如何在Next.js API路由中集成i18next对接next-translate实现国际化
Next.js API层对接next-translate实现国际化方案
不需要额外引入i18next-http-middleware,直接复用next-translate自带的服务端翻译能力即可,完全复用现有前端翻译资源,无额外维护成本。
1. 封装API层通用i18n工具
新建utils/apiI18n.js,实现语言解析、翻译函数初始化逻辑,语言识别规则和next-translate前端规则保持一致:
import i18nConfig from '../i18n' // 导入项目中已有的next-translate配置文件 import getT from 'next-translate/getT' export function getLocaleFromReq(req) { // 语言识别优先级:URL query参数 > NEXT_LOCALE cookie > 请求头accept-language > 配置默认语言 const { lang } = req.query if (lang && i18nConfig.locales.includes(lang)) return lang const cookieLocale = req.cookies.NEXT_LOCALE if (cookieLocale && i18nConfig.locales.includes(cookieLocale)) return cookieLocale const acceptLang = req.headers['accept-language']?.split(',')[0]?.split('-')[0] if (acceptLang && i18nConfig.locales.includes(acceptLang)) return acceptLang return i18nConfig.defaultLocale } export async function initApiI18n(req, namespace = 'common') { const locale = getLocaleFromReq(req) const t = await getT(locale, namespace) return { t, locale } }
2. 在API接口中直接调用
以登录接口为例,替换原来硬编码的错误提示:
// pages/api/login.js import { initApiI18n } from '../../utils/apiI18n' export default async function loginHandler(req, res) { // 初始化翻译,指定使用auth命名空间(和前端命名空间规则完全一致) const { t } = await initApiI18n(req, 'auth') try { // 原有业务逻辑 if (principal !== walletSigningfor) { // 用t函数读取多语言文案,defaultValue为缺省兜底文案 throw new Error(t('login.diff_wallet_sign', { defaultValue: 'Failed to login, signed message with different wallet....' })) } res.status(200).json({ code: 0, msg: 'success' }) } catch (err) { res.status(400).json({ code: -1, msg: err.message }) } }
3. 补全翻译文件
直接在现有next-translate的locales目录下新增对应文案即可,和前端翻译完全共用文件,不需要单独维护:
locales/en/auth.json新增:
{ "login": { "diff_wallet_sign": "Failed to login, signed message with different wallet...." } }
locales/zh/auth.json新增:
{ "login": { "diff_wallet_sign": "登录失败,签名消息使用的钱包与当前选择钱包不匹配" } }
可选优化
如果需要在所有API接口中统一使用翻译,可以把i18n初始化逻辑放到Next.js的全局API中间件中,将t方法挂载到req对象上,避免每个接口重复写初始化代码。
说明:
next-translate/getT是next-translate官方提供的服务端专用方法,不会被打包到前端bundle,在API层、getServerSideProps等服务端场景都可以安全使用,和前端翻译共用同一套配置、同一批文案文件,没有适配成本。
内容的提问来源于stack exchange,提问作者comalex3
相关产品推荐
相关产品推荐

