切換中英文等其他語言,步驟如下:
1、獲取vue-i18n的js文件
官方下載地址 https://unpkg.com/vue-i18n@8.21.0/dist/vue-i18n.js
或者在https://gitee.com/TANJIE-2020/vue-i18n下載demo源碼,將demo源碼中的lang文件夾直接復制到項目根目錄,與src同層級;
目錄結構如下圖:

2、lang文件夾
vue-i18n.js 就是下載的 國際化語言js;
zh_CN.js 中文js
export default { index: { title:'你好,UNI-APP', navBack:'返回', set:'設置', mine:'我的', navTitle:'菜單', currentSystemLang:'當前系統語言', langChange:'語言切換', navRightMenu:'菜單', tabBar:{home:'首頁',shop:'商店',search:'搜索',mine:'我的'} }, }
en_US.js 英文js
export default { index: { // 首頁語言 title:'HELLO,UNI-APP', navBack:'back', set:'set', mine:'mine', navTitle:'menu', currentSystemLang:'Current system language', langChange:'Language switch', navRightMenu:'menu', tabBar:{home:'home',shop:'shop',search:'search',mine:'mine'} }, }
trad_CN.js 繁體js
等等各種語言...
index.js 所有語言匯總,最后將index.js引入main.js中
// index.js import Vue from 'vue' import VueI18n from './vue-i18n' Vue.use(VueI18n) const system_info = uni.getStorageSync('system_info') console.log(system_info) if (!system_info) { // 獲取設備信息 uni.getSystemInfo({ success: function (res) { console.log('設備信息'+res) if(res.language.indexOf('zh') >= 0) { return uni.setStorageSync('system_info', {language:'zh_CN'}) } if(res.language.indexOf('en') >= 0) { return uni.setStorageSync('system_info', {language:'en'}) } } }) } const cur_lang = system_info.language == 'en' ? 'en' : 'zh_CN' const i18n = new VueI18n({ locale: cur_lang || 'zh_CN', // 默認選擇的語言 messages: { 'en': LangEn, 'zh_CN': LangCn, 'trad_CN': LangTrad } }) export default i18n
// main.js import Vue from 'vue' import App from './App' Vue.config.productionTip = false; App.mpType = 'app'; import i18n from './lang/index' Vue.prototype._i18n = i18n const app = new Vue({ i18n, ...App }) app.$mount()
語言切換頁面 language.vue
<template>
<view class="language-container">
<view class="language-content">
<view class="item" v-for="(item,index) in List" :key="index" @click="chooseLanguage(index,item.lang)">
<view class="item-left">{{ item.name }}</view>
<view class="item-right" v-if="item.src != ''">
<image mode="widthFix" :src="item.src"></image>
</view>
</view>
</view>
</view>
</template>
<script>
export default{
data() {
return{
system_lenguage:'',
List:[
{
name:'跟隨系統',
lang:'',
src:'../../../../static/center-icon/icon_grzx_xtsz_yy_xz.png'
},
{
name:'中文(簡體)',
lang:'zh_CN',
src:''
},
{
name:'中文(繁體)',
lang:'trad_CN',
src:''
},
{
name:'English',
lang:'en',
src:''
}
]
}
},
onLoad() {
const system_info = uni.getStorageSync('system_info')
this.system_lenguage = this._i18n.locale = system_info.language
const langList = uni.getStorageSync('langList')
if(langList.length == 0) {
//
} else {
this.List = langList
}
},
onShow() {
uni.setNavigationBarTitle({
title:this.$t('pagesTitle').Language
})
},
computed: {
i18n() {
return this.$t('home')
}
},
methods:{
// changeLanguage(){
// console.log('語言切換')
// const system_info = uni.getStorageSync('system_info')
// this.system_lenguage = system_info.language;
// system_info.language === 'en' ? system_info.language = this._i18n.locale = 'zh_CN' : system_info.language = this._i18n.locale = 'en'
// uni.setStorageSync('system_info',system_info)
// uni.setTabBarItem({index: 0,text: this.i18n.tabBar.home});
// uni.setTabBarItem({index: 1,text: this.i18n.tabBar.shop});
// uni.setTabBarItem({index: 2,text: this.i18n.tabBar.search});
// uni.setTabBarItem({index: 3,text: this.i18n.tabBar.mine});
// uni.reLaunch({
// url: 'index'
// })
// },
chooseLanguage(index,lang) {
let self = this
const system_info = uni.getStorageSync('system_info')
self.system_lenguage = system_info.language;
self.List.forEach((item,i) => {
if(index == 0) {
uni.getSystemInfo({
success: function (res) {
if(res.language.indexOf('zh') >= 0) {
return system_info.language = self._i18n.locale = 'zh_CN'
}
if(res.language.indexOf('en') >= 0) {
return system_info.language = self._i18n.locale = 'en'
}
}
})
}
if(index == i) {
if(item.src == '../../../../static/center-icon/icon_grzx_xtsz_yy_xz.png') return
item.src = '../../../../static/center-icon/icon_grzx_xtsz_yy_xz.png'
system_info.language = self._i18n.locale = lang
} else {
item.src = ''
}
})
uni.setStorageSync('system_info',system_info)
uni.setStorageSync('langList',self.List)
}
}
}
</script>
<style lang="scss" scoped>
.language-container{
background-color: #f5f6f7;
min-height: 100vh;
padding-top: 20rpx;
.language-content{
background-color: #fff;
.item{
display: flex;
justify-content: space-between;
padding: 0 20rpx;
align-items: center;
height: 90rpx;
border-bottom: 1px solid #f4f1f1;
.item-left{
color: #444;
font-size: 28rpx;
}
.item-right{
width: 30rpx;
image{
width: 100%;
height: 100%;
}
}
}
}
}
</style>
其他頁面中
<template>
<view class="popula-container">
<view class="popula-content">
<view class="popu-img">
<image mode="widthFix" src="../../../static/center-icon/icon_grzx_mlz.png"></image>
</view>
<view class="popu-title">{{ i18n.ruheyongyourenqizhi }}</view> // 頁面中使用
<view class="popu-text">{{ i18n.ruheyongyourenqizhidezhi }}</view>
</view>
</view>
</template>
<script>
export default{
data() {
return {
system_lenguage:'',
}
},
onLoad() {
const system_info = uni.getStorageSync('system_info')
this.system_lenguage = this._i18n.locale = system_info.language
},
mounted() {
uni.setNavigationBarTitle({
title:this.$t('pagesTitle').Popularity // js 中使用
})
},
computed: {
i18n() {
return this.$t('center')
}
},
}
</script>
<style lang="scss" scoped>
.popula-container{
background-color: #f5f6f7;
min-height: 100vh;
position: relative;
.popula-content{
width: 500rpx;
height: 500rpx;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-250rpx,-250rpx);
.popu-img{
width: 200rpx;
margin: 0 auto;
image{
width: 100%;
height: 100%;
}
}
.popu-title{
font-size: 35rpx;
color: #333;
text-align: center;
margin: 30rpx 0;
}
.popu-text{
color: #999;
font-size: 30rpx;
text-align: center;
}
}
}
</style>
每個頁面中都要使用 onLoad() 和 computed 中的代碼
