Я надеюсь, что кто-то в сообществе 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
распознавателю, который будет работать как со стандартными запросами, так и с узлами?