2017-09-14 55 views
1

我正在尋找一個i18n的graphql-response示例:我不想將語言傳遞到每個查詢中,但是我只找到非常稀疏的文檔來說明如何將語言放入上下文以使其可用爲決心。如何使用express-graphql-App?

我使用節點和graphql-express,每個提示使用這個組合或任何其他高度讚賞!

回答

0

爲@jamuhl表明,這裏是使用i18next上放置所選語言的例子該請求,然後使用上下文傳遞它到graphql:

第一設置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)); 

下一步就是把它傳遞給上下文的對象,當您設置graphql(通常情況下,你的上下文對象將是比這更復雜):

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

現在你可以拿起從所選的語言在你的解析器的背景:

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

如果不設置上下文明確,上下文設置請求:您可以從那裏得到它,但我仍然認爲這是更好的風格明確地控制您的上下文。請檢查此解決方案是否適用於您的graphql版本 - 這裏最棘手的部分是找出調用的正確簽名,因爲graphql傾向於在省略配置參數方面過於巧妙,以便更容易設置 - 因此,大多數示例都缺乏查詢,上下文和架構的簽名,您需要這種方法才能正常工作。

+0

我用i18next express和graphql作爲api,並且將i18next作爲前端進行響應,似乎它不相互通信而不是讀取它的localhost端口,因爲返回的lang總是'en-US'。你有什麼主意嗎? –

+0

啊,nvm,我不需要i18​​n在api端 –