天天看點

多語言解決方案

文章目錄

      • 背景
      • 整體方案
        • 多語言管理端
        • 用戶端
        • 流水線
        • 其他

背景

多語言是一個比較麻煩的事情,特别是當 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) {

    }

})
           

流水線

流水線的步驟如下圖所示:

多語言解決方案

主要有以下幾步:

  1. 拉取工程,master 分支
  2. 從管理端拉取多語言資源,并将其覆寫到多語言子產品當中
  3. 編譯,若不能編譯通過則報錯
  4. 覆寫完之後,看工程是否發生變化,若發生變化則送出到master分支,若無變化則跳過

其中流水線是定期自動執行,目前我們設定的是每隔十分鐘執行一次。

其他

這裡主要涉及到的是用戶端,其中還需要考慮背景的多語言問題,例如背景 push 一條資訊需要在用戶端展示,也需要考慮到多語言的問題,是以我們在請求的時候需要帶上多語言字段,背景根據這個字段進行比對傳回對應的資源。