这个话题纯属炒冷饭,已经有不少同行搞出来了,本文只是记录自己处理的过程。
不管哪个系统,多语言方案套路都是一样的
1、建立多语言映射库
2、记录并存储用户选择的语言版本,下次进入直接进入对应语言版本
3、根据用户设置动态加载语言版本
4、前台调用
上代码
项目根目录新建i18n目录,在该目录下存放不同版本的语言库
zh_CN.js
const languageMap = {
\'简体中文\': \'简体中文\',
\'繁体中文\': \'繁体中文\',
\'英文\': \'英文\',
\'多语言\': \'多语言\',
\'设备状态可视图\': \'设备状态可视图\',
\'当前班次\': \'当前班次\',
\'近一周\': \'近一周\',
\'近一月\': \'近一月\',
\'近三月\': \'近三月\'
}
module.exports = {
languageMap: languageMap
}
zh_TW.js
const languageMap = {
\'简体中文\': \'簡體中文\',
\'繁体中文\': \'繁體中文\',
\'英文\': \'英文\',
\'多语言\': \'多語言\',
\'设备状态可视图\': \'設備狀態可視圖\',
\'当前班次\': \'當前班次\',
\'近一周\': \'近壹周\',
\'近一月\': \'近壹月\',
\'近三月\': \'近三月\'
}
module.exports = {
languageMap: languageMap
}
en.js
const languageMap = {
\'简体中文\': \'Simplified Chinese\',
\'繁体中文\': \'Traditional Chinese\',
\'英文\': \'English\',
\'多语言\': \'multi language\',
\'设备状态可视图\': \'equipment status chart\',
\'当前班次\': \'current class\',
\'近一周\': \'last week\',
\'近一月\': \'last month\',
\'近三月\': \'last three month\'
}
module.exports = {
languageMap: languageMap
}
key以中文做标识,前台书写的时候可以直接写中文,对英语不好的比较方便
项目根目录新建utils目录,在该目录下新建language.js
function getLanguage() {
// 获取本次存储的语言版本,默认中文
return wx.getStorageSync(\'language\') ||\'zh_CN\'
}
function translate() {
// 返回翻译对照映射表
return require(\'../i18n/\' + getLanguage() + \'.js\').languageMap
}
function translateText(desc) {
// 翻译
return translate()[desc] || desc
}
module.exports = {
getLanguage: getLanguage,
_t: translate, // JSON映射表
_: translateText // 翻译函数
}
为什么要有translate和translateText两个方法?
因为小程序wxml文件中只能使用对象,js文件中只能使用函数,无法通用
项目根目录新建components目录,在该目录新建switchLanguage目录,存放语言切换组件
wxml文件
<view class="switch-language-box">
<picker bindchange="bindPickerChange" value="{{array[index].value}}" range="{{array}}" range-key="name">
<view class="picker">
{{array[index].name}}
</view>
</picker>
</view>
js文件
const base = require(\'../../utils/language.js\')
const _ = base._
Component({
options: {},
properties: {},
data: {
index: 0,
language: \'zh_CN\',
array: [{
value: \'zh_CN\',
name: _(\'简体中文\')
}, {
value: \'zh_TW\',
name: _(\'繁体中文\')
}, {
value: \'en\',
name: _(\'英文\')
}]
},
created () {
const language = base.getLanguage()
let index = 0
switch(language) {
case \'zh_CN\':
index = 0
break
case \'zh_TW\':
index = 1
break
case \'en\':
index = 2
break
default:
break
}
this.setData({
index: index,
language: language
})
},
methods: {
bindPickerChange: function (e) {
this.setData({
index: e.detail.value,
language: this.data.array[e.detail.value].value
})
this.switchLanguage()
},
switchLanguage () {
wx.setStorageSync(\'language\', this.data.array[this.data.index].value)
// 重新加载一次页面
// wx.navigateTo({
// url: \'index\'
// })
this.setData({
array: [{
value: \'zh_CN\',
name: _(\'简体中文\')
}, {
value: \'zh_TW\',
name: _(\'繁体中文\')
}, {
value: \'en\',
name: _(\'英文\')
}]
})
// 触发页面刷新,否则当前页语言版本无法更新
this.triggerEvent(\'refleshevent\')
}
}
})
wxss文件可以自己定义
.switch-language-box{
position: fixed;
top: 10px;
right: 10px;
border: 1px solid gray;
}
应用
json文件(引用语言切换组件)
{
"usingComponents": {"switchLanguage": "../../components/switchLanguage/index"}
}
wxml文件
<switchLanguage bindrefleshevent="reflesh"></switchLanguage>
js文件
const base = require(\'../../utils/language.js\')
const _ = base._
Page({
data: {
_t: \'\'
},
onLoad(option) {
this.mixinFn()
wx.setNavigationBarTitle({
title: _(\'设备状态可视图\')
})
},
reflesh () {
this.onLoad()
},
mixinFn () {
this.setData({
_t: base._t()
})
}
})
前台使用
<text>{{_t[\'多语言\']}}</text>