2016-09-30 2 views
1

GraphQL/Relayコミュニティ内の誰かがこの問題を抱えていると思います。Relayを使用しているときにGraphQLの結果をローカライズ

私たちは多言語システムを持っています。つまり、結果はローカライズされています。したがって、フィールドリゾルバに引き渡される引数は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. 
     } 
     ] 
    } 
    } 
} 

これは、このように見て翻訳可能なフィールドのリゾルバ(私はdataloaderを使用していますことに注意してください)することが可能です。

... 
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) 
} 

翻訳が存在する場合は、代わりにそれを使用しますeオリジナル値。 Relayをプロジェクトに導入するまで、これはうまくいきました。

我々は言語を渡す方法はありません 、できるリレーのnodeを利用したい、それが部分的に動作してきた、すなわち:

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

しかしnodeを使用しているのでviewerのように引数を取ることができません。

language parametersを標準クエリとノードの両方で動作するリゾルバに渡すにはどうすればよいですか?

答えて

0

graphql-js v0.6以降、各リゾルバは第3パラメータとしてcontextオブジェクトを受け取ります。これは、コンテキスト情報をサーバからGraphQLの実行フェーズに渡すのに適しています。たとえば、認証と承認を処理するために使用します。あなたはそこで目的の言語を渡すことができます。 express-graphqlまたはkoa-graphqlを使用すると、デフォルトでcontextとしてrequestオブジェクトが渡されます。レゾルバからヘッダーを調べることができます。

EDIT:ねえ、express-graphql

+0

答えてくれてありがとう:ここに明示-graphqlを使用してgraphqlリゾルバでセッションを処理する例です。コンテキストを使用していますが、ノードID経由でリレーを照会するときは機能しません。 –

+0

あまりにも編集をありがとう。私はこれを反映するために私の答えを編集しますが、これらのクエリはユーザーに代わって投げられます。結果は日本語でもいいかもしれませんが、英語で欲しいかもしれません。 –

関連する問題