i18next始终返回回退语言,如何全局使用i18next.t?
问题原因与解决方案
问题核心在于全局i18next实例和请求绑定的i18n上下文是分离的:middleware.LanguageDetector仅在请求周期内检测并设置当前请求对应的i18n实例的语言(也就是req.t依赖的实例),但全局的i18next单例不会自动跟随请求切换语言,始终沿用初始配置的回退语言(这里是'en')。
解决方法
1. 请求上下文内使用:手动传入当前请求语言
在请求处理函数里(比如你的404路由),直接从请求对象中获取检测到的语言,传给i18next.t的参数即可:
app.all('*', (req: Request, res: Response) => { // LanguageDetector会将检测到的语言存到req.language或req.i18n.language const currentLng = req.language; res.status(404).json({ status: i18next.t('errorStatus', { lng: currentLng }), message: i18next.t('error404', { lng: currentLng }), }) })
2. 非请求上下文使用:传递语言参数
如果是在请求处理之外的函数(比如工具类、服务层),需要将语言作为参数传入函数,再调用i18next.t时指定:
// 非请求上下文的工具函数 function getNotFoundError(lng: string) { return { status: i18next.t('errorStatus', { lng }), message: i18next.t('error404', { lng }) } } // 在请求处理中调用工具函数 app.all('*', (req: Request, res: Response) => { const error = getNotFoundError(req.language); res.status(404).json(error); })
3. 前置检查:确保语言文件有效
先确认locales/ar/translation.json文件存在、格式正确,且包含errorStatus和error404对应键值,避免因文件缺失或键不存在导致自动回退到英文。
内容的提问来源于stack exchange,提问作者Mohamed Sawah
相关产品推荐
相关产品推荐

