首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C+项目实现多国语言解决方案

背景

在实际项目开发当中,有些需求可能会要求我们实现多种语言,这里的语言是指界面上,一般就是在客户端,特指那些老外用户使用我们的产品时,为了更好的使用客户端和上手,我们需要将语言翻译成当地的语言。

当然,有时候需要同时适配十几种语言,因为产品用户波及五大洲四大洋,这个时候就需要有一个比较好的架构来实现这个需求。有些程序员可能就比较毛糙,简单的使用宏定义,或者说在代码中不断的写if...else..这样的方式是不可取,并且为项目主导者所诟病。

编码问题

多国语言的存在、不同语言操作系统的存在,使得针对多语言的设计颇费周章,在编码上所付出的工作量也是可观的。所谓编码的问题,归结起来,就是二进制的编码以何种编码格式进行解析的问题。

需要强调的是,我们这边多国语言一般是客户端上显示的语言文本,在实际开发语言当中,我们一贯坚持都是用英语来编程的,而不是采用中文编程或者其他语言编程。

特别是在硬盘文件和内存数据的相互转化、即读写过程中,如果采用了错误的编码格式,就会造成乱码。一般的编码转换,直接做映射的不太可能,需要比较多的工作量,大多情况下还是选择 Unicode 作为转换的中介。

解决方案

采用 GNU gettext 

基于Duilib方案

基于Qt Linguist

基于其他方案

采用 GNU gettext 

这是比较原始的方法,当你没有轮子可以用的时候,只能自己想办法造轮子。最好的方式就是借鉴第三方库,或者说最原始的时刻。

gettext 是GNU国际化与本地化(i18n)函数库。它常被用于编写多语言程序。程序源代码需要进行修改以响应 GNU gettext 请求。多数编程语言均已通过字符封装的方式实现了对其的支持。为了减少输入量和代码量,此功能通常以标记别名_的形式使用,除C语言外, GNU gettext 还支持 C++, Objective-C,以及其他多种脚本语言。

基于Duilib方案

这是有道笔记里多语言文件,有道的UI库就是采用duilib方案,大部分基于duilib方案里的文件中会有一个本地文件是多语言包,而这个包有时可能会打包成zib的方式加载。

Duilib是一个轻量级的UI,里面也实现了多语言解决办法。以下是Duilib在多语言方案中的一些处理

初始化多语言代码

在程序调用时初始化语言包

CLangManagerUI::SetLanguage(_T("Lang\\ChineseSimplified"), _T("chs"));

动态切换其他语言

CLangManagerUI::SetLanguage(_T("Lang\\English"), _T("en"));

GetMainWnd()->GetManager()->GetLangManager()->ReloadLanguage();

基于Qt Linguist

Qt在多国语言这方面也做了一个很完整的框架,应该来说Qt的多国语言非常利于开发者去开发,它完整的实现了和代码的分离以及自适应UI布局。它创造了一个Qt Linguist工具,正如qml以及qt designer这些插件工具一样,给开发者带来了方便,是许多低端程序员的福音。

同一个字段,它允许你直接在插件上映射到多国语言。

你需要在.pro文件里添加Translatations模块

然后采用lupdate以及lrelease的方式去获取文本字段以及编译好多国语言后发布

lupdate会有ts文件,lrelease后会有qm文件。

然后在代码中加载qm文件即可

基于其他方案

目前的第三方工具已经比较完善

Linux 上存在第三方的 iconv 项目,使用也较为简单,其实质也是以 Unicode 作为转换的中介。可以参阅 iconv 相关网站。

ICU 是一个很完善的国际化工具。其中的 Code Page Conversion 功能也可以支持文本数据从任何字符集向 Unicode 的双向转换。可以访问其网站

有个同事就比较取巧,它直接调用谷歌的翻译将中文自动翻译成多国语言,省去了自己翻译字段的功夫,当然谷歌的接口是带有商业性质的,也不能让你无限次调用接口,所以在实际项目当中,不建议你使用。

总结

当然开发者只能是打通整个多国语言的实现,而语言翻译的精准却是无法实现的,这得益于一个伟大的翻译家来帮助我们。所以说,想要出海的产品,如果在资金以及实力雄厚的公司而言,一般会有一个专业的翻译团队,而这里面的翻译者包含了各个小语言种专业毕业的同学。

有几点比较好的建议,可以开放出文本文件,直接让用户来修改,曾经做个一个游戏客户端,可能你翻译的不一定好,人家玩家在玩游戏过程中想让更友好更接受画面上的文本,可以直接在提供的文本开发接口中去修改。

如果你采用C++来实现多国语言,可能会有点复杂和麻烦。如果你是基于脚本语言比如java和python基本都有现成的库调用。在开发中,读入字符串和写出的字符串字符集要一致,在实际开发过程中要提高代码的通用性,输出文件的可读性,避免陷入直接的字符集编程。当然也会有乱码等问题,这个可能是无法解决的,毕竟你翻译出来的东西你也不懂他国语言。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20220505A00JD400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券