html5軟件下載手機(jī)版網(wǎng)頁(yè)關(guān)鍵詞排名優(yōu)化
引入
在代碼里面寫(xiě)中文就很low,運(yùn)行時(shí)多語(yǔ)言切換是客戶(hù)端程序都應(yīng)該具備的。
qt國(guó)際化其實(shí)就是qt中字符串的字符集編碼的設(shè)置。當(dāng)然這個(gè)設(shè)置不是簡(jiǎn)單的選擇一下什么語(yǔ)言就好,這個(gè)需要編程人員來(lái)處理的。
通常對(duì)于非拉丁字符(主要指??latin1???字符集)的字符串,就需要使用到??unicode???字符集,而通常使用??UTF-8???編碼。如果只是本地使用一下,直接使用??""??包含文件就可以了。但是有時(shí)候設(shè)計(jì)到網(wǎng)絡(luò)傳輸?shù)惹闆r,就要考慮這些了。
QT提供了??QTextCodec??類(lèi)來(lái)進(jìn)行文本字符集的轉(zhuǎn)換操作。
本文的重點(diǎn)不在于此。深入學(xué)習(xí)可以看
? QTextCodec && 字符編碼??
? ?Qt 編碼問(wèn)題QTextCodec??
本文的重點(diǎn)在于QT界面顯示的中文化。
1、控制需要翻譯的文本
在編寫(xiě)QT程序的時(shí)候,對(duì)于要翻譯的文本,應(yīng)當(dāng)使用??tr()??包含起來(lái)。
我們先來(lái)看看??tr??函數(shù)的原型,注意,這是一個(gè)靜態(tài)函數(shù)。
QString QObject::tr(const char * sourceText, const char * disambiguation = 0, int n = -1)
因?yàn)镼t中的類(lèi)都繼承自??QObject???類(lèi),所以這里直接使用了??tr???,如果不是在繼承自QT的類(lèi)中使用,應(yīng)該用??Object::tr(…)??來(lái)調(diào)用。
這還不是很準(zhǔn)確,在宏定義??Q_OBJECT???展開(kāi)后,會(huì)創(chuàng)建一個(gè)??QMetaObject???對(duì)象,即??static const QMetaObject staticMetaObject;??這個(gè)可以看看源碼
對(duì)于Q_OBJECT的解析可以看Qt信號(hào)與槽機(jī)制的基石-MOC詳解
#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:
展開(kāi)一個(gè)宏定義??QT_TR_FUNCTIONS???,而這里面定義了一個(gè)內(nèi)聯(lián)的??tr???函數(shù)。可以看出這里實(shí)際是使用了一個(gè)靜態(tài)對(duì)象??staticMetaObject???的成員函數(shù)??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); }
例如對(duì)于一個(gè)??QLabel???控件,將其顯示的文本使用??tr??括起來(lái)。tr是經(jīng)過(guò)多級(jí)函數(shù)調(diào)用才實(shí)現(xiàn)了翻譯操作,是有代價(jià)的,所以不該用的時(shí)候最好不要用。
QLable *label = new QLable(tr("hello"),this);
這次還是以一個(gè)??hello world??為例。
先看hello.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>class Widget : public QWidget
{Q_OBJECTpublic: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)
{//創(chuàng)建一個(gè)PushButtonQPushButton * btn = new QPushButton(tr("click me"),this);//連接信號(hào)和槽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更新翻譯
在上面,源文件中的相關(guān)字符串已經(jīng)使用??tr???函數(shù)包裝起來(lái)了?,F(xiàn)在要做的就是更新這些要翻譯的字符串到??ts???文件。
??lupdate???就是用于掃描??pro???文件中指定的代碼或UI文件中被??tr??包裝起來(lái)的文本的工具
lupdate的使用
??lupdate??的使用可以使用??lupdate --help??來(lái)查看。
粗略的說(shuō)一下這個(gè)工具的用法:
使用方法:
lupdate [選項(xiàng)] [項(xiàng)目文件]…
lupdate [選項(xiàng)] [源文件 | 路徑 | @ lst 文件]…-ts ts 文件 | @ lst 文件
(lst文件是一個(gè)文本文件,保存一些文件名稱(chēng),一行一個(gè))
常用選項(xiàng) | 說(shuō)明 |
---|---|
-ts … | 指定輸出文件。 |
-codecfortr | 指定為 tr() 調(diào)用假設(shè)的編解碼器。只有與-ts 有效。 |
-extensions [,]… | 擴(kuò)展支持的文件后綴。擴(kuò)展名列表必須用逗號(hào)分隔。默認(rèn)值:‘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 | 對(duì)ui文件的掃描不保留行號(hào) |
-pro | .Pro 文件的名稱(chēng)。對(duì)于具有.pro 文件語(yǔ)法,但不同的文件后綴的文件非常有用。 |
-source-language [_] | 指定新文件的源字符串的語(yǔ)言。默認(rèn)值Posix 標(biāo)準(zhǔn)。 |
-target-language [_] | 指定新文件翻譯的語(yǔ)言。如果未指定,則猜測(cè)系統(tǒng)語(yǔ)言。 |
@lst-file | 從 lst 文件讀取附加文件的名稱(chēng) (每行一個(gè))。 |
生成ts文件
1. 在命令行中指定方式生成
這里只生成一個(gè)翻譯文件??zh_hans.ts???,其實(shí)可以跟多個(gè)文件名來(lái)生成多個(gè)用于翻譯的??ts???文件。這個(gè)方式會(huì)忽略掉??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??文件中指定
這里我們先修改一個(gè)??hello.pro??文件。
這是原本的??hello.pro??文件:
QT += core gui
TARGET = hello
TEMPLATE = app
SOURCES += main.cpp\hello.cpp
HEADERS += hello.h
LIBS += -lxcb
現(xiàn)在我們添加一句
TRANSLATIONS = zh_hans.ts
添加之后使用??lupdate???來(lái)生成??zh_hans.ts??文件
o@o-pc:~/hello$ lupdate hello.pro
3. linguits翻譯文本
生成了??ts???文件后就要進(jìn)行翻譯了。??ts???文件實(shí)際上是類(lèi)似于??xml??文件的,我們可以直接打開(kāi)它來(lái)翻譯。
- 直接翻譯
打開(kāi)ts文件,我們只需要在????和????之間填寫(xiě)我們翻譯后的文件即可。
例如我們將?"click me"?翻譯為點(diǎn)擊我。則修改為:
<message><location filename="widget.cpp" line="9"/><source>click me</source><translation type="unfinished">點(diǎn)擊我</translation>
</message>
如果你認(rèn)為翻譯合格了,沒(méi)有問(wèn)題了,可以將??translation type=“unfinished”>???中的??type="unfinished"??刪除。
- 使用linguits工具翻譯
1、點(diǎn)擊菜單欄 文件 --> 打開(kāi) 彈出文件選擇對(duì)話(huà)框后選擇生成的ts文件
2、設(shè)置源語(yǔ)言和目標(biāo)語(yǔ)言,然而并沒(méi)什么用
1、選擇要翻譯的短語(yǔ)
2、填寫(xiě)翻譯的文本
3、翻譯完成后記得保存
4. lrelease發(fā)布翻譯
所謂發(fā)布翻譯,就是使用??lrelease??工具將??ts??文件轉(zhuǎn)換輸出不包含多余信息的??qm??文件(qm文件是二進(jìn)制文件,非文本文件)。
我們先來(lái)看看翻譯后的??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>點(diǎn)擊我^_^</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??使用簡(jiǎn)要說(shuō)明
使用方法:
lrelease [選項(xiàng)] 項(xiàng)目文件
lrelease [選項(xiàng)] ts 文件 [-qm qm 文件]
選項(xiàng) | 說(shuō)明 |
---|---|
-idbased | 使用 Id 而不是源字符串作為消息的鍵 |
-compress | QM 文件壓縮 |
-nounfinished | 不使用未完成的翻譯 |
-removeidentical | 如果源文本與翻譯后的文本相同,不使用這個(gè) |
-markuntranslated | 如果消息有沒(méi)有真正的翻譯,使用源文本和 |
5. 在程序中使用翻譯文件
在QT程序中要使用翻譯文件,需要使用到類(lèi)??QTranslation????,F(xiàn)在來(lái)修改??main.cpp??.
#include "widget.h"
#include <QApplication>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator tsor; //創(chuàng)建翻譯器tsor.load("zh_hans.qm"); //加載語(yǔ)言包a.installTranslator(&tsor); //安裝翻譯器Widget w;w.show();return a.exec();
}
參考
- QT國(guó)際化(lupdate/linguits/lrelease)