在vue3項(xiàng)目中實(shí)現(xiàn)國(guó)際化的代碼示例
首先我們進(jìn)行一下最終效果的展示:
了解國(guó)際化的實(shí)現(xiàn)思路????
首先在正式的實(shí)現(xiàn)國(guó)際化之前,我們不妨先來(lái)了解一下實(shí)現(xiàn)國(guó)際化的思路:
//定義msg值的數(shù)據(jù)源 const messages={ ? en:{ ? msg:"hello world" } ?zh:{ ? msg:"你好世界" } } //定義切換變量 let locale="en"; //3.定義賦值函數(shù) function t(key){ ? ?return messages[locale][key] }
講解一些國(guó)際化的實(shí)現(xiàn)方式,其實(shí)就是定義了一個(gè)對(duì)象,然后在這個(gè)對(duì)象中包含兩種(當(dāng)然也可以是多種)語(yǔ)言,比如在這里這個(gè)messages
對(duì)象中就包含兩個(gè)對(duì)象分別文en
和zh
,這兩個(gè)對(duì)象中都有同一個(gè)屬性msg
,zh
中對(duì)應(yīng)的是中文,而en
對(duì)應(yīng)的就是英文,
我們?cè)诔跏嫉臅r(shí)候定義一個(gè)locale變量,并且指定變量值為"en",同時(shí)我們還定義了一個(gè)函數(shù),這個(gè)函數(shù)接收一個(gè)key值,我們可以理解為這個(gè)key是想要獲取的gu國(guó)際化處理的變量值,比如在這個(gè)例子里面這個(gè)key就代表著 ”msg“,這樣我們只需要修改locale的值就可以獲取不同語(yǔ)言下的msg的值了,這就實(shí)現(xiàn)了國(guó)際化
在項(xiàng)目開(kāi)發(fā)中使用國(guó)際化??♀???♀?
初始化配置
在了解了國(guó)際化的原理之后,其實(shí)實(shí)現(xiàn)國(guó)際化的原理并不復(fù)雜,那么我們?cè)趯?shí)際項(xiàng)目中是如何做的呢?
在開(kāi)發(fā)過(guò)程中,一般我們需要借助第三方的包來(lái)實(shí)現(xiàn)。
首先安裝指定的包
npm i vue-i18n@next
對(duì)于國(guó)際化我們實(shí)現(xiàn)分為一下幾個(gè)步驟:
- 創(chuàng)建一個(gè)組件用于修改locale
- 配置修改
element-plus
的語(yǔ)言包 - 創(chuàng)建并導(dǎo)入自定義的語(yǔ)言包
在安裝指定的包之后我在實(shí)際項(xiàng)目中是這樣處理的:
- 首先在src文件下面創(chuàng)建一個(gè)i18n文件夾專(zhuān)門(mén)用來(lái)處理國(guó)際化的問(wèn)題
- 然后在里面新建index.js文件
- 并且建立一個(gè)文件夾名稱(chēng)為lang,專(zhuān)門(mén)用來(lái)存放自定義的語(yǔ)言包
import { createI18n } from "vue-i18n"; //這是我自己創(chuàng)建的語(yǔ)言包 import mZhLocale from "./lang/zh"; import mEnLocale from "./lang/en"; //這里使用了vuex來(lái)進(jìn)行全局的數(shù)據(jù)共享 import store from "@/store"; //創(chuàng)建messages對(duì)象,里面注冊(cè)相應(yīng)的語(yǔ)言包,這里面我注冊(cè)了自己定義的語(yǔ)言包 const messages = { ?en: { ? ?...mEnLocale, }, ?zh: { ? ?...mZhLocale, }, }; // 進(jìn)行持久化處理,防止在頁(yè)面刷新之后數(shù)據(jù)丟失 const getLanguage = () => { ?return store && store.getters && store.getters.language; }; const i18n = createI18n({ ?legacy: false, // 使用composition API ?locale: getLanguage(),//初始的時(shí)候調(diào)用這個(gè)函數(shù)獲取vuex中的數(shù)據(jù),當(dāng)然vuex初始數(shù)據(jù)調(diào)用localstorage中存儲(chǔ)的數(shù)據(jù),或者默認(rèn)賦值為”zh“ ?globalInjection: true, ?// 表明使用全局t函數(shù) ?messages, }); export default i18n;//將i18函數(shù)導(dǎo)出
我們?cè)趇ndex.js中進(jìn)行i18函數(shù)的創(chuàng)建和導(dǎo)出,注冊(cè)使用了自己定義的語(yǔ)言包,我們導(dǎo)出之后還需要在main.js中進(jìn)行注冊(cè)使用
main.js中
import App from "./App.vue"; import i18n from "@/i18n/index"; const app = createApp(App); app.use(i18n);
在進(jìn)行注冊(cè)完之后我們還要在項(xiàng)目中對(duì)要展示的文字的部分進(jìn)行如下的修改,因此我們要使用$t函數(shù)
在項(xiàng)目中使用
其中的navBar.home則是在語(yǔ)言包中定義的數(shù)據(jù) 例如在英語(yǔ)語(yǔ)言包中:
export default{ navBar:{ ? home:"Home" } }
在中文語(yǔ)言包中就會(huì)有一個(gè)對(duì)應(yīng)的中文數(shù)據(jù)
export default{ navBar:{ ? home:"主頁(yè)" } }
這里只是做一個(gè)實(shí)例。
<span>{{ $t("navBar.home") }}</span>
這t函數(shù)
的第一種使用方式,我們當(dāng)然還會(huì)遇到其他的情況。
就比如說(shuō)是在登錄注冊(cè)頁(yè)面中的輸入框我們也想要使用t函數(shù)來(lái)進(jìn)行國(guó)際化的處理:
<el-input :placeholder="$t('login.inputName')"></el-input>
沒(méi)有發(fā)生太大的變化,只是要注意一下,當(dāng)然我們有的時(shí)候可能需要封裝一個(gè)函數(shù),然后在函數(shù)中我們封裝了國(guó)際化的相關(guān)需求,這個(gè)時(shí)候如何做呢?
其實(shí)也不復(fù)雜,比如我們封裝了一個(gè)函數(shù)用來(lái)處理sideBarItem中的標(biāo)題。
import i18n from "@/i18n"; // 根據(jù)這個(gè)函數(shù)來(lái)處理面包屑和sidebar export const generateTitle = (title) => { ?return i18n.global.t("route." + title); };
這里面我們導(dǎo)入了之前創(chuàng)建的I18n文件夾下面的idnex.js文件,注意最后我們?cè)诤瘮?shù)返回值上面通過(guò)i18n.global.t()
來(lái)將相應(yīng)的值返回。
element-plus組件中的國(guó)際化處理????
在上面的說(shuō)明中我們只是配置了自定義的語(yǔ)言包處理,那么我們?nèi)绾翁幚韊lement-plus中的組件的國(guó)際化處理呢?
在element-plus的給出的方案中,我們一般這么處理:
- 在APP.vue中使用
el-config-provider
組件將router-view標(biāo)簽包裹 - 其次我們需要給locale定義值,這里我們同樣還是使用vuex中的共享數(shù)據(jù)來(lái)進(jìn)行定義,判斷vuex中的存儲(chǔ)的值,如果是zh的化就配置中文語(yǔ)言包,否則就是英文語(yǔ)言包。
- 我們需要導(dǎo)入
element-plus
自帶的語(yǔ)言包來(lái)進(jìn)行相應(yīng)的處理。
<template> ?<el-config-provider :locale="$store.getters.language === 'zh' ? ZhCn : En"> ? ?<router-view></router-view> ?</el-config-provider> </template> <script setup> import En from "element-plus/lib/locale/lang/en"; import ZhCn from "element-plus/lib/locale/lang/zh-cn"; </script>
這樣當(dāng)我們vuex中的數(shù)據(jù)發(fā)生變化的時(shí)候,element-plus中的語(yǔ)言也會(huì)發(fā)生相應(yīng)的變化。
封裝語(yǔ)言切換組件
當(dāng)然為了切換語(yǔ)言我封裝了一個(gè)組件LangSelect:
<template> ?<div> ? ?<el-dropdown trigger="click" @command="handleSetLanguage"> ? ? ?<div> ? ? ? ?<el-tooltip content="國(guó)際化"> ? ? ? ? ?<div><svg-icon icon="language"></svg-icon></div> ? ? ? ?</el-tooltip> ? ? ?</div> ? ? ?<template #dropdown> ? ? ? ?<el-dropdown-menu> ? ? ? ? ?<el-dropdown-item command="zh" :disabled="language === 'zh'" ? ? ? ? ? ?>中文</el-dropdown-item ? ? ? ? ?> ? ? ? ? ?<el-dropdown-item command="en" :disabled="language === 'en'" ? ? ? ? ? ?>English</el-dropdown-item ? ? ? ? ?> ? ? ? ?</el-dropdown-menu> ? ? ?</template> ? ?</el-dropdown> ?</div> </template>
<script setup> import { computed } from "vue"; import { useStore } from "vuex"; import { useI18n } from "vue-i18n"; import { ElMessage } from "element-plus"; const store = useStore(); // 實(shí)例化i18 const i18 = useI18n(); const language = computed(() => store.getters.language); // 進(jìn)行語(yǔ)言切換 const handleSetLanguage = (lang) => { ? ? ?i18.locale.value = lang; ?store.commit("app/setLanguage", lang); ?ElMessage.success("更新完成"); ?console.log(lang); }; </script>
注意這里我們使用了useI18n
這個(gè)函數(shù)來(lái)進(jìn)行實(shí)例化,然后我們定義了一個(gè)函數(shù)handleSetLanguage
,用來(lái)切換語(yǔ)言,
- 在函數(shù)內(nèi)部,通過(guò)修改
i18.locale.value
的值來(lái)更新當(dāng)前語(yǔ)言。 - 然后調(diào)用
store.commit
方法來(lái)觸發(fā)名為"setLanguage"的Vuex mutation,更新store中的語(yǔ)言狀態(tài)。 - 使用
computed
函數(shù)創(chuàng)建名為language
的計(jì)算屬性,language屬性依賴(lài)于
store.getters.language,即從Vuex store的
language`的getters中獲取當(dāng)前語(yǔ)言。
vuex中的數(shù)據(jù)
export default { state: { ? ?// 獲取緩存中的顯示文字類(lèi)型,如果為空默認(rèn)為中文 ? ?language: getItem(LANG) || "zh", }, ? ?mutations: { ? ?//通過(guò)這個(gè)方法來(lái)修改vuex中的數(shù)據(jù) ? ?setLanguage(state, lang) { ? ? ?// 給緩存中添加數(shù)據(jù) ? ? ?setItem(LANG, lang); ? ? ?state.language = lang; ? }, }, }
到此這篇關(guān)于在vue3項(xiàng)目中實(shí)現(xiàn)國(guó)際化的代碼示例的文章就介紹到這了,更多相關(guān)vue3項(xiàng)目國(guó)際化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue.extend與vue.component的區(qū)別和聯(lián)系
這篇文章主要介紹了vue.extend與vue.component的區(qū)別和聯(lián)系,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-09-09vue3動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題
這篇文章主要為大家詳細(xì)介紹了vue3如何通過(guò)動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-01-01Vue-cli3中如何引入ECharts并實(shí)現(xiàn)自適應(yīng)
這篇文章主要介紹了Vue-cli3中如何引入ECharts并實(shí)現(xiàn)自適應(yīng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06vue3?Table分頁(yè)保留選中狀態(tài)代碼示例
這篇文章主要給大家介紹了關(guān)于vue3?Table分頁(yè)保留選中狀態(tài)的相關(guān)資料,vue table組件是一個(gè)非常方便的表格組件,它可以幫助我們實(shí)現(xiàn)分頁(yè)和選中功能,需要的朋友可以參考下2023-08-08Vue.js展示AJAX數(shù)據(jù)簡(jiǎn)單示例講解
當(dāng)通過(guò)AJAX方式取回?cái)?shù)據(jù)后,使用vue.js可以完美地按一定邏輯在頁(yè)面上的展示數(shù)據(jù),代碼簡(jiǎn)單、優(yōu)美、自然,而且便于與在用的頁(yè)面框架集成,本文給大家介紹Vue.js展示AJAX數(shù)據(jù)簡(jiǎn)單示例2017-03-03Vue項(xiàng)目中實(shí)現(xiàn)AES加密解密的全過(guò)程
AES算法是一種對(duì)稱(chēng)加密算法,用于加密和解密數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目中實(shí)現(xiàn)AES加密解密的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08