本文提及如何使用QT和QT Linguist來實(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國際化的文章扮碧。這里也簡(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括起來所有字符放入到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文件來產(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++ 來處理ts文件而不是Qt Linguist(別笑我低端)但汞。
如下是Qt Linguist中打開ts文件的樣子 宿刮, 黃色的框是你的文件列表,點(diǎn)選文件后會(huì)在紅色的框內(nèi)顯示所有tr括起來的語句或者是ui中的可見字符串私蕾。綠色框是當(dāng)前翻譯中的文本和翻譯后的文本僵缺。黑色框是文本在代碼中的具體位置,幫助你精確翻譯踩叭,但是這部分常常不可用磕潮。那些文件名和源語句前的鉤鉤只是用來標(biāo)記完成度的,完成就打成綠色的鉤容贝,自己打自脯,但是不影響翻譯的。
個(gè)人更喜歡用notepad++斤富,順便一提吧膏潮。如下是notepad++打開ts的樣子,剛好是一個(gè)完整的context满力。標(biāo)簽是一個(gè)文件所有需翻譯文本集合的開始標(biāo)志焕参。標(biāo)簽指明了文件中的類名稱。是一條需翻譯語句的開始標(biāo)記油额。是語句在文件中的行數(shù)叠纷,因此可能在同一個(gè)中出現(xiàn)多次。需翻譯的語句潦嘶,要精確涩嚣,連空格個(gè)數(shù)不一樣都不能匹配。是翻譯后的語句衬以,這個(gè)標(biāo)簽一個(gè)開始是 缓艳,好像是這樣的,表示語句沒有翻譯好看峻,當(dāng)你在notepad++中確實(shí)完成翻譯后記得將type部分刪掉阶淘,帶有這個(gè)unfinished標(biāo)志的語句是即使翻譯好也不會(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)繁彬呻,再覆蓋原來的ts文件來完成這個(gè)任務(wù)衣陶。不論怎樣,完成繁體翻譯吧騷年闸氮!
5剪况、關(guān)于動(dòng)態(tài)語言切換
個(gè)人對(duì)這個(gè)沒有什么認(rèn)識(shí)。但是我只提一個(gè)問題:動(dòng)態(tài)翻譯是否在你的工程中非有不可蒲跨? 如果不是译断,就稍稍偷個(gè)懶吧。我的建議有兩個(gè)或悲,一個(gè)比較傻瓜孙咪。1.在用戶安裝你的應(yīng)用的過程中(安裝包),讓用戶選定一個(gè)語言巡语,安裝完成后不可以改變翎蹈。相信這個(gè)不會(huì)影響用戶的使用體驗(yàn),因?yàn)闆]有人會(huì)裝B到明明英文不好卻是要用英文安裝男公,安裝后又作賤地想換回中文的(你荤堪?)。 2.在應(yīng)用中給用戶一個(gè)設(shè)置選項(xiàng),讓用戶可以選擇語言逞力,但是選擇語言后提示需要重啟本應(yīng)用曙寡。這個(gè)辦法比較傻瓜。在用戶重啟你的應(yīng)用時(shí)寇荧,你就有機(jī)會(huì)讓你的QTranslator重新load一個(gè)不同的qm文件,這樣就可以完成語言切換执隧。個(gè)人偏向第一種方法揩抡,也稍稍省點(diǎn)心吧,別讓自己太容易暴斃吧coder镀琉。
6峦嗤、QTranslator的一些問題
一個(gè)QApplication會(huì)有一個(gè)translator。translator可以remove屋摔,也可以install烁设。下面是筆者一個(gè)簡(jiǎn)單的程序來設(shè)置語言:
1).先定義我的qm文件的路徑先
2).根據(jù)系統(tǒng)的QLocale判斷應(yīng)該load哪個(gè)qm文件
那個(gè)optionManager是用來讀注冊(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。好了持灰,就說到這個(gè)程度盔夜,這樣的損招再說的話那些老鳥又要表示不屑了。
8、請(qǐng)使用命令行獲得.qm文件喂链,而不是QT Linguist的”發(fā)布為"或者“另外發(fā)布為”~7凳!
這里很可能是我的機(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。