迁移指南

按照本指南从 v9.x 升级到 v10.x

升级到 Vue I18n v11

我们已将 Vue I18n 从 v10 升级到 v11,此主要版本更新已弃用 Legacy API 模式和自定义的 v-t 指令,并且从 Legacy API 模式中移除了 tc()$tc()

请查看关于破坏性变更的详细文档 这里

配置选项

以下 配置选项 已被更改、弃用或移除。

状态选项说明
promotedexperimental.hmr默认启用,并更名为 hmr
promotedexperimental.switchLocalePathLinkSSR默认启用,且不再提供禁用此功能的选项。
promotedexperimental.autoImportTranslationFunctions默认启用,并更名为 autoDeclare
changedrestructureDir该选项不能再被禁用。

建议保持未设置状态以使用默认值 'i18n'
deprecatedtypesv11 只支持 'composition' 类型,与 Vue I18n v12 保持一致。
deprecatedbaseUrlv11 仅允许字符串值,不再支持函数配置。

复杂场景请使用运行时配置或依赖多域名本地化设置基地址。
deprecatedroutesNameSeparator文档中标记为内部使用,终端用户的使用场景不明确。
deprecateddefaultLocaleRouteNameSuffix文档中标记为内部使用,终端用户的使用场景不明确。
removedlazy现在所有的语言包文件均启用懒加载。
removedbundle.optimizeTranslationDirective该功能已被禁用并彻底移除,详细上下文见 此议题讨论
removedexperimental.generatedLocaleFilePathFormat本模块对文件路径(例如语言包文件、vue-i18n 配置)相关配置已完全移除,使此选项过时。

行为变化

浏览器语言检测

语言检测和重定向的改进遵循了文档中严格的行为。在 v9 中,某些 strategyredirectOn 选项的组合表现出意外的行为,这在 v10 中已得到修正。

关键变化:当使用 strategy: 'prefix'redirectOn: 'root' 时,非根路径(例如 '/search')将不再自动重定向到其本地化版本(例如 '/zh/search')。

迁移:如果您需要对所有路径使用前缀策略进行重定向,请更新您的配置:

export default defineNuxtConfig({
  i18n: {
    strategy: 'prefix',
    detectBrowserLanguage: {
-      // redirectOn: 'root', // ⚠️ In v10 this will only redirect the root path
+      redirectOn: 'all',  // Redirects all paths as documented
    }
  }
})

影响:这影响了使用 strategy: 'prefix' 的项目,这些项目依赖于之前意外的行为,即 redirectOn: 'root' 也处理非根路径。

有关可用选项的更多详细信息,请参见 redirectOn 文档

I18n 函数

以下组合式函数和 I18n 函数 已被更改、弃用或移除。

状态函数说明
changeduseLocaleHead()options 参数中的 key 属性已被移除,无法再配置,这是为了实现可预测且一致的本地化头部标签管理。
removedonLanguageSwitched()请使用 'i18n:localeSwitched' 钩子替代。

该函数实际上是触发钩子而非订阅,导致行为不可预测。
removedonBeforeLanguageSwitch()请使用 'i18n:beforeLocaleSwitch' 钩子替代。

该函数实际上是触发钩子而非订阅,导致行为不可预测。

上下文函数

以下 上下文函数 已被更改、弃用或移除。

状态函数说明
changed$localeHead()options 参数中的 key 属性已被移除,无法再配置,这是为了实现可预测且一致的本地化头部标签管理。
deprecated$localeHead()请改用 useLocaleHead() 组合式函数。

因使用场景有限已被弃用,且 useLocaleHead() 提供相同功能,且与 useHead() 配合更易使用。
deprecated$getRouteBaseName()请使用 $routeBaseName() 替代。

这是为了与其他上下文函数及其组合式函数名保持一致。
removed$resolveRoute()请使用 $localeRoute() 替代。
removed$localeLocation()请使用 $localeRoute() 替代。

运行时配置

部分设置在运行时配置中的选项仅用于将构建时配置传递到运行时,且运行时更改这些选项可能导致问题。

我们现将其视为编译器常量,而非运行时配置,这样可以对未使用的逻辑进行树摇,减少项目体积。

以下选项已从运行时配置中移除:

已移除的运行时配置选项
lazy
strategy
trailingSlash
differentDomains
defaultDirection
multiDomainLocales
routeNameSeparator
defaultLocaleRouteNameSuffix

生成的选项

项目中生成的选项文件是本模块在运行时内部使用的,不应被使用,未来可能会移除更多属性。

未来对这些内部选项的更改将不会在迁移指南中记录。如果您有这些选项的使用案例,请提交一个问题,描述您的使用案例,以便我们评估是否可以以不同的方式支持它。

生成的选项文件已重命名:

旧名称新名称
#build/i18n-options.mjs#build/i18n-options.mjs
#internal/i18n/options.mjs#internal/i18n-options.mjs

以下导出已从生成的选项中移除:

已移除的导出
isSSG
hasPages
parallelPlugin
nuxtI18nOptions
DEFAULT_COOKIE_KEY
DYNAMIC_PARAMS_KEY
NUXT_I18N_MODULE_ID
SWITCH_LOCALE_PATH_LINK_IDENTIFIER

移除理由:

  • 这些导出不再被模块使用,且可能在最终构建中暴露敏感信息
  • 部分选项现作为静态值使用,以实现更好的树摇效果,减小项目体积。

传统迁移

v7 和 v8 的迁移指南可在旧版文档中找到。