PO檔自動繁簡轉換程式

最近在更新我的網站Now.in,最麻煩的一項工作就是國際化,通常我都是先以英文寫網頁,接著用TurboGears2的i18n功能將字串訊息取出,而我的GUI程式的i18n流程也差不多,都是先寫英文,翻成繁體中文,其中一個最腦人的過程,就是把翻好的繁體中文po檔裡的字串剪下貼上到google翻譯將它變成簡體中文再貼到簡體中文的po檔裡,這些工作都是重覆性極高的機械性動作,在一開始句子還少時做還可以,當字詞越來越多,這就變成一件痛苦的工作,既然是高重覆性的工作,為什麼需要人力來做呢? 於是我就寫了一個小程式,可以自動把po檔的內容抓出來丟到google翻譯去,把結果寫到另一個po檔中

# -*- coding: utf8 -*-
'''
Created on 2010/4/27

@author: Victor-mortal
'''

import os
import sys
import urllib
import json
import logging
import optparse
import codecs
import htmllib

log = logging.getLogger(__name__)

def unescape(s):
    p = htmllib.HTMLParser(None)
    p.save_bgn()
    p.feed(s)
    return p.save_end()

def translate(text, sourceLanguage, destLanguage):
    """Translate a text

    @param text: text to translate
    @param sourceLanguage: the language original text is in
    @param destLanguage: language to translate to
    """
    log.info('Translate %s from %s to %s', text, sourceLanguage, destLanguage)
    query = dict(v='1.0',
                 q=text.encode('utf8'),
                 langpair='%s|%s' % (sourceLanguage, destLanguage))
    file = urllib.urlopen(
        'http://ajax.googleapis.com/ajax/services/language/translate',
        data=urllib.urlencode(query)
    )
    result = file.read()
    file.close()
    jsonResult = json.loads(result)
    if not jsonResult['responseData']:
        return None
    return unescape(jsonResult['responseData']['translatedText'])

def main():
    logging.basicConfig(level=logging.INFO)

    parser = optparse.OptionParser(
        usage="usage: %prog sourcePoFile destPoFile sourceLanguage destLanguage"
    )
    (_, args) = parser.parse_args()

    sourceFilePath = args[0]
    destFilePath = args[1]
    sourceLang = args[2]
    destLang = args[3]

    log.info('Translate %s (in %s) to %s (in %s)',
             sourceFilePath, sourceLang, destFilePath, destLang)

    result = []
    sourceFile = codecs.open(sourceFilePath, 'rt', encoding='utf8')
    for line in sourceFile.readlines():
        if line.startswith('msgstr'):
            _, msg = line.split(' ', 1)
            msg = msg.strip()
            msg = msg[1:-1]
            translatedMsg = translate(msg, sourceLang, destLang)
            if not translatedMsg:
                translatedMsg = msg
            result.append(('msgstr "%s"n' % translatedMsg))
        else:
            result.append(line)
    sourceFile.close()

    destFile = codecs.open(destFilePath, 'wt', encoding='utf8')
    destFile.writelines(result)
    destFile.close()

if __name__ == '__main__':
    main()

使用方法很簡單

python po_translate.py 來源po檔 目的po檔 來源語言 目的語言

而語言的代碼,在Google translate的API文件中有寫,事實上它能做的不只有繁簡轉換,要翻成其它語言也可以,只是如果你能接受那品質的話

This entry was posted in Python, 中文文章, 分享 and tagged , , , , , , . Bookmark the permalink.

4 Responses to PO檔自動繁簡轉換程式

  1. 小遊戲 says:

    我是用 Django 的 i18n, 我也有想到要把這個程序自動化,還好有找到您這篇文章,省了很多時間,感謝分享

  2. 小遊戲 says:

    幫忙補充一下,語言代碼

    python po_translate.py a.po b.po zh-tw zh-cn

  3. Tom says:

    請問怎樣在wordpress中使用這段代碼?我只想設置簡體轉繁體,請問代碼加在哪個位置?請幫助,謝謝。

  4. Pingback: 蕃薯爸的【不上班事業集團】 | 網路 創業 兼職 賺錢 » Po translate 自動化翻譯工具