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

Next.js[next-i18next] 多服务架构下翻译子目录配置方法问询

解决Next.js多服务架构下next-i18next的自定义翻译目录配置

我刚好处理过类似的多服务i18n配置需求,给你分享两种结构的具体实现方案:

方案一:按语言划分服务子目录(结构一)

这种结构下所有翻译文件集中在public/locales下,按语言目录再拆分服务子目录。我们可以通过**命名空间(namespaces)**来区分不同服务的翻译内容,具体配置步骤如下:

1. 配置next-i18next核心文件

在项目根目录创建next-i18next.config.js,指定基础locale路径并启用命名空间支持:

// next-i18next.config.js
module.exports = {
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'de'],
  },
  localePath: typeof window === 'undefined' ? require('path').resolve('./public/locales') : '/locales',
  reloadOnPrerender: process.env.NODE_ENV === 'development',
}

2. 在组件中调用对应服务的翻译

使用useTranslation hook时,传入服务对应的命名空间(格式为服务子目录/文件名):

// src/services/service_one/components/Content.js
import { useTranslation } from 'next-i18next'

export default function ServiceOneContent() {
  const { t } = useTranslation('service_one/content')
  return <div>{t('welcome_message')}</div>
}

3. SSR/SSG场景预加载翻译(可选)

如果页面需要服务端渲染,在getStaticProps或getServerSideProps中预加载对应服务的命名空间:

// src/services/service_one/pages/index.js
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'

export async function getStaticProps({ locale }) {
  return {
    props: {
      ...await serverSideTranslations(locale, ['service_one/content']),
    },
  }
}

方案二:每个服务独立维护locales目录(结构二)

这种结构适合完全独立的服务模块,每个服务自行管理翻译文件。我们可以为每个服务创建独立的i18n配置,实现翻译隔离:

1. 为每个服务创建独立的i18n实例

比如在service_one目录下创建i18n.js,自定义翻译文件的加载路径:

// src/services/service_one/i18n.js
import { createInstance } from 'i18next'
import { initReactI18next } from 'react-i18next'
import backend from 'i18next-http-backend'
import rootI18nConfig from '../../../next-i18next.config.js'

const createI18nInstance = async (locale) => {
  const i18n = createInstance()
  await i18n
    .use(initReactI18next)
    .use(backend)
    .init({
      ...rootI18nConfig.i18n,
      locale,
      backend: {
        loadPath: '/services/service_one/locales/{{lng}}/{{ns}}.json',
      },
      defaultNS: 'content',
    })
  return i18n
}

export default createI18nInstance

2. 在服务页面中使用独立i18n实例

在服务的页面组件中,初始化并通过I18nextProvider注入实例:

// src/services/service_one/pages/index.js
import { useTranslation, I18nextProvider } from 'react-i18next'
import createI18nInstance from '../i18n'

export default function ServiceOnePage({ i18n }) {
  const { t } = useTranslation()
  return (
    <I18nextProvider i18n={i18n}>
      <div>{t('welcome_message')}</div>
    </I18nextProvider>
  )
}

export async function getStaticProps({ locale }) {
  const i18n = await createI18nInstance(locale)
  return {
    props: { i18n },
  }
}

3. 配置Next.js静态资源路由

因为翻译文件不在默认的public目录下,需要在next.config.js中添加重写规则,让Next.js能正确加载:

// next.config.js
const nextConfig = {
  async rewrites() {
    return [
      {
        source: '/services/:service/locales/:lng/:ns.json',
        destination: '/src/services/:service/locales/:lng/:ns.json',
      },
    ]
  },
}

module.exports = nextConfig

两种方案的适用场景:

  • 方案一更适合服务间有共享翻译内容的场景,管理更集中
  • 方案二更适合完全独立的服务模块,隔离性更好

你可以根据自己的架构需求选择对应的方案。

内容的提问来源于stack exchange,提问作者David L. Rajcher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:57:48