2017-09-14 11 views
1

私はgraphql-responseをi18nにする例を探しています:すべてのクエリに言語を渡したくはありませんが、文脈に言語を入れて利用できるようにする方法については、解決のためにExpress-Graphql-Appをi18nする方法は?

私はnodeとgraphql-expressを使用していますが、この組み合わせのいずれかを使用するたびにヒントが得られます。

答えて

0

ないgraphqlに深いが、あなたが使用して問題を解決できるということを確認するhttp://i18next.com - >または明示ミドルウェア@jamuhlが示唆するようにhttps://github.com/i18next/i18next-express-middleware

+0

はい、これまでのやり方はかなりわかりましたが、私は統合された例を探していました: –

+0

あなたが最初かもしれないので、あなたの設定を共有することは他人を助けるのにうれしいでしょう... – jamuhl

0

に、より具体的な、ここで選択した言語を配置するためにi18nextを使用する例があります

const i18next = require('i18next') 
// detects language from query, cookies or Accept-Language using i18next 
i18next 
    .use(i18nMiddleware.LanguageDetector) 
    .init({ 
    preload: ['en', 'de'] 
    }); 
app.use(i18nMiddleware.handle(i18next)); 

最初i18nextを設定:その要求とはgraphqlためにそれを渡すためにコンテキストを使用します

app.use('/api/v1' 
     ,graphqlHTTP((req) =>{ 
      return { 
      schema: schema.schema, 
      rootValue: schema.root, 
      graphiql: false, 
      pretty: true, 
      context: {language: req.language} 
      } 
     })); 

は今、あなたがから選択した言語を拾うことができます:

次のステップは、あなたがあなたのgraphql(通常は、あなたのコンテキスト・オブジェクトは、それよりももっと複雑になります)を設定するときに、コンテキスト・オブジェクトにそれを渡すことですあなたのリゾルバのコンテキスト:

var root = { 
    ... 
    yourApiCall: async (query, context, schema) => { 
     let language = context.language || "en" 
     ... 
     return {localizedStrings: ...} 
    } 

明示的コンテキストを設定しない場合、コンテキストが要求に設定されている:あなたはそこからそれを引き出すことができますが、私はまだそれが明示的にコンテキストを制御するためのより良いスタイルだと思います。このソリューションはあなたのバージョンのgraphqlで動作することを確認してください。ここで最も労力のかかる部分は、呼び出しのための適切なシグネチャを見つけることでした。設定が簡単でないために、設定パラメータがあまりにも巧妙になってしまいがちですしたがって、ほとんどの例では、このアプローチが適切に動作するために必要なクエリ、コンテキスト、スキーマの署名が欠けています。

+0

私はi18next expressとgraphqlをapiにして、i18nextをフロントエンドとして反応させると、返されたlangが常に 'en-US'であるため、localhostポートを読み込む代わりに、互いに通信しないようです。あなたは何か考えていますか? –

+0

ああ、nvm、私はapi側でi18nは必要ありません –

関連する問題