前言
我创建的模板是基于vue2的模板,uni-app模板内部已经包含了vue-i18n,所以不需要通过npm方式安装vue-i18n。
1. 创建locale文件目录
ps:语言包文件一定要跟index.js同级,不然在pages.json设置语言将不生效。
├── locale/
│ ├──zh-Hans.json // 中文简体
│ ├──pt-BR.json // 巴西葡萄牙语
│ ├──index.js
zh-Hans.json文件
{
"locale.zh-hans": "Chinês",
"locale.pt-BR": "Português",
}
pt-BR.json文件
{
"locale.zh-hans": "简体中文",
"locale.pt-BR": "葡萄牙语",
}
index.js
// vue2配置
import Vue from 'vue'
import VueI18n from 'vue-i18n'
// 国际化 json 文件
import zhHans from './zh-Hans.json' // 中文简体
import ptBR from './pt-BR.json' // 巴西葡萄牙语
const messages = {
'zh-Hans': zhHans,
'pt-BR': ptBR,
}
const i18nConfig = {
locale: uni.getLocale(), // 获取已设置的语言
messages
}
Vue.use(VueI18n)
const i18n = new VueI18n(i18nConfig)
export default i18n
// vue3配置
import { createI18n } from 'vue-i18n'
// 国际化 json 文件
import zhHans from './zh-Hans.json' // 中文简体
import ptBR from './pt-BR.json' // 巴西葡萄牙语
const messages = {
'zh-Hans': zhHans,
'pt-BR': ptBR,
}
const i18nConfig = {
locale: uni.getLocale(), // 获取已设置的语言
messages
}
const i18n = createI18n(i18nConfig)
export default i18n
main.js 引入
// vue2
import App from './App'
import Vue from 'vue'
// 国际化
import i18n from './locale/index.js'
Vue.use(i18n)
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
i18n,
...App
})
app.$mount()
// vue3
import { createSSRApp } from 'vue'
import i18n from './locale/index.js'
export function createApp() {
const app = createSSRApp(App)
app.use(i18n)
return {
app
}
}
2. 在页面使用
ps: $t()是i18n自带方法,可以全局使用。
在页面使用
<template>
<view>{{$t('locale.pt-BR')}}</view>
</template>
在js使用
<script>
export default {
onLoad() {
const locale = this.$t('locale.pt-BR')
console.log(locale);
}
}
</script>
3.切换语言
ps: 页面中设置语言后需要调用this.$i18n.locale='zh-Hans’后生效。
<template>
<view class="content">
<view class="text-area">
<text class="title">{{$t('locale.pt-BR')}}</text>
<button @click="langChange('zh-Hans')">简体中文</button>
<button @click="langChange('pt-BR')">葡萄牙语</button>
</view>
</view>
</template>
<script>
export default {
data() {
return {}
},
onLoad() {},
methods: {
langChange(lang) {
uni.setLocale(lang)
this.$i18n.locale = lang
}
}
}
</script>
<style>
.content {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.text-area {
display: flex;
justify-content: center;
flex-direction: column;
}
.title {
font-size: 36rpx;
color: #8f8f94;
}
</style>
4. 在pages.json中使用 %% 占位
ps:语言包文件一定要跟index.js同级,不然在pages.json设置语言将不生效。
{
"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "%index.home%"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "uni-app",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
}