话说没有google就没有这篇文章,连续两天两夜的奋战终于搞妥了i18n语言包翻译的工作环境glotpress。
1.背景
原有的系统由于国际化需要,采用gettext技术对系统中涉及语言的地方都做了处理,方便了使用poEdit直接从源码中提取源文字模板pot的工作。但涉及到其他国语言的翻译仍需要各个语言的翻译根据我们导出的execel逐条翻译。面对一个成型的系统近2W条词条的翻译工作,量还是很大的,而且产品升级后新增词条的翻译如何整合并快速生成语言包文件是一个大问题。
2.技术分析
gettext技术通过设置语言的mapping实现替换的原理并不难以理解,poedit利用正则从代码提取字符也是很简单的逻辑。
GoOgle到gettext工具包中含有msgfmt,msgunfmt分别可以把po文件压成mo文件,把mo文件再解压成po文件。po文件用文本编辑器打开后也很好理解规则,一条原文对应一条翻译,多行的条目首行两个“,后续每行用“”引起来,每条翻译间空一行。
上面两个工具的windows版本官方的release库中也有下载,注意要把tool和runtime的都下载了,而且还得去下iconv的可执行文件,合在一起就木有报错了。
3.系统架构
为了实现更友好的处理,我希望能把现有的语言包全存到数据库中,按需提取且能快速增加,要是能实现自动翻译就更好了。
那么从已知的gettext技术结合php、mysql来处理,思路为利用gettext把已有的mo文件还原成po文件,再用php读取po文件处理后逐条存入数据库,翻译时调用在线的api传入要翻译的原文和原文语言和目标语言,将返回的文字存入相应语言的相应条目内。
按这个思路搞了一晚基本实现了已有的数据存入数据库以及读取。
4.阶段总结
照此开发下去一套系统预计需要几十天建成,劳产率太低,决定暂停。
这时不甘心的我想起来N年前搞bbpress时在一个大神的博客链接的系统内做过在线的插件编辑,那时自己懵懵懂懂,就记得wordpress的官方插件至少都实现了几十个国家的机器语言翻译版本的语言包。(怎么知道是机器翻译的,这个一看就知...)N年前就有的技术,现在应该由成型系统了,于是各种Google,结合记忆确定了这个大神叫做Gautam Gupta,看他github照片居然是阿三哥。他的博客多年后彻底改造了,我找不到原来的系统入口,于是只得上bbpress官方网站找线索,终于在wordpress官网上找到一款将glotpress的开源软件,十来年居然还没有stable的意思...
————————
第一场战役无疾而终....
5.glotpress
既然找到了这个家伙的存在,我满心想着功能强大、易用等名词,但google了一把心凉了半截,这个软件是个小众软件,使用群体并不大,想找篇正儿八经的安装使用文章都没有,继续在国外网站找效果居然一样不明显。不过好在是开源软件,代码量也不大,结构和wordpress也很像,看了看,捣鼓了半天也就搭起来了。
1.使用admin,密码a登录
2.创建项目
3.建立翻译版本
4.导入翻译文件。这个时候如果mo文件速度显然会比po慢,而两种文件导入都很慢,有的时候导入到一半就会报错,这个时候再导入几次应该就能导入完成(导入过的就不再导入了),这里我一上来还犯了一个错,在繁体的语言包里导入了日语的语言包,再导入时好像覆盖不了,就全乱了套,还好数据库就那么几张表很容易看明白,清空重来就是了。
5.这时基本的在线翻译环境建立完毕,如果放到外网给翻译人员开放账号的话就可以轻松实现协同了。
6.怎么实现google的翻译呢?傻眼了,google啊,号称不作恶的google居然把翻译api给在2011年变成收费产品了。
7.替代方案呢?Bing翻译API支持每天2W字符的免费转换。花了一下午把这套方案实现了,悲剧的是这个接口的速度有够慢,而且只能从后台去调用验证接口,根据返回的数据生成api-key再通过soap、http、ajax等三种不同方式实现翻译,依次看msdn最后找到一条较稳定的小道,就是采用ajax方式的v1版本地址,实测速度在glotpress的页面上hack增加自动点击,测试自动翻译数十分钟算了下平均值10s翻译1条。对于本产品5个语言包2W*5=10W的量,需要计算机开着一直做12天。而且结果还全部都是机器语言版本,这个效率实在不敢恭维。
8.继续寻求替代方案。
转一个其他人博客对各大api的评价
微软API:利用WCF方式进行翻译,每次翻译英文字数最大为一万两千多个,中文字符的话最多为六七千个,最大200M字符/月的限制,超过限制后要付费。对HTML翻译支持完美,翻译结果也不错,但考虑到免费字符数限制,需做账号轮巡,账号注册的步骤那叫一个繁琐啊……(此方式可做为首选翻译方式,轮巡的翻译功能已实现,有时间了把源码贴上来。 ——qfzhang于2013-05-30更新)
YoudaoAPI:语言支持不够多,只有英文、日文、中文几个之间的互相翻译,且每次请求最多翻译的字符数不能超过200,还有访问频率限制。
GoogleAPI:Google翻译的API,优势明显,翻译结果十分准确,尤其是针对HTML,能够准确跳过HTML标签部分,只翻译文本,但它是付费使用的(v1版为免费版,但接口已关闭),其价格为100万字符/20美金,其价格自然不言而喻。且在使用过程中发现,其标称每次最大翻译字符数不能超过2k,但实际使用时超过1.5k就会报异常。
BaiduAPI:有访问频率限制和长度限制,且翻译结果不理想。
从百度APi的帮助文件看应该还是不错的
http://openapi.baidu.com/wiki/index.php?title=%E5%B8%AE%E5%8A%A9%E6%96%87%E6%A1%A3%E9%A6%96%E9%A1%B5/%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91/%E7%BF%BB%E8%AF%91API
考虑这两天再试试这个接口,毕竟百度的服务还是很稳定很快速的。
=====
续
百度API很快,参数很少
缺点却是翻译结果不理想,有些字符串直接翻不动,可能跟访问频率有关