我有一个 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:我没有使用车把
经过这么长时间的尝试,以及在这里发布问题几分钟后,我解决了它。我认为这是古老的 StackOverflow 的祝福。
笑话不谈,我看到了对这个问题的评论并认为“这是有道理的”。
在控制器中,而不是这样使用
...
import i18next from 'i18next';
...
i18next.t('users:successful_login')
我删除了全局
i18next
导入并将其更改为
req.i18n.t('users:successful_logout')