Vue3 i18n 实践
在之前公司有做过国际化,但是并非自己搭建 ,如果你也没有相关经验且需要对日期插件支持,这篇文章应该对你有用。
实现方式
Vue3中实现国际化(i18n)大概分两种方式:
- 使用Vue I18n插件:
Vue I18n
是一个官方支持的国际化插件,它提供了一种在Vue应用程序中轻松管理多语言的方式。您可以通过安装并导入Vue I18n
库,然后在Vue
应用程序的入口文件中创建一个I18n
实例,并使用各种功能和选项来定义翻译消息、语言环境和翻译规则等。 - 自立更生:官方给我们提供了两个不错的思路,一是使用全局变量的方式,二则是利用
Provide
/inject
。
由于自立更生式实现复杂翻译(变量翻译和某些需要在翻译文本里插入参数)过于繁琐,所以我选择使用Vue I18n插件。
搭建与使用
安装Vue I18n:首先,使用npm
或yarn
安装Vue I18n
。
1 | npm install vue-i18n |
创建翻译文件:在你的项目中创建一个文件夹,用于存储不同语言的翻译文件。每个语言的翻译文件都是一个JSON
对象。
1 | src/ |
配置Vue I18n:在你的Vue
应用程序的入口文件中,导入Vue I18n
并进行配置。
1 | // index.ts |
1 | // main.ts |
以上是创建i18n
实例获取当前语言环境并引入到vue
全局。
在组件中使用翻译文本:通过$t
函数在组件模板中访问翻译文本,通过t
函数翻译组件脚本中的文本。
1 | <!-- 组件模板 --> |
1 | // 组件脚本 |
上面值得注意的是,在组件脚本中直接使用 $t
会提示”找不到 $t
声明”,这是由于 Compositon API
作用域导致的,这里选择获取 i18n
实例中的可访问属性 t
来达到与 $t
一样的效果。
问题一:控制台提示
1 | You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler to explicitly replace feature flag globals with boolean literals to get proper tree-shaking in the final bundle. |
如果遇到上述警告,则需要在webpack或Vite中添加配置:
1 | define: { |
webpack
则需要配置 DefinePlugin
相关资料链接:
vue i18n issues
Reduce bundle size with feature build flags
问题二:日期国际化
当切换Language时,所使用的DayJS
或MomentJS
不会切换到对应的语言。
对此在dayJS下面提过issues,仔细考虑发现这好像并不属于bug也不属于feature,于是只好自己封装。
以DayJS
为例,对dayjs
对象进行封装:
1 | export function i18nDayjs(date?: string | number | dayjs.Dayjs | Date | null | undefined): dayjs.Dayjs { |
上面 i18nDayjs
封装在”useFunction”内,利用computed
动态计算存储在pinia
的变量language,从而实现动态切换dayjs.locale
,这样在切换language后,日期也会随之变化。
最后
以上就是关于Vue3中国际化的实践了,主要用来记录i18n的实现思路,以及遇到的坑。
上述代码只是片段,与之相关的commit
: f60ea7a,f1fcb0c
$The\,End$