【问题标题】:How to i18n an express-graphql-App?如何 i18n 一个 express-graphql-App?
【发布时间】:2018-02-23 01:08:47
【问题描述】:

我正在寻找 i18n graphql-response 的示例:我不想将语言传递到每个查询中,但我只找到了关于如何将语言放入上下文以拥有它的非常稀疏的文档可用于解决。

我正在使用 node 和 graphql-express,非常感谢使用此组合或任何其他组合的每个提示!

【问题讨论】:

标签: express internationalization graphql


【解决方案1】:

不要深入研究 graphql,而是确定您可以使用 http://i18next.com 解决您的问题 -> 或更具体地使用 express 中间件 https://github.com/i18next/i18next-express-middleware

【讨论】:

  • 是的,我就是这么干的,我一直在寻找一个集成的例子:
【解决方案2】:

正如@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 在省略配置参数以使其更容易设置时往往过于聪明开箱即用 - 大多数示例因此缺少此方法正常工作所需的查询、上下文、模式的签名。

【讨论】:

  • 我使用 i18next express 和 graphql 作为 api,并将 i18next 作为前端反应,似乎它不相互通信而不是读取它的 localhost 端口,因为返回的 lang 总是en-US。你有什么想法吗?
  • 啊,nvm,我在api端不需要i18​​n
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 2019-03-03
  • 2020-08-07
  • 2021-03-17
  • 2022-10-04
  • 2020-11-17
  • 2017-04-12
相关资源
最近更新 更多