Uniapp实现多语言切换

前言

之前做项目过程中,也做过一次多语言切换,大致思想都是一样的,想了解的可以看下之前的文章C#WinForm实现多语言切换

使用i18n插件

安装插件
csharp 复制代码
npm install vue-i18n --save
Main.js配置
csharp 复制代码
// 引入 多语言包
import VueI18n from 'vue-i18n'
Vue.use(VueI18n) // 通过插件的形式挂载
// 引入语言包,注意路径
import Chinese from '@/common/lang/cn.js'; //简体中文
import English from '@/common/lang/en.js'; //英文
import Deutsch from '@/common/lang/gd.js'; //德文

// 构造i18n对象
const i18n = new VueI18n({
	// 默认语言,这里的local属性,对应message中的cn、en属性
	locale: uni.getStorageSync('locale') || 'zh_CN',
	// 引入语言文件
	messages: {
		// 这里的属性名是任意的,您也可以把zh设置为cn等,只是后续切换语言时
		// 要标识这里的语言属性,如:this.$i18n.locale = zh|en|cn|xxx
		'zh_CN': Chinese,
		'en_US': English,
		'de-DE':Deutsch
	}
})

Vue.prototype._i18n = i18n;
语言文件

在COMMON下创建个文件夹,然后把语言文件放到这个下面,可以看到上述配置引用的语言文件

csharp 复制代码
//语言文件写法
export default {
	login: {
		title:'WMS',
		zhanghao:'账号',
		mima:'密码',
		qingshuruzhanghao:'请输入账号'
	},
	userdetail:{
		fanhui:'返回',
		xuanze:'语言选择'
	}
}
语言切换

首先看下效果图:

页面实现代码放下面了,注意的是切换的时候不是切换这一个页面,是所有配置好的页面都会切换。

csharp 复制代码
<template>
	<view class="content">
		<scroll-view scroll-y class="page">
			<cu-custom bgColor="bg-gradual-pink" :isBack="true">
				<block slot="backText">{{$t('userdetail.fanhui')}}</block>
				<block slot="content">{{$t('userdetail.xuanze')}}</block>
			</cu-custom>
			
        <view class="radioInfo">
        			<view class="dataInfo">
        				<!-- 列表内容开始 -->
        				<radio-group @change="radioChange">
        					<view class="dataList" v-for="(item,index) in dataList" :key='index'
        						@click="listClick(item.titleId)" :class="index === radioCurrent?'radiOn':''">
        						<view class="textImg">
        							<view class="img">
        								<image :src="item.imgUrl" mode="widthFix"></image>
        							</view>
        							<view class="text">
        								<text>{{item.title}}</text>
        								<text>{{item.url}}</text>
        							</view>
        						</view>
        						<view class="radioBox">
        							<radio color="#2DCF8C" :value="item.titleId + ''" :checked="index === radioCurrent" />
        						</view>
        					</view>
        				</radio-group>
        				<!-- 列表内容结束 -->
        			</view>
        		</view>	
		</scroll-view>
	</view>
</template>

<script>
	import api from '@/api/api.js'
	export default {
		data() {
			return {
               dataList: [{
               					imgUrl: '../../static/icon/cn.png',
               					title: '中文',
               					titleId: 1
               				}, {
               					imgUrl: '../../static/icon/vn.png',
               					title: 'English',
               					titleId: 2
               				}, {
               					imgUrl: '../../static/icon/dg.png',
               					title: 'Deutsch',
               					titleId: 3
               				}],
               				radioCurrent: null,
               				dataFrom: {
               					titleId: null //传的id
               				}
			};
		},
		methods: {
			radioChange(evt) { //单个选择框点击
							this.dataFrom.titleId = parseInt(evt.detail.value) //如果需要通过点击来知道选择的是哪个商品的id
							console.log('选中',this.dataFrom.titleId)
							if(this.dataFrom.titleId == 1){
								this._i18n.locale = "zh_CN"
							}
							if(this.dataFrom.titleId == 2){
								this._i18n.locale = "en_US"
							}
							if(this.dataFrom.titleId == 3){
								this._i18n.locale = "de-DE"
							}
						},
			listClick(titleId) { //整个数据点击
							this.dataFrom.titleId = titleId //如果需要通过点击来知道选择的是哪个商品的id
							for (let i = 0; i < this.dataList.length; i++) {
								if (this.dataList[i].titleId == titleId) {
									this.radioCurrent = i;
									break;
								}
							}
						}	
		}
	}
</script>

<style>
	.page {
		height: 100Vh;
		width: 100vw;
	}

	.page.show {
		overflow: hidden;
	}

	.switch-sex::after {
		content: "\e716";
	}

	.switch-sex::before {
		content: "\e7a9";
	}

	.switch-music::after {
		content: "\e66a";
	}

	.switch-music::before {
		content: "\e6db";
	}
</style>
<style lang="scss">
	.content {
		.radioInfo {
			.dataInfo {
				width: 80%;
                margin: auto;
				.checkAll {
					display: flex;
					justify-content: space-between;
				}
 
				.radiOn {
					border: 1px solid #2DCF8C !important;
				}
 
				.dataList {
					width: 170%;
					display: flex;
					align-items: center;
					justify-content: space-between;
					border: 1px solid #E7E9EE;
					padding: 20rpx;
					margin-bottom: 20rpx;
 
					.textImg {
						display: flex;
						align-items: center;
 
						.img {
							border: 1px solid #E7E9EE;
							padding: 10rpx;
 
							image {
								width: 90rpx;
								height: 90rpx;
								display: block;
							}
						}
 
						.text {
							padding-left: 20rpx;
 
							text {
								display: block;
								font-size: 30rpx;
								color: #000;
								font-weight: bold;
							}
						}
					}
				}
			}
		}
	}
</style>
相关推荐
南城夏季32 分钟前
蓝领招聘二期笔记
前端·javascript·笔记
Huazie32 分钟前
来花个几分钟,轻松掌握 Hexo Diversity 主题配置内容
前端·javascript·hexo
NoloveisGod1 小时前
Vue的基础使用
前端·javascript·vue.js
GISer_Jing1 小时前
前端系统设计面试题(二)Javascript\Vue
前端·javascript·vue.js
海上彼尚1 小时前
实现3D热力图
前端·javascript·3d
理想不理想v2 小时前
使用JS实现文件流转换excel?
java·前端·javascript·css·vue.js·spring·面试
公子艾2 小时前
uniapp设置tabBar高斯模糊并设置tabBar高度占位
uni-app
EasyNTS2 小时前
无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
前端·javascript·vue.js
老码沉思录2 小时前
React Native 全栈开发实战班 - 数据管理与状态之Zustand应用
javascript·react native·react.js
poloma2 小时前
五千字长文搞清楚 Blob File ArrayBuffer TypedArray 到底是什么
前端·javascript·ecmascript 6