baizy77 发表于 2018-10-9 18:04:49

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

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

版权声明---------------------------------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白转载请注明出处!---------------------------------------------------------------------------------------------------------------------课程目录: 【独家连载】《Qt入门与提高-GUI产品开发》目录
网页版课程源码 提取码:1uy7
引言----------------------------------------------------------------------------------------------------------------------       在外包软件项目中,有很多是提供给国外用户的,这就涉及到中英文问题。比如,如果需要把我们开发的产品给国外用户使用我,就可能使用英文界面;如果提供给国内用户,就需要使用中文界面。这就带来一个问题,一套界面两种语言。这该怎么办呢?别急,Qt提供了国际化方案来解决这个问题。 正文----------------------------------------------------------------------------------------------------------------------       Qt的方案称作国际化,其实也很简单:把所有需要翻译的文本放到类中,然后需要我们提供一个中英文对照的翻译文件(.qm),最后在程序启动时加载这个翻译文件就可以了。       我们看一下详细步骤:       1)在ui或代码中使用英文。       2)在提供翻译的类中使Q_OBJECT。       3)pro中添加TRANSLATTIONS       4)使用lupdate命令,提取待翻译内容到.ts文件。       5)添加中英文对照翻译,并用linguist导出为翻译文件(.qm文件)。       6)程序启动时加载.qm文件。
       下面,我们分步骤详细介绍。第1步在ui或代码中使用英文。       首先,我们在绘制ui文件时或者是在编码时使用英文。在编码时需要使用所在类的tr()。
代码清单: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宏:
代码清单:class CDialog : public QDialog, public Ui::CDialogBase
{
       Q_OBJECT
public:
       CDialog(QWidget* pParent);
       ~CDialog();
};       如果不添加Q_OBJECT宏,使用lupdate命令抽取ts文件时将会报错:代码清单:lupdate ks03_01.pro
ks03_01/dialog.cpp:7: Class 'CDialog' lacks Q_OBJECT macro Updating'ks03_01.ts'...
第3步 pro中添加TRANSLATTIONS在ks03_01.pro中添加如下内容:
代码清单:TRANSLATIONS += ks03_01.ts
       ks03_01.ts是利用lupdate命令抽取ts文件时的文件名。当然也可以带路径。代码清单: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,包含所需的头文件代码清单:#include <QApplication>
#include <QTranslator>   // 国际化
#include <QLibraryInfo>// 国际化
2,加载Qt自身的翻译文件代码清单:// 安装qt自带的中文翻译
const QString localSysName =QLocale::system().name();// 获取本机系统的语言环境
QScopedPointer<QTranslator>qtTranslator(new QTranslator(QCoreApplication::instance()));
if(qtTranslator->load(QStringLiteral("qt_") + localSysName,
       QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
{
       QCoreApplication::installTranslator(qtTranslator.take());
}
3,加载项目自己的翻译文件代码清单:QString strPath= qgetenv(“TRAINDEVHOME”);// 获取环境变量所指向的路径
strPath +="/system/lang";       //$TRAINDEVHOME/system/lang/ks03_01.qm
QScopedPointer<QTranslator>gpTranslator(new QTranslator(QCoreApplication::instance()));
if(gpTranslator->load("ks03_01.qm", strPath))
{
   QCoreApplication::installTranslator(gpTranslator.take());
}请大家注意:            我们可以在自己的ts文件中编写Qt类的翻译内容哦。比如QMessageBox的“OK”"Cancel"按钮,我们都可以通过这种方式处理为显示中文的按钮。

结语----------------------------------------------------------------------------------------------------------------------   国际化在Qt软件开发过程中是非常重要的组成部分。即使您目前的代码没有推向国外用户市场,我也建议您养成使用国际化方案进行编程的习惯。因为这样您对于国际化编程会比较熟练,而且会形成一种标准化的编程格局,相信对您今后的发展也是有利的。
上一节:KS02-07   还是不知道pri咋用?来练练手吧
下一节:KS03-02   几种常见的国际化编程场景
页: [1]
查看完整版本: 【独家连载】Qt入门与提高:KS03-01怎样实现国际化