Lzh on GitHub

不同域名

为您的应用支持的每种语言使用不同的域名。

您可能希望为您的应用支持的每种语言使用不同的域名。

以下是实现此目的的方法:

  • differentDomains 选项设置为 true
  • locales 选项配置为对象数组,其中每个对象都有一个 domain 键,其值为您希望用于该语言环境的域名。可选地包括端口(如果非标准)和/或协议。如果未提供协议,则会尝试自动检测,但在某些情况下可能无法正常工作,例如页面是静态生成时。
  • 可选地将 detectBrowserLanguage 设置为 false。启用时(默认情况下启用),用户在首次访问时可能会被重定向到不同的域名。如果您希望确保访问给定域名始终显示相应语言环境的页面,请将其设置为 false
nuxt.config.ts
export default defineNuxtConfig({
  i18n: {
    locales: [
      {
        code: 'en',
        domain: 'mydomain.com'
      },
      {
        code: 'es',
        domain: 'es.mydomain.com'
      },
      {
        code: 'fr',
        domain: 'fr.mydomain.com'
      },
      {
        code: 'pl',
        domain: 'http://pl.mydomain.com'
      },
      {
        code: 'ua',
        domain: 'https://ua.mydomain.com'
      }
    ],
    differentDomains: true
    // 或者只在生产环境启用该选项
    // differentDomains: (process.env.NODE_ENV === 'production')
  }
})

使用不同域名时,您的语言切换器应使用常规的 <a> 标签:

<script setup>
const { locale, locales } = useI18n()
const switchLocalePath = useSwitchLocalePath()

const availableLocales = computed(() => {
  return locales.value.filter(i => i.code !== locale.value)
})
</script>

<template>
  ...
  <a v-for="locale in availableLocales" :href="switchLocalePath(locale.code)" :key="locale.code">
    {{ locale.code }}
  </a>
  ...
</template>

运行时环境变量

有时需要在不同的环境(例如预发布环境和生产环境)中更改域名。 由于 nuxt.config.ts 在构建时使用,因此有必要为不同环境创建不同的构建。

locale-domains.config.ts
export const localeDomains = {
  uk: process.env.DOMAIN_UK,
  fr: process.env.DOMAIN_FR
}
nuxt.config.ts
import { localeDomains } from './locale-domains.config'

export default defineNuxtConfig({
  modules: ['@nuxtjs/i18n'],

  i18n: {
    differentDomains: process.env.NODE_ENV === 'production',
    locales: [
      {
        code: 'uk',
        domain: localeDomains.uk
      },
      {
        code: 'fr',
        domain: localeDomains.fr
      }
    ]
  }
})

使用上述配置,将需要为预发布环境和生产环境运行构建,并使用不同的 .env 文件来指定 DOMAIN_UKDOMAIN_FR

或者,为了避免多次构建的需要,可以通过运行时环境变量覆盖语言环境域名。变量名应遵循 NUXT_PUBLIC_I18N_DOMAIN_LOCALES_{code}_DOMAIN 格式

例如:

production.env
NUXT_PUBLIC_I18N_DOMAIN_LOCALES_UK_DOMAIN=uk.example.test
NUXT_PUBLIC_I18N_DOMAIN_LOCALES_FR_DOMAIN=fr.example.test
staging.env
NUXT_PUBLIC_I18N_DOMAIN_LOCALES_UK_DOMAIN=uk.staging.example.test
NUXT_PUBLIC_I18N_DOMAIN_LOCALES_FR_DOMAIN=fr.staging.example.test

仅对部分语言使用不同域名

如果一个或多个域名需要托管多种语言,则每个域名的默认语言需要将 domainDefault: true,以便每个域名都有一个回退语言环境。 differentDomains 选项仍然需要设置为 true

nuxt.config.js
export default defineNuxtConfig({
  // ...
  i18n: {
    locales: [
      {
        code: 'en',
        domain: 'mydomain.com',
        domainDefault: true
      },
      {
        code: 'pl',
        domain: 'mydomain.com'
      },
      {
        code: 'ua',
        domain: 'mydomain.com'
      },
      {
        code: 'es',
        domain: 'es.mydomain.com',
        domainDefault: true
      },
      {
        code: 'fr',
        domain: 'fr.mydomain.com',
        domainDefault: true
      }
    ],
    strategy: 'prefix',
    differentDomains: true
    // 或者只在生产环境启用该选项
    // differentDomains: (process.env.NODE_ENV === 'production')
  },
  // ...
})

给定上述配置并使用 'prefix' 策略,以下请求将是:

当使用 'prefix_except_default' 策略时,相同的请求将是: