切换中英文等其他语言,步骤如下:

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 中的代码