我來教大家如何讓你的vue app 支援多國語言. 我們要使用的套件是Vue-i18n.
npm install vue-i18n --save
// 資料架構
src
│
└───lang
│ lang.js
│
└───subfolder1
│ en.json
│ cn.json
│ tw.json
│ es.json
//lang.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import cn from './cn.json'
// import en from './en.json'
// import tw from './tw.json'
// import es from './es.json'
Vue.use(VueI18n)
const locale = 'cn'
const messages = {
cn
}
const i18n = new VueI18n({
/** 默认值 */
locale,
messages
})
export default i18n
//cn.json
{
"hello123": "你好-簡",
"bye123" : "再会",
"car" : "cn車 | {count}車"
}
// main.js
export const app = new Vue({
el: '#app',
store,
i18n,
render: h => h(App)
})
// mutation.js
import {app} from '../main' //匯入我們的Vue Instance
...
export const mutations = {
[types.SET_LANG] (state, payload) {
app.$i18n.locale = payload // 改變語言
}
}
export const actions = {
setLang({commit}, payload) {
commit(types.SET_LANG, payload)
}
}
<button @click="setLang('cn')">cn</button>
methods: {
setLang: function(lang){
this.$store.dispatch('setLang', lang)
}
}
當你的語言很多包的時候, 一開始全部帶入的話會造成loading很重, 網路很慢. 這時候就要用lazy loading
請參考以下code
async setLangNew({commit}, payload){
if (payload in app.$i18n.messages) {
commit(types.SET_LANG, payload)
} else {
try {
// 你可以用fetch 或import 隨便你
// 你只要確定你的webpack 支援 import 語法
// const res = await axios.get(`./src/lang/${payload}.json`)
const res = await import(`./src/lang/locale/${payload}.json`)
app.$i18n.setLocaleMessage(payload, res.data)
commit(types.SET_LANG, payload)
}
catch(e) {
console.log(e)
}
}
}
感謝分享
補充 new Vue() 是 Vue 2 語法,
Vue 3 用 Vue.createApp() 取代 new Vue()
https://book.vue.tw/appendix/migration.html#%E5%85%83%E4%BB%B6%E5%AF%A6%E9%AB%94%E5%BB%BA%E7%AB%8B
Vue 2 support will end on Dec 31, 2023. Learn more about Vue 2 Extended LTS.
The Benefits of the New Vue 3 App Initialization Code