node.js - Node.js + Express + i18next 如何从数据库加载语言
问题描述
我的场景是 Node.js + Express + Handlebars + i18next 应用程序。
我想在数据库配置键上设置默认语言。如果我决定默认语言应该是 X 而不是 Y,我只需更改它并将该选择保存在我的应用程序的后端。问题是我不想每次更改默认语言时都重新加载整个应用程序,所以我不能在i18next.init()
方法中这样做。默认语言应在每次页面请求时从数据库中读取,如果当前用户未进行其他选择,则应使用默认语言。我的想法如下,但它不起作用:
const express = require('express');
const i18next = require('i18next');
const app = express();
...
i18next.init(...);
...
app.use((req, res, next) => {
const lng = someLogicToDecideLanguage();
i18next.changeLanguage(lng, (err, t) => {
if (err) {
next(err);
}
console.log(i18next.language); // it's changed!
next();
});
});
如果我登录回调结果,它似乎改变i18next.language
了changeLanguage
,但是当视图被渲染时,语言没有改变。
谢谢!
解决方案
我发现了这个问题。我没有在正确的翻译实例上更改语言,i18next 克隆的翻译实例在请求中可用并用于翻译。您必须更改i18next.changeLanguage
为req.i18n.changeLanguage
:
app.use((req, res, next) => {
const lng = someLogicToDecideLanguage();
req.i18n.changeLanguage(lng, (err, t) => {
if (err) {
next(err);
}
console.log(i18next.language); // it's changed!
next();
});
});
推荐阅读
- reactjs - 如何在 React 的输入元素中突出显示主题标签?
- angular - Angular and Http Calls How to make an http call to keep trying until a success response is received?
- javascript - 在反应中访问'scrollLeft'属性
- lazy-loading - 从库中延迟加载功能模块
- python - 无法在 python 中使用 selenium 使网页的隐藏部分处于活动状态
- ftp - Fuse Filesystem 与 FTP 通信
- java - 类 Event 中的构造函数事件
不能应用于给定类型;找不到符号方法 getTitle() - swift - Swift 中的 UIButton 切换布尔变量
- powershell - 在 CI 构建中使用 Powershell 获取变更集详细信息时遇到问题
- python-3.x - 使用 MQTT 模拟物联网