3/07/2007

使用 po 文件翻译 GuideXML[转载]

Date: 2007-01-28
Version: 1.0
Authors: 张乐
Licence: 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆 License

内容

* 背景知识
。po文件简介
。po文件格式解析
。po文件翻译的好处
* 准备工作
。po4a
。文本编辑器
* 推荐翻译模式
。翻译全新的文件
。利用旧版的已翻译文件翻译新文件

背景知识
po文件简介

po文件本来是用来翻译程序源代码里的字符串的。先来稍微解释一下它本来的用途,需要一点点C语言的基础才能完全理解。如果理解有困难 ,可以忽略这段内容,不会对我们使用po来翻译造成任何影响。

目前大部分自由软件实现国际化使用的是gettext。国际化就是让程序可以使用多国语言来显示程序里的字符串。程序里一般都有很多字符串,菜单名也好,错误信息也好,都是字符串。假设字符串为string,非国际化的程序里都是直接写"string"。如果用了gettext来实现国际化的话,就要写成gettext("string")。有时也会看到_("string"),那实际上也是gettext,只不过通过宏的定义把 gettext改头换面了。这个string就是msgid。然后使用xgettext来从程序源代码文件产生po文件。然后交给专门的翻译人员来翻译 po。翻译人员根本不需要懂编程。翻译完毕后,使用msgfmt来把po转化成mo文件,并安装到系统里合适的位置。程序运行时,到底显示什么字符串就是由gettext 函数来决定的了。主要有两个决定因素,一个是系统的locale及相关环境变量(LANGUAGE,LC_ALL,LC_MESSAGES和LANG),一个是相关的mo文件。具体可以看我的这篇 文章 。

随着程序版本的升级,程序里的字符串的数量和内容都会发生变化,但变化不会很大,以前翻译过的po里大部分msgid都能被重复利用。所以维护po的翻译人员在每次得到从新的程序源代码产生的po时,都用msgmerge来根据旧的已翻译过的po来先处理一下新的未翻译的po。处理过后,大部分情况下新po就翻译的差不多了。翻译人员的工作量被大幅度减轻了。
po文件格式解析

po文件都是由一对对的msgid和msgstr组成的。msgid就是原文。msgstr就是译文。原文译文相互对照,所以非常适于翻译。


msgid "Flash Player 9 released"
msgstr ""

有的msgid前面一行有fuzzy的字样。这说明,第一这个po是被msgmerge处理过的;第二,已翻译的po里没有和这个msgid完全等同的 msgid,只有非常相似的。这种情况下,msgmerge仍然会用那个相似的msgid来翻译此msgid。不过会给这个msgid标记为fuzzy,表示翻译人员仍然要翻译这 个msgid,并在翻译后去掉上面带fuzzy的这一行。


#, fuzzy
msgid "Gentoo Linux PPC Handbook"
msgstr "Gentoo Linux Alpha手册"

po文件翻译的好处

1. 原文译文相互对照,适于翻译
2. 一篇文章里同一个msgid不管出现多少次,都只需要翻译一次
3. 旧有的已翻译过的po,可以重复利用,不必再次翻译,且利于统一风格
4. 有非常好的翻译工具,熟练使用后可大幅度提高工作效率

准备工作
po4a

为了使用po来翻译,显然我们需要能够把xml转成po的工具。这里我们选用po4a。有两个原因:

* po4a可支持GuideXML,也就是gentoo文档专有格式
* po4a可以根据原来的xml文档和与之对应的已经翻译过的xml文档生成po。这个功能非常有用,随后即可看到。

安装po4a


emerge po4a

掌握po4a的三个命令

1. 从xml产生未翻译po


po4a-gettextize -f guide -m orig.xml > untrans.po

2. 从旧的xml原文和译文产生已经翻译过的po


po4a-gettextize -f guide -m orig.xml -l trans.xml > trans.po

3. 用已经翻译过的po和xml原文来产生xml译文


po4a-translate -f guide -m orig.xml -p trans.po -k 1 > trans.xml

文本编辑器

最好的翻译po的工具,无疑是po模式的emacs。当然任何其他的文本编辑器都行,但是效率上绝对比不过po模式的emacs。这里我推荐使用emacs 23。这个版本支持xft。它所需要的keyword是~x86或~amd64。

1. 安装emacs-cvs和gettext

echo app-editors/emacs-cvs >> /etc/portage/package.unmask
echo "app-editors/emacs-cvs gtk xft toolkit-scroll-bars" >> /etc/portage/package.use
echo "sys-devel/gettext emacs" >> /etc/portage/package.use
emerge =emacs-cvs-23.0.0-r1 gettext dejavu

1. 配置字体

* 指定xft为FontBackend,在~/.Xdefaults中加入


Emacs.FontBackend: xft

* 用下列命令启动


emacs --enable-font-backend -fn "Dejavu Sans Mono-12"

1. 基本使用

* 用emacs 打开po文件,即自动进入po模式。菜单栏里有一个名叫PO的菜单,里面有当前模式下可以使用的所有快捷键。po模式下不可直接编辑文件内容。可先把光标移到要编辑的msgid上。使用po的快捷键(比如f或u)来移动,移动的单位就是msgid,速度很快。移动到目的地,然后按回车,即可翻译该msgid。这时整个窗口一分为二。上面可显示msgid,下面翻译。在翻译区域进行翻译时,操作方式就和普通模式下的emacs一样。也就是说你可以把它当作Windows记事本来用。唯一不同的是,在结束翻译后,要按住Ctrl,然后按两次c,以保存这一条翻译结果。然后再按f或u来处理fuzzy的和未翻译的msgid。注意在翻译完fuzzy的msgid后要按tab,来删除fuzzy标记。当不管按f还是u,光标都不再移动的时候,就表示整个po翻译完了。
* 常用快捷键:
。n 移动到下一个msgid
。p 移动到上一个msgid
。f 移动到下一个fuzzy msgid
。F 移动到上一个fuzzy msgid
。u 移动到下一个未翻译msgid
。U 移动到上一个未翻译msgid
。tab 删除本msgid的fuzzy标记

推荐翻译模式
翻译全新的文件

假设这个文件叫orig.xml,下同

* po4a-gettextize -f guide -m orig.xml > output.po
* 用文本编辑器翻译output.po
* po4a-translate -f guide -m orig.xml -p output.po -k 1 > trans.xml

利用旧版的已翻译文件翻译新文件

假设旧版文件叫old.xml,旧版已翻译文件叫old-trans.xml,新文件叫new.xml

* po4a-gettextize -f guide -m old.xml -l old-trans.xml > old-trans.po
* po4a-gettextize -f guide -m new.xml > new.po
* msgmerge old-trans.po new.po > new-trans.po
* 用文本编辑器翻译news-trans.po
* po4a-translate -f guide -m new.xml -p new-trans.po -k 1 > new-trans.xml

没有评论: