Задать вопрос
@Procyon

Как перевести сообщения об ошибке GraphQL для Rails 6 используя интернационализацию?

Как можно перевести сообщение об ошибке GraphQl используя интернационализацию рельс?
Используя только бекэнд?
К примеру, у меня есть вывод GraphiQL, с полем message:
{
  "errors": [
    {
      "message": "Argument 'facultativeMark' on InputObject 'FacultativeMarkAttributes' is required. Expected type Int!",
      "locations": [
        {
          "line": 2,
          "column": 52
        }
      ],
      "path": [
        "mutation addfacultativMark",
        "addFacultativeMark",
        "attributes",
        "facultativeMark"
      ],
      "extensions": {
        "code": "missingRequiredInputObjectAttribute",
        "argumentName": "facultativeMark",
        "argumentType": "Int!",
        "inputObjectType": "FacultativeMarkAttributes"
      }
    }
  ]
}

Мне нужно перевести, видимо, поле message и, желательно, использовать для этого интернационализацию рельс.
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@vsuhachev
Один за вариантов - собрать перевод из мета-информации которая есть в сообщении об ошибке. Завязаться на код ошибки как идентификатор для локализации

require "json"
require "i18n"

errors = JSON.parse(<<~JSON, symbolize_names: true)[:errors]
  {
    "errors": [
      {
        "message": "Argument 'facultativeMark' on InputObject 'FacultativeMarkAttributes' is required. Expected type Int!",
        "locations": [
          {
            "line": 2,
            "column": 52
          }
        ],
        "path": [
          "mutation addfacultativMark",
          "addFacultativeMark",
          "attributes",
          "facultativeMark"
        ],
        "extensions": {
          "code": "missingRequiredInputObjectAttribute",
          "argumentName": "facultativeMark",
          "argumentType": "Int!",
          "inputObjectType": "FacultativeMarkAttributes"
        }
      }
    ]
  }
JSON

I18n.available_locales = [:ru]
I18n.locale = :ru

I18n.backend.store_translations(:ru, YAML.load(<<~YAML)["ru"])
  ru:
    external_api:
      errors:
        missingRequiredInputObjectAttribute: Аргумент '%{argumentName}' для '%{inputObjectType}' является обязательным. Ожидается тип '%{argumentType}'
YAML

errors.each do |error|
  vars = error[:extensions].dup
  code = vars.delete(:code)
  error[:message_en] = error[:message]
  error[:message] = I18n.t(code, scope: "external_api.errors", **vars)
end

pp errors
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы