最近Qucs Project有個德國佬加入,這個……一加入就做了不少苦力的工作,像換掉一些Qt3才支援的function,換個Qt4相對應的名字,
他說他是用Xcode的取代功能寫的,老實說這個東西不是用sed就可以解決嗎(._.),不過算了,有人幫忙總是好事。
他後來又貢獻了一個PR,內容是把整個程式的德文翻譯加了一千多個翻譯,根本巨量苦力;同時他又開了一個issue,想要把德文的翻譯給補完,
我覺得這樣一個一個翻譯有點太累了,雖然Qt 有linguist幫忙,可是其實還是很累,遇到沒翻過的,還是要自行輸入。
當下靈機一動,想到之前看過有人用Google Translate來自動進行Gnu Po檔的繁簡轉換,那一樣我能不能用Google Translate進行Qt 的翻譯呢?
為了這個我寫了一個PyLinguist的script,輔助工具選用的是Python的package goslate , 使用方法很簡單,產生一個goslate的物件後,叫個function 即可:
import goslate
go=goslate.Goslate()
go.translate("worship", "zh_tw")
'崇拜'
同樣的,qt的翻譯檔就是一個xml 檔,python要對付xml也是小菜一碟,用xml.etree.Element即可,每個要翻譯的文字會以這樣的格式記錄:
<message>
<source>Hu&e:</source>
<translation type="unfinished"></translation>
</message>
Source是原始文字,Translation則是翻譯文,如果還沒翻譯,就會在translation tag加上type=“unfinished"的屬性。
整體程式流程:
把整個xml 讀到一個xml tree 物件裡,用的是 python xml 的 ElementTree :
import xml.etree.ElementTree as ET
self.tree = ET.parse(XXX.ts)
root = self.tree.getroot()
開始翻譯,這裡我設定self.maplist這個dict物件,記錄所有翻過的內容,這樣只要以後再次出現就取用之前的結果,省下網路回應的時間; 之所以要在translate的外面加上try, except,是我發現goslate在翻譯OK這個字時,不知為何會出現錯誤,為了讓程式跑下去只好出此下策; 如果找到翻譯文,就替代掉之前的文字並拿掉unfinished的屬性。
for msg in root.iter('message'):
source = msg.find('source').text
isTranslated = not (msg.find('translation').attrib.get('type') == "unfinished")
if not isTranslated:
if source in self.maplist:
msg.find('translation').text = self.maplist[source]
del msg.find('translation').attrib['type']
else:
try:
text = self.gs.translate(source, target_lang)
msg.find('translation').text = text
self.maplist[source] = text
del msg.find('translation').attrib['type']
except Exception:
pass
最後把程式寫出去即可,也是一行搞定:
self.tree.write(filename, xml_declaration=True, encoding="UTF-8", method="html")
結果:
目前除了輸出時如xml 的DOCTYPE宣告會消失,大致上的功能是可接受的,翻譯800行約100到200個翻譯文的檔案,大約30秒就翻完了,
這之中可能還有一些是google translate回應的時間,這已經比人工還要快了不少。
老話一句:working hard, after you know you are working smart,翻譯這種事多無聊,丟給google做就好啦。
感恩python,讚嘆python
本程式(毫無反應,其實就只是個腳本XDD) 原始碼在此 ,不過這年頭 qt 的程式感覺已經沒多少人在寫了吧, 大家都去寫網頁了。