Next.js使用next-i18next时如何配置多语言别名避免重复维护翻译文件
实现方案
方案1:通过next-i18next资源映射实现(推荐)
该方案无需修改请求逻辑,仅通过配置即可实现多地区指向同一套翻译资源:
- 调整next-i18next配置文件(通常为
next-i18next.config.js或直接写在next.config.js中),补全所有需要支持的地区标识,同时新增localePath动态映射逻辑:
module.exports = { i18n: { defaultLocale: "en", // 补全所有需要支持的地区标识 locales: ["en", "zh-CN", "zh-SG", "zh-TW", "zh-HK"], }, // 动态返回翻译资源路径,实现多地区共用同一套翻译 localePath: (locale, namespace) => { let targetLocale = locale // 简体地区统一映射到zh-CN资源 if (locale === 'zh-SG') targetLocale = 'zh-CN' // 繁体地区统一映射到zh-TW资源 if (locale === 'zh-HK') targetLocale = 'zh-TW' return `./public/locales/${targetLocale}/${namespace}.json` } };
- 仅需在
public/locales目录下维护3套翻译文件夹即可:en(英文)、zh-CN(简体中文)、zh-TW(繁体中文),无需新增zh-SG、zh-HK对应的翻译目录。
方案2:通过Middleware实现请求侧重写
如果不需要在URL中展示不同地区的locale标识(比如zh-SG用户直接显示/zh-CN/xxx路径),可以通过Next.js的Middleware实现请求时的语种映射,无需在i18n配置中声明所有地区:
- 在项目根目录新建
middleware.js文件,写入以下逻辑:
import { NextResponse } from 'next/server' export function middleware(request) { const acceptLang = request.headers.get('accept-language') || '' if (acceptLang.startsWith('zh')) { // 匹配简体地区 if (acceptLang.includes('zh-CN') || acceptLang.includes('zh-SG')) { return NextResponse.rewrite(new URL(`/zh-CN${request.nextUrl.pathname}`, request.url)) } // 匹配繁体地区 if (['zh-TW', 'zh-HK', 'zh-MO'].some(lang => acceptLang.includes(lang))) { return NextResponse.rewrite(new URL(`/zh-TW${request.nextUrl.pathname}`, request.url)) } } return NextResponse.next() } export const config = { // 排除不需要做语种检测的路径 matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], }
- 对应调整i18n配置中的locales数组为
["en", "zh-CN", "zh-TW"]即可,无需新增其他地区标识。
注意事项
- 两种方案均不需要新增额外的翻译JSON文件,仅需维护简体、繁体、英文三套翻译资源即可。
- 方案1会保留用户对应地区的locale标识在URL中,比如新加坡用户访问时路径为
/zh-SG/xxx,如果需要统一URL路径,可以新增简单的重定向规则将zh-SG重定向到zh-CN、zh-HK重定向到zh-TW。
内容的提问来源于stack exchange,提问作者Jan Klimo
相关产品推荐
相关产品推荐

