You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 06:57:00