vue3實(shí)現(xiàn)國(guó)際化的過(guò)程與遇到的問(wèn)題詳解
前言
開(kāi)發(fā)了一個(gè)國(guó)際化的項(xiàng)目,技術(shù)棧是vue3 + TS + vite + vant + pinia, 需要設(shè)置多語(yǔ)言,采用的是vue-i18n這一個(gè)國(guó)際化插件,貌似只看到英文文檔,而且網(wǎng)上找的其他教程大部分是針對(duì)vue2的,對(duì)應(yīng)vue3的比較少,所以自己整理了一下
安裝引入
npm install vue-i18n
在src下新建locals文件夾,包含index.js,en.js,zh.js(只做中英文切換)
// zh.js
export default {
login: {
login: '登錄',
userName: '用戶(hù)名',
password: '密碼'
}
}// en.js
export default {
login: {
login: 'login',
userName: 'userName',
password: 'password'
}
}// index.js
import { createI18n } from 'vue-i18n'
import zh from './zh'
import en from './en'
const messages = {
en,
zh,
}
const language = (navigator.language || 'en').toLocaleLowerCase() // 這是獲取瀏覽器的語(yǔ)言
const i18n = createI18n({
locale: localStorage.getItem('lang') || language.split('-')[0] || 'en', // 首先從緩存里拿,沒(méi)有的話(huà)就用瀏覽器語(yǔ)言,
fallbackLocale: 'en', // 設(shè)置備用語(yǔ)言
messages,
})
export default i18n有個(gè)注意的地方就是上面用了緩存,待會(huì)會(huì)說(shuō)到為什么要這樣做
最后在main.js引入就好了
import { createApp } from 'vue'
import i18n from './locals'
const app = createApp(App)
app.use(i18n)
app.mount('#app')至此插件就算配置好了,接下來(lái)使用的話(huà)基本上就兩種場(chǎng)景,一是在<template>里面,一種是在setup里面
使用
- 在<template>中使用
要用到一個(gè)$t()的方法,或者使用v-t也行
<div>
{{`$t('login.userName')`}}
</div>
<div v-t="'login.password'"></div>關(guān)于$t()還有很多用法,可以動(dòng)態(tài)傳參等,具體還是去官網(wǎng)看看
- 在setup中使用
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
console.log(t('login.useName'))
</script>目前項(xiàng)目中只采用這兩種方式,還有其他的就不展開(kāi)了
- 切換語(yǔ)言
vue-i18n提供了一個(gè)全局變量locale,直接修改即可
<template>
<div class="menu">
<div class="menu-item" @click="changeLang('en')">English</div>
<div class="menu-item" @click="changeLang('zh')">中文</div>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
const { locale } = useI18n()
const changeLang = (lang: string) => {
locale.value = lang
localStorage.setItem('lang', lang)// 重要!下面遇到問(wèn)題里解釋
}
</script>遇到的問(wèn)題
- 切換語(yǔ)言后,跳轉(zhuǎn)頁(yè)面或者刷新當(dāng)前頁(yè)后語(yǔ)言又重置了
這是因?yàn)榍袚Q語(yǔ)言是修改的全局變量locale,當(dāng)頁(yè)面一刷新,相當(dāng)于又重置為默認(rèn)值了,所以上面采用緩存來(lái)解決
- 使用ref或者reactive設(shè)置的文字,切換語(yǔ)言后不更新
這是因?yàn)檫@里的數(shù)據(jù)是初始化產(chǎn)生的,并不能跟著local變化而響應(yīng)變化,關(guān)于這一點(diǎn),我是放在了computed里面解決的
<template>
<div class="ilst">
<div
v-for="item in list"
:key="item">
{{item}}
</div>
</div>
</template>
<script setup lang="ts">
import { useI18n } from 'vue-i18n'
import { ref, computed } from 'vue'
const { t } = useI18n()
// 使用ref定義之后再改語(yǔ)言無(wú)效
//const list = ref([
// t('c100018'),
// t('c100019'),
// t('c100020'),
// t('c100021'),
// t('c100020'),
])
// 采用computed可解決
const list = computed(() => [
t('c100018'),
t('c100019'),
t('c100020'),
t('c100021'),
t('c100020'),
])
</script>當(dāng)然啦解決方法不止這一種,還可以使用watch等,自己去找資料看看吧~
總結(jié)
按照目前的生態(tài)來(lái)看,做國(guó)際化項(xiàng)目還是比較多資料來(lái)參考的,ui框架用的是vant,這也可以通過(guò)設(shè)置locale來(lái)改變組件的語(yǔ)言。
import { Locale } from 'vant'
import enUS from 'vant/es/locale/lang/en-US'
Locale.use('en-US', enUS)業(yè)務(wù)代碼使用vue-i18n也很簡(jiǎn)單,是個(gè)不錯(cuò)的選擇
到此這篇關(guān)于vue3實(shí)現(xiàn)國(guó)際化的過(guò)程與遇到問(wèn)題的文章就介紹到這了,更多相關(guān)vue3實(shí)現(xiàn)國(guó)際化內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue使用ECharts實(shí)現(xiàn)折線(xiàn)圖和餅圖
這篇文章主要為大家詳細(xì)介紹了vue使用ECharts實(shí)現(xiàn)折線(xiàn)圖和餅圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
Vuejs 實(shí)現(xiàn)簡(jiǎn)易 todoList 功能 與 組件實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了Vuejs 實(shí)現(xiàn)簡(jiǎn)易 todoList 功能 與 組件,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
vue使用svg文件補(bǔ)充-svg放大縮小操作(使用d3.js)
這篇文章主要介紹了vue使用svg文件補(bǔ)充-svg放大縮小操作(使用d3.js),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09
解決Antd 里面的select 選擇框聯(lián)動(dòng)觸發(fā)的問(wèn)題
這篇文章主要介紹了解決Antd 里面的select 選擇框聯(lián)動(dòng)觸發(fā)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
vue實(shí)現(xiàn)導(dǎo)航菜單和編輯文本的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)導(dǎo)航菜單和編輯文本功能的方法,文中示例代碼非常詳細(xì),幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
在vue3項(xiàng)目中給頁(yè)面添加水印的實(shí)現(xiàn)方法
這篇文章主要給大家介紹一下在vue3項(xiàng)目中添加水印的實(shí)現(xiàn)方法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08
vue監(jiān)聽(tīng)對(duì)象及對(duì)象屬性問(wèn)題
這篇文章主要介紹了vue監(jiān)聽(tīng)對(duì)象及對(duì)象屬性問(wèn)題,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
vue項(xiàng)目實(shí)現(xiàn)表單登錄頁(yè)保存賬號(hào)和密碼到cookie功能
這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)表單登錄頁(yè)保存賬號(hào)和密碼到cookie功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08

