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