Локализация результатов GraphQL при использовании Relay

Я надеюсь, что кто-то в сообществе GraphQL/Relay столкнулся с этой проблемой.

У нас многоязычная система, а это значит, что результаты локализованы. Итак, у нас есть аргумент с именем lang, который передается преобразователям полей.

Запросы пишутся так:

query {
  viewer(lang: ja) {
    books { <- Type is `Book`
      id
      title <- This would be localized to Japanese.
    }
  }
}

Что вернет:

{
  "data": {
    "viewer": {
      "books": [
        {
          "id": "SOMETHINGSOMETHING123",
          "name": "ハリー・ポッター" // "Harry Potter" in Japanese.
        }
      ]
    }
  }
}

Это возможно благодаря тому, что преобразователь для переводимых полей выглядит следующим образом (обратите внимание, что я использую загрузчик данных):

...
resolve: (parent, args, ast, { rootValue }) => {
  const { language } = rootValue
  const { BookLoader } = rootValue.loaders
  return BookLoader.TranslationsLoader(language).load(parent.id).then(translations => translations[parent.id].title || parent.title)
}

Если перевод существует, он будет использовать его вместо исходного значения. Это работало нормально, пока мы не добавили Relay в наш проект.

Мы хотим использовать Relay node и частично заработали, т.е.:

query {
  node(id: "SOMETHINGSOMETHING123") {
    ...b
  }
}
fragment b on Book {
  id
  name
}

Но поскольку использование node не может принимать такие аргументы, как viewer, нет способа передать язык.

Как мне передать language parameters распознавателю, который будет работать как со стандартными запросами, так и с узлами?


person Naoto Ida    schedule 30.09.2016    source источник


Ответы (1)


Начиная с graphql-js v0.6, каждый преобразователь получает объект context в качестве третьего параметра. Это удобно для передачи контекстной информации с сервера на этап выполнения GraphQL. Мы используем его, например, для обработки аутентификации и авторизации. Там можно было пройти на нужном языке. Если вы используете express-graphql или koa-graphql, они по умолчанию передают объект request как context. Вы можете проверить заголовки от преобразователя.

РЕДАКТИРОВАТЬ: Вот пример обработки сеанса в преобразователе graphql с использованием express-graphql: express-graphql

person Andy Carlson    schedule 30.09.2016
comment
Эй, спасибо за ответ. Мы используем контекст, он просто не будет работать, когда мы запрашиваем через Node ID для Relay. - person Naoto Ida; 01.10.2016
comment
Спасибо и за правку. Я отредактирую свой ответ, чтобы отразить это, но эти запросы выдаются от имени пользователя, а это означает, что мне могут быть нужны результаты на японском языке, но вы можете захотеть их на английском языке. - person Naoto Ida; 03.10.2016