Qt国际化的一般步骤

  1. 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符。

          
    这些可见字符必须被 tr() 、QCoreApplication::translate()、Qt_TR_NOOP()、Qt_TRANSLATE_NOOP()等来包裹字符串,具体这些函数或者宏是什么功能,我们后面细说。
     
  2. 使用 Qt Linguist 翻译应用程序。
  3. 运行 lrelease,生成二进制的 .qm 文件,应用程序可以使用 QTranslator 加载这个文件。
 

翻译标志函数和宏

  1. 在类内时,使用tr() 和 Qt_TR_NOOP()

     
    使用 tr() 包裹可见字符,如下代码所示:
    1. QPushButton *button = new QPushButton(this);
    2. button->setText(tr("国际化"));

    上面是将按钮的名称进行国际化,上面也是 tr() 函数的最简单的用法。当然,此种用法还是有其局限性。只有这段代码在类函数里面,并且所属的类继承于 QObject 的时候,才可以使用 tr() 。

     
    如果所属的类不是继承于 QObject,我们可以将上面代码改成下面所示:
    1. QPushButton *button = new QPushButton(this);
    2. button->setText(QObject::tr("国际化"));
    或者使用 Q_DECLARE_TR_FUNCTIONS 将 tr() 函数加入到这个类里,代码如下所示:
    1. class MyClass
    2. {
    3. Q_DECLARE_TR_FUNCTIONS(MyClass)
    4. public:
    5. MyClass();
    6. ...
    7. };

    如果声明的字符串生命资源串和常量,我们就需要使用 QT_TR_NOOP() 和 tr() 配合使用。 示例代码如下所示:

    1. QString FriendlyConversation::greeting(int type)
    2. {
    3. static const char *greeting_strings[] = {
    4. QT_TR_NOOP("Hello"),
    5. QT_TR_NOOP("Goodbye")
    6. };
    7. return tr(greeting_strings[type]);
    8. }

    或者在类内而不在类函数里,代码如下所示:

    1. class MyClass
    2. {
    3. Q_DECLARE_TR_FUNCTIONS(MyClass)
    4. static const char * const ids[] = {
    5. //% "This is the first text."
    6. QT_TR_NOOP("qtn_1st_text"),
    7. //% "This is the second text."
    8. QT_TR_NOOP("qtn_2nd_text"),
    9. 0
    10. };
    11. public:
    12. MyClass();
    13. void addLabels();
    14. ...
    15. };
    16. void MyClass::addLabels()
    17. {
    18. for (int i = 0; ids[i]; ++i)
    19. new QLabel(tr(ids[i]), this);
    20. }
     
  2. 在类外时,使用QCoreApplication::translate() 和 Qt_TRANSLATE_NOOP(),相对于 tr() 函数,translate() 函数的优点:
  • 使用范围更广,tr() 的使用范围在类内使用,translate() 可以在类内也可以在独立的函数中使用,例如:main() 函数。
  • 翻译更精细,因为 translate() 添加了上下文共能,所以他相对于 tr() 可以更精确的进行翻译,例如,translate("MainForm", "draw") 和 translate("SubForm", "draw"); 都是 “draw” 我们可以根据他在不同的窗体上,翻译有所区别。
     
    同样,在 Qt_TRANSLATE_NOOP() 宏中也是相同的用法。

Qt国际化详细介绍,中文乱码以及解决方案的更多相关文章

  1. Cygwin 各种情况下中文乱码--终极解决方案

    0.引言 本人从进公司以来一直负责公司Android平台下产品的NDK开发,用的工具: 01. Google的adt-bundle(集成了eclipse和sdk) 02. NDK 03. Cygwin ...

  2. 【C#】C#中使用GDAL3(二):Windows下读写Shape文件及超详细解决中文乱码问题

    转载请注明原文地址:https://www.cnblogs.com/litou/p/15035790.html 本文为<C#中使用GDAL3>的第二篇,总目录地址:https://www. ...

  3. 使用Kettle抽取数据时,出现中文乱码问题解决方案

    使用Kettle在不同的数据库抽取数据时,有时会出现中文乱码问题:其解决方案如下: 1.查看数据库的字符集是否是UTF-8(最常用的字符集) 2.如果数据库设置正确仍然存在中文乱码,则可能是因为有的客 ...

  4. xampp3.2下mysql中文乱码终极解决方案

    xmapp3.2.2中mysql已经被替换成了Mariadb,网上那些显示char语句已经失灵. 另外本文主要介绍的是手动在mysql中写入中文乱码问题 那么我们将采用如下三个步骤解决乱码问题 1.打 ...

  5. C# 读取oracle 中文乱码的解决方案

    用OracleDataAccess.dll访问oracle数据库,遇到中文乱码的情况. 解决方案如下: 1查看字符集编码, 在数据库服务器端 启动 sqlplus SQL->select use ...

  6. Spring Boot 中文乱码问题解决方案汇总

    使用 Spring Boot 开发,对外开发接口供调用,传入参数中有中文,出现中文乱码,查了好多资料,总结解决方法如下: 第一步,约定传参编码格式 不管是使用httpclient,还是okhttp,都 ...

  7. mysql插入表数据中文乱码问题解决方案

    一.问题 开发中遇到将其它数据库数据插入到mysql数据库表中一直会报类似如下错误: Incorrect string value: '\xE6\x88\x91' for column 'name' ...

  8. 关于 IntelliJ 的 IDEA PyCharm 等更新 2019.2 后中文乱码 的解决方案

    关于IntelliJ 的2019.2 更新后的中文乱码解决方案 设置 备用字体 file -> Setting -> Editor ->Font 由于编程常用英文首选字体font默认 ...

  9. MySql 中文乱码排查解决方案

    MySQL会出现中文乱码的原因不外乎下列几点: server本身设定问题,例如还停留在latin1 table的语系设定问题(包含character与collation) 客户端程式(例如php)的连 ...

随机推荐

  1. Java 可变参数

    java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理.注意:可变参数必须位于最后一项.当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持 ...

  2. windows7 64 位 mysql 5.6.12 安装

    1.修改 my-default.ini 改名为 my.ini 内容修改为 [mysqld] loose-default-character-set = utf8    basedir = D:/mys ...

  3. iPhone、iPad默认按钮样式问题

    iPhone.iPad默认按钮样式问题 解决方法给按钮元素添加一个-webkit-appearance: none;具体代码 input[type="button"], input ...

  4. jQuery 源码基本框架

    抽丝剥茧, 7000+ 行的 jQuery 源码基本可以概括为以下的伪代码 (function (window, undefined) { //将 document 封装成 jQuery 对象并缓存 ...

  5. js 中的流程控制-条件语句

    条件语句: if(exp)执行一句代码 <script> var x = 1 ; if(x == 1 ) //当if判断语句结果是true 或者 false 当判断结果等于true的时候, ...

  6. 基于Qt QGraphicsView的多点触摸绘图

    本应用于基于QGraphicsView框架,实现多点触摸. 工程仅仅演示了多点触摸绘图,源自我前段时间一款基于Qt的绘图软件. 工程结构: kmp.h 定义了枚举 slide.h/cpp 定义了派生于 ...

  7. Linux 使用yum install安装mysql登陆不上解决办法

    CentOS yum安装mysql后 Can’t connect to local MySQL server through socket ‘/var/lib/ CentOS Can’t connec ...

  8. HDU 1207

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1207 四柱汉诺塔问题 当 r = (sqrt(8*n+1)-1)/2 时, 存在 count = (n ...

  9. eclipse问题解决(link方式安装插件失败)

    使用 link 方式,离线安装 eclipse 插件时,经常失败. 一.常见的失败情况 link方式配好后,eclipse 启动,没有弹出任何信息. 查看当前工作空间——.metadata——.log ...

  10. MySQL ubuntu启动

    service mysql start 启动 service mysql restart 重启 service mysql stop 停止 mysql -uroot -ppassword 登入mysq ...