ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vue-i18n 迁移指南:从 v5 旧版 API 到 v6+ 全新实例化 API 的完整对照手册

vue-i18n 迁移指南:从 v5 旧版 API 到 v6+ 全新实例化 API 的完整对照手册 前端国际化【免费下载链接】vue-i18n:globe_with_meridians: Internationalization plugin for Vue.js项目地址https://gitcode.com/gh_mirrors/vu/vue-i18n点击查看免费下载导读本文基于 vue-i18n 官方迁移文档仓库gitbook/en/migrations.md整理而成系统梳理了从 vue-i18n v5 时代基于 Vue 全局静态 APIVue.locale、Vue.t、Vue.tc、Vue.te等向 v6 基于VueI18n类实例化 API构造器选项 实例属性 实例方法迁移的全部变更点。读完本文你将能够把旧版全局配置与全局方法逐项改写到新的VueI18n实例语法理解locale、fallbackLocale、messages、missing、formatter等新 API 的底层实现原理以及掌握用setLocaleMessage实现动态加载语言包Dynamic locale的完整实战方案。本文适用于正在从 v5 升级到 v6 及以上版本当前仓库版本为 8.x 系的 vue-i18n 使用者。迁移背景为什么需要这份对照表vue-i18n 从 v5 升级到 v6 时API 设计发生了根本性变化。v5 时代的插件把国际化能力以全局静态方法的形式挂载在Vue构造器上如Vue.locale、Vue.t而 v6 开始引入VueI18n类要求开发者显式创建一个VueI18n实例再通过i18n选项注入到 Vue 根实例中const i18n new VueI18n({ locale: ja, messages }) new Vue({ i18n }).$mount(#app)这一变化让语言环境locale、消息表messages、回退策略等配置全部收拢到单一实例内部既避免了全局污染也使得同一个页面中可以并存多个互不干扰的VueI18n实例。仓库 src/index.js 中VueI18n类的构造函数正是这套新 API 的实现载体下面各节的迁移对照都可以在该文件里找到对应的源码支撑。说明本仓库当前版本为 8.28.2见 package.json文中所有新 API 的说明均以当前仓库源码与 gitbook/en/api.md 为准。一、Global config全局配置项迁移v5 中通过全局配置设置的国际化参数在 v6 中全部改为VueI18n类构造器选项或实例属性。1.1lang→localelang全局配置已被替换。新用法是在VueI18n构造器中通过locale选项指定初始语言或通过VueI18n#locale属性在运行时动态切换const i18n new VueI18n({ locale: en, // ...其他选项 }) const app new Vue({ i18n }).$mount(#app) // 切换语言 i18n.locale ja // 或通过组件上注入的 $i18n 访问 app.$i18n.locale ja从源码看locale的默认值是en-USsrc/index.js并且locale属性是可读写的——读时返回内部_vm.locale写时通过$set触发响应式更新src/index.js因此切换语言后所有绑定$t的视图会自动重渲染。当你通过app.$i18n.locale ja赋值时本质上操作的是根实例注入的同一个VueI18n实例。1.2fallbackLang→fallbackLocalefallbackLang全局配置已被替换为fallbackLocale用于声明当当前语言缺少某条消息时的回退语言const i18n new VueI18n({ locale: ja, fallbackLocale: en, // ... }) const app new Vue({ i18n }).$mount(#app) // 修改回退语言 i18n.fallbackLocale zh // 或 app.$i18n.fallbackLocale zh源码中fallbackLocale的默认值与locale一样是en-USsrc/index.js且支持更复杂的回退定义数组、对象形式的 locale 链详见仓库 gitbook/en/fallback.md。注意当fallbackLocale被写入新值时源码会清空_localeChainCache缓存再$set更新src/index.js保证回退链按最新配置重建。1.3missingHandler→missingv5 的missingHandler被替换为missing选项/属性用于处理翻译缺失场景。回调签名保持(locale, key, vm)三个参数const i18n new VueI18n({ // ... missing: (locale, key, vm) { // 处理翻译缺失逻辑例如上报或提示 }, // ... }) const app new Vue({ i18n }).$mount(#app) // 运行时替换 missing 处理器 i18n.missing (locale, key, vm) { // 新的处理逻辑 } // 或 app.$i18n.missing (locale, key, vm) { // 新的处理逻辑 }源码中missing的默认值为nullsrc/index.js并提供了可读写的 getter/settersrc/index.js。它在底层_warnDefault中被调用当某条 key 翻译结果为空时若设置了missing处理器则调用this._missing.apply(null, [locale, key, vm, values])若处理器返回字符串则直接作为翻译结果返回反之未设置处理器则在非生产环境下发出警告src/index.js。也就是说设置missing后缺失翻译不再告警而是交给你的回调自行处理。1.4i18nFormatter→formatterv5 的i18nFormatter被替换为formatter选项/属性。自定义格式化器需要实现format(message, ...values)接口class CustomFormatter { format (message, ...values) { // 自定义渲染逻辑 return something string } } const i18n new VueI18n({ // ... formatter: new CustomFormatter(), // ... }) const app new Vue({ i18n }).$mount(#app) // 运行时替换为普通对象形式的格式化器 i18n.formatter { format: (message, ...values) { // 自定义渲染逻辑 return something string } } // 或 app.$i18n.formatter { format: (message, ...values) { // 自定义渲染逻辑 return something string } }从源码看formatter默认使用内置的BaseFormatterdefaultFormattersrc/index.js构造器在this._formatter options.formatter || defaultFormatter处取值src/index.js。内置格式化器实现在 src/format.js它会把消息字符串解析为text / named / list / unknown四种 token 并缓存解析结果然后按命名参数或列表参数模式编译替换。自定义格式化器的渲染入口在_render方法中——若自定义 formatter 的interpolate返回空值会自动回退到内置defaultFormattersrc/index.js因此自定义格式化器失败时不会导致页面白屏。更完整的自定义格式化实践可参考仓库示例 examples/formatting/custom。二、Global methods全局方法迁移v5 把翻译方法直接挂在Vue构造器上v6 改为VueI18n实例方法。2.1Vue.locale→messages选项 getLocaleMessage/setLocaleMessagev5 通过Vue.locale静态方法注册/读取语言消息新版本改用构造器messages选项初始化配合实例方法读写const i18n new VueI18n({ // ... messages: { en: { hello: hello world, // ... }, ja: { hello: こんにちは、世界, // ... } }, // ... }) const app new Vue({ i18n }).$mount(#app) // 读取某语言的 locale messages返回的是浅拷贝 const en i18n.getLocaleMessage(en) en.greeting hi! // 写回 i18n.setLocaleMessage(en, en) // 或通过组件实例 const ja app.$i18n.getLocaleMessage(ja) ja.greeting やあ app.$i18n.setLocaleMessage(ja, ja)源码实现上getLocaleMessage返回looseClone(this._vm.messages[locale] || {})src/index.js——注意返回的是浅拷贝直接修改返回对象不会生效必须再调用setLocaleMessage写回。setLocaleMessage内部通过this._vm.$set(this._vm.messages, locale, message)触发响应式更新src/index.js因此动态注入语言包后视图会立即刷新。此外还有mergeLocaleMessage6.1用于合并而非整体覆盖src/index.js以及messages只读属性与availableLocales属性按字母序返回已注册语言列表src/index.js。2.2Vue.t→VueI18n#tVue.t被替换为实例方法t(key, [locale], [values])const i18n new VueI18n({ locale: en, messages: { en: { greeting: hi {name} } }, // ... }) i18n.t(greeting, { name: kazupon }) // - hi kazupont支持命名参数上例与列表参数两种格式对应底层 src/format.js 中{name}形式的 named token 与{0}形式的 list token 解析。t的完整签名与$t一致更多格式化细节见 gitbook/en/formatting.md。2.3Vue.tc→VueI18n#tcVue.tc被替换为tc(key, [choice], [values])用于复数pluralization翻译const i18n new VueI18n({ locale: en, messages: { en: { apple: no apples | one apple | {count} apples } }, // ... }) const count 10 i18n.tc(apple, count, { count }) // - 10 apples复数消息通过|分隔多个形式。底层_tc会把count预置进参数predefined { count: choice, n: choice }再调用fetchChoice按getChoiceIndex选择的索引切片src/index.js。默认复数规则是英语兼容实现2 个选择时按1判定多于 2 个时取Math.min(choice, 2)src/index.js。俄语等拥有复杂复数体系的语言可通过构造器pluralizationRules选项注入自定义规则src/index.js详见 gitbook/en/pluralization.md。2.4Vue.te→VueI18n#teVue.te被替换为te(key, [locale])用于判断某条 key 是否存在const i18n new VueI18n({ locale: en, messages: { en: { hello: hello world } }, // ... }) i18n.te(hello) // - true i18n.te(hallo, ja) // - false i18n.te(hello) // - true底层te通过_exist判断先尝试用路径解析器getPathValue按 keypath 取值再对扁平 key 做兜底判断message[key]src/index.js因此既支持message.hello这类嵌套路径也支持扁平 key。三、Constructor options构造器选项迁移3.1locales→messagesv5 构造器选项locales被替换为messages同时在组件级Component option的i18n选项中同样使用messages// 全局级VueI18n 构造器 const i18n new VueI18n({ locale: en, messages: { en: { greeting: hi {name} } }, // ... }) // 组件级组件 option 中的 i18n.messages const Component1 { i18n: { messages: { en: { title: Title1 } } } }组件级i18n选项在 src/mixin.js 的beforeCreate钩子中被处理如果options.i18n是普通对象且根实例存在$i18n则组件会继承根实例的formatter、fallbackLocale等配置并创建独立的组件级VueI18n实例。组件级语言消息优先于全局语言消息这是 vue-i18n 组件化本地化的核心机制完整说明见 gitbook/en/component.md。四、Instance properties实例属性迁移4.1$lang→locale属性v5 中组件实例上的$lang属性被替换为VueI18n#locale属性const i18n new VueI18n({ locale: en, // ... }) const app new Vue({ i18n }).$mount(#app) // 切换语言 i18n.locale ja // 或 app.$i18n.locale ja由于locale是响应式属性修改后所有依赖当前 locale 的翻译、日期/数字格式化都会自动刷新。组件上可通过注入的$i18n拿到根实例gitbook/en/api.md 中$i18n注入属性的说明因此app.$i18n.locale ja与i18n.locale ja完全等价。五、Features功能迁移5.1 Dynamic locale动态语言包被移除改用setLocaleMessage自行实现v5 内置的 Dynamic locale 功能在 v6 中被移除。如果需要在运行时动态加载语言包官方迁移文档给出了基于fetchsetLocaleMessage的完整参考实现const i18n new VueI18n({ locale: en }) const app new Vue({ i18n, data: { loading: } }).$mount(#app) function loadLocaleMessage (locale, cb) { return fetch(/locales/ locale, { method: get, headers: { Accept: application/json, Content-Type: application/json } }).then((res) { return res.json() }).then((json) { if (Object.keys(json).length 0) { return Promise.reject(new Error(locale empty !!)) } else { return Promise.resolve(json) } }).then((message) { cb(null, message) }).catch((error) { cb(error) }) } app.loading loading ... loadLocaleMessage(en, (err, message) { if (err) { app.loading console.error(err) return } i18n.setLocaleMessage(en, message) app.loading })这段代码的要点拆解先创建实例、后注入消息new VueI18n({ locale: en })只声明语言不预置消息表UI 渲染前先展示loading ...状态。异步拉取 JSON通过fetch(/locales/ locale)按语言拉取语言包并校验返回对象非空空对象会reject为locale empty !!错误。写回实例成功后在回调中调用i18n.setLocaleMessage(en, message)。从源码看setLocaleMessage通过$set把消息挂到响应式数据上src/index.js翻译会立即生效随后清除loading状态。这也是 gitbook/en/lazy-loading.md 中“按需加载语言包”方案的核心原语。在实际项目中你还可以配合mergeLocaleMessage做增量合并或利用availableLocales属性判断某个语言是否已加载。六、迁移检查清单把上面的对照关系汇总成一张速查表方便升级时逐项核对v5 旧 APIv6 新 API说明lang全局配置VueI18n构造器locale选项 /locale属性默认en-US响应式可读写fallbackLang全局配置fallbackLocale选项 / 属性默认en-US支持 locale 链missingHandler全局配置missing选项 / 属性回调签名(locale, key, vm)设置后缺失不再告警i18nFormatter全局配置formatter选项 / 属性需实现format(message, ...values)失败自动回退内置格式化器Vue.locale全局方法messages选项 getLocaleMessage/setLocaleMessage返回浅拷贝改后需写回Vue.t全局方法VueI18n#t支持命名/列表参数Vue.tc全局方法VueI18n#tc复数翻译可自定义pluralizationRulesVue.te全局方法VueI18n#te支持 keypath 与扁平 keylocales构造器选项messages构造器 / 组件i18n选项组件级消息优先于全局$lang实例属性locale属性通过$i18n或实例直接访问Dynamic locale功能移除用setLocaleMessage自行实现官方给出了 fetch 加载参考实现迁移后的典型代码形态迁移完成后一个典型的 v6 应用形态如下与 gitbook/en/started.md 中的入门示例一致// 模块系统下需显式安装CDN 全局 script 方式会自动安装 // import Vue from vue // import VueI18n from vue-i18n // Vue.use(VueI18n) const messages { en: { message: { hello: hello world } }, ja: { message: { hello: こんにちは、世界 } } } const i18n new VueI18n({ locale: ja, // 设置初始语言 messages, // 设置语言消息 }) new Vue({ i18n }).$mount(#app)需要补充的两点实践提醒安装方式使用 NPM/Yarn 模块系统时必须显式Vue.use(VueI18n)见 gitbook/en/installation.md而VueI18n构造器本身也内置了自动安装逻辑——若window.Vue存在且尚未安装会在实例化时自动install(window.Vue)src/index.js。升级范围本文对照的是 v5 → v6含当前 8.x的 API 变更。若你的项目还要继续向 vue-i18n v9 迁移需要注意 9.x 中fallbackRootWithEmptyString等行为的默认值变化当前仓库 src/index.js 与 gitbook/en/api.md 中有明确说明。总结v5 → v6 的迁移本质是从“Vue 全局静态国际化 API”走向“VueI18n 实例化 API”所有配置locale、fallbackLocale、messages、missing、formatter收拢为构造器选项与实例属性所有能力翻译、复数、存在性检查、消息读写收拢为实例方法被移除的 Dynamic locale 则由setLocaleMessage 异步加载自行实现。当前仓库的 src/index.js核心实现、src/format.js内置格式化器、src/mixin.js组件级注入、gitbook/en/api.md完整 API 参考是继续深入这套新 API 的第一手资料升级改造时可直接对照查阅。赞分享前端国际化【免费下载链接】vue-i18n:globe_with_meridians: Internationalization plugin for Vue.js项目地址https://gitcode.com/gh_mirrors/vu/vue-i18n点击查看免费下载相关推荐CANN ops-math Power算子文档Power 查看源码 https://link.gitcode.com/i/55c21caba36d7a1b6ca8cacb4b3670c5 本算子仅提供算子库人工智能CANNExpress-Validator 从 v5 迁移到 v6 的完整指南Express Validator 从 v5 迁移到 v6 的完整指南 前言 Express Validator 是一个流行的 Express 中间件用于验证后端Open Battery Information终极电池修复工具完整指南轻松解锁BMS故障Open Battery Information终极电池修复工具完整指南轻松解锁BMS故障 在现代电子设备维修领域电池管理系统BMS故障常常导致完好的嵌入式硬件开发智能硬件上一篇CameraKit iOS照片拍摄进阶技巧分辨率、闪光灯与对焦控制下一篇gRPC Security Handshakers 源码深度解析TLS/ALTS 握手框架与安全端点实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表