項目基於Vue+Typescript+iview,有國際化的需求,目前支持中文和英文兩種語言。
自己國際化沒有什麼難度,可是typescript和iview仍是有點須要注意的,特此記錄。html
Vue I18n 是 Vue.js 的國際化插件。它能夠輕鬆地將一些本地化功能集成到你的 Vue.js 應用程序中。
基本的使用方法就很少介紹了,參考下列文檔。後面介紹一些遇到的問題及解決辦法。前端
參考文檔:vue
<span>{{$t('m.common.name')}}</span>
調用$t
方法,參數傳key
值。至於m.common.name
的key從何而來,咱們看一下i18n傳入的的messages值。git
先看main.js
裏,message傳入兩種語言的字符串對象。github
const messages = { 'zh-CN': require('../../static/locale/cn.js'), 'en-US': require('../../static/locale/en.js') } const i18n = new VueI18n({ locale: lang, messages })
其中zh-CN
的值:typescript
m = { common: { name: '名稱' } }
en-US
的值:前端框架
m = { common: { name: 'Name' } }
到這裏,明白了m.common.name
的key
怎麼來的了吧!cookie
js代碼中的使用方法是調用$i18n.t
方法app
data () { return { btnName: this.$i18n.t('m.common.create') } }
須要注意的是,與html中不一樣,當i18n的locale切換時,html中用到的字符串會從新渲染,完成語言的切換,而js代碼中的字符串沒法實現。
網上有一個方案是將字符串獲取放在computed中,或者是watch監聽locale的變化,完成翻譯的轉換。
我這裏,採用的是切換locale時,先將locale存在cookie中,而後刷新頁面,完成國際化。框架
// 頁面刷新 location.reload();
雖然這種辦法存在問題(沒法保持當前頁面的狀態),可是卻能解決iview組件的國際化。
在ts代碼中使用i18n的話,會報錯:"TypeError: Cannot read property 't' of undefined"
因此須要將用到i18n的放在@Component中,以下:
@Component({ data () { return { btnName: this.$i18n.t('m.common.create') } } }) export default class ResourcePoolPage extends Vue { }
可是若是data中不是單純的屬性,而是複雜的對象,甚至會引用到methods中的方法時,你甚至須要把data和methods都挪至@Component裏,那麼就失去ts的優點了。下面的方法能夠解決這個問題:
首先main.ts
裏,改寫,將Vue對象存在window。
window['vm'] = new Vue({ router, i18n, render: (h) => h(App), store: VuexStore }).$mount('#app')
在ts中須要用到時
export default class ResourcePoolPage extends Vue { btnName2: string = window['vm'].$i18n.t('m.common.create') }
若是嫌麻煩,能夠封裝一個翻譯的方法,在ts裏調用便可。
iview的國際化分爲iview自身的國際化,以及iview接收到數據的國際化(如Table中的columns的國際化)。
在main.ts
裏完成:
import iview from 'iview' import localeCN from 'iview/locale/zh-CN' import localeEn from 'iview/locale/en-US' const lang = VuexStore.getters.getLang // 獲取當前的lang const locale = (lang === 'zh-CN') ? localeCN : localeEn Vue.use(iview, { locale })
數據的國際化沒有特別的操做,依照前面的js和ts方法,只須要一個頁面刷新操做便可。具體流程以下:
main.ts
初始會讀cookie裏的值,獲取lang的設置,沒有的話默認是中文。location.reload()
,刷新頁面。