實現(xiàn)多語言配置的Vue3項目方式
在 Vue 3 項目中,通過使用vue-i18n 庫可以方便地實現(xiàn)多語言配置,為用戶提供多語言支持的界面體驗。
在本篇博客中,我將向您介紹如何在 Vue 3 項目中配置和使用多語言功能,讓您的應用能夠支持多種語言。讓你的開發(fā)起來更加簡單。
步驟一:安裝 vue-i18n
首先,在您的 Vue 3 項目中安裝vue-i18n 庫。您可以通過以下命令來安裝:
npm install vue-i18n@next
步驟二:創(chuàng)建語言文件
在src下創(chuàng)建一個語言文件夾,用來存放語言配置文件(en.js,zh.js,i18n.js)三個文件,我這個項目只需要中英文,現(xiàn)在做一個簡單使用示例

具體的文件
en.js:(英文翻譯文件夾)
//en
export default {
message: {
home: 'home'
}
}
zh.js:(中文)
export default {
message: {
home: '首頁'
}
}
i18n.js:
import { createI18n } from "vue-i18n";
import en from './en'
import zh from './zh';
const i18n = createI18n({
locale:localStorage.getItem('language') || 'zh', // 默認是中文
globalInjection:true,//全局配置$t
legacy:false,
messages:{en,zh}// 需要做國際化的語種
})
export default i18n
然后在main.js里頭配置全局的語言
main.js:
import './assets/main.css'
import { createApp } from 'vue'
import pinia from '@/stores/index.js'
import App from './App.vue'
import router from './router'
import i18n from './lang/i18n';
const app = createApp(App)
app.use(router)
app.use(pinia)
app.use(i18n)
app.mount('#app')
配置好這些以后就可以使用了:
切換中英文的文件:
<template>
<div class="entry_box">
<div class="entry_head">
<button @click="changeLocale">{{ currentLocale === 'en' ? 'Switch to Chinese' : '切換英文' }}</button>
</div>
<div class="entry_main">
<div class="menu">
<Menu/>
</div>
<div class="main">
<router-view>
</router-view>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import Menu from '@/components/Menu.vue'
import { useI18n } from 'vue-i18n';
const { locale, t } = useI18n();
locale.value = 'zh';
const currentLocale = ref(locale.value);
const changeLocale = () => {
currentLocale.value = currentLocale.value === 'zh' ? 'en' : 'zh';
locale.value = currentLocale.value;
};
</script>
<style scoped lang="less">
.entry_box{
height: 100%;
width: 100%;
.entry_head{
height: 64px;
width: 100%;
display: flex;
background: #409eff;
}
.entry_main{
width: 100%;
height: calc(100vh - 64px);
display: flex;
.menu{
width: 1;
height: calc(100vh - 64px);
}
.main{
padding: 10px;
flex: 1;
height: calc(100vh - 64px);
}
}
}
</style>
在菜單配置項里頭做語言切換的監(jiān)聽
<template>
<div class="menu_box">
<el-menu
active-text-color="#d71921"
background-color="#fff"
class="el-menu-vertical-gat"
:default-active="defaultActive"
text-color="#040c2c"
:collapse="isCollapse"
@open="handleOpen"
@close="handleClose"
ref="menuRef"
>
<template v-for="item in menuData" :key="item.index">
<el-sub-menu v-if="item.children && item.children.length > 0" :index="item.index">
<template #title>
<span>{{ item.title }}</span>
</template>
<el-menu-item v-for="citem in item.children" :index="citem.index" :key="citem.index" @click="changeMenu(citem)">
{{ citem.title }}
</el-menu-item>
</el-sub-menu>
<el-menu-item v-else :index="item.index" @click="changeMenu(item)">
<el-icon><component :is="item.icon"></component></el-icon>
<span>{{ item.title }}</span>
</el-menu-item>
</template>
</el-menu>
</div>
</template>
<script setup>
import { ref, onMounted, onBeforeUnmount, watch, markRaw, onUpdated } from 'vue';
import { Document, Menu as IconMenu, Location, Setting } from '@element-plus/icons-vue';
import { useRoute, useRouter } from 'vue-router';
import { useI18n } from 'vue-i18n'
const { locale, t } = useI18n();
const router = useRouter()
const defaultActive = ref('1');
const isCollapse = ref(false);
const menuRef = ref(null);
const menuData = ref([]);
const initMenuData = () => {
menuData.value = [
{
index: '1',
title: t('message.home'),
name: 'home',
icon: markRaw(Location)
},
{
index: '2',
title: '系統(tǒng)管理',
name: 'systemManagement',
icon: markRaw(Setting),
},
{
index: '3',
title: '網(wǎng)關配置',
name: 'equipmentConfig',
icon: markRaw(IconMenu)
},
{
index: '4',
title: '日志管理',
name: 'logManagement',
icon: markRaw(Document)
}
];
}
// 監(jiān)聽語言變化,并重新初始化菜單數(shù)據(jù)
watch(locale, () => {
initMenuData();
});
// 初始化菜單數(shù)據(jù)
initMenuData();
const setCollapseState = (windowWidth) => {
if (windowWidth < 768) {
isCollapse.value = true;
} else {
isCollapse.value = false;
}
}
const handleOpen = (key, keyPath) => {
if(menuRef&&menuData){
for(let i=0;i<menuData.length;i++){
let menu = menuData[i];
if(menu.index!=key&&menu.children&&menu.children.length>0){
//關閉其他sub-menu
menuRef.close(menu.index);
}
}
}
// if (key !== defaultActive.value && menuData.value) {
// menuData.value.forEach((menu) => {
// if (menu.index !== key && menu.children && menu.children.length > 0) {
// menu.$refs.menuRef.close(menu.index);
// }
// });
// }
}
const handleClose = (key, keyPath) => {
// Handle close logic here
}
const changeMenu = (item) => {
console.log(item);
router.push({ name: item.name });
// this.$router.push({ name: item.name });
}
onMounted(() => {
setCollapseState(window.innerWidth);
window.addEventListener('resize', () => {
setCollapseState(window.innerWidth);
});
});
onBeforeUnmount(() => {
window.removeEventListener('resize', setCollapseState);
});
</script>
<style scoped lang="less">
.menu_box {
height: 100%;
.el-menu {
height: 100%;
}
}
</style>
效果如下:


總結
通過以上步驟,您已經(jīng)成功配置了 Vue 3 項目的多語言功能。用戶可以通過切換語言來改變應用中顯示的文字內(nèi)容,為不同語言用戶提供更好的用戶體驗。
這只是一個簡單的配置,后續(xù)還需要把切換的語言放到store中,以便其他地方使用。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
關于Element上傳組件beforeUpload上傳前限制失效問題
這篇文章主要介紹了Element上傳組件beforeUpload上傳前限制失效問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
elementplus實現(xiàn)多級表格(最后一級展示圖片)
本文主要介紹了elementplus實現(xiàn)多級表格(最后一級展示圖片),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-05-05
vue form表單post請求結合Servlet實現(xiàn)文件上傳功能
這篇文章主要介紹了vue form表單post請求結合Servlet實現(xiàn)文件上傳功能,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
el-input寬度跟隨輸入內(nèi)容自適應的實現(xiàn)方法
這篇文章主要給大家介紹了關于el-input寬度跟隨輸入內(nèi)容自適應的實現(xiàn)方法,我們再實際應用中可能需要input文本框能夠根據(jù)輸入字符的所占據(jù)的寬度自動調節(jié)尺寸,需要的朋友可以參考下2023-08-08
解決vue v-for 遍歷循環(huán)時key值報錯的問題
今天小編就為大家分享一篇解決vue v-for 遍歷循環(huán)時key值報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

