温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

KS03-01 怎样实现国际化

发布时间:2020-06-24 04:48:03 来源:网络 阅读:352 作者:女儿叫老白 栏目:编程语言

版权声明

----------------------------------------------------------------

作者: 女儿叫老白

转载请注明出处!

----------------------------------------------------------------

网页版课程源码 提取码:1uy7

--------------------------------------------------------------

引言

----------------------------------------------------------------

    如果我们开发的产品是提供给国外用户的,这就涉及到中英文问题。比如:如果需要把产品给国外用户使用,就可能使用英文界面;如果提供给国内用户,就需要使用中文界面。这就带来一个问题,一套界面两种语言。这该怎么办呢?别急,Qt提供了国际化方案来解决这个问题。

 

正文

----------------------------------------------------------------

    Qt的方案称作国际化。其实也很简单:把所有需要翻译的文本放到类中,然后需要提供一个中英文对照的翻译文件(.qm),最后在程序启动时加载这个翻译文件就可以了。

    我们看一下详细步骤:

    1)  在ui或代码中使用英文。

    2)  在提供翻译的类中使Q_OBJECT。

    3)  pro中添加TRANSLATIONS

    4)  使用lupdate命令,提取待翻译内容到.ts文件。

    5)  添加中英文对照翻译,并用linguist导出为翻译文件(.qm文件)。

    6)  程序启动时加载.qm文件。

 

    下面,我们分步骤详细介绍。

Step 1, 在ui或代码中使用英文

    首先,我们在绘制ui文件时或者是在编码时使用英文。在编程时需要调用所在类的tr()接口。

1.   

m_pLabel2->setText(tr(“this is translated   by source code”));

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

 

Step 2, 在提供翻译的类中使Q_OBJECT

    如果需要我们的类提供翻译功能,除了让他从QObject派生,还需要使用Q_OBJECT宏。

    假设我们的类名为CDialog,那么需要在类定义开头添加Q_OBJECT

 

代码清单03-01-01

1.      

2.      

3.      

4.      

5.      

6.      

7.      

8.      

class CDialog : public QDialog{

    Q_OBJECT

public:

    CDialog(QWidget*   pParent);

    ~CDialog();

private:

     Ui::CDialog ui;

};

    如果不添加Q_OBJECT宏,使用lupdate命令抽取ts文件时将会报错:

lupdate ks03_01.pro3_01

dialog.cpp:7:   Class 'CDialog' lacks Q_OBJECT macro Updating 'ks03_01.ts'...

    上述错误信息的含义是:类CDialog缺少Q_OBJECT宏。

 

Step 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子目录下,抽取的文件名为ks03_01.ts。

 

Step 4, 使用lupdate命令,提取待翻译内容到.ts文件

    执行lupdate命令,读取pro中的配置并且读取源代码文件,将待翻译内容抽取到ts文件:

lupdate   ks03_01.pro

    请注意,务必在ks03_01.pro中配置TRANSLATIONS配置项,否则上述命令将执行失败。而且待翻译类必须使用Q_OBJECT宏。

 

Step 5,  添加中英文对照翻译,并用linguist导出为翻译文件

    抽取完ts文件后,使用linguist界面打开ts文件,手工添加翻译内容,然后导出为qm二进制文件。

    添加翻译时,请将翻译后的文本写在:”Translation to 简体中文(中国)”下面的文本编辑框内(如图03_01_01)。

图03_01_01


    请注意,对标点符号也要一一翻译。

    完成一个翻译项后,请将”源文”前面的问号(图03_01_02中虚线位置)改为“√”(鼠标左键单击)。

图03_01_02


    您也可以查看左侧“上下文”框中的内容,检查是否还有未翻译的项目(前面带“?”,翻译完成后的应该带”√”)。


    完成所有翻译后,请将ts文件发布为.qm文件。方法是选择菜单中的“另外发布为”。然后选择发布目录即可。

    比如,我们可以将.qm文件发布到 $$(PRJROOT)/system/lang目录下。

 

Step 6,  程序启动时加载.qm文件

    我们在main()函数或其他合适的位置加载qm文件。

1,包含所需的头文件

1.      

2.      

3.      

#include   <QApplication>

#include   <QTranslator>  // 国际化

#include   <QLibraryInfo> // 国际化

 

2,加载Qt自身的翻译文件

Qt自身也提供了一个翻译文件,用来实现Qt提供的类的翻译功能。

代码清单03-01-02

1.      

2.      

3.      

4.      

5.      

6.      

7.      

8.      

9.      

10. 

// 安装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,加载项目自己的翻译文件

代码清单03-01-03

1.      

2.      

3.      

4.      

5.      

6.      

7.      

8.  

9.    

10. 

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"按钮,我们都可以通过这种方式处理为显示中文的按钮。如果我们从designer种拖出QDialogButtonBox(带OK、Cancel)按钮,那么翻译时需要注意,在ts文件中手工添加如下内容:

代码清单03-01-04

1.      

2.      

3.      

4.      

5.      

6.      

7.      

8.      

9.      

10.    

11.    

12.    

13.    

14.   

15. 

<context>

      <name>QPlatformTheme</name>

      <message>

          <location filename="../src/widgets/qdialogbuttonbox.cpp"   line="+42"/>

          <location line="+18"/>

          <source>OK</source>

          <translation>确定</translation>

      </message>

      <message>

          <location line="+54"/>

          <source>Cancel</source>

          <translation>取消</translation>

      </message>

</context>

    这时因为在Qt的源代码里,为QDialogButtonBox的按钮进行翻译时,实际使用了QPlatformTheme,见Qt代码:

QCoreApplication ::translate ("QPlatformTheme" , "OK" )

实际上,这可以作为Qt的补丁。所以,我们最好将其作为Qt自身的翻译的一个补充,将上述ts文件的内容专门保存一个公共的ts文件,供各项目使用。

 

结语

----------------------------------------------------------------

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


----------------------------------------------------------------

《Qt入门与提高-GUI产品开发》目录

上一节:KS02-06 一劳永逸:引入pri体系
下一节:

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI