目的
项目需要支持多语言,我们需要提取出项目中使用的静态文本, 使用语言包进行管理, 当切换语言设置的时候,可以自动切换整个项目的文字显示
发现 vue 项目中有对应的组件 vue-i18n,而且对项目的代码修改不大, 于是就使用了这个组件去修改项目中的代码
安装
- // script 引入
- <script src="https://unpkg.com/vue/dist/vue.js"></script>
- <script src="https://unpkg.com/vue-i18n/dist/vue-i18n.js"></script>
- // npm 安装
- npm install vue-i18n
- // yarn 安装
- yarn add vue-i18n
一般一个项目中使用都是通过安装包的方式去运行的, script 引入的较少
使用
项目中配置 i18n
- import VueI18n from 'vue-i18n'
- Vue.use(VueI18n)
- const i18n = new VueI18n({
- local: 'cn', // 设置语言
- messages // 语言包
- })
- new Vue({
- el: '#app',
- ...
- i18n
- })
- // messages 大概的使用格式
- {
- cn: {
- name: '名字'
- },
- us: {
- name: 'Name'
- }
- }
使用 i18n
- // html 需要使用 {{}} 将 name 包装起来
- {{$t('name')}}
- // js
- $t('name')
还有一些其他的用法, 如:
针对不同语言, 显示不同的格式
如果在传入自定义变量来控制显示
... 具体的请参考官方文档
切换语言的话, 可以使用内置变量:
- // 通过设置 locale 来切换语言
- this.$i18n.locale = cn | us
语言包的生成 & 替换项目中原有的静态文本
这一步最关键, 抽离出所有出现的汉字, 替换成 $t('xxx'), 维护多个版本的语言文件
语言包这边是这么处理的, 项目下新增一个目录 languages
- --languages
- --lib
- -- cn.js // 中文语言包
- -- us.js // 英文语言包
- -- .. // 其他语言, 暂未实践
- -- index.js // 导出语言包
- cn.js
- export default {
- common: {
- message: '消息'
- },
- xxx: {
- }
- }
- us.js
- export default {
- common: {
- message: 'Messages'
- },
- xxx: {
- }
- }
- index.js
- import cn from './lib/cn.js'
- export default {
- cn,
- us
- }
替换文本
- <template>
- ...
- <div>{{$t('message')}}</div>
- ...
- </template>
问题
不同的语言, 格式不同, 长度不同, 可能需要调整项目的样式, 以保正常
对于一个已经在使用的项目, 生成语言包这一步工作量大, 浪费时间
没有考虑如果是否需要动态的加载语言包, 而非初始的加载所有的语言包
来源: https://juejin.im/post/5aa7e18ff265da2384404334