Qt--多语言翻译

Qt使用lupdate工具导出ts文件来记录需要翻译的文本信息,经过翻译后,再使用lrelease工具生成qm文件,然后在程序中加载qm文件的方式来实现多语言。

ts文件格式

ts文件是xml格式的文件文件,格式如下所示

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
    <name>QLineEdit</name>
    <message>
        <location filename="../src/gui/widgets/qlineedit.cpp" line="+2680"/>
        <source>&amp;Undo</source>
        <translation>撤消(&amp;U)</translation>
    </message>
    <message>
        <location line="+4"/>
        <source>&amp;Redo</source>
        <translation>恢复(&amp;R)</translation>
    </message>
    <message>
        <location line="+7"/>
        <source>Cu&amp;t</source>
        <translation>剪切(&amp;T)</translation>
    </message>
    <message>
        <location line="+4"/>
        <source>&amp;Copy</source>
        <translation>复制(&amp;C)</translation>
    </message>
    <message>
        <location line="+4"/>
        <source>&amp;Paste</source>
        <translation>粘贴(&amp;P)</translation>
    </message>
    <message>
        <location line="+5"/>
        <source>Delete</source>
        <translation>删除</translation>
    </message>
    <message>
        <location line="+6"/>
        <source>Select All</source>
        <translation>选择全部</translation>
    </message>
</context>
</TS>

解释说明下各标签含义

<context>
    <name>类名</name>
    <message>
        <location 定位到源文件位置,这个标签可以没有/>
        <source>源文件中tr("***")中的需要翻译的文本</source>
        <translation>翻译后的文本</translation>
    </message>
</context>

lupdate、lrelease

在.pro文件中加上如下一行

TRANSLATIONS = app_zh_CN.ts app_zh_CN.qm

即表示将源码中使用到tr的地方导出到app_zh_CN.ts,然后编译成app_zh_CN.qm

这个过程需要使用到两个工具,就是lupdatelrelease,在Qt的安装目录下可以找到这两个命令
使用方式如下:

lupdate yourapp.pro
lrelease app_zh_CN.ts

当然如果你使用QtCreator,在菜单项的Tools->External->Qt语言家中可以直接点击使用
先使用lupdate生成ts文件,然后使用编辑器或者Qt自带的lingust工具打开ts文件,翻译填充上<translation>标签,然后使用lrelease命令即可生成序列化后的qm文件。

QTranslator

在程序初始化代码中,书写如下代码即可加载qm语言翻译包

// 加载app自定义语言包
QTranslator *translator = new QTranslator(qApp);
translator->load(qm);
qApp->installTranslator(translator);

// 加载qt自带语言包
QTranslator *qt_translator = new QTranslator(qApp);
qt_translator->load(QLocale(), "qt", "_", ":/lang");
//qt_translator->load(":/lang/qt_zh_CN.qm");
qApp->installTranslator(qt_translator);

Bug

这里指出qt自带语言包qt_zh_CN.ts中的一个bug,改bug导致加载qt_zh_CN.qmQMessageBoxQDialogButtonBox中的标准按钮仍然无法汉化显示。

解决方法如下:

打开qt_zh_CN.ts后将QDialogButtonBox替换成QPlatformTheme,然后使用lrelease,重新导出qt_zh_CN.qm即可。

参考https://bugreports.qt.io/browse/QTBUG-39180

懒得操作的同学可以直接到我的百度网盘下载一份直接用,我已经修复好的qt_zh_CN.tsqt_zh_CN.qm文件
https://pan.baidu.com/s/1f0GgqSskRJjXRh3THWUTrA

替换上新的qt_zh_CN.qm后可以发现,QDialogButtonBox中的Open和Cancle按钮已经汉化了,QLineEdit右键菜单也汉化了

qm

发布了130 篇原创文章 · 获赞 147 · 访问量 29万+
展开阅读全文

Qt tr()翻译 加载 问题

12-22

关于Qt 多语言的问题 加载qm时,有些没有翻译过来,显示的还是原本的! 是这样的,我想把所有成员变量写在一个类中,这些成员变量是公共 的,供其它类来访问修改,那么问题来了:在其它类中调用全局变量或全局类后翻译后,加载时没有翻译过来,都保持了原样; 网上说的大部分资料我都看过,大部分针对的是乱码问题,对于我这种形式的介绍的比较少,我不知道怎么办,所以来求助各位大侠: 代码抽出来了,简化成以下示例: test.pro: ``` QT += core gui TARGET = Test TEMPLATE = app SOURCES += main.cpp test.cpp global.cpp HEADERS += test.h global.h FORMS += test.ui TRANSLATIONS = test.ts RESOURCES += test.qrc ``` 全局类: **global.h:** ``` #ifndef GLOBAL_H #define GLOBAL_H #include <QString> class Global { public: Global(); QString strTest; }; **global.cpp:** extern Global myGlobal; #endif // GLOBAL_H #include "global.h" #include <QObject> Global myGlobal; Global::Global() { strTest = QObject::tr("Text"); }; ``` 测试类: **test.h:** ``` #ifndef TEST_H #define TEST_H #include <QDialog> namespace Ui { class Test; } class Test : public QDialog { Q_OBJECT public: explicit Test(QWidget *parent = 0); ~Test(); private: Ui::Test *ui; }; #endif // TEST_H ``` **test.cpp:** ``` #include "test.h" #include "ui_test.h" #include "global.h" Test::Test(QWidget *parent) : QDialog(parent), ui(new Ui::Test) { ui->setupUi(this); //文字还是翻译前的,没有进行更新: ui->lbTest->setText(myGlobal.strTest); //如果定义一个局部变量,是可以成功显示翻译后的文本,但是这样没用呀,因为这个类变量要是全局的,其它类也要访问和修改: //Global test; //ui->lbTest->setText(test.strTest); } Test::~Test() { delete ui; } ``` **test.ui:**就加一个标签控件,用于显示文本 ``` <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> <class>Test</class> <widget class="QDialog" name="Test"> <property name="geometry"> <rect> <x>0</x> <y>0</y> <width>400</width> <height>300</height> </rect> </property> <property name="windowTitle"> <string>Test</string> </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> <widget class="QLabel" name="lbTest"> <property name="text"> <string/> </property> <property name="alignment"> <set>Qt::AlignCenter</set> </property> </widget> </item> </layout> </widget> <layoutdefault spacing="6" margin="11"/> <resources/> <connections/> </ui> ``` **Main.cpp:** ``` #include <QtGui/QApplication> #include "test.h" #include <QTextCodec> #include <QTranslator> QTranslator *myTranslator; int main(int argc, char *argv[]) { QApplication a(argc, argv); myTranslator = new QTranslator(); myTranslator->load(":/test.qm"); a.installTranslator(myTranslator); Test w; w.show(); return a.exec(); } ``` 用Qt Linguist 将文本“Text”翻译成“Update Text”: 编译运行,没有变化,显示的还是原“Text”! 如果在test类中定义局部变量,就会成功,显示的是翻译后的(但是局部的没用,不是我想要的,我需要的是全局的): 期间: 文件编码用GB2312和UTF-8都试过,翻译都无效! tr编码用GB2312和UTF-8都试过,翻译也都无效! 头疼呀 ,请各位大侠赐教,谢谢! 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览