本文提及如何使用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。