当前位置: 首页 > news >正文

使用vue-i18n实现语言切换

如果是 Vue 3,确保 vue-i18n 的版本是 9.x 以上 npm install vue-i18n@9
如果是 Vue 2,确保 vue-i18n 的版本是 8.x 以下 npm install vue-i18n@8

1.vue2写法

main.js配置

import Vue from 'vue'
import App from './App'
import store from './store' // store
import plugins from './plugins' // plugins
import './permission' // permission
import {getDicts
} from "@/api/system/dict/data"
import uView from "uview-ui";
import i18n from "@/language/index.js"; // 引入 i18n
Vue.use(uView);
Vue.use(plugins)Vue.config.productionTip = false
Vue.prototype.$store = store
Vue.prototype.getDicts = getDictsApp.mpType = 'app'const app = new Vue({...App,i18n
})app.$mount()

新建一个文件夹存放各版本语言 index.js

import Vue from 'vue';
import VueI18n from 'vue-i18n';
import enUS from "./locales/en_US";
import kmKH from "./locales/km_KH";
import zhCN from "./locales/zh_CN";// 支持的语言
const SUPPORTED_LANGS = ["zh-CN", "en-US", "km-KH"];// 获取并规范化语言
const getLanguage = () => {// 1. 优先使用 localStoragelet lang = localStorage.getItem("language");// 2. 其次根据浏览器语言自动判断if (!lang) {const nav = navigator.language.toLowerCase();if (nav.startsWith("zh")) {lang = "zh-CN";} else if (nav.startsWith("en")) {lang = "en-US";} else if (nav.startsWith("km")) {lang = "km-KH";} else {lang = "zh-CN";}}// 3. 确保语言被支持if (!SUPPORTED_LANGS.includes(lang)) {lang = "zh-CN";}// 4. 确保 localStorage 是标准格式localStorage.setItem("language", lang);return lang;
};const language = getLanguage();
Vue.use(VueI18n);
const i18n = new VueI18n({legacy: false, // 使用Composition API,这里必须设置为falselocale: language, // 默认显示语言fallbackLocale: "zh-US", // 当语言找不到时,用中文兜底globalInjection: true, // 全局注册$t方法messages: {// 配置语言对应的文件"zh-CN": zhCN,"en-US": enUS,"km-KH": kmKH,},
});export default i18n;

层级如下
在这里插入图片描述
页面中使用

<template><view class="content"><view class="title"><p class="header">{{ $t("menu.title") }}</p><view class="home"><div class="homeimg"><p>{{ $t("login.title") }}</p></div></view></view><view class="container"><view v-for="item in data" :key="item.name"><uni-section :title="$t(menuTitle[item.name])" type="line"></uni-section><view class="grid-body"><uni-grid :column="4" :showBorder="false" @change="changeGrid"><uni-grid-item v-for="i in item.children" :key="i.name"><view class="grid-item-box"><u-icon :name="i.img" :size="80"></u-icon><text class="text">{{ $t(menuTitle[i.name]) }}</text></view></uni-grid-item></uni-grid></view></view></view></view>
</template><script>
export default {data() {return {data: [{name: 'scgl',children: [{name: 'scll',url: '',img: require('../static/icon/name.png')},]},]};},computed: {menuTitle() {return this.$t('menuTitle');}},methods: {changeGrid(e) {this.$modal.showToast('模块建设中~');}}
};
</script>

封装一个组件用于切换语言

<template><div class="language-switch-box"><div class="change-box"><template v-if="optionType === 'text'"><span@click="changeLanguage('zh-CN')":class="{ active: locale === 'zh-CN' }">中文</span>|<span@click="changeLanguage('en-US')":class="{ active: locale === 'en-US' }">English</span>|<span@click="changeLanguage('km-KH')":class="{ active: locale === 'km-KH' }">ខ្មែរ</span></template><template v-else><el-selectv-model="locale"@change="changeLanguage"style="width: 140px"><el-optionv-for="(value, key) in languageDict":key="key":label="value":value="key"/></el-select></template></div></div>
</template><script>
import { useI18n } from "vue-i18n";export default {props: {optionType: {type: String,default: "text",},},data() {return {locale: localStorage.getItem("language") || "zh-CN",languageDict: {"zh-CN": "中文","en-US": "English","km-KH": "ខ្មែរ",},};},methods: {changeLanguage(language) {this.locale = language;localStorage.setItem("language", language);console.log("切换语言:", language);console.log("当前 locale:", this.locale);},},watch: {locale(newLocale) {this.$i18n.locale = newLocale;},},
};
</script>

2.vue3写法

main.js配置

import i18n from "@/language"; // 引入 i18n
app.use(i18n);

新建一个文件夹存放各版本语言 index.js

import { createI18n } from "vue-i18n";
import enUS from "./locales/en_US";
import kmKH from "./locales/km_KH";
import zhCN from "./locales/zh_CN";// 支持的语言
const SUPPORTED_LANGS = ["zh-CN", "en-US", "km-KH"];// 获取并规范化语言
const getLanguage = () => {// 1. 优先使用 localStoragelet lang = localStorage.getItem("language");// 2. 其次根据浏览器语言自动判断if (!lang) {const nav = navigator.language.toLowerCase();if (nav.startsWith("zh")) {lang = "zh-CN";} else if (nav.startsWith("en")) {lang = "en-US";} else if (nav.startsWith("km")) {lang = "km-KH";} else {lang = "zh-CN";}}// 3. 确保语言被支持if (!SUPPORTED_LANGS.includes(lang)) {lang = "zh-CN";}// 4. 确保 localStorage 是标准格式localStorage.setItem("language", lang);return lang;
};const language = getLanguage();const i18n = createI18n({legacy: false, // 使用Composition API,这里必须设置为falselocale: language, // 默认显示语言fallbackLocale: "zh-CN", // 当语言找不到时,用中文兜底globalInjection: true, // 全局注册$t方法messages: {// 配置语言对应的文件"zh-CN": zhCN,"en-US": enUS,"km-KH": kmKH,},
});export default i18n;

语言包层级同上、用法同上、只是导入方法不同
问题记录
当需要动态使用语言包中的键
可以使用以下两种写法

<uni-section :title="$t(`menuTitle.${item.name}`)" type="line"></uni-section>
<text class="text">{{ $t(`menuTitle.${i.name}`) }}</text>
computed: {menuTitle() {return (key) => this.$t(`menuTitle.${key}`);}},<uni-section :title="menuTitle(item.name)" type="line"></uni-section>
<text class="text">{{ menuTitle(i.name) }}</text>
http://www.dtcms.com/a/395297.html

相关文章:

  • 做小程序找哪家公司,解析小程序开发定制公司哪家适合你
  • 【python】python进阶——math模块
  • NHD-6108 全自动远、近光检测仪:智能高效的汽车灯光检测方案
  • 《 Linux 点滴漫谈: 一 》开源之路:Linux 的历史、演进与未来趋势
  • C#和微软System.Speech.Synthesis库实现语音合成
  • C++概述 (一)
  • 【开题答辩全过程】以 基于springboot的高校仪器共享管理系统设计和实现为例,包含答辩的问题和答案
  • 【python】FastAPI简介
  • IDEA lombok注解无效的问题,运行时提示java: 找不到符号或者方法
  • Windows 系统部署 Kronos 金融 K 线基础模型——基于 EPGF 架构
  • 010 Rust流程控制
  • MyBatisPlus快速入门:简化CRUD操作
  • 网络编程套接字(三)---简单的TCP网络程序
  • 背景建模(基于视频,超炫)项目实战!
  • ios26版本回退到ios18
  • OpenCV直方图比较:原理与四种方法详解
  • OpenCV - 图像金字塔
  • 寄存柜频繁维护还卡顿?杰和IB2-281主板:智能化升级高效省心
  • 海外短剧系统开发:多语言适配与跨地区部署的架构实践
  • JVM内存模型详解:看内存公寓如何分配“房间“
  • 【论文阅读】4D-VLA:时空视觉-语言-动作预训练与跨场景校准
  • 【论文阅读】MDM : HUMAN MOTION DIFFUSION MODEL
  • 【论文阅读】RynnVLA-001:利用人类示范改进机器人操作
  • Leecode hot100 - 105.从前序与中序遍历序列构造二叉树
  • 联邦学习论文分享:Federated Learning with GAN-based Data Synthesis for Non-IID Clients
  • 绕过百度网盘无限制下载
  • 【自记】PyCharm 更换阿里云国内源教程
  • 【Axure原型分享】区间K线图
  • javascript之Es6八股文
  • npm和pnpm命令大全