本帖最后由 baizy77 于 2019-7-2 20:26 编辑
版权声明--------------------------------------------------------------------------------------------------------------------- 作者: 女儿叫老白 转载请注明出处! --------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------
网页版课程源码 提取码: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字符串变量的位置)。
代码清单: - const char* c_strInfo = "cannot save file: disk full!";
- ……
- cout << tr(c_strInfo) << endl;
复制代码
此处只给出了一行使用c_strInfo字符串变量的代码,其实可能会有多处代码使用该变量,因为这种情况比较简单,我们不再给出示例。
场景4. 在非QObject派生类中实现国际化编程。 在介绍国际化编程的过程时,我们一再强调待翻译字符串所在的类一定要从QObject派生(直接派生或间接派生都行),但是有时候,我们不希望把自己的类定义成QObject的派生类,这该怎么办呢? 其实很简单,我们可以定义一个公共类,把需要翻译的字符串由这个类负责翻译就行了。当然了,这个类需要从QObject派生。假设我们有一个类CMyClass,这个类没有父类或者没有从QObject派生,那么我们可以定义另外一个类CCommonString,由它负责代替CMyClass实现国际化:
代码清单: - // commonstring.h
- #ifndef _CCOMMONSTRING_H
- #define _CCOMMONSTRING_H
- #include <QObject>
- class CCommonString : public QObject
- {
- Q_OBJECT
- };
- #endif // _CCOMMONSTRING_H
- // myclass.h
- class CMyClass {
- ……
- public:
- voidfunc(void);
- };
- // myclass.cpp
- #include "commonstring.h"
- #include "myclass.h"
- const char* c_strInfo = "This alsowork!";
- void CMyClass::func(void){
- cout<< CCommonString::tr("This will Wok!") << endl;
- cout<< CCommonString::tr(c_strInfo) << endl;
- }
复制代码
在上面的代码中,我们定义了一个类CMyClass,它的func()函数中有字符串需要翻译,而CMyClass却并非QObject的派生类,因此我们定义了类CCommonString,由它代替CMyClass实现翻译。接下来,我们只需要使用lupdate命令和linguist命令分别进行提取ts文件和提供翻译字符串并发布为qm文件就可以了,详细过程可以看前一章节的说明。
结语 ---------------------------------------------------------------------------------------------------------------------- 至此为止,我们为大家介绍了4种常见的国际化编程场景,都是我们在进行国际化编程时经常碰到的一些情况,希望能够对大家有所帮助。
|