其他博客地址

主力博客:https://tonghuix.io

2014年9月1日星期一

使用 Emacs + PO-mode 做本地化翻译

之前用过poedit和Gtranslator做过本地化翻译,对初学者来说是很好的工具,也是必须要掌握的工具。但在某些情况下就不是那么顺手,比如快速查找上下文翻译,Review既有的翻译等等。后来偶然一个机会发现了Emacs下的插件PO-mode,于是我现在已经全面转入po-mode的使用了。

作为Emacs的一个major mode,PO-mode目前是我使用中发现的最好的本地化工具了,它的优点是利用了Emacs非常方便的文本编辑框架,方便翻译者和Reviewer,又保留和提升了本地化翻译工具Gettext的优势,更难得的是降低了新手的入门门槛。



安装

安装是最简单的,因为大多数Linux发行版都有gettext-el包,装上之后就可以用了,超级简单。对于Windows和希望手动安装的来说,可以参考这个手动安装文档:https://www.gnu.org/software/gettext/manual/html_node/PO-Mode.html

基本操作

其实软件本地化的主要无非就是围绕文本翻译和Gettext的相关操作展开,因此所有图形化l10n工具的本质也都是将Gettext的各种操作简便图形化出来。

用Emacs打开一个po文件,如果是使用包管理器安装的话,此时会自动进入到PO-mode。若没自动打开,可以手动 M-x po-mode 打开,也可以自己写一个hook到.po文件上。

此时把光标移动到任意一个词条上,按Enter键即可打开翻译窗口。在翻译窗口翻译一段后,按 C-c C-c 即可保存,若想放弃此次翻译可以用 C-c C-k 。注意翻译时不要删掉末尾的"<"字符。

基本操作非常简单!

一些特别常用操作:

按键 操作
n 移动到下一词条
p 移动到上一个词条
u 移动到下一个未翻译的词条
U 移动到上一个未翻译的词条
t 移动到下一个已翻译的词条
T 移动到上一个已翻译的词条
f 移动到下一个模糊翻译(Fuzzy)的词条
F 移动到上一个模糊翻译(Fuzzy)的词条
k 清空当前词条的翻译
Backspace 标记当前词条为模糊翻译(Fuzzy)
TAB 移除当前词条的模糊标志(fuzzy)
# 修改当前词条的翻译者注释
? 显示帮助页面
q 退出PO-mode,退出时进行验证翻译

更多玩法

刚开始用PO-mode的时候感觉各种不爽,于是发现用命令E,可以进入传统文本编辑模式,我可以自由编辑。当然实际上,这未必是个好事,因为你会无意中破坏po文件的结构和一些很关键的内容,造成很多不便。

另外,既然是对Gettext进行封装,那么最基本的一些Gettext命令应该是支持的,比如 msgfmt 等等,PO-mode提供了一个简单的命令——V,代表Validate,会自动执行 msgfmt -c -v 命令,可以输出错误信息,如:

msgfmt --statistics -c -v -o /dev/null gnome-boxes.master.zh_CN.po
gnome-boxes.master.zh_CN.po:930: “msgid”和“msgstr”中的指定格式数量不匹配 msgfmt: 发现 1 处致命错误
gnome-boxes.master.zh_CN.po: 194 条已翻译消息.

此时在提示窗内按ENTER(RET)即可定位到出错的那一行,修改好即可。修改好之后再输入命令 V ,又会进行验证,直到输出如下的确认信息:

msgfmt --statistics -c -v -o /dev/null gnome-boxes.master.zh_CN.po
gnome-boxes.master.zh_CN.po: 190 条已翻译消息,3 条模糊消息,1 条未翻译消息.

还有就是平时翻译的时候会碰上类似 “\n”、“\"”等等这种格式转义符,请看这个例子:

msgid "'%s' could not be restored from disk\n"
"Try without saved state?"


而我在翻译窗口内只需要如下这样输入即可,也就是不需要输入“\n”,只要在行尾回车换行即可。

无法从磁盘恢复“%s”
忽略保存的状态来尝试吗?<

 最终结果会自动转换是:

msgid "'%s' could not be restored from disk\n"
 "Try without saved state?"
msgstr "无法从磁盘恢复“%s”\n"
 "忽略保存的状态来尝试吗?"

 类似的情况还可以用来处理英文双引号(" ")和斜线符(\)等转义字符上。

其他技巧

有些时候我们会碰上需要保持译文和原文一致的情况,比如时间啊日期啊,特意标注的英文等等,这时候可以在主编辑状态按 C-j 即可,就可以自己将原文复制到译文处。也就是保持 msgidmsgstr 的精准一致。

既然是在Emacs下操作,那么就可以结合其他插件和工具,比如拼写检查。详情参见EmacsWiki的PoMode一文。如果作为一个审核翻译的Reviewer来说,工作还是非常繁重的,因此结合Emacs的一些插件,就可以实现很多非常好用的功能,比如错别字检查,格式校对等等,这里推荐之前在CSDN的同事编写的Emacs中文校对插件,可以非常快速查找常用的错别字和符号问题,当然对于咱们来说还需要在此基础上稍微hack一些,增加更多符合中文本地化翻译的内容。

结论

好的工具绝对可以使工作事半功倍,本文所介绍的Emacs+PO-mode就是这样一款不可多得的本地化翻译工具。本文只是非常浅显的介绍了po-mode最常用的一些日常操作,其他一些功能,比如结合C源文件等,请参考PO-mode的官方文档

希望各位朋友多多参与到自由软件、开源软件的本地化工作中来吧!特别的,参与GNOME项目的本地化,可以进入这个地址:http://l10n.gnome.org