文章目錄
-
-
- 背景
- 整體方案
-
- 多語言管理端
- 用戶端
- 流水線
- 其他
-
背景
多語言是一個比較麻煩的事情,特别是當 App 比較大的時候,還會涉及到多個部門的開發以及翻譯人員,這中間可能會存在比較大的溝通成本,而且還可能會阻塞開發的進度。以下是我們在具體開發過程當中使用的一個方案,通過管理端+流水線自動同步的方式來解決。
整體方案
整個方案分為管理端,用戶端以及流水線三個部分。
子產品 | 流程 | 使用者 |
---|---|---|
多語言管理端 | 1.開發送出待翻譯的資源; 2.調用谷歌翻譯,生成翻譯資源; 3.流水線自動同步翻譯資源到項目工程; 4.翻譯人員稽核并修改不恰當的翻譯; | 開發,翻譯,流水線 |
用戶端 | 建立一個language子產品,專門用于存放多語言資源,流水線自動同步新的翻譯資源到該子產品 | 開發 |
流水線 | 定時從多語言管理端擷取多語言資源,并将資源送出到工程 | 無,自動執行 |
多語言管理端
Google 翻譯:https://cloud.google.com/translate/docs/basic/translate-text-basic?hl=zh-cn
這裡主要是通過 Google 翻譯 + 人工稽核的方式。
其中 Google 翻譯完成之後,開發者便可以建立一個詞條,并給詞條指定一個唯一的 key,用戶端需要通過這個 key 來擷取翻譯資源。建立完成之後,流水線會自動将翻譯資源同步到工程,開發者同步到本地之後就可以繼續開發。
如下圖所示,image_upload_failed 為唯一的 key。
資源同步之後,工程當中便會有 image_upload_failed 對應的多語言資源。
當翻譯同學稽核發現有不恰當的翻譯結果時,可以直接在網站上進行修改,修改完成之後也會觸發流水線同步。翻譯同學和開發同學互不阻塞。
用戶端
我們可以建立一個多語言子產品,專門用于存放所有的多語言資源,讓所有的業務均依賴于這個子產品,并提供擷取資源的接口,這樣可以友善我們調試。流水線自動更的時候,隻需要更新對應的 strings.xml 檔案就可以了。
本地調試
設定了多語言之後,我們可以還需要進行調試,一般情況下可以在系統設定裡面切換語言,然後檢視效果,可是這樣步驟有點多,而且有時候設定完了之後,不認識這種語言,想設定回來又要找好久。是以我們可以在 App 内部提供切換多語言的方式進行調試。
我們都是通過 resources 字段去擷取資源,有時候是 Application 的 resources 有時候是 Activity 的 resources,是以我們可以在 Application 初始化的時候進行設定,在 ActivityLifecycleCallbacks 周期函數當中,當 Activity 被建立的時候進行設定,這樣就避免需要在每個 Acitivity 當中去設定了。
//設定 Application 的resources
val resources : Resources = BaseApplication.context.resources
if (setLanguage != null) {//希望置換的語言
val config = resources.configuration
config.setLocale(setLanguage)
resources.updateConfiguration(config,resources.displayMetrics)
}
//設定 Acitivty 的resources
BaseApplication.getContext().registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks{
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
val resources = activity.resources
val config = resources.configuration
config.setLocale(setLanguage)
resources.updateConfiguration(config,resources.displayMetrics)
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
流水線
流水線的步驟如下圖所示:
主要有以下幾步:
- 拉取工程,master 分支
- 從管理端拉取多語言資源,并将其覆寫到多語言子產品當中
- 編譯,若不能編譯通過則報錯
- 覆寫完之後,看工程是否發生變化,若發生變化則送出到master分支,若無變化則跳過
其中流水線是定期自動執行,目前我們設定的是每隔十分鐘執行一次。
其他
這裡主要涉及到的是用戶端,其中還需要考慮背景的多語言問題,例如背景 push 一條資訊需要在用戶端展示,也需要考慮到多語言的問題,是以我們在請求的時候需要帶上多語言字段,背景根據這個字段進行比對傳回對應的資源。