Welcome 微信登录

首页 / 操作系统 / Linux / Qt国际化(源码含中文时)的点滴分析

注意:本文不介绍如何使用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_GBKQTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));#elseQTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));#endifQTranslator translator;translator.load("hellotr_en");app.installTranslator(&translator);QPushButton hello(QPushButton::tr("你好!", "版权所有:Dbzhang800"));hello.show();return app.exec();}大家应该都知道如何做了:
  • 使用lupdate 生成 hellotr_en.ts 文件
  • 使用linguist 打开该文件进行翻译
  • 使用lrelease (或通过linguist的菜单)将其转换成hellotr_en.qm文件
三步走下来,结果正常,界面能显示翻译出来的问题。但是,翻译过程中有一点会很不爽:
  • 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相关的源码文件可能会有不同,我不能确定),能力和精力有限哈。