相信不少前端er在遇到多語言需求時,都會遇到下面的問題
- 開發完成後面對眾多語言key,需要將真實內容提取到語言包中,在不同的檔案中切換來切換去,非常繁瑣
- 經常漏翻,可能翻了一個語言,另一個語言就忘記翻了
- 維護起來太麻煩,遇到新需求增加的語言檔案,又需要同時在多個語言檔案上進行同步更新
- debug太難受,時間一長無法立馬準確知道當前key對應的是什麼內容,又需要自己去對照語言包去檢視
這只是其中的一部分,還有很多問題,這裡就不列舉了。後面實在受不了了,就去尋找是否有更優解,嘗試過很多外掛,直到我發現了它-----i18n-ally,它的出現成功的解決了我上面所有的痛點,而且還做得更多,無論是開發效率還是開發體驗,都是指數級的增長!
i18n-ally
這是一個vscode外掛,專案已經開源i18n-ally,也是vue i18n專案官方推薦的第三方工具。它提供了
內聯提示功能,通過內聯提示功能,你能很方便的進行debug,再也不會出現面對一堆key時而不知所措的情況
當前頁面懸浮窗快速修改key值對應的語言檔案,再也不需要頻繁的切換語言包然後找key修改了
統一管理所有翻譯,對於使用的,未使用的,翻譯進度等都能做到很好的監控,同時提供了自動翻譯的功能,自動翻譯並將翻譯結果應用到相應的語言包中
靈活方便提取頁面上未翻譯的文字內容,自動根據結構在相應的位置建立對應的翻譯key
- 更多功能,請看官方文件自行探索
如何配置
下面會通過保姆級別的配置說明搭建一個高效的多語言工作環境
配置工作區
首先說一下vscode的工作區,相信在大部分時候,很多人都是用的一個工作區,一個總的配置檔案,這樣在專案多起來的時候,弊端就特別明顯,如果僅僅某些專案需要用到的配置,卻放在了全域性設定裡面,專案多起來會導致配置檔案很雜亂,基於專案的工作區開發配置就顯得特別重要。維護一些特定需求的工作區配置,對於日常開發來說,是很有必要的。比如後面要講的多語言,只要有類似需求的都能向工作區新增檔案,當有時候忘記一些開發套路的時候,因為都是同類專案,也能很方便的在同一個工作區找到類似程式碼進行cv操作。總的來說工作區是vscode在不同的專案應用不同配置的解決方案。更多關於工作區的介紹可看 這篇文章,我的做法是建一個叫工作區的資料夾,裡面全都放置著.code-workspace字尾的工作區配置檔案,統一管理。
{
//工作區配置,如果要配置多個資料夾,直接新增path即可,路徑path是當前配置檔案相對於真實的專案路徑的
"folders": [
{
"path": "../frontStudy/vue-test-case"
},
// {
// "path": "../company/secondProject/explorer"
// }
],
"settings": {
//vscode在當前工作區的配置
}
//其他的選項請檢視vscode文件
}
配置多語言
多語言的配置,vue專案使用的是vue-i18n與上面說的i18n-ally外掛的結合。
- 安裝i18n-ally,vscode外掛商店直接搜尋安裝
- 建立工作區配置檔案xxx.code-workspace,可以跟我一樣設定專門的工具區配置資料夾,也可以直接設定在專案裡,填入配置,將專案資料夾通過folders新增進工作區,然後通過vscode開啟配置檔案
{
//工作區配置,如果要配置多個資料夾,直接新增path即可,路徑path是當前配置檔案相對於真實的專案路徑的
"folders": [
{
"path": "../frontStudy/vue-test-case"
},
// {
// "path": "../company/secondProject/explorer"
// }
]
}
- 在專案下安裝vue-i18n,並建好語言包資料夾
yarn add vue-i18n
建立語言包資料夾locales以及語言檔案
- 在工作區配置檔案中新增i18n-ally配置
"settings": {
"i18n-ally.localesPaths": ["src/locales"], //配置工作區內的語言包資料夾的匹配路徑,可以為多個匹配
"i18n-ally.extract.keygenStyle": "camelCase", //對預設生成的key的命名
"i18n-ally.keystyle": "nested", //對於key的處理,包裹nesta:{b:{c:value}}, 展平flat a.b.c: value
"i18n-ally.review.enabled": false,
"i18n-ally.annotationMaxLength": 30
}
- 編寫i18n.js並在main.js中引入
import Vue from "vue";
import VueI18n from "vue-i18n";
import cn from "./zh-CN/index.json";
import en from "./en/index.json";
Vue.use(VueI18n);
const langList = ["en", "zh"];
const initKey = initLangKey();
// 初始化語言key
function initLangKey() {
let langkey = localStorage.getItem("langkey");
// 如果未初始化,通過瀏覽器判斷應該設定成啥語言
if (!langkey) {
const lang = (navigator.language || navigator.browserLanguage)
.toLowerCase()
.substring(0, 2);
switch (lang) {
case "en":
langkey = "en";
break;
case "zh":
langkey = "zh";
break;
default:
langkey = "en";
break;
}
} else if (!langList.includes(langkey)) {
// 如果不是en,zh,預設en
langkey = "en";
}
localStorage.setItem("langkey", langkey);
return langkey;
}
const i18n = new VueI18n({
locale: initKey,
messages: {
en: Object.assign({}, en),
zh: Object.assign({}, cn),
},
});
export default i18n;
在main.js中引入
import i18n from './locales/i18n.js'
new Vue({
i18n,
render: h => h(App)
}).$mount('#app')
- 享用i18n-ally帶來的生產力的提升
注意事項
- 對於不同框架以及更多功能的探索,可通過官方的examples去檢視,比較詳細,有配置也有語言包檔案的配置
- 不同格式的許可權是不同的,i18n-ally對js檔案的只能讀取key,無法寫入更改key,預設情況下,除了JSON,YAML,JSON5,其他的都是關閉的,如果需要支援,需要新增配置,支援情況如下
最後
i18n-ally帶給我的體驗是,從刀耕火種到工業時代,極大的提升了我做多語言時的開發體驗,感謝開發者們提供了這種對我來講是劃時代的開發工具。本文案例程式碼已放入github。