网络寻租

Programmer, Gamer, Hacker

Pyqt多国语言

| Comments

qt的多国语言支持方案

qt在设计的时候就考虑到了多国语言应该如何处理, 原理以及使用方法很简单. 如下:

第一步: 写代码的时候, 对于需要翻译的词语, 用tr()包起来, 比如:

QPushButton hello(QPushButton::tr("Hello world!"));

这样qt就知道这些词语是需要翻译的了. 然后qt需要把这些词语取出来, 放到一个文件里面去, 好进行下一步的翻译工作.

在你的pro文件里面说明这个文件的名称:

TRANSLATIONS    = clabel_zh_CN.ts

这样就可以利用lupdate这个工具来把需要翻译的词语取出来:

lupdate-qt4 clabel.pro

然后, 我们就可以开始翻译工作了. qt提供了一个配套的翻译工具: linguist:

linguist-qt4 clabel_zh_CN.ts

其实ts文件是xml的格式, 你想直接编辑文本也是可以的.

当做完翻译工作之后, 我们需要把ts文件编译一下, 方便程序使用:

lrelease-qt4 clabel_zh_CN.ts

这样就会生成clabel_zh_CN.qm. 最后, 在代码里面加上选择语言的代码:

QTranslator trans;
trans.load("clabel_zh_CN");
app.installTranslator(&trans);

QPushButton hello(QPushButton::tr("Hello world!"));
hello.show();

app.exec();

qt多国语言更详细的介绍在: http://doc.qt.nokia.com/4.6/i18n-source-translation.html

pyqt下面如何实现多国语言

pyqt里面实现的过程和qt里面的类似, 只是因为第一步需要扫描的不是c++代码, 所以需要利用一个pyqt的工具: pylupdate4, 用法和lupdate一样.

首先写程序

1
2
3
4
5
6
trans = QTranslator()
trans.load('plabel_zh_CN')
app.installTranslator(trans)

button = QPushButton(tr("hello world!"))
button.show()

等等, 里面的tr是什么?

def tr(msg):
    return QCoreApplication.translate("@default", msg)

qt翻译是根据类的名称来走的, 调用了什么类的tr, 就取这个类里面设置的翻译.

qt里面是可以利用QObject::tr来翻译, 但是pyqt里面不能, pylupdate4只是做字符串查找, 看有什么字符串是在tr后面的, 然后根据tr调用者来把这个词语归类, 如果没有调用者, 就把它归类到 “@default” 里面. 于是我就只好利用上面的方法来做一个规避..有点恶心, 看看以后是否会有更好的方法来处理.

对于类里面的翻译, 不需要那么麻烦:

class Input(QWidget):
    def __init__(self):
        super(Input, self).__init__()
        label = QLabel(self.tr("input:"))

这里面的tr, 就可以被正确翻译出来.

然后运行pylupdate, 因为我们是python程序, 没有pro, 就只能手动指定文件了

pylupdate4 main.py -ts plabel_zh_CN.ts

好了, 下面的步骤和c++的方法一样

linguist-qt4 clabel_zh_CN.ts
lrelease-qt4 plabel_zh_CN.ts

然后执行代码, 程序按照我们期望的方式翻译过来了, 是不是很简单?

上面的示例代码放在这里: http://bitbucket.org/linjunhalida/pyqt-i10n-example

Comments