QT國(guó)際化

本文提及如何使用QT和QT Linguist來(lái)實(shí)現(xiàn)翻譯,如果你對(duì)所謂動(dòng)態(tài)翻譯感興趣,請(qǐng)移步到其他文章。筆者也推薦一本叫《精通QT4 GUI 編程》的書,里面第18章有提及動(dòng)態(tài)的(既不用關(guān)閉程序?qū)崿F(xiàn)“一點(diǎn)即換”)翻譯。

網(wǎng)上有許多關(guān)于QT國(guó)際化的文章。這里也簡(jiǎn)單講述一次.


1、qm文件和ts文件。

ts文件是程序員是用的翻譯文件。你有幾種方法可以得到這樣的文件。

(1) 針對(duì)整個(gè)項(xiàng)目:在項(xiàng)目文件中加入TRANSLATION += ?abc.ts(abc是自定的文件名)。那么你可以使用Qt自帶的控制臺(tái),輸入命令lupdate myPro.pro(myPro是自定的項(xiàng)目名稱)。Qt就會(huì)為你在項(xiàng)目文件的同一目錄下生成一個(gè)abc.ts文件。輸入命令時(shí)要么當(dāng)前目錄就是pro文件所在目錄,要就在pro文件名前帶上絕對(duì)或相對(duì)路徑。

當(dāng)你lupdate你的pro文件是,Qt會(huì)將ui文件中所有的可見字符以及你在程序用使用tr括起來(lái)所有字符放入到ts文件中。

(2) 針對(duì)單個(gè)文件,這只適用于一些特定場(chǎng)景或者個(gè)人使用習(xí)慣。當(dāng)你往項(xiàng)目里頭添加了新的帶有需要翻譯文本的文件后,你完全可以直接再次lupdate一次整個(gè)項(xiàng)目,Qt不會(huì)覆蓋你在abc.ts中已經(jīng)做好的任何翻譯。 當(dāng)然你也可以lupdate單個(gè)文件,命令和上一個(gè)是一樣的 : lupdate ?文件的絕對(duì)路徑或相對(duì)路徑 -ts 要生成的ts文件名和文件路徑,例如:

lupdate ../app/test.cpp ?-ts ./testTs.ts

那么Qt就是在你指定的路徑下生成你指定的文件名的ts文件。

qm文件是程序能識(shí)別的二進(jìn)制的翻譯文件。通過發(fā)布一個(gè)ts文件來(lái)產(chǎn)生。命令很簡(jiǎn)單:lrelease abc.ts。 那么Qt 會(huì)為你在abc.ts的同名目錄下生成一個(gè)同名的qm文件。qm文件是QTranslator應(yīng)該讀入的文件,關(guān)于QTranslator,就移步到Qt的幫助手冊(cè)吧。

下圖是Qt自帶的控制臺(tái)。


2、處理ts文件

處理ts文件當(dāng)然也有多種方法。你可以使用Qt Linguist打開,也可以使用任何支持XML文本格式的工具打開。個(gè)人比較喜歡使用notepad++ 來(lái)處理ts文件而不是Qt Linguist(別笑我低端)。

如下是Qt Linguist中打開ts文件的樣子 , 黃色的框是你的文件列表,點(diǎn)選文件后會(huì)在紅色的框內(nèi)顯示所有tr括起來(lái)的語(yǔ)句或者是ui中的可見字符串。綠色框是當(dāng)前翻譯中的文本和翻譯后的文本。黑色框是文本在代碼中的具體位置,幫助你精確翻譯,但是這部分常常不可用。那些文件名和源語(yǔ)句前的鉤鉤只是用來(lái)標(biāo)記完成度的,完成就打成綠色的鉤,自己打,但是不影響翻譯的。

個(gè)人更喜歡用notepad++,順便一提吧。如下是notepad++打開ts的樣子,剛好是一個(gè)完整的context。標(biāo)簽是一個(gè)文件所有需翻譯文本集合的開始標(biāo)志。標(biāo)簽指明了文件中的類名稱。是一條需翻譯語(yǔ)句的開始標(biāo)記。是語(yǔ)句在文件中的行數(shù),因此可能在同一個(gè)中出現(xiàn)多次。需翻譯的語(yǔ)句,要精確,連空格個(gè)數(shù)不一樣都不能匹配。是翻譯后的語(yǔ)句,這個(gè)標(biāo)簽一個(gè)開始是 ,好像是這樣的,表示語(yǔ)句沒有翻譯好,當(dāng)你在notepad++中確實(shí)完成翻譯后記得將type部分刪掉,帶有這個(gè)unfinished標(biāo)志的語(yǔ)句是即使翻譯好也不會(huì)被寫入qm文件中的。

最后,你需要一個(gè)年輕貌美的女同事,既熟悉英文,又溫柔體貼。而且不會(huì)在你忘得不可開交但剩下30%翻譯任務(wù)的時(shí)候也不肯幫你一把。祝你好運(yùn),coder。


3、我的工程使用了Qt的控件,但是Qt的控件中字符都是英文的……

不要緊,到你的Qt安裝目錄下搜一下.ts文件,你會(huì)發(fā)現(xiàn)其實(shí)Qt已經(jīng)為我們準(zhǔn)備好了非常多的ts文件。剛剛這個(gè)問題中,我們就找到qt_zh_CN.ts文件,這是一個(gè)有qt控件簡(jiǎn)體中文翻譯的文件。你完全可以把這個(gè)文件放到你的工程中去(你不會(huì)跟計(jì)較那幾百k的空間吧!?),然后通過文本工具,往這個(gè)文件中添加 , 例如你可以將你的項(xiàng)目的ts文件直接拷貝到qt_zh_CN.ts文件的最后面(為了好找) ,然后lrelease這個(gè)qt_zh_CN.ts文件。你就會(huì)發(fā)現(xiàn)Qt控件中的英文也變成中文了,而且還添加了你自己的部分。


4、我想為我的工程添加繁體翻譯

方法同上,不過這次你要找的文件叫qt_ch_TW.ts(Qt在這就做得不對(duì)了哈!什么TaiWan 和 China的,都一個(gè)地方),這個(gè)文件有Qt所有控件的繁體中文翻譯。你甚至可以講qt_zh_CN.ts的內(nèi)容拷貝到word中,然后簡(jiǎn)轉(zhuǎn)繁,再覆蓋原來(lái)的ts文件來(lái)完成這個(gè)任務(wù)。不論怎樣,完成繁體翻譯吧騷年!


5、關(guān)于動(dòng)態(tài)語(yǔ)言切換

個(gè)人對(duì)這個(gè)沒有什么認(rèn)識(shí)。但是我只提一個(gè)問題:動(dòng)態(tài)翻譯是否在你的工程中非有不可? 如果不是,就稍稍偷個(gè)懶吧。我的建議有兩個(gè),一個(gè)比較傻瓜。1.在用戶安裝你的應(yīng)用的過程中(安裝包),讓用戶選定一個(gè)語(yǔ)言,安裝完成后不可以改變。相信這個(gè)不會(huì)影響用戶的使用體驗(yàn),因?yàn)闆]有人會(huì)裝B到明明英文不好卻是要用英文安裝,安裝后又作賤地想換回中文的(你?)。 2.在應(yīng)用中給用戶一個(gè)設(shè)置選項(xiàng),讓用戶可以選擇語(yǔ)言,但是選擇語(yǔ)言后提示需要重啟本應(yīng)用。這個(gè)辦法比較傻瓜。在用戶重啟你的應(yīng)用時(shí),你就有機(jī)會(huì)讓你的QTranslator重新load一個(gè)不同的qm文件,這樣就可以完成語(yǔ)言切換。個(gè)人偏向第一種方法,也稍稍省點(diǎn)心吧,別讓自己太容易暴斃吧coder。


6、QTranslator的一些問題

一個(gè)QApplication會(huì)有一個(gè)translator。translator可以remove,也可以install。下面是筆者一個(gè)簡(jiǎn)單的程序來(lái)設(shè)置語(yǔ)言:

1).先定義我的qm文件的路徑先


2).根據(jù)系統(tǒng)的QLocale判斷應(yīng)該load哪個(gè)qm文件

那個(gè)optionManager是用來(lái)讀注冊(cè)表的。這個(gè)跟應(yīng)用本身有關(guān)。

3). 準(zhǔn)備一個(gè)接口,然App在啟動(dòng)時(shí)load好qm文件。

這樣大概就是使用過程了。其他的話聰明的你應(yīng)該可以理解的了。


7、 哪個(gè)QLocale::Language表示中文繁體啊??

這個(gè)問題問題得好啊。在Qt的QLocale中的Language枚舉中是沒有中文繁體的。那怎么辦?我這里給有一個(gè)不是建議的建議,那就認(rèn)為,這臺(tái)機(jī)子不是英文和中文的話,就是中文繁體(中文指中文簡(jiǎn)體)。用一個(gè)估計(jì)少見的Language表示中文繁體,寫注冊(cè)表時(shí),遇到就這個(gè)Language項(xiàng),就認(rèn)為是中文繁體。load的時(shí)候就用繁體的qm。好了,就說(shuō)到這個(gè)程度,這樣的損招再說(shuō)的話那些老鳥又要表示不屑了。


8、請(qǐng)使用命令行獲得.qm文件,而不是QT Linguist的”發(fā)布為"或者“另外發(fā)布為”~!!

這里很可能是我的機(jī)器問題。但是那天工作時(shí)遇到的問題確實(shí)就在于此。如果你用QT Linguist的發(fā)布功能,你可能會(huì)和我一樣發(fā)現(xiàn)很多句子都不能翻譯,但是你檢查你的ts文件時(shí)卻沒有問題。如果有人看到了這里,并且有機(jī)會(huì)實(shí)踐,請(qǐng)幫忙看看情況是不是真的如此。如果可以的話請(qǐng)給我留個(gè)言。或者直接向Qt 提BUG。

Enjoy your Qt。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,055評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評(píng)論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,346評(píng)論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評(píng)論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,118評(píng)論 0 286
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,637評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,558評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,739評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評(píng)論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 43,980評(píng)論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評(píng)論 1 280
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,347評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,702評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程,因...
    小菜c閱讀 6,477評(píng)論 0 17
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,707評(píng)論 18 399
  • Qt是屬于一個(gè)跨平臺(tái)的GUI開發(fā)軟件,支持的平臺(tái)有Unix、Linux、Windows/WinCE、IOS等。 Q...
    一葉之界閱讀 8,193評(píng)論 0 17
  • 《裕語(yǔ)言》速成開發(fā)手冊(cè)3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 27,307評(píng)論 5 19
  • 我發(fā)現(xiàn)“運(yùn)動(dòng)”這個(gè)項(xiàng)目每隔幾年都會(huì)被“雞血”喚醒列入計(jì)劃,但總是堅(jiān)持不了幾次,哪怕是產(chǎn)后身體酸痛,花了不少錢去上私...
    什么和什么的閱讀 251評(píng)論 1 2