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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:33:10