找回密码
 立即注册
收起左侧

【独家连载】Qt入门与提高:KS03-02几种常见的国际化编...

5
回复
7197
查看
[复制链接]
累计签到:41 天
连续签到:1 天
来源: 原创 2018-10-9 21:44:37 显示全部楼层 |阅读模式

马上注册,查看详细内容!注册请先查看:注册须知

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

版权声明
---------------------------------------------------------------------------------------------------------------------
该文章原创于Qter开源社区(www.qter.org
作者: 女儿叫老白
转载请注明出处!
---------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------

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

引言
----------------------------------------------------------------------------------------------------------------------
    前面的章节我们介绍了实现国际化的基本步骤,讲的是最最基本的国际化编程的方法。今天我们给大家介绍几种常见的国际化编程场景,这几种场景虽然核心是一样的,但是分别采用了不同的编程方式实现国际化。
正文
----------------------------------------------------------------------------------------------------------------------
      今天给大家介绍4中常见的国际化场景:
       1)  在ui界面文件中使用英文字符串实现国际化编程。
       2)  在代码中使用tr(字符串常量)实现国际化编程。
       3)  在代码中使用tr(字符串变量)实现国家化编程。
       4)  在非QObject派生类中实现国际化编程。
       下面我们分别看一下。
场景1. 在ui界面文件中使用英文字符串实现国际化编程。
       这是我们比较常见的一种国际化编程场景:在界面的资源文件ui中,直接使用英文字符串,然后按照前面章节的步骤依次执行即可。因为界面的ui文件对应的类都是从QWidget派生而来,而QWidget是从QObject派生得到,因此,我们不用担心翻译文本所在类是否从QObject派生的问题。

场景2. 在代码中使用tr(字符串常量)实现国际化编程。
       这种场景其实就是我们在前一章节介绍的内容。在类中使用tr()。这就要求类从QObject派生,并且在类定义的开头要加上Q_OBJECT宏。这些内容我们在前面章节已经阐述过,再次不再赘述。

场景3. 在代码中使用tr(字符串变量)实现国家化编程。
       这种场景出现在我们的待翻译字符串常量在多处代码行时,也就是同样的字符串在同一个类的好几处代码中出现。请注意,此处指的是在同一个类的不同代码行中的场景,如果是不同类的代码中使用同一个字符串常量,我们会按照场景4去处理。
       我们先看在同一个类的不同代码行中出现的字符串常量,一般情况下,我们会定义一个const的字符串变量来存储该常量,原因有2:
       第一是因为避免在多处使用该字符串常量时因为笔误导致拼写错误;
       第二是因为如果需要修改该字符串的内容,我们只需要在一处修改就可以了(定义该const字符串变量的位置)。

代码清单:
  1. const char* c_strInfo = "cannot save file: disk full!";

  2. ……

  3. cout << tr(c_strInfo) << endl;
复制代码

       此处只给出了一行使用c_strInfo字符串变量的代码,其实可能会有多处代码使用该变量,因为这种情况比较简单,我们不再给出示例。

场景4. 在非QObject派生类中实现国际化编程。
       在介绍国际化编程的过程时,我们一再强调待翻译字符串所在的类一定要从QObject派生(直接派生或间接派生都行),但是有时候,我们不希望把自己的类定义成QObject的派生类,这该怎么办呢?
       其实很简单,我们可以定义一个公共类,把需要翻译的字符串由这个类负责翻译就行了。当然了,这个类需要从QObject派生。假设我们有一个类CMyClass,这个类没有父类或者没有从QObject派生,那么我们可以定义另外一个类CCommonString,由它负责代替CMyClass实现国际化:

代码清单:
  1. // commonstring.h
  2. #ifndef _CCOMMONSTRING_H
  3. #define _CCOMMONSTRING_H

  4. #include <QObject>

  5. class CCommonString : public QObject
  6. {
  7.        Q_OBJECT
  8. };

  9. #endif // _CCOMMONSTRING_H


  10. // myclass.h
  11. class CMyClass {
  12. ……
  13. public:
  14.        voidfunc(void);
  15. };


  16. // myclass.cpp
  17. #include "commonstring.h"
  18. #include "myclass.h"

  19. const char* c_strInfo = "This alsowork!";
  20. void CMyClass::func(void){
  21.        cout<< CCommonString::tr("This will Wok!") << endl;
  22.        cout<< CCommonString::tr(c_strInfo) << endl;
  23. }
复制代码

       在上面的代码中,我们定义了一个类CMyClass,它的func()函数中有字符串需要翻译,而CMyClass却并非QObject的派生类,因此我们定义了类CCommonString,由它代替CMyClass实现翻译。接下来,我们只需要使用lupdate命令和linguist命令分别进行提取ts文件和提供翻译字符串并发布为qm文件就可以了,详细过程可以看前一章节的说明。

结语
----------------------------------------------------------------------------------------------------------------------
至此为止,我们为大家介绍了4种常见的国际化编程场景,都是我们在进行国际化编程时经常碰到的一些情况,希望能够对大家有所帮助。


回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2018-10-10 14:04:39 显示全部楼层
这样子看起来好累啦  能不能加点灰色背景啊

点评

感谢您的意见。主要是因为网页的编辑器好像有bug有时候会把代码漏掉一部分。后面争取用代码编辑器的方式发布。  详情 回复 发表于 2018-10-10 17:38
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2018-10-10 17:38:13 显示全部楼层
岑寂 发表于 2018-10-10 14:04
这样子看起来好累啦  能不能加点灰色背景啊

感谢您的意见。主要是因为网页的编辑器好像有bug有时候会把代码漏掉一部分。后面争取用代码编辑器的方式发布。
回复 支持 反对

使用道具 举报

尚未签到

2019-5-21 15:33:47 显示全部楼层
楼主,QT翻译变量失败呢,const char* c_strInfo = "cannot save file: disk full!";   cout << tr(c_strInfo) << endl; 使用翻译工具的时候,翻译工具中没有直接把这个给忽略了,遇到这种情况如何处理呢?
回复 支持 反对

使用道具 举报

尚未签到

2019-5-21 15:34:55 显示全部楼层
打错字了   翻译工具直接把这个给忽略了

点评

抱歉,好久没登录了,刚看到信息。  详情 回复 发表于 2019-5-24 15:46
回复 支持 反对

使用道具 举报

累计签到:41 天
连续签到:1 天
2019-5-24 15:46:44 显示全部楼层
秋风暮霞挽红曲 发表于 2019-5-21 15:34
打错字了   翻译工具直接把这个给忽略了

抱歉,好久没登录了,刚看到信息。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了