软件翻译/Old

来自Ubuntu中文
跳到导航跳到搜索

开源软件的国际化的原理

软件,总是从程序代码开始的。程序源代码中有很多的字符串,国际化的目的,就是把这些字符串从代码中取出来,翻译成其他语种。开源软件国际化有一种使用广泛的实现方式,整个过程会涉及到三种格式的文件:pot格式、po格式、mo格式,并有一套GNU工具完成其中的转化,其流程可以参见下面的图:

具体的步骤如下:

  1. 使用工具软件提取出代码中的字符串,生成的结果是pot(Portable Object Template )格式的文件,这是po(Portable Object)格式文件的模板,在将来程序可能配置成其他语种,其他语言的po文件都从它而来
  2. 如果需要翻译中文版,则由pot格式生成po格式的初始文件ZH_CN.po,这时的po文件还没有翻译,与pot文件差别还不大
  3. 软件翻译者完成po文件中字符串的翻译,这是开源软件翻译的工作主体
  4. po格式文件翻译完成后,生成可以被程序使用的mo(Machine Object)格式的文件ZH_CN.mo
  5. 生成的mo格式文件存放在系统中,启动程序,中文版本的ZH_CN.mo被调用,软件摇身变成中文版了


以一个例子说明开源软件的翻译

上面的介绍有点晦涩难懂,那么我们看一个已经完成翻译的软件MonoDevelop,相信就比较清楚了。 MonoDevelop 是个Linux平台上的开放源代码集成开发环境,主要用来开发Mono与.NET Framework软件。在ubuntu环境下,我们下载MonoDevelop的源代码,可以看到有一个po的文件夹,有很多不同语言的po文件,如意大利语po文件it.po,也包括已经翻译完成的中文po文件zh_CN.po。


在ubuntu环境下,首先成功编译安装MonoDevelop(具体参照INSTALL文件的方法). 然后,如下设置系统的语言为英文: export LANG=es_US

启动MonoDevelop,看到的是英文界面:

然后设置系统的语言为中文: export LANG=zh_CN.UTF-8

启动MonoDevelop,看到的是摇身一变的中文界面:

很神奇是吧,为什么会这样的效果呢?因为在编译MonoDevelop的时候,会生成前面提到的各种语言的mo文件,当你使用中文的时候,使用的就是中文的翻译mo文件,当系统环境变量设置为其他的语言,软件启动后会找对应语言的mo文件。我们搜索一下,就可以看到MonoDevelop的mo放在了系统的语言包文件夹里,我们看到MonoDevelop有很多的语言版本。

administrator@ubuntu:~$ locate monodevelop.mo
/usr/share/locale/ca/LC_MESSAGES/monodevelop.mo
/usr/share/locale/cs/LC_MESSAGES/monodevelop.mo
/usr/share/locale/da/LC_MESSAGES/monodevelop.mo
/usr/share/locale/es/LC_MESSAGES/monodevelop.mo
/usr/share/locale/fr/LC_MESSAGES/monodevelop.mo
/usr/share/locale/gl/LC_MESSAGES/monodevelop.mo
/usr/share/locale/hu/LC_MESSAGES/monodevelop.mo
/usr/share/locale/id/LC_MESSAGES/monodevelop.mo
/usr/share/locale/it/LC_MESSAGES/monodevelop.mo
/usr/share/locale/ja/LC_MESSAGES/monodevelop.mo
/usr/share/locale/nl/LC_MESSAGES/monodevelop.mo
/usr/share/locale/pl/LC_MESSAGES/monodevelop.mo
/usr/share/locale/pt/LC_MESSAGES/monodevelop.mo
/usr/share/locale/pt_BR/LC_MESSAGES/monodevelop.mo
/usr/share/locale/ru/LC_MESSAGES/monodevelop.mo
/usr/share/locale/sl/LC_MESSAGES/monodevelop.mo
/usr/share/locale/sv/LC_MESSAGES/monodevelop.mo
/usr/share/locale/tr/LC_MESSAGES/monodevelop.mo
/usr/share/locale/zh_CN/LC_MESSAGES/monodevelop.mo
/usr/share/locale/zh_TW/LC_MESSAGES/monodevelop.mo


看完上面的例子,我们就可以自己动手来做做开源软件的中文翻译了。从上面看,翻译中文版本所需要做的主体工作,就是把原始的po文件翻译成中文。


那么如何翻译po文件呢?这里还是以MonoDevelop作为例子。打开zh_CN.Po文件,我们可以看到如下:



可以看到每个po文件的开头会有一些相关信息,诸如po文件的时间,翻译者的信息,文件的编码格式等,以“#”开头的行是注释。这些相关信息之后,就是po文件的主体了,po文件的主体就是由一对对的msgid和msgstr组成的。msgid是原文,msgstr就是译文,您需要做的是把 msgid 中的英文翻译成中文写到 msgstr 中,原文译文相互对照,所以方便翻译。


虽然看起来很简单,但是翻译中还有很多需要注意的细节,比如:有关菜单快捷键的处理,在 KDE 中,菜单快捷字符的前缀是“&”:
msgid "&Glimmer Editor"
msgstr "Glimmer 编辑器(&G)"


在 GNOME 中,菜单快捷字符的前缀是“_”:
msgid "_Setup..."
msgstr "设置(_S)..."


另外,po文件中有些语句是带有参数的,有些语句的翻译,为了符合中文的习惯,可能要做一些调整,比如下面例子中为了中文的语感,把参数2提前了:
msgid "%1 articles match rule %2"
msgstr "匹配规则 %2 的文章有 %1 个"


类似的翻译细节还有很多,需要在实际的使用中,多多与网友交流和查资料,才能做出出色的中文版本。


翻译完成后,我们可以测试一下翻译后的效果如何,这就需要把翻译后的po文件生成mo文件:
msgfmt zh_CN.po -o zh_CN.mo
看到文件夹下生成zh_CN.Mo文件。以中文语言包为例,一般类unix系统中的中文语言包mo文件一般放在/usr/share/locale/zh_CN/LC_MESSAGES/或者/usr/locale/share/locale/zh_CN/LC_MESSAGES/,我们把zh_CN.Mo拷贝到/usr/share/locale/zh_CN/LC_MESSAGES/,就可以看到翻译后的结果。

开源软件的翻译工具使用

翻译po文件有很多的工具,KBabel、gtranslator、KAider以及 poEdit 都是专用翻译工具

使用网站launchpad.net做在线翻译

以上简要里描述了开源软件的翻译的大致过程,现在还有一种比较新颖的方式,那就是通过UBUNTU的网站launchpad.net做在线翻译。Launchpad.net 是由 Ubuntu 的母公司 Canonical 有限公司所架设,其功能之一就是提供了在线翻译的功能,不过建议大家只选择于 Launchpad 翻译 Ubuntu 上独有的软体,而其他的软体则直接到其社群参与翻译的工作。

在 Launchpad 上加入 Ubuntu 中文翻译之前,建议先用自己的GPG公钥签署Code of Conduct,这是一个 launchpad.net 对参与人员约定的工作准则,其意义可见:http://www.ubuntu.com/community/processes/newmember。签署Code of Conduct的地址是:https://launchpad.net/~yourusername/+codesofconduct

在您正式着手进行翻译之前,请注意阅读 Ubuntu-l10n-zh-cn 翻译组的公告,参见launchpad.net/~ubuntu-l10n-zh-cn,这里会提示最新的翻译分支,以及相关的实用链接,主要是翻译工作手册和术语表,请一定要仔细阅读。

一般来说,新的 launchpad 翻译者常会犯的错误有:

  • 标点符号翻译不当——关于此,请参照www.kdecn.org/l10n/method.php这篇文章中的标点翻译规范进行(这篇文章虽然是在KDE中国网站上,但翻译规范基本对所有软件都应适用)。
  • 不注意原文的使用环境——比如 view 这个词,一般情况下译作“查看”,但在涉及数据库的上下文时可能需要译作“视图”。一个推荐的解决办法是:在成为一个软件的翻译者之前,先成为这个软件的用户。此外,注意 Launchpad 会显示相关原文所在的源码文件名,有时还会提供开发者留下的注释,这些都有助于理解原文的实际使用环境。
  • 术语翻译不当或前后不统一——请在翻译一个软件前意识到软件翻译和通用英语翻译的差异,例如“cache”和“buffer”,在绝大多数情况下前者应译作“缓存”,后者译作“缓冲”或“缓冲区”,虽貌似相近但绝不能混淆。还有英语缩写如UML、OSS等也是类似,在有既成通用译名前尽可能不要自造新译名,除非您确信这样做有绝对必要。如果您在翻译时抱有疑问,请参考:i18n.linux.net.cn/dict.php
  • 刻意追求完成度,提交不确定的翻译项——你提交的翻译会随着 Ubuntu 的发行而出现在世界上所有 Ubuntu 用户的电脑屏幕上,也许还会出现在各大 IT 网站新闻稿的抓图里,甚至是 CCTV 的摄影机前。所以,不确定的翻译请标注为Need Review,我们不是为翻译列表上的那个柱状图而工作。

如果您在 Launchpad.net 的翻译过程中抱有疑问或是需提出的建议,可以在 Ubuntu 中文社区内获得帮助,也可通过公告上给出的联系信箱和相关负责人员沟通,这些渠道的响应仍然是活跃的。


如果您想了解更多介绍,请参考 Ubuntu 的wiki,以及 launchpad.net 上的帮助。

开源软件的翻译经验汇总