使用 Qt 编写国际化的程序,最好不要在程序中直接使用特殊编码的文本。 比如要 编写一中文界面的 Qt 程序,应该在程序中使用英文,程序编写完成后,把文本提取 出来翻译。 这样,程序还可以根据Locale的不同,支持多种语言。 下面介绍如何在 Qt 程序中标注字符串,如何提取并翻译文本。

像普通的国际化过程一样,Qt 使用了类似GNU gettext一样的函数 QObject::tr(),它 用于从Qt的信息文件 .qm 中取出信息,这些信息是经过 Qt 的工具处理的。 Qt在处理 编码时还使用了 QTranslator 类,可用于指定整个应用软件的 的信息文件。

下面是一段使用了 QObject::tr()的代码,它建立了一个弹出菜单,菜单项是"Quit", 它被放置在菜单条上,在菜单条上显示的是标签"File"。

                QPopupMenu* popup;                popup = new QPopupMenu( this );                popup->insertItem( tr("&Quit"),qApp,SLOT(quit()) );                menubar->insertItem( tr("&File"),popup );                

对 于绝大多数情况,可以用上述方法处理。不过有时在定义某些变量中使用的字符 串,不能使用上述方法,但是为了让Qt提取并翻译该字符串,必须用 某种方法标志出 来。Qt 定义了 QT_TR_NOOP() 和 QT_TRANSLATE_NOOP() 来标志它们。前者用于单个字 符串,后者用于多个字符串。比如,

        static const char* strings[] = {         QT_TR_NOOP( "Hello" ),           QT_TR_NOOP( "World" )       };        

有时需要使用printf/sprintf之类的函数动态生成字符串,比如,

                QStings s;                s.sprintf( "Button %d",i );                but->setText( s );

对这种使用方式的国际化是使用 arg() 函数。

                QString s = tr( "Button %1" ).arg(i);                but->setText( s );                

提取上述信息的方法是使用 Qt 提供的工具 findtr 命令:

        findtr [filename].cpp > i18n.po

它类似于GNU的 xgettext,上述文件的提取信息文件内包含,

        ....      "Content-Type: text/plain; charset=iso-8859-1/n"       #: i18n.cpp:34        msgid "ExampleWidget::&File"        msgstr ""       ...       

接 下来是文本翻译过程。 在Qt中翻译信息文件时应该注意以下事项: (1) 提取的 信息文件的编码是iso-8859-1,在翻译成某种语言(编码)时应该 注意改动它的 字符集,比如对中文GB2312和Big5编码,应该是, "Content-Type: text/plain; charset=gb2312/n"或者"Content-Type: text/plain; charset=big5/n"。 (2) 提取的信息有一个范围,比如上面的文件指定的范围是 ExampleWidget, 在翻译 前应该把它去掉,变成 msgid "::&File"。(3) 被翻译的字符串可能含有加速键 符号,如 "&File"中的"F",如果翻译成中文最好保留该信息,它可以翻译成 "文件(&F)"。

对于翻译后的文件(比如上面的翻译文件存为 i18n_gb.po),必须使用 Qt 提供的 工具 msg2qm 把它转换为 .qm 文件才能使用,

                > msg2qm i18n_gb.po i18n_gb.qm                

它类似于GNU的 msgfmt 命令。翻译后的文件可以用Qt程序直接调用。

                QTranslator *translator = new QTranslator(0);                translator->load("i18n_gb.qm",".");                qApp->installTranslator(translator);                

此外,Qt 还提供了类似于 msgmerge 的工具 mergetr,它用于把新提取的信息 文件和已经翻译过的信息文件融合起来,在此不再赘述。

在 Qt 中也可以直接使用 QTextCodec 来转换字符串的编码,这为在Qt下开发纯 中文软件带来了便利条件,不过这种方法不符和国际化/本地化的习惯,

                char *string = "中文和English混和字符串!"                QTextCodec* gbk_codec = QTextCodec::codecByName("GBK");                QString gbk_string = codec->toUnicode(string);                QLabel *label = new QLabel(gbk_string);                

如果使程序只支持一种编码,也可以直接把整个应用程序的编码设置为GBK编码, 然后在字符串之前 加tr(QObject::tr),

                qApp->setDefaultCodec( QTextCodec::codecForName("GBK") );                QLabel *label = new QLabel( tr("中文标签") );                

如果使Qt根据Locale的环境变量取得字符集,可以使用 QString::fromLocal8Bit(str)。

在Qtopia中添加国际化支持相关推荐

  1. Abp Vnext应用程序项目中添加docker支持的小结

    文章目录 介绍 具体步骤 1.创建项目 2.添加docker支持 3.调整 4.运行实例 总结 介绍 abp vnext 里面的只有 module 项目里面是自动添加 docker 支持的,因为其是面 ...

  2. 为React应用添加国际化支持

    国际化一般可分为以下几个挑战: 1.检测用户的语言环境; 2.翻译UI元素.标题和提示; 3.提供特定于地区的内容,如日期.货币和数字. 在本文中,我将只关注前端部分.我们将开发一个简单的通用Reac ...

  3. Spring Boot 架构中的国际化支持实践—— Spring Boot 全球化解决方案

    背景 Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 ...

  4. SpringBoot 中添加jsp支持遇到的问题

    由于想把一个java web项目使用springBoot框架来联系一下,Java web项目用到了jsp,于是便需要在spring boot中引入jsp支持 引入方法网上很多,现在记录一下自己遇到的问 ...

  5. WP7应用程序中添加麦克风支持

    通过选择"文件 | 新建项目"菜单命令来创建一个新项目. 将显示"新建项目"窗口.展开"Visual C#"模板,然后选择"Sil ...

  6. android studio添加v7包,如何在Android Studio中添加RecyclerView-v7支持包

    一直知道RecyclerView可以代替ListView.GridView使用,聽說功能很強大,但還沒有去學習過.今天想學習,沒想到還沒開始便撞牆了.輸入Recycler,只有這兩個東西,沒有提示Re ...

  7. Nginx中添加gzip_static支持

    添加上述命令后,会报一个错误,unknown directive "gzip_static"主要的原因是Nginx默认是没有添加ngx_http_gzip_static_modul ...

  8. ffmpeg 中添加264支持

    转自:http://blog.sina.com.cn/s/blog_513f4e8401011yuq.html ffmpeg 中带有264的解码,没有编码,需要添加x264: 参考百度上的" ...

  9. QtCreater中添加Debug支持

    QtCreater中使用Debug编译项目时,想使用debugging项目时,需要windows支持,找到设置->应用->应用和功能->Windows Software Develo ...

  10. qt linux 国际化,多语言,配置CLion管理Qt项目国际化支持

    随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...

最新文章

  1. mysql amoeba 配置_Amoeba新版本MYSQL读写分离配置
  2. RandLA-Net测试
  3. c语言选择结构程序设计笔记,C语言选择结构程序设计.ppt
  4. 450g带盖吐司配方_【配方分享】预祝冬安 明石克彦老师的提子吐司
  5. 计算机应用技术基础考试分值,计算机一级考试内容包括哪些 试题分值上是如何分布的...
  6. 【转】一步一步学Linq to sql(十):分层构架的例子
  7. python词云可视化视频_Python数据分析-可视化-wordcloud词云
  8. GC-MS分析方法如何定性与定量?
  9. 计算机毕业设计 SSM健康知识信息平台 健康自检平台 健康体检管理系统Java
  10. java微信开发教程,Java微信公众平台开发(1) 接入微信公众平台
  11. Unity3D纯白(Pure White)烘焙【2020】
  12. 使用gihub搭建个人博客
  13. JS-计算日期差值;计算日期之间的月数
  14. 向量范数与矩阵范数矩阵模的平方-函数和几何以及映射的关系-数学
  15. 新媒体营销方式的优势
  16. 吃鸡神器!新款苹果 iPad,免费送一台!
  17. python读取dat数据_dat文件读写_c语言读写dat文件_c语言读dat文件 - 云+社区 - 腾讯云...
  18. SY6982E芯片了解
  19. 国内外深度学习开放数据集下载集合(值得收藏,不断更新)
  20. 一名优秀的销售人员应该具备哪些素质和能力?

热门文章

  1. Android lint工具 检查的常见问题
  2. python输入一系列的值_python中的input()和print()输入输出函数应用实例笔记
  3. 数据结构最短路径例题_数据结构(五)图---最短路径(迪杰斯特拉算法)
  4. dnf全部使用_DNF:1.13拍卖最后1天物价,花瓣礼箱破千万,果然人人都是黑商
  5. mysql 前缀索引_MySQL前缀索引
  6. mysql限制数据类型的长度_MySQL数据类型的长度
  7. java orientation_Java WritableCellFormat.setOrientation方法代码示例
  8. c++程序调用python代码_使用C++调用Python代码的方法详解
  9. Centos7.6环境使用kubeadm部署kubernetes1.18.4
  10. 用C#在Visual Studio写Javascript单元测试