为什么i18next的fallbackLng会覆盖changeLanguage?

问题描述 投票:0回答:1

我有一个 node.js 应用程序,我正在尝试基于 URL 查询字符串支持多语言。我使用了 i18next 模块。

这是我的主index.ts的片段

...
import i18next from 'i18next';
import i18nextMiddleware from 'i18next-http-middleware';
import i18nextBackend from 'i18next-fs-backend';

...

i18next
  .use(i18nextBackend)
  .use(i18nextMiddleware.LanguageDetector)
  .init({
    debug: true,
    fallbackLng: 'en',
    //lng: i18next.language,
    defaultNS: 'common',
    ns: ['common', 'users', 'products', 'errors'],
    /*preload: ['en', 'ar'],*/
    backend: {
      loadPath: './src/locales/{{lng}}/{{ns}}.json',
    },
    detection: {
      order: ['querystring', 'cookie', 'header'],
      lookupQuerystring: 'lang',
    },
  });
app.use(i18nextMiddleware.handle(i18next));
app.use((req, _res, next) => {
  const lang = req.query.lang || 'en';
  //console.log(lang)
  
  req.i18n.changeLanguage(lang as string);
  next();
});

...

这就是我在用户控制器中使用它的方式

    ...
    return res.json({
      status: 'success',
      data: { ...user },
      message: i18next.t('users:successful_login'),
    });
  • 如果我设置
    fallbackLng: ''
    ,我会在API中获得翻译密钥 回复
    successful_login
  • 如果我成功了
    fallbackLng: 'en'
    ,我 总是能得到英文翻译
  • 如果我将其更改为
    fallbackLng: 'ar'
    ,我总是会得到对应的阿拉伯语

似乎fallbackLngALWAYS覆盖了语言更改中间件

当我调用任何 API 时,我会看到每个 API 调用的这三个日志

   i18next: languageChanged en
   i18next: languageChanged ar
   i18next: languageChanged ar

似乎语言确实发生了变化,但我仍然只能得到

fallbackLng

中的任何语言

PS:我没有使用车把

node.js typescript express i18next
1个回答
0
投票

经过这么长时间的尝试,以及在这里发布问题几分钟后,我解决了它。我认为这是古老的 StackOverflow 的祝福。

笑话不谈,我看到了对这个问题的评论并认为“这是有道理的”。

在控制器中,而不是这样使用

...
import i18next from 'i18next';

...
i18next.t('users:successful_login')

我删除了全局

i18next
导入并将其更改为

req.i18n.t('users:successful_logout')
© www.soinside.com 2019 - 2024. All rights reserved.