2010-08-18

半自动生成多语言对照表

软件本地化会出现多个语言版本。
一般情况都是从一个语言翻译到另一个语言,那么同时看到这两种语言就好了。
但是,还有特殊需求:要同时看见这些语言版本……
似乎没有现成的软件提供这个功能。那么只有自己动手了。

由于历史原因,i10n/l10n 有两种实现方式:ini 配置文件和 gettext。
实际上,还有一种,微软喜欢的那种,资源动态库。

ini 文件:处理起来比较简单

每种语言一个 ini 文件。
利用"="过滤掉 SECTION,再导入 Excel("="作为分隔符)基本就大功告成了。
只是需要注意文本中是否有"=",也就是,有没有出现第 3 列、第 4 列……(可以用 Excel 公式 AVERAGEA(C:C) 有没有除零错误来辅助判断)
文本中包含"=",则删除第一列,仍保存为文本。
再用 Excel 打开(没有分隔符)就搞定了一种语言——按顺序出现在 Excel 中某列。
剩下的语言同样操作搞定,最后贴到一张 Excel 表中就好了。

po 文件:麻烦一些

需要写点代码,从 po 文件获得 msgid 和 msgstr,然后以 TAB 分割方式写到文本文件中。
之后直接用 Excel 打开即可。
其他语言如法炮制,最后合并到一张表格即可。

#!/usr/bin/env python

# convert po file to tab delimited file

from babel.messages import pofile
import sys

def quote(text):
    text = '\\r'.join(text.split('\r'))
    return '"' + '\\n\n'.join(text.split('\n')).strip() + '"'

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Usage: ", sys.argv[0], " <filename.po>"
        sys.exit(0)

    with open(sys.argv[1], 'r') as po:
        msgs = pofile.read_po(po)

    with open(sys.argv[1] + '.txt', 'wb') as txt:
        txt.write('\xff\xfe')
        for msg in msgs:
            if not msg.id:
                continue
            row = quote(msg.id) + '\t' + quote(msg.string) + '\r\n'
            txt.write(row.encode('utf-16')[2::])

No comments:

Post a Comment