找回密码
 立即注册
收起左侧

【独家连载】Qt入门与提高:KS03-01怎样实现国际化

0
回复
5642
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-10-9 18:04:49 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 baizy77 于 2019-7-2 20:26 编辑

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------

引言
----------------------------------------------------------------------------------------------------------------------
       在外包软件项目中,有很多是提供给国外用户的,这就涉及到中英文问题。比如,如果需要把我们开发的产品给国外用户使用我,就可能使用英文界面;如果提供给国内用户,就需要使用中文界面。这就带来一个问题,一套界面两种语言。这该怎么办呢?别急,Qt提供了国际化方案来解决这个问题。
正文
----------------------------------------------------------------------------------------------------------------------
       Qt的方案称作国际化,其实也很简单:把所有需要翻译的文本放到类中,然后需要我们提供一个中英文对照的翻译文件(.qm),最后在程序启动时加载这个翻译文件就可以了。
       我们看一下详细步骤:
       1)  在ui或代码中使用英文。
       2)  在提供翻译的类中使Q_OBJECT。
       3)  pro中添加TRANSLATTIONS
       4)  使用lupdate命令,提取待翻译内容到.ts文件。
       5)  添加中英文对照翻译,并用linguist导出为翻译文件(.qm文件)。
       6)  程序启动时加载.qm文件。

       下面,我们分步骤详细介绍。
1ui或代码中使用英文。
       首先,我们在绘制ui文件时或者是在编码时使用英文。在编码时需要使用所在类的tr()。

代码清单:
  1. m_pLabel2->setText(tr(“this is translated by source code”));
复制代码

       tr()接口是QObject类提供的,所以就要求调用tr()接口的类是从QObject派生的。如果待翻译的文本串所在的类不是从QObject派生,那么请使用从QObject派生的类来调用tr()接口。具体方法在后续章节介绍,这里我们先介绍最基本的用法。

2在提供翻译的类中使Q_OBJECT
       如果需要我们的类提供翻译功能,除了让他从QObject派生,还需要使用Q_OBJECT宏。
假设我们的类是CDialog,那么需要在类定义开头添加Q_OBJECT宏:

代码清单:
  1. class CDialog : public QDialog, public Ui::CDialogBase
  2. {
  3.        Q_OBJECT
  4. public:
  5.        CDialog(QWidget* pParent);
  6.        ~CDialog();
  7. };
复制代码
       如果不添加Q_OBJECT宏,使用lupdate命令抽取ts文件时将会报错:
代码清单:
  1. lupdate ks03_01.pro
  2. ks03_01/dialog.cpp:7: Class 'CDialog' lacks Q_OBJECT macro Updating'ks03_01.ts'...
复制代码

3 pro中添加TRANSLATTIONS
ks03_01.pro中添加如下内容:

代码清单:
  1. TRANSLATIONS += ks03_01.ts
复制代码

       ks03_01.ts是利用lupdate命令抽取ts文件时的文件名。当然也可以带路径。
代码清单:
  1. TRANSLATIONS += $TRAIN_SRC_PATH /translations/ks03_01.ts
复制代码
       表示将抽取得到的ts文件放到源代码的src/translations目录下。

4使用lupdate命令,提取待翻译内容到.ts文件。
       执行lupdate命令,读取pro中的配置并且读取源代码文件,将待翻译内容抽取到ts文件:
              lupdateks03_01.pro
       请注意,务必在ks03_01.pro中配置TRANSLATIONS配置项,否则上述命令将执行失败。而且待翻译类必须使用Q_OBJECT宏。

5添加中英文对照翻译,并用linguist导出为翻译文件。
       抽取完ts文件后,使用linguist界面打开ts文件,手工添加翻译内容,然后导出为qm二进制文件。
       添加翻译时,请将翻译后的文本写在:”Translation to简体中文(中国)”下面的文本编辑框内。
       完成一个翻译项后,请将”源文”前面的问好改为“√”(鼠标左键单击)。
       您也可以查看左侧“上下文”框中的内容,检查是否还有未翻译的项目(前面带“?”,翻译完成后的应该带”√”)。
       完成所有翻译后,请将ts文件发布为.qm文件。方法是选择菜单中的“另外发布为”。然后选择发布目录即可。
       比如,我们可以将.qm文件发布到 $$(PRJROOT)/system/lang目录下。

6程序启动时加载.qm文件。
       我们在main()函数或其他合适的位置加载qm文件。
1,包含所需的头文件
代码清单:
  1. #include <QApplication>
  2. #include <QTranslator>     // 国际化
  3. #include <QLibraryInfo>  // 国际化
复制代码

2,加载Qt自身的翻译文件
代码清单:
  1. // 安装qt自带的中文翻译
  2. const QString localSysName =QLocale::system().name();  // 获取本机系统的语言环境
  3. QScopedPointer<QTranslator>qtTranslator(new QTranslator(QCoreApplication::instance()));
  4. if(qtTranslator->load(QStringLiteral("qt_") + localSysName,
  5.        QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
  6. {
  7.        QCoreApplication::installTranslator(qtTranslator.take());
  8. }
复制代码

3,加载项目自己的翻译文件
代码清单:
  1. QString strPath= qgetenv(“TRAINDEVHOME”);  // 获取环境变量所指向的路径
  2. strPath +="/system/lang";       //$TRAINDEVHOME/system/lang/ks03_01.qm
  3. QScopedPointer<QTranslator>gpTranslator(new QTranslator(QCoreApplication::instance()));
  4. if(gpTranslator->load("ks03_01.qm", strPath))
  5. {
  6.      QCoreApplication::installTranslator(gpTranslator.take());
  7. }
复制代码
请大家注意:
              我们可以在自己的ts文件中编写Qt类的翻译内容哦。比如QMessageBox的“OK”"Cancel"按钮,我们都可以通过这种方式处理为显示中文的按钮。


结语
----------------------------------------------------------------------------------------------------------------------
     国际化在Qt软件开发过程中是非常重要的组成部分。即使您目前的代码没有推向国外用户市场,我也建议您养成使用国际化方案进行编程的习惯。因为这样您对于国际化编程会比较熟练,而且会形成一种标准化的编程格局,相信对您今后的发展也是有利的。

上一节:  KS02-07   还是不知道pri咋用?来练练手吧

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了