Qt国际化——多语言翻译时值得注意的一个编程问题

问题:

         在用Qt开发的项目中,可以很轻松的实现多语言切换的功能,即国际化。关于这方面的资料网上不少,我这里不谈这个问题,而是记录一个在实际编程中值得注意的一个实践问题。

          我们知道,在不是继承自QObject的类中,如果使用 tr(“撤销”); 这样的代码会编译出错;我们也知道, tr(const char * sourceText,...) 其实是 QObject的一个公有静态函数,于是我们可以这样使用:QObject:: tr(“撤销”); 。代码得以编译通过! 

         但是,这样在后面用Qt语言家翻译的时候,会有一些问题。在Qt语言家翻译的时候,待翻译的词条是按照“上下文(context)”来进行归类划分的。如果要翻译的字符串所出现的类继承自QObject,那么这个上下文就是词条所在类的名字(例如, MyDialog)。但是如果要翻译的字符串所在的类并非继承自QObject的话,这个待翻译的词条(QObject:: tr(“撤销”); )则没有合适的上下文,那么就是全局的。当然,全局并不会有什么大问题,但是一旦像这种QObject:: tr(“撤销”); 全局的待翻译词条很多时,会变得难以识别,不好区分,给翻译工作带来很大麻烦。 特别是有重复的情形时,情况会变得更加糟糕。

解决办法:

1)让需要翻译的词条所在的类继承自QObject类,即使你这个类并不需要继承自QObject类(也许你并不需要这个类具有信号-槽功能),那么为了翻译,我觉得这样做也是值得的,就相当于为你的待翻译词条提供了一个合适的上下文支持。有些同学可能会觉得这样做会不会导致类变得臃肿,影响效率。我的建议是先不要考虑多,用用就会知道的。

2)用MyObject:: tr(“撤销”); 代替QObject:: tr(“撤销”);  注:这里的MyObject是你项目里任何一个继承自QObject的子类,这样的话,tr("撤销"); 这个词条就会出现在MyObject的上下文中。但是这样做会出现无谓的头文件包含。

3)直接使用QCoreApplication::translate ( const char * context, const char * sourceText, ....); 。使用这个函数,可以通过函数的第一个参数指定合适的上下文。这种方法应该可以达到目的,但我没有试过。因为我觉得每次多写一个参数是一个累赘。而且这种人为指定的分类考验人的记忆。

另外,有一个题外话(我们项目曾经出现过的一个BUG):

如果在你的静态全局变量中出现了中文,值得注意的了,因为静态全局变量是在程序进入main()函数之前初始化的,所以这时很可能导致你的中文出现乱码。所以一定要确保在初始化含有中文的字符串之前,你的程序已经设置了支持中文。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://blog.csdn.net/yulinxx/article/details/43260203 ------------------------------------------ C++ 国际化!!!!! 创建一个空白的Qt工程 添加一个main.cpp #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv) QWidget* pWnd = new QWidget(); QPushButton* pBtn = new QPushButton(QPushButton::tr("Test Translate")) QVBoxLayout* pVlayout = new QVBoxLayout(); pVlayout->addWidget(pBtn) pWnd->setLayout(pVlayout); pWnd->show(); return a.exec(); } 即可运行起来。。。。 此工程中,只有按钮上有文字。。。运行如下图示: 在工程中加入: TRANSLATIONS += testTrans_en.ts (ts文字名可随意取) 然后执行: Tools -> External -> Linguist -> Update Translations(lupdate) 提示完成: /usr/local/Qt5.4.0/5.4/gcc_64/bin/lupdate" finished 在工程中,可以发现多了一个 testTrans_en.ts 文件,此文件可用文本编辑器打开进行查看,如: QPushButton Test Translate 此步骤是将工程中的文字(加tr等包含的文字)进行提取到ts文件中 接下来,在终端运行 x@x:~$ linguist 打开 Qt Linguist 翻译工具,对文字进行逐个翻译并保存 在工程中再执行: Tools -> External -> Linguist -> Release Translations(lrelease) 结果提示:/usr/local/Qt5.4.0/5.4/gcc_64/bin/lrelease" finished 在工程中,可以发现多了一个 testTrans_en.qm文件,此文件为二进制格式文件,即我们最终使用翻译文件 然后添加Qt资源,将testTrans_en.qm添加进来 修改main.cpp文件,将翻译文件添加进来,最终执行 #include #include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); QTranslator qtTranslator; qtTranslator.load(":/translate/testTrans_en.qm") a.installTranslator(&qtTranslator); QWidget* pWnd = new QWidget(); QPushButton* pBtn = new QPushButton(QPushButton::tr("Test Translate")) QVBoxLayout* pVlayout = new QVBoxLayout(); pVlayout->addWidget(pBtn) pWnd->setLayout(pVlayout); pWnd->show() return a.exec() } 最终执行结果:
Qt中实现国际化和多语言切换需要以下步骤: 1. 在Qt项目中创建一个“ts”文件,用于存储翻译后的资源。可以使用Qt自带的工具“Qt Linguist”来创建和编辑这些文件。 2. 在Qt项目中使用Qt翻译API来翻译界面元素。例如,使用tr()函数来标记需要翻译的字符串。 3. 使用lupdate工具来生成一个“.ts”文件,其中包含需要翻译的所有字符串。 4. 使用Qt Linguist编辑器来翻译这些字符串,并将它们保存到“.ts”文件中。 5. 使用lrelease工具来生成一个二进制的翻译文件“qm”文件,其中包含翻译后的资源。 6. 在Qt项目中加载这些翻译文件,并在运行切换语言。 下面是一个简单的示例代码,演示如何在Qt中实现多语言切换: ```cpp #include <QApplication> #include <QTranslator> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载翻译文件 QTranslator translator; translator.load("myapp_zh.qm"); app.installTranslator(&translator); // 设置界面元素的翻译 QLabel label(tr("Hello World!")); label.show(); return app.exec(); } ``` 在上面的例子中,我们使用QTranslator类来加载翻译文件,并使用installTranslator()函数将其安装到应用程序中。我们还使用了tr()函数来标记需要翻译的字符串。 当应用程序启动,它将自动加载当前系统语言对应的翻译文件。如果用户切换了语言,我们只需要重新加载对应的翻译文件即可。 希望这可以帮助你实现Qt中的国际化和多语言切换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值