- UID
- 1029342
- 性别
- 男
|
2.6.1 Unicode
Qt 使用QString 存储Unicode 编码的字符串,Qstring 取代了粗糙的const char *;它提供了用于处理Qstring 和const char *之间相互转换的构造函数和操作符。因为Qt 使用了隐式共享(写时复制)技术来减少内存的使用,所以直接复制Qstring 的值是不会产生问题的。为有效率的存储ASII 码字符串,Qt 还提供了QCString 类。Qt 为所有要显示在屏幕上的文本,包括最简单的文字标签到最复杂的宽文本编辑器,提供了一个强大的Unicode 文本呈现引擎。这个引擎支持一些先进的特征,例如特殊的间隔线、双向写和区别标记。它几乎支持世界上所有的书写系统,包括阿拉伯文,中文,古斯拉夫文,英文,希腊文,希伯来文,日文,韩文,拉丁和越南文。体现这个引擎的最优化性能的常用的例子就是:在带有加速功能的文字的下方显示一条下划线(例如File)。QtextCodec 的子类用于处理不同编码类型的字符集之间的转换。Qt 3.0 支持37 种不同的编码方式,包括中文的Big5 和GBK,日文的EUC-JP、JIS 和Shift-JIS,俄罗斯的KOI8-R和ISO 8859 系列。它们可以以库的一部分或者插件的形式编译,或者使用“feature”机制去除这些编译。
2.6.2 应用的翻译
Qt 提供了相应的工具和函数用于帮助开发者以他们的本地语言推出应用。要使一个字符串可以被翻译,你需要把这个字符串作为一个参数放到tr()函数中调用。例如:
saveButton->setText( tr("Save") );
Qt 尝试寻找字符串"Save"的译文,如果找到的话,就会把它的译文显示出来,如果找不到,就用原来的字符串"Save"进行显示。例如我们把英文作为源语言,现在我们要把这个源语言翻译成中文,即中文为翻译的目标语言,以此类推。这样当我们调用tr()函数后,函数的参数的原先的缺省编码就会转变为Unicode 编码。Tr()函数的通常用法为:
Context::tr("source text", "comment")
上面的 “Context” 是指一个QObject 对象的子类的名称。如果在一个包含了tr()成员函数的类的上下文环境中使用tr()函数时,“Context”通常可以省略掉。例如:
Context::func1()
{
setText( tr("Save") );
}
“source text”是指要翻译的文本的内容 “comment”是一个可选项,它用于给手工翻译者提供一些额外的信息。说了半天,还有一个重要的内容我们没谈,就是tr()函数如何寻找到译文。我们要把一个源字符串翻译为和它对应的译文(目标语言的字符串)时,我们需要让Qt 知道这些译文放在哪里。Qt 规定了译文存储在QTranslator 对象中,这个对象是从一个内存映射文件(扩展名为pm)中读取译文。每个pm 文件包含了某种语言的译文信息。所以开发者需要建立一个pm 文件来存储应用中需要翻译的字符串的译文。Qt 提供了3 种工具帮助人们建立译文存储文件(.pm 文件),这3 个工具是lupdate, QtLinguist 和 lrelease.
1、lupdate 自动地从源代码文件(.cpp)和界面接口文件(.ui)中获取所有需要翻译的对象,即上述的(“Context”);同时还获取要翻译的所有的字符串(源语言的字符串),即上述的“source text”;“comment”选项如果被使用的话,也会被纳入收集的范围。当这些信息收集完毕后,lupdate 最后会生成一个.ts 文件(翻译源文件),这个文件是直接可阅读的。
2、开发者使用Qt Linguist 工具提供的良好的人机界面打开一个.ts 文件(翻译源文件),然后开发者根据每一个source text 填写上相对应的译文,这样一个.ts 文件(翻译源文件)就包含了完整的“Context”,“source text”和译文信息。
3、最后通过运行lrelease 去把一个.ts 文件(翻译源文件)压缩为一个.pm 文件(译文存储文件),生成的.pm 文件可用在嵌入式设备上。
在一个应用的生存期间里,上述的步骤有可能根据需要会被反复执行。多次运行lupdate 是很安全的,你可以重复使用已经存在的译文(.pm)文件,或者当你不想使用某些翻译文件时你可以标记这些翻译源文件为旧文件,而不需要删除它们。 |
|