简介:本文详细解析Nuxt.js与@nuxtjs/i18n模块结合时的注意事项,涵盖配置、路由、SEO优化及常见问题,助力开发者高效实现多语言项目。
在全球化浪潮下,多语言支持已成为Web应用的标配。Nuxt.js作为基于Vue的SSR框架,结合官方推荐的@nuxtjs/i18n模块,能够高效实现国际化需求。然而,实际开发中若配置不当,可能引发路由混乱、SEO异常或性能问题。本文从配置、路由、SEO及常见问题四个维度,系统梳理关键注意事项,助开发者规避陷阱。
安装@nuxtjs/i18n时,需确保Nuxt.js版本匹配。例如,Nuxt 3需使用@nuxtjs/i18n@next,而Nuxt 2需选择稳定版。版本冲突可能导致构建失败或运行时错误。建议通过npm list nuxt @nuxtjs/i18n检查版本一致性。
在nuxt.config.ts中,locales、defaultLocale和vueI18n是关键配置:
export default defineNuxtConfig({modules: ['@nuxtjs/i18n'],i18n: {locales: [{ code: 'en', iso: 'en-US', name: 'English' },{ code: 'zh', iso: 'zh-CN', name: '中文' }],defaultLocale: 'en',vueI18n: {legacy: false, // Nuxt 3需禁用legacy模式locale: 'en',fallbackLocale: 'en'}}})
locales.code:必须与路由前缀一致(如/en、/zh),否则会导致404。iso字段:用于生成lang属性,影响浏览器语言检测。fallbackLocale:未翻译键的回退语言,避免显示原始键名。通过useI18n()钩子或$i18n对象可实现语言切换:
<script setup>const { locale } = useI18n()const switchLanguage = (lang) => {locale.value = lang // 同步更新当前语言// 若需重定向到对应语言路由,可结合useRouter}</script>
注意:直接修改locale不会自动重定向,需手动处理路由跳转。
@nuxtjs/i18n支持两种路由模式:
/en/about、/zh/about,适合多语言独立内容。en.example.com/about、zh.example.com/about,需配置DNS和服务器重定向。配置示例:
i18n: {strategy: 'prefix_except_default', // 默认语言无前缀routes: {about: {en: '/about',zh: '/关于'}}}
陷阱:若未正确设置strategy,可能导致默认语言路由重复(如/about和/en/about同时存在)。
模块自动生成<html lang>和hreflang标签,但需确保:
iso字段准确:如zh-CN而非zh,否则搜索引擎可能误判。head()方法覆盖默认值:
<script setup>const { locale } = useI18n()useHead({htmlAttrs: {lang: locale.value},link: [{ rel: 'alternate', hreflang: 'en', href: 'https://example.com/en' },{ rel: 'alternate', hreflang: 'zh', href: 'https://example.com/zh' }]})</script>
使用nuxt generate时,需为每个语言生成独立页面:
i18n: {locales: ['en', 'zh'],generate: {routes: async () => {const enRoutes = ['/', '/about'] // 英文路由const zhRoutes = ['/', '/关于'] // 中文路由return [...enRoutes.map(r => ({ route: r, params: { lang: 'en' } })),...zhRoutes.map(r => ({ route: r, params: { lang: 'zh' } }))]}}}
问题:若路由未对齐,可能导致部分语言页面缺失。
原因:语言前缀与路由配置不匹配。
解决:
nuxt.config.ts中locales.code是否与路由前缀一致。pages目录结构支持多语言(如pages/about.vue对应所有语言)。现象:控制台报错Failed to load translation。
排查步骤:
locales/[locale].json)。lazy: true按需加载大文件:
i18n: {lazy: true,langDir: 'locales/',locales: [{ code: 'zh', file: 'zh-CN.json' }]}
场景:后端API返回的动态内容未翻译。
方案:
$t()包装动态数据(需提前加载对应语言的翻译)。Accept-Language自动切换。启用lazy和separateRoute减少初始包体积:
i18n: {lazy: true,separateRoute: true, // 为每个语言生成独立路由文件vueI18n: {messageCompiler: {func: true // 启用函数式翻译键}}}
nuxt.config.ts设置i18n.seo: false禁用元标签缓存(需手动管理)。通过routes配置覆盖默认行为:
i18n: {routes: {login: {en: '/sign-in',zh: '/登录'}}}
注意:自定义路由需与pages目录结构匹配,否则会触发404。
在Setup语法中直接使用useI18n:
<script setup>const { t, locale } = useI18n()const message = computed(() => t('welcome'))</script>
Nuxt + @nuxtjs/i18n的组合极大简化了多语言开发流程,但需严格遵循配置规范。关键点包括:版本兼容性、路由策略选择、SEO标签准确性及性能优化。建议通过单元测试验证语言切换逻辑,并利用Nuxt的DevTools实时调试国际化行为。掌握这些要点后,开发者可高效构建符合全球市场需求的Web应用。