天天看点

多语言解决方案

文章目录

      • 背景
      • 整体方案
        • 多语言管理端
        • 客户端
        • 流水线
        • 其他

背景

多语言是一个比较麻烦的事情,特别是当 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 一条信息需要在客户端展示,也需要考虑到多语言的问题,所以我们在请求的时候需要带上多语言字段,后台根据这个字段进行匹配返回对应的资源。