Express中i18next翻译在EJS模板不渲染且无法自动检测语言
解决方案
你遇到的问题核心是两个错误配置导致的,按如下步骤修改即可修复浏览器语言自动检测失效的问题:
1. 注册i18next请求中间件
i18nextMiddleware.LanguageDetector依赖请求上下文读取浏览器的Accept-Language请求头完成语言检测,你没有把中间件挂载到Express实例上,检测逻辑根本不会执行。
在你的Express初始化代码、所有路由声明之前,添加中间件注册逻辑:
const express = require('express'); const app = express(); // i18next初始化代码保持不变 i18next .use(Backend) .use(i18nextMiddleware.LanguageDetector) .init({ backend: { loadPath: __dirname + '/locales/{{lng}}/{{ns}}.json' }, fallbackLng: 'en', preload: ['en', 'de'] }); // 新增:注册i18next中间件,必须放在路由之前 app.use(i18nextMiddleware.handle(i18next));
2. 改用请求对象绑定的t函数
你之前直接绑定全局i18next.t的方式是错误的:全局t函数的语言固定为初始化的默认值,不会感知每个请求单独检测到的语言。
中间件注册完成后,每个请求的req对象上会自动挂载绑定了当前请求语言的t函数,直接传递该函数给模板即可:
res.render("index", {t: req.t});
你之前写的i18next.t.bind(i18next.t)逻辑可以直接删除,不再需要。
(可选)自定义语言检测规则
如果修改后还是检测失效,可以在i18next的init配置中新增detection项,明确指定检测规则:
i18next.init({ // 其他原有配置保持不变 detection: { // 检测优先级:优先读取浏览器请求头 order: ['header'], // 只允许检测配置的两种语言 allowedLngs: ['en', 'de'], // 关闭语言缓存,避免旧缓存影响测试 caches: false } })
内容的提问来源于stack exchange,提问作者user17145524
相关产品推荐
相关产品推荐

