微信小程序多语言实现方案

这个话题纯属炒冷饭,已经有不少同行搞出来了,本文只是记录自己处理的过程。

不管哪个系统,多语言方案套路都是一样的

1、建立多语言映射库

2、记录并存储用户选择的语言版本,下次进入直接进入对应语言版本

3、根据用户设置动态加载语言版本

4、前台调用

 

上代码

项目根目录新建i18n目录,在该目录下存放不同版本的语言库

zh_CN.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const languageMap = {
    '简体中文': '简体中文',
    '繁体中文': '繁体中文',
    '英文': '英文',
    '多语言': '多语言',
    '设备状态可视图': '设备状态可视图',
    '当前班次': '当前班次',
    '近一周': '近一周',
    '近一月': '近一月',
    '近三月': '近三月'
}
 
module.exports = {
    languageMap: languageMap
}

  

zh_TW.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const languageMap = {
    '简体中文': '簡體中文',
    '繁体中文': '繁體中文',
    '英文': '英文',
    '多语言': '多語言',
    '设备状态可视图': '設備狀態可視圖',
    '当前班次': '當前班次',
    '近一周': '近壹周',
    '近一月': '近壹月',
    '近三月': '近三月'
}
 
module.exports = {
    languageMap: languageMap
}

  

en.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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文件

1
2
3
4
5
6
7
<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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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文件可以自己定义

1
2
3
4
5
6
.switch-language-box{
    position: fixed;
    top: 10px;
    right: 10px;
    border: 1px solid gray;
}

  

应用

json文件(引用语言切换组件)

1
2
3
{
  "usingComponents": {"switchLanguage": "../../components/switchLanguage/index"}
}

  

wxml文件

1
<switchLanguage bindrefleshevent="reflesh"></switchLanguage>

  

js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()
        })
    }
})

  

前台使用

1
<text>{{_t['多语言']}}</text>

  

本站数据来源于互联网,仅供个人学习交流,如有侵权,请联系我们进行删除

Copyright © 2020 - 2021 WXXBEST 蜀ICP备18009175号-1