Node.js + Express + i18следующий как загрузить язык из базы данных - PullRequest
0 голосов
/ 29 мая 2020

мой сценарий: Node.js + Express + Handlebars + i18next app.

Я хотел бы установить язык по умолчанию для ключа конфигурации базы данных. Если я решу, что языком по умолчанию должен быть 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, кажется, что он изменился, но когда представление отображается, язык не меняется.

Спасибо!

1 Ответ

0 голосов
/ 30 мая 2020

Я нашел проблему. Я не менял язык в правильном экземпляре переводчика, который клонирует 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();
        });
    });
...