QT国际化(lupdate/linguits/lrelease)

本文由乌合之众瞎写http://www.cnblogs.com/oloroso/

qt国际化其实就是qt中显示文本语言的设置。

QT提供了QTextCodec类来进行文本字符集的转换操作。

本文的重点不在于此。深入学习可以看

本文的重点在于QT界面显示的中文化。

1、控制需要翻译的文本

在编写QT程序的时候,对于要翻译的文本,应当使用tr()包含起来。

我们先来看看tr函数的原型,注意,这是一个静态函数。

QString QObject::tr(const char * sourceText, const char * disambiguation = 0, int n = -1)

因为Qt中的类都继承自QObject类,所以这里直接使用了tr,如果不是在继承自QT的类中使用,应该用Object::tr(...)来调用。

这还不是很准确,在宏定义Q_OBJECT展开后,会创建一个QMetaObject对象,即static const QMetaObject staticMetaObject;这个可以看看

#define Q_OBJECT \
public: \
Q_OBJECT_CHECK \
static const QMetaObject staticMetaObject;\
Q_OBJECT_GETSTATICMETAOBJECT \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
QT_TR_FUNCTIONS \
virtual int qt_metacall(QMetaObject::Call,int, void **); \
private:

展开一个宏定义 QT_TR_FUNCTIONS,而这里面定义了一个内联的tr函数。可以看出这里实际是使用了一个静态对象staticMetaObject的成员函数tr

# define QT_TR_FUNCTIONS \
static inline QString tr(const char *s, const char *c = 0) \
{ return staticMetaObject.tr(s, c); } \
static inline QString trUtf8(const char *s,const char *c = 0) \
{ return staticMetaObject.trUtf8(s, c); } \
static inline QString tr(const char *s,const char *c, int n) \
{ return staticMetaObject.tr(s, c, n); } \
static inline QString trUtf8(const char *s,const char *c, int n) \
{ return staticMetaObject.trUtf8(s, c, n); }

例如对于一个QLabel控件,将其显示的文本使用tr括起来。tr是经过多级函数调用才实现了翻译操作,是有代价的,所以不该用的时候最好不要用。

QLable *label = new QLable(tr("hello"),this);

这次还是以一个hello world为例。

先看hello.h

#ifndef WIDGET_H
#define WIDGET_H #include <QWidget> class Widget : public QWidget
{
Q_OBJECT public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void btn_click();
}; #endif // WIDGET_H

再看hello.cpp

#include "widget.h"
#include <QPushButton>
#include <QMessageBox> Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//创建一个PushButton
QPushButton * btn = new QPushButton(tr("click me"),this);
//连接信号和槽
connect(btn,SIGNAL(clicked()),this,SLOT(btn_click()));
} Widget::~Widget()
{
} void Widget::btn_click()
{
QMessageBox::information(NULL, tr("click button"),
tr("hello world"), QMessageBox::Yes);
}

2、lupdate更新翻译

在上面,源文件中的相关字符串已经使用tr函数包装起来了。现在要做的就是更新这些要翻译的字符串到ts文件。lupdate就是用于扫描pro文件中指定的代码或UI文件中被tr包装起来的文本。

lupdate的使用

lupdate的使用可以使用lupdate --help来查看。

粗略的说一下这个工具的用法:

使用方法:
lupdate [选项] [项目文件]...
lupdate [选项] [源文件 | 路径 | @ lst 文件]...-ts ts 文件 | @ lst 文件
(lst文件是一个文本文件,保存一些文件名称,一行一个)
常用选项 说明
-ts ... 指定输出文件。
-codecfortr 指定为 tr() 调用假设的编解码器。只有与-ts 有效。
-extensions [,]... 扩展支持的文件后缀。扩展名列表必须用逗号分隔。默认值: 'java,jui,ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs,qml'。
-no-recursive 指定不递归扫描的目录
-recursive 递归扫描指定目录
-I or -I 附加的包含文件目录
-no-ui-lines 对ui文件的扫描不保留行号
-pro .Pro 文件的名称。对于具有.pro 文件语法,但不同的文件后缀的文件非常有用。
-source-language [_] 指定新文件的源字符串的语言。默认值Posix 标准。
-target-language [_] 指定新文件翻译的语言。如果未指定,则猜测系统语言。
@lst-file 从 lst 文件读取附加文件的名称 (每行一个)。

生成ts文件

1、在命令行中指定方式生成

这里只生成一个翻译文件zh_hans.ts,其实可以跟多个文件名来生成多个用于翻译的ts文件。这个方式会忽略掉pro文件中指定要生成的翻译文件。

o@o-pc:~/hello$ lupdate hello.pro -ts zh_hans.ts
Updating 'zh_hans.ts'...
Found 3 source text(s) (3 new and 0 already existing)

2、在pro文件中指定

这里我们先修改一个hello.pro文件。

这是原本的hello.pro文件:

QT       += core gui

TARGET = hello
TEMPLATE = app SOURCES += main.cpp\
hello.cpp
HEADERS += hello.h LIBS += -lxcb

现在我们添加一句

TRANSLATIONS = zh_hans.ts

添加之后使用lupdate来生成zh_hans.ts文件

o@o-pc:~/hello$ lupdate hello.pro

3、linguits翻译文本

生成了ts文件后就要进行翻译了。ts文件实际上是类似于xml文件的,我们可以直接打开它来翻译。

1、直接翻译

先打开看看

我们只需要在<translation></translation>之间填写我们翻译后的文件即可。

例如我们将"click me"翻译为"点击我_"。则修改为:

  6     <message>
7 <location filename="widget.cpp" line="9"/>
8 <source>click me</source>
9 <translation type="unfinished">点击我</translation>
10 </message>

如果你认为翻译合格了,没有问题了,可以将translation type="unfinished">中的type="unfinished"删除。

2、使用linguits工具翻译

1、点击菜单栏 文件 --> 打开 弹出文件选择对话框后选择生成的ts文件

2、设置源语言和目标语言,然而并没什么用,(__)

1、选择要翻译的短语

2、填写翻译的文本

3、翻译完成后记得保存

4、lrelease发布翻译

所谓发布翻译,就是使用lrelease工具将ts文件转换输出不包含多余信息的qm文件(qm文件是二进制文件,非文本文件)。

我们先来看看翻译后的ts文件。

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>Widget</name>
<message>
<location filename="widget.cpp" line="9"/>
<source>click me</source>
<translation>点击我^_^</translation>
</message>
<message>
<location filename="widget.cpp" line="20"/>
<source>click button</source>
<translation>单击按钮</translation>
</message>
<message>
<location filename="widget.cpp" line="21"/>
<source>hello world</source>
<translation>你好 世界</translation>
</message>
</context>
</TS>

使用lrelease生成qm文件

o@o-pc:~/hello$ lrelease zh_hans.ts -qm zh_hans.qm

lrelease使用简要说明

使用方法:
lrelease [选项] 项目文件
lrelease [选项] ts 文件 [-qm qm 文件]
选项 说明
-idbased 使用 Id 而不是源字符串作为消息的键
-compress QM 文件压缩
-nounfinished 不使用未完成的翻译
-removeidentical 如果源文本与翻译后的文本相同,不使用这个
-markuntranslated 如果消息有没有真正的翻译,使用源文本和

4、在程序中使用翻译文件

在QT程序中要使用翻译文件,需要使用到类QTranslation。现在来修改main.cpp.

#include "widget.h"
#include <QApplication>
#include <QTranslator> int main(int argc, char *argv[])
{
QApplication a(argc, argv); QTranslator tsor; //创建翻译器
tsor.load("zh_hans.qm"); //加载语言包
a.installTranslator(&tsor); //安装翻译器 Widget w;
w.show(); return a.exec();
}

编译后运行看看。

QT国际化 一 (lupdate/linguits/lrelease)的更多相关文章

  1. Qt国际化详细介绍,中文乱码以及解决方案

    Qt国际化的一般步骤 运行 lupdate,从应用程序的代码中提取所有界面上的可见字符.        这些可见字符必须被 tr() .QCoreApplication::translate().Qt ...

  2. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

  3. QT国际化(中英转换)

    转载:https://blog.csdn.net/u012528526/article/details/54707233 QT国际化(中英转换) 我们都知道在安卓中,想做国际化很简单,只需要建立对应的 ...

  4. QT国际化,中英文等多语言界面显示的方法

    在网上学习了一下QT的国际化使用方法,最后将自己试成功的方法总结例如以下: 当中遇到的问题有:生成的ts文件里 代码中的中文 有的不显示,有的显示乱码.   步骤1: 生成.ts文件,在pro项目文件 ...

  5. 【Qt】Qt国际化【转】

    简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言) ...

  6. QT国际化示例, 检测系统语言,设置适合语言,按键切换显示语言

    1.效果如下图,开启就自动检测系统语言,选择系统语言显示, UI有控件设置,在中文和英文之间切换.. 2. 源码 dialog.h #ifndef DIALOG_H #define DIALOG_H ...

  7. 【Qt】Qt国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)【转】

    简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...

  8. Qt 国际化之二:多国语界面动态切换的实现

    第一步在你的pro里面加入 TRANSLATIONS = myexec_zh.ts (根据对应的ts文件修改)第二步用lupdate 操作pro 将要翻译的提取到ts文件 命令是 lupdate my ...

  9. Qt入门(12)——Qt国际化

    应用的国际化就是使应用成为能被非本国的人使用的过程.有的情况下,国际化很简单,例如,使一个US应用可被Australian或者British用户理解,工作可能少于几个拼写修正.但是使一个US应用可以被 ...

随机推荐

  1. HTML学习笔记——图片显示、图片跳转、图片相对路径

    1>显示图片.用a标签实现点击图片跳转.地图标签/点击图片上固定区域跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  2. Python 调用 user32.dll

    import ctypes h = ctypes.windll.LoadLibrary("C:\\Windows\\System32\\user32.dll") h.Message ...

  3. C#使用百度API通过IP获取地理位置和坐标

    百度接口相关说明:http://developer.baidu.com/map/ip-location-api.htm 返回是json格式,首先构建相关反系列化类: #region AddressFo ...

  4. Kindeditor 代码审计

    <?php /** * KindEditor PHP * * 本PHP程序是演示程序,建议不要直接在实际项目中使用. * 如果您确定直接使用本程序,使用之前请仔细确认相关安全设置. * */ r ...

  5. Yii2框架与MongoDB拓展、Redis拓展的安装流程

    @author 周煦辰 2016-03-21 这段时间新上了一个项目,使用的是Yii2框架.这里记录一下Yii2框架.Yii2-Mongo拓展.Yii2-Redis拓展等的安装流程.因为使用的系统是W ...

  6. Ajax异步刷新地址栏

    公司项目后台使用现成的UI框架,DevExpress,jqGrid,XXXUI之类的,这些展示数据列表的控件/插件,基本是异步的. 这倒也好,有变化也只是数据那一块变化,不会重新加载整个页面. 但是, ...

  7. [C#]通用守护进程服务

    摘要 很多情况下,都会使用windows服务做一些任务,但总会有一些异常,导致服务停止.这个时候,开发人员又不能立马解决问题,所以做一个守护者服务还是很有必要的.当检测到服务停止了,重启一下服务,等开 ...

  8. thinkphp学习笔记13-15集

    13集: ThinkPHP3.1.3使用视频教程--后台登录验证与自动运行方法_标清.flv 14集: ThinkPHP3.1.3使用视频教程--自定义SESSION处理DB驱动与添加Redis处理驱 ...

  9. Redis在WEB开发中的应用与实践

    Redis在WEB开发中的应用与实践 一.Redis概述: Redis是一个功能强大.性能高效的开源数据结构服务器,Redis最典型的应用是NoSQL.但事实上Redis除了作为NoSQL数据库使用之 ...

  10. GOF业务场景的设计模式-----工厂模式

    定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类. 工厂方法模式 基本代码 interface IProduct { public void produ ...