注意:本文不介绍如何使用Qt的国际化、本地化支持。本文针对的是偏底层的、Manual和其他资料中很少涉及的东西。所以,继续之前,请先确保:你已经对如何使用Qt的国际化比较熟悉了。
本文针对的是
tr("我是中文")
这种情况, 是Qt中translate、tr 与中文问题
一文提到的 2b 问题的深入。
例子
首先,个人比较抵制源码中使用中文(当然也包括用tr扩住中文了)。但是如果非要用,也不是不可以。在
Qt中translate、tr 与中文问题
一文中,我提到了这个问题。
废话少说,看个例子:
#include <QApplication>
#include <QPushButton>
#include <QTextCodec>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
#ifndef LOVE_GBK
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
#else
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
#endif
QTranslator translator;
translator.load("hellotr_en");
app.installTranslator(&translator);
QPushButton hello(QPushButton::tr("你好!", "版权所有:Dbzhang800"));
hello.show();
return app.exec();
}
大家应该都知道如何做了:
三步走下来,结果正常,界面能显示翻译出来的问题。但是,翻译过程中有一点会很不爽:
- hellotr_en.ts 文件中,本该显示"你好!"的地方出现的是一堆乱码!
- 当然,使用linguist进行翻译时很难受,因为你不知道乱码处是什么东西
为了解决这个问题,我们不妨从源头lupdate开始看看。
lupdate
作用:从源码文件中提取待翻译的字符串
目前支持的源码文件的后缀:
java,jui,ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs,qml
我们这儿只关心与C++有关的源码文件(QtJambi、QtScript、!Qt Quick相关的源码文件可能会有不同,我不能确定),能力和精力有限哈。
生成.ts文件
要使用lupdate,细分一下,有两种方式:
TRANSLATIONS = hello_zh_CN.ts hello_zh_TW.ts
- 在命令行中指定要生成的ts文件(这时将忽略.pro内指定的文件):
lupdate hello.pro -ts hello_zh_CN.ts hello_zh_TW.ts
乱码?
我们在
QString 与中文问题
一文中,已经充分见识了源码中包含非latin1字符时的编码问题。
lupdate 要从源码文件中提取中文字符串,但它无从知道那我们使用的utf-8,还是gbk,又或者是big5等等编码。所以,需要我们告诉它!
前面提到lupdate的两种用法,那么我们要分别通过两种方法告诉它我们的文件是何种编码:
- 在 .pro 中指定要生成的ts文件时,在 .pro 文件内指定编码
CODECFORTR = utf-8 #or gbk
#DEFAULTCODEC = utf-8
#CODEC = utf-8
注意,如果 CODECFORTR 没有定义,将找 DEFAULTCODEC,如果还没有定义,将找 CODEC。3个都没有定义的话,就采用latin1
- 在 命令行指定 ts 文件时,需要在命令行指定编码
lupdate hello.pro -codecfortr utf-8 -ts hello_zh_CN.ts hello_zh_TW.ts
恩,编码设置挺顺利的,这样一来,lupdate根据指定的编码能识别我们的汉字,然后生成的.ts文件不再是乱码了,同时,它在.ts文件中记录下源码中窄字符串的编码
<defaultcodec>GB2312</defaultcodec>
lrelease
lrelease 是 Linguist 工具链的一部分,可作为独立程序使用。它将 .ts 文件转换成压缩的 .qm 文件,供 QTranslator 使用。
对应于前面 lupdate 的用法,lrelease也有两种用法
lrelease project.pro
lrelease ts-files [-qm qm-file]
注意bug!
我们刚才提到 .ts 到 .qm 的过程,存在一个编码的过程。具体到我们前面提到的GB2312,意味着lrelease需要使用Qt的插件(比如qcncodecs4.dll)。
但很不幸,当前版本(Qt4.7)的lrelease存在bug。
- 我不知道Qt在搞什么飞机,它程序中没有使用QCoreApplication(反而做了很多其他的工作),结果导致无法加载插件。这样一来,QString 中存放的unicode字符串将强制转成latin1(信息丢失!)
注意:如果你使用的utf-8编码,则不存在这个问题。因为utf-8不需要插件。
如何避免?
尝试阅读lrelease的源码,因为功底太差,最终放弃。所以我也无法提供补丁,只告诉大家一个折中的方法:
如果你在简体中文的windows系统中使用gb2312,那么在指定编码是,直接指定SYSTEM而不要指定GB2312
,这样一来,可以避免使用codecs插件。
这样的话,.ts中的字符串将会在不借助codecs插件的情况下被lrelease成功地被转码成gb2312。我们的程序此时又可以成功加载翻译了。鼓掌!呵呵
lingiust
- 通过设置字符集,我们在lingiust中进行翻译时,已经可以正常看到汉字了
- 因为它是从.ts文件加载的,xml格式的.ts文件是不存在乱码基础的
- 但是一点例外:就是 lingiust 显示源码的窗口(Sources and Forms)中,汉字依然是乱码
原因?
个人认为这应当是lingiust的一个bug。
- 因为它显示源码时,简单粗暴,直接按照latin1进行读入的
- 实际上,.ts 文件中已经包含 defaultcodec 信息了,但是它却没有使用。
怎么办?我想应该这样来做(其实lupdate也应该这样来做的,如果这样做了,就不用对MSVC的情况单独设置一个source编码了)。
- 如果源码文件包含BOM信息,则直接按照BOM提供的编码信息读入源文件。
- 如果不包含BOM,则按照.ts文件指定的编码读入读入源文件
折中之道
如果你只是想让lingiust能正确显示编码,那么你只需要找到:
找到:
void SourceCodeView::showSourceCode(const QString &absFileName, const int lineNum)
{
...
fileText = QString::fromLatin1(file.readAll());
...
}
改为
QString::fromLocal8Bit
重新编译一下lingiust即可。
至此,我们的任务完成!
小结
总结一下:
分享到:
相关推荐
7. **国际化和本地化**:QT提供了i18n工具,支持多语言环境,帮助应用更好地适应不同地区的用户。 8. **QML**:QT Quick(QML)是一种声明式的语言,用于快速构建具有动态和交互性的用户界面,尤其适合触摸设备。 ...
qt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码.zipqt项目实项目源码....
QT项目实例源码c++是面向C++开发者的一个实践教程,主要展示了在QT框架下如何进行用户界面的设计和功能实现。QT是一个强大的跨平台应用程序开发框架,广泛应用于GUI(图形用户界面)编程,同时支持网络、数据库、...
QT视频播放器源码是一个基于Qt框架开发的多媒体播放应用的源代码,它提供了一个用于学习和理解多媒体播放原理及Qt编程的实例。Qt是一个跨平台的C++库,广泛应用于图形用户界面(GUI)开发,同时支持非GUI程序如...
Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码 Qt基于数据库的学生管理系统源码...
源码分析可以帮助我们了解其内部工作原理,这对于想要进行定制化开发或者优化性能的开发者来说尤其重要。 1. **Qt Data Visualization 模块**:该模块是Qt库的一部分,专注于数据的图形表示。它包括多种图表类型,...
QT聊天程序源码是用于构建基于QT框架的...通过分析和学习这个QT聊天程序源码,开发者不仅可以提升QT编程技能,还能了解网络聊天应用的设计原理和实现方法。这将对进一步开发类似的应用或者扩展现有功能提供宝贵的参考。
7. **国际化**:QT支持多语言环境,源码中可能包含QTranslator和QApplication::translate()函数,用于实现软件的国际化。 8. **插件系统**:QT支持插件机制,允许在运行时动态加载扩展功能。如果源码包含插件功能,...
QT影音播放器源码是一个基于QT框架和MPLAYER的开源...通过深入学习和实践QT影音播放器的源码,开发者不仅可以提升QT和多媒体编程技能,还可以了解到软件工程中的一些最佳实践,如模块化设计、错误处理、代码注释等。
9. **国际化与本地化**:Qt4支持多语言环境,源码中可能包含如何添加翻译文件(.ts和.qm)以及如何切换应用语言的内容。 10. **并发编程**:Qt4提供了线程支持,通过QThread类可以实现多线程,提升应用程序的执行...
通过分析和学习Qt-5.12.12源码,开发者可以了解Qt的内部工作原理,优化性能,定制特定功能,甚至为Qt框架贡献自己的代码。同时,对于想要深入学习C++和图形界面编程的人来说,这是一个宝贵的资源,因为Qt的源码质量...
**QtModbus通信源码详解** QtModbus是一款基于Qt框架和libmodbus库开发的Modbus通信工具,适用于初学者学习和理解Modbus通信协议的实现。在本文中,我们将深入探讨QtModbus的原理、设计模式以及如何使用libmodbus库...
【标题】"Qt之WPS源码" 涉及的知识点主要集中在两个核心领域:Qt框架和WPS办公软件的源代码分析。Qt是一个跨平台的C++图形用户界面应用程序开发框架,广泛用于创建桌面、移动和嵌入式系统的应用。而WPS,全称是金山...
在分析源码之前,我们需要了解Qt的基本组件和编程模型。Qt的核心概念包括信号与槽机制、事件处理和模型视图架构。在俄罗斯方块游戏中,信号与槽机制用于处理用户输入(如键盘事件)和游戏状态更新;事件处理负责捕捉...
7. **国际化与本地化**:QT支持多语言环境,通过QLocale和QTranslator类,开发者可以方便地实现应用程序的国际化和本地化。 8. **单元测试与调试**:QT提供了QTestLib库进行单元测试,而QT Creator内置的调试器则...
QT6源码编译是一个复杂的过程,涉及到许多步骤和技术细节。在Visual Studio 2019环境下编译QT6.1.3版本,你需要准备一些必要的工具和了解关键的编译流程。以下是一份详尽的指南: 1. **安装必备软件**: - **...
在安装QT Data Visualization源码时,你需要配置CMake,设置QT的安装路径和其他必要的编译变量,然后让CMake生成适用于你操作系统的构建文件。之后,使用Make或类似工具进行编译和链接。 在编程接口(API)方面,QT...
8. **国际化与本地化**:如果`config`涉及到用户界面的设置,那么它可能包含了多语言支持的实现,使用QT的翻译工具如`qmake`和`lrelease`处理`.ts`和`.qm`文件。 9. **调试与测试**:在QT Creator中,可以方便地...
**QtCharts 5.7.0 源码与编译安装详解** QtCharts是Qt框架中的一个模块,专门用于创建各种数据可视化图表,如折线图、柱状图、饼图等。在5.7.0版本中,它提供了丰富的图形类型和定制选项,使得开发者能够轻松地在...
QT是Qt Company开发的一款强大的跨平台应用程序开发框架,主要用C++语言编写,广泛应用于桌面、移动和嵌入式系统的GUI(图形用户界面...通过阅读和分析源码,可以加深对QT框架的理解,为后续的项目开发打下坚实的基础。