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