多语言解决方案

news2024/11/17 0:25:14

文章目录

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

背景

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JavaEE初阶】第二节.多线程( 进阶篇 ) 锁的优化、JUC的常用类、线程安全的集合类

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、synchronized的优化操作 1.1 锁膨胀/锁升级 1.2 锁消除 1.3 锁粗化二、JUC 2.1 Callable接口 2.2 ReentrantLock类&…

Python获取中国大学MOOC某课程评论及其参与人数

文章目录前言一、需求二、分析三、运行结果前言 本系列文章来源于真实的需求本系列文章你来提我来做本系列文章仅供学习参考 一、需求 1、课程参加人数 2、课程学员名称及其评论 二、分析 首先查看网页源代码是否有需要的数据 课程参加人数 课程学员名称及其评论 F12 打开浏…

Linux中断处理

目录 一、什么是中断 二、中断处理原理 三、中断接口 3.1 中断申请 3.2 中断释放 3.3 中断处理函数原型 四、按键驱动 一、什么是中断 一种硬件上的通知机制,用来通知CPU发生了某种需要立即处理的事件 分为: 1. 内部中断 CPU执行程序的过程中&am…

力扣sql简单篇练习(二十)

力扣sql简单篇练习(二十) 1 广告效果 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT ad_id,IFNULL(ROUND(sum(IF(actionClicked,action,0))/sum(IF(actionIgnored,0,1))*100,2),0.00) ctr FROM Ads GROUP BY ad_id ORDER BY ctr desc,ad_id …

消息队列MQ介绍

消息队列技术是分布式应用间交换信息的一种技术。消息队列可驻留在内存或磁盘上,队列存储消息直到它们被应用程序读走。通过消息队列,应用程序可独立地执行--它们不需要知道彼此的位置、或在继续执行前不需要等待接收程序接收此消息。 消息中间件概述 消息队列技术是…

Wi-Fi 7技术揭秘

引言 2022年4月7日,紫光股份旗下新华三集团全球首发企业级智原生Wi-Fi 7 AP新品 WA7638和WA7338。仅在同年的6月15日,在东京举行的第29届日本网络通信展览会(Interop Tokyo 2022,简称Interop展)中,WA7638就…

Java - 数据结构,栈

一、栈 1.1、什么是栈 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压…

关于《How to Learn to Code Get a Developer Job in 2023》的经验学习

1. Who is This Book For ? for Anyone who is considering a career in software development. 2. Can Anyone Learn to Code? Any sufficiently motivated person can learn to code. 3.Executive Summary Learning to code is hard.Getting a job as a software devel…

01-基于SOA架构someip 开发-Linux开发环境搭建

前言:SOME/IP 是一个汽车的中间件解决方案,可用于控制消息。从一开始,它的设计就是为了完美地适应不同尺寸和不同操作系统的设备。这包括小型设备,如相机、AUTOSAR设备,以及头部单元或远程信息处理设备。同时还确保了S…

华为OD机试题,用 Java 解【VLAN 资源池】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

脑洞|ChatGPT加持下,ChatOps将如何革新团队协作与运维管理?

要说近期科技圈 “顶流”,非 ChatGPT 莫属。 比起目前常见的语音助手与聊天 bot,这位机器人显得更有 “人味儿”,不仅能模拟人类的语气,跟你聊得有来有回,还能写剧本、编音乐、写代码。 说到聊天工具,就让…

低代码开发可以解决哪些问题?

低代码开发可以解决哪些问题?如果用4句话去归纳,低代码开发可以解决以下问题—— 为企业提供更高的灵活性,用户可以突破代码的限制自主开发业务应用;通过减少对专业软件开发人员的依赖,公司可以快速响应市场上的新业务…

完全背包—动态规划

一、背包问题概述 如图,完全背包与01背包的区别只有一点:01背包中每个物品只能取一个而完全背包中每个物品可以取无数个。解决完全背包问题必须首先弄明白01背包,不清楚的可以看我的这篇文章01背包—动态规划。 二、例题 重量价值物品0115物…

Jenkins+docker发布Springbot服务

1.开发Springbot应用 新建多个环境的配置文件 bootstrap.yaml 通过变量获取不同环境active bootstrap-dev.yml bootstrap-pre.yaml 预发布及生产环境配置文件走nacos 二.配置docker 新增Dockerfile文件 Dockerfile内容 # Docker image for springboot file run # VERSION…

代码名命规范浅析

日常开发编码中,代码的名命是个大学问,能快速的看懂开源代码的结构和意图,也是一项必备的能力。在java项目的代码结构中,采用长名命的方式来规范类的名命,能够自己表达其主要意图,配合高级IDE,可…

万字长文带你实战 Elasticsearch 搜索

ES 高级实战 前言 上篇我们讲到了 Elasticsearch 全文检索的原理《别只会搜日志了,求你懂点原理吧》,通过在本地搭建一套 ES 服务,以多个案例来分析了 ES 的原理以及基础使用。这次我们来讲下 Spring Boot 中如何整合 ES,以及如何在 Spring Cloud 微服务项目中使用 ES 来…

考研复试机试 | C++ | 王道机试课程笔记

目录Zero-complexity (上交复试题)题目&#xff1a;代码&#xff1a;括号匹配问题题目&#xff1a;代码&#xff1a;表达式解析问题 &#xff08;浙大机试题&#xff09;题目&#xff1a;代码&#xff1a;标准库里提供了栈 stack<typename> myStack .size() 栈的大小 .pu…

互斥信号+任务临界创建+任务锁

普通信号量 1、信号量概念 2、创建信号量函数 3、互斥信号量 创建互斥信号量函数 等待信号量函数 释放互斥信号量 4、创建任务临界区 5、任务锁 任务上锁函数 ​编辑 任务结束函数 效果 普通信号量 1、信号量概念 信号量像是一种上锁机制&#xff0c;代码必须获…

Java性能-回收算法-Throughout回收算法

垃圾回收算法 理解Throughput回收器 回收器三个基本操作——回收 找到不使用的对象 释放内存 压缩堆碎片 Minor GC和Full GC&#xff0c;每个操作都会标记&#xff0c;释放和压缩对应的目标分代 [63.205s][info][gc,start ] GC(13) Pause Full (Ergonomics) [63.205s][info][…

Odoo丨Odoo框架源码研读三:异常处理与定制化开发

Odoo丨Odoo框架源码研读三&#xff1a;异常处理与定制化开发 Odoo源码研读的第三期内容&#xff1a;异常处理与定制化开发。 *异常处理* Odoo中的Exception是对Python内置异常做了继承和封装&#xff0c;设定了自己核心的几个Exception。 而对异常的处理和Python内置异常的…