他後來又貢獻了一個PR,內容是把整個程式的德文翻譯加了一千多個翻譯,根本巨量苦力;同時他又開了一個issue,想要把德文的翻譯給補完,我覺得這樣一個一個翻譯有點太累了,雖然Qt 有linguist幫忙,可是其實還是很累,遇到沒翻過的,還是要自行輸入。
當下靈機一動,想到之前看過有人用Google Translate來自動進行Gnu Po檔的繁簡轉換,那一樣我能不能用Google Translate進行Qt 的翻譯呢?
為了這個我寫了一個PyLinguist的script,輔助工具選用的是Python的package goslate:
使用方法很簡單,產生一個goslate的物件後,叫個function 即可:
go=goslate.Goslate()
go.translate("worship", "zh_tw")
'崇拜'
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”的屬性。<source>Hu&e:</source>
<translation type="unfinished"></translation>
</message>
整體程式流程大概是這樣:
讀檔,把整個xml 讀到一個xml tree 物件裡:
self.tree = ET.parse(XXX.ts)
root = self.tree.getroot()
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
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做就好啦。
原始碼:
本程式(毫無反應,其實就只是個腳本XDD)為自由軟體,原始碼公布在:https://github.com/yodalee/PyLinguist
參考資料:
1. Goslate:http://pythonhosted.org/goslate/
2. python xml
https://docs.python.org/2/library/xml.etree.elementtree.html
沒有留言:
張貼留言