nuxtjs/i18n
v8.x 升级到 v9.xVue I18n 已从 v9 升级到 v10。Vue I18n v10 没有新增重大功能,但有一些破坏性的变化,例如删除了在 v9 中被弃用的某些功能,并将 API $tc()
集成到 $t()
中,可以在旧版 API 风格中使用。
更多信息,请查看文档 这里。
jit
选项JIT 编译现在是 Vue I18n v10 的默认选项。
https://vue-i18n.intlify.dev/guide/migration/breaking10.html#default-enable-for-jit-compilation
因此,在 Nuxt I18n v8 中的 jit
选项不再需要,因此已被删除。
langDir
默认值我们现在使用与 Nuxt 4 中的目录结构变更 一致的默认目录结构。
变更内容:
langDir
现在默认为 'locales'
。<rootDir>/i18n
解决,可以使用 restructureDir
选项进行配置。以下是此更改后的项目结构示例:
app/
server/
i18n/
locales/
en.json
ja.json
i18n.config.ts
localeDetector.ts
nuxt.config.ts
变更原因:
app/
和 server/
外面的根目录使用专用的 i18n/
文件夹更为合理。为了便于迁移到 v9,您可以通过设置 restructureDir: false
来禁用该功能,此选项将在 v10 中被移除。
iso
重命名为 language
语言环境对象上的 iso
属性已重命名为 language
,以与网页上的语言标签使用一致(例如 navigator.language
和 Accept-Language
)。原来的 iso
属性名称指的是描述有效语言标签的 ISO 标准,详情请参见 相关问题。
一些属性已更改名称或互换,以更好地符合其功能。本模块配置的运行时配置属性主要用于内部目的,不应依赖,但值得注意的是这些变化。
v8 | v9 | 备注 |
---|---|---|
locales | domainLocales | 这还将环境变量键更改为 NUXT_PUBLIC_I18N_DOMAIN_LOCALES_{code}_DOMAIN ,请参见 runtimeConfig |
configLocales | locales |
useLocaleHead()
useLocaleHead()
和 $localeHead()
的选项参数的结构已更改,具有更简洁的属性名称,并且默认启用这些选项。
以下表格比较了 v8 和 v9 中 useLocaleHead()
和 $localeHead()
的选项属性:
v8 | v9 | 备注 |
---|---|---|
- | lang | 新属性,用于配置 lang HTML 属性,默认为 true |
addDirAttributes | dir | 默认已更改:false -> true |
addSeoAttributes | seo | 默认已更改:false -> true |
identifierAttribute | key |
我们在 useLocaleHead()
和 $localeHead()
的选项参数中添加了 lang
属性,原本这个属性是不可单独配置的,详情请参见 useLocaleHead()
。
在 v8 中,注入的上下文函数(例如 $localePath()
, $switchLocalePath()
等)类型和名称未能如预期工作。即使未从组合函数赋值,这些函数在使用时可能也会发现它们可以不带前缀($
)使用。
在 v9 中,类型和名称已被修复,如果您在项目中全局使用未加前缀的函数(没有组合函数),您需要按照原本的意图为这些函数添加前缀。
getRouteBaseName()
-> $getRouteBaseName()
resolveRoute()
-> $resolveRoute()
localePath()
-> $localePath()
localeRoute()
-> $localeRoute()
localeLocation()
-> $localeLocation()
switchLocalePath()
-> $switchLocalePath()
localeHead()
-> $localeHead()
dynamicRouteParams
选项及遗留动态路由参数实现通过设置 nuxtI18n
属性与 definePageMeta()
设置动态路由参数的功能已被完全移除,取而代之的是 useSetI18nParams()
组合函数,该功能默认启用,这意味着 dynamicRouteParams
选项不再必要。
组合函数的用法与弃用的实现类似,以下是迁移示例:
<script>
definePageMeta({
nuxtI18n: {
en: { id: 'my-post' },
fr: { id: 'mon-article' }
}
})
</script>
<template>
<!-- pages/post/[id].vue -->
</template>
应更改为:
<script>
const setI18nParams = useSetI18nParams();
setI18nParams({
en: { id: 'my-post' },
fr: { id: 'mon-article' }
})
</script>
<template>
<!-- pages/post/[id].vue -->
</template>
有关更多详细信息,请查看 语言切换器 指南。
nuxtjs/i18n
v7.x 升级到 v8.xvueI18n
选项以不接受 createI18n
选项这是为了确保编译/构建时与运行时之间的稳定性和区分,因为 vue-i18n 在运行时被使用。
更多详细信息请参见 GitHub 拉取请求。
您可以继续在 i18n.config
中定义 vueI18n
选项。有关如何操作的示例,请参见 Vue i18n 和 基本使用 部分。
pages
选项中的路由键规则在 pages
选项中设置的路由键已变更为相对于 Nuxt 中的 pages/
目录的文件基础,并且 不包括前导 /
。
原因是这与 Nuxt 基于文件的路由匹配更为直观。
Nuxt2:
-| pages/
---| about.vue
---| users/
-----| _id/
-------| profile.vue
---| index.vue
i18n: {
parsePages: false,
pages: {
about: {
fr: '/a-propos',
},
'users/_id/profile': {
fr: '/u/:id/profil',
}
}
}
Nuxt3:
pages/
├── about.vue
├── users/
├──── [id]/
├────── profile.vue
├── index.vue
i18n: {
customRoutes: 'config',
pages: {
about: {
fr: '/a-propos',
},
'users/[id]/profile': {
fr: '/u/[id]/profil',
}
}
}
localeLocation()
对于选项 API 风格,请使用 localeRoute
代替。弃用的原因是关于 Vue Router 中路由解析的接口更改。
localeLocation()
由于与 localeLocation()
选项 API 的同样原因而被弃用。
$nuxtI18nHead()
对于选项 API 风格,请使用 localeHead()
代替。
nuxtI18n
组件选项已被 defineI18nRoute()
编译宏替代,因为它可以与打包器优化。
Nuxt2:
<script>
import Vue from 'vue'
export default Vue.extend({
nuxtI18n: {
paths: {
pl: '/polish'
}
}
})
</script>
Nuxt3:
<script setup>
defineI18nRoute({
paths: {
pl: '/polish'
}
})
</script>
parsePages
选项使用 customRoutes
选项。因为选项名称 parsePages
并不直观。
export default defineNuxtConfig({
modules: [
'@nuxtjs/i18n'
],
i18n: {
// ...
- parsePages: false,
+ customRoutes: 'config',
// ...
}
})
vuex
选项Nuxt i18n 模块不再需要 Vuex,请使用 useSetI18nParams
组合函数代替以设置动态路由参数。
export default defineNuxtConfig({
modules: [
'@nuxtjs/i18n'
],
i18n: {
// ...
- vuex: true,
// ...
}
})
有关更多详细信息,请参见 语言切换器。
sortRoutes
选项此选项不再需要,因为 Nuxt 3 中的路由不再需要排序。
skipNuxtState
选项此选项不再需要,因为它可以用 多文件懒加载 替代,该功能在 v8 中得到支持。
i18n:extend-messages
钩子被 i18n:registerModule
钩子所替代,弃用原因如下:
替代的 i18n:registerModule
钩子与懒加载翻译的工作方式相同。只有语言环境消息的文件信息被序列化并传递到运行时上下文。语言环境消息通过动态导入加载,然后懒加载,在性能上没有负面影响。
有关更多详细信息,请参见 扩展消息钩子。
vueI18nLoader
选项此选项不再需要,因为 i18n 自定义块由 unplugin-vue-i18n 作为默认支持。
onBeforeLanguageSwitch
和 onLanguageSwitched
函数选项这些函数现在可以通过 Nuxt 运行时钩子触发。有关如何使用这些钩子的更多信息,请参考 运行时钩子。
以下 API 已更改为 $
:
i18n
-> $i18n
getRouteBaseName()
-> $getRouteBaseName()
localePath()
-> $localePath()
localeRoute()
-> $localeRoute()
switchLocalePath()
-> $switchLocalePath()
Vuex 扩展 API 已被移除,因为在 Nuxt3 中不再需要 Vuex。
以下 API 不再可用:
$i18n
getRouteBaseName()
localePath()
localeRoute()
localeLocation()
switchLocalePath()