[Vue3]i18n語系檔編譯後能修改

需求情境:由於專案編譯後到客戶端仍會微調字典檔內容,ex: 把字從 OK -> Login
但並不方便反覆編譯的情況,透過axios更新字典檔

環境 package.json中的版本:
“axios": “^1.4.0",
“vue": “^3.3.4",
“vue-i18n": “^9.2.2",
“vue-router": “^4.2.4"

專案結構

public
  └ static
    └ lang
      └ en.json
      └ tw.json
    └ config.js
    └ favicon.ico
    └ index.html
src
  └ api
  └ assets
  └ lang
    └ index.js
  └ store
  └ views
    └ login.vue
  └ App.vue
  └ main.js
  └ router.js
babel.config.js
jsconfig.json
package.json
vue.config.js

調整預設語系

編譯後仍可修改

//config.js
window.g = {
    language:'en',
}

初始化i18n

//main.js
import App from './App.vue'
import i18n from './lang'
app.use(i18n)

createApp(App).use(i18n).mount('#app')

語系字典檔

//en.json
{
    "loginPage": {
        "account": "Account",
        "password": "Password",
        "login": "Login"
    }
}
//tw.json
{
    "loginPage": {
        "account": "帳號",
        "password": "密碼",
        "login": "登入"
    }
}

i18n的設定

//lang/index.js
import { createI18n } from 'vue-i18n/dist/vue-i18n.cjs'
import tw from "../../public/static/lang/tw.json";
import en from '../../public/static/lang/en.json'

let i18n = createI18n({
    legacy: false,
    globalInjection: true, // 全局模式,可以直接使用 $t
    locale: localStorage.getItem("language") ? localStorage.getItem("language") : window.g.language,
    messages: {
        en,
        tw
    }
})

export default i18n

自動取得最新版本的語系字典檔

//App.vue
<script>
import axios from "axios";
import i18n from "@/lang";
export default {
  name: 'App',
  setup(){
    const netLink = window.location.href
    const getLink = netLink.split("/#/") // router.js中設定  history:createWebHashHistory()  預設網址會有/#/
    //中文
    axios.get(getLink[0]+'/static/lang/tw.json').then(res=>{
      i18n.global.setLocaleMessage('tw', res.data)
    })
    //英文
    axios.get(getLink[0]+'/static/lang/en.json').then(res=>{
      i18n.global.setLocaleMessage('en', res.data)
    })
  }
}
</script>

畫面上顯示文字

//login.vue
<div>{{ $t("loginPage.account") }}</div>
  • 從en切換到tw
    i18n.global.locale = 'tw’
  • 刷新畫面
    router.go(0)

  • 記住這次的變更
    localStorage.setItem('language’, 'tw’)

關於站主

Shiro

因為興趣無限擴張,一直很猶豫要不要寫一個很雜的Blog,後來還是這麼做了。

聯絡:shiro050102✦gmail.com  ✦請自行更換成@

Vue