首页 > 解决方案 > 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.languagechangeLanguage,但是当视图被渲染时,语言没有改变。

谢谢!

标签: node.jsdatabaseexpressconfigurationi18next

解决方案


我发现了这个问题。我没有在正确的翻译实例上更改语言,i18next 克隆的翻译实例在请求中可用并用于翻译。您必须更改i18next.changeLanguagereq.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();
        });
    });

推荐阅读