引用自:
http://www.kdecn.org/l10n/method.php
本文有相当的历史,文中很多链接已经过期,但工作的准则仍然是有效的,相关背景请参阅文末。如果您想加入我们现在的工作,请先看这里 。
如果您希望加入 Linux 中文化计划,请阅读下面的说明。
1.加入我们
您需要首先加入我们 。
2.准备工作
如果条件允许,您最好有个 GNU/Linux,这样可以一边翻译一边测试您正在翻译的程序。如果您在 Windows 下工作,可以去 RedHat 的网站下载并安装 CygWin 这个 Linux 仿真环境。强烈推荐使用 Windows 2000,不仅体积相对小巧,打补丁后稳定性和兼容性都很好。目前 RedHat 已经完整地移植了几乎整个 Linux 到 Windows 下,而且更新非常快,请看屏幕截图 。GNOME/KDE 也移植到了 CygWin 环境下,称为 Cygnome 和 KDE on Cygwin , 不过它们安装后运行速度很慢(因为 Windows 本身已经消耗了过多的资源),而且最新版本也难以快速移植过来。建议完全安装 CygWin,大约需要 730 多兆空间。如果采用默认安装,至少还要指定安装 devel 分支下的 gettext 软件包,它是测试翻译必需的软件包。有时安装程序会出现问题,报告找不到 cygwin1.dll ,您可以在这里下载 1.3.22 版,然后拷贝到系统搜索路径(如:C:\WINNT\system32 或 C:\cygwin\bin\)下,重新运行一遍安装程序即可。其实,它位于下载的压缩包 release\cygwin\cygwin-1.3.22-1.tar.bz2 里。
在 Linux 下您要用到 kwrite 和 gedit 文本编辑器,它们都有良好的 UTF-8 支持,而且整个 PO 文件可以一目了然,还可以使用 VIM 或 EMACS (后者目前仅支持 gb2312 编码)文本编辑器。 KBabel 、gtranslator 、以及 poEdit 是专用翻译工具,推荐使用。在 Windows 下,推荐使用 EmEditor ,还可以 使用 EditPlus。不建议使用 UltraEdit 或 Notepad。由于配置较复杂,这里提供它的 po/pot 设置文件 ,下载后双击将键值导入注册表,即可得到符合要求的配置,请看屏幕截图 。
另外,还有可能用到十六进制编辑器,如 WinHex ,因为有时 Windows 下的文本编辑器会在 UTF-8 编码的文件前方添加三个字节(即所谓 Unicode 署名),以标明其为 UTF-8 编码。这种文件是无法通过编译的,必须用十六进制编辑器去除这三个字节!
注意 : 在 使用 EmEditor 保存文件为 UTF-8 编码的时候(文件->另存为),请取消“加入 Unicode 署名”前面的对勾,以避免发生上述情况!
在 Linux 下您可能需要英汉词典 IBMDICT 或 StarDict 及其词典 ,而在 Windows 下推荐使用金山词霸。
3.认领任务
目前,我们的工作主要集中在 KDE 和 GNOME 的界面翻译上。 KDE 的进度页面 以及 GNOME 的进度页面 中是我们目前的工作进度(注意: 请不要直接从这两个页面 下载文件进行翻译)。首先您必须登陆到这里:http://i18n.ricetons.com 如果是第一次登陆,您需要首先注册。登陆后,点击左侧的“Translation Statistics”,您可以从 KDE 或 GNOME 的进度页面中挑选还没有人负责的文件(状态为“A”),点击后弹出一个信息页面,点击下方的“Occupy”链接,从弹出的“占据”操作页面 选择“With a prefilled PO Head”或者右键点击“Orginal File”选择“另存为”,下载它们的翻译文件(*.po)或翻译模版文件(*.pot)进行翻译。“With a prefilled PO Head”表示下载的文件预先填充好了 PO 头部信息,“Orginal File”则是原始文件。 此时在“Translation Pool”以及“Task”页面就可以找到您占据的文件。
通常进度页面中相应的翻译文件(*.po)都是经过预填充的,也就是说已经翻译了一部分,可以直接拿来接着翻译。对于较大或从未有人翻译过的文件, 您可以在开始工作之前先在邮件列表里声明一下,会有网友给您提供一个基于辞典的预翻译的文件, 可以减少重复劳动。当然,所有预翻译的内容您都需要仔细校对。对于 GNU 软件的翻译,也请您在开始工作之前先在邮件列表里声明一下,邮件的标题可以是“申请 xxx.pot”、“占据 xxx.pot”、“Occupy xxx.po”或者“正在更新 xxx.po”。 这样做是为了避免和其他人冲突,因为我们的状态页并不包含 GNU 软件,无法显示到底谁正在翻译某个文件。
如果您希望申请其它工作,可以跟王剑 (我们的网络协调员) 联系。
请不要一次占据多个文件,以免影响整体进度。除非您确信您在短期内能完成所有工作。 一般的原则是:认领一个-- >完成一个-->提交一个。
请将 kdenonbeta 组的翻译放在最后进行,这个包里的软件都处于早期开发阶段,通常不会被加入最终的发行包里,请尽量优先翻译其他内容!
4.如何翻译
下载了 .pot 文件以后,请把它重命名为 .po 文件。第一步是修改文件头, 如果您不知道该怎么改,可以参考其它已翻译的 po 文件。这是一个例子(绿色的是修改的部分):
# translation of ***.po to Chinese Simplified <--这里您可以填入一些注释 # Copyright (C) 2008 Free Software Foundation, Inc. <-- 填入翻译年代 # Xie Yuheng <[email protected]>, 2001. # Li Zongliang <[email protected]>, 2001. # Zong Yaotang <[email protected]>, 2002. # Liu Songhe <[email protected]>, 2002. # Xiong Jiang <[email protected]>, 2002. # <-- 此处填入您自己的信息 #, fuzzy <-- * msgid "" msgstr "" "Project-Id-Version: kspread \n" <-- 填入模板名称 "POT-Creation-Date: 2001-11-25 00:13+0100\n" "PO-Revision-Date: 2002-12-16 20:30+0800 \n" <-- 填入完成翻译的时间,北京时间为东8区时间(+0800) "Last-Translator: Xiong Jiang <[email protected]> \n" <-- 填入最后翻译者的信息 "Language-Team: zh_CN <[email protected]> \n" <-- 填入我们小组的信息 "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8 \n" <-- 大小写不限,如果是 GB2312 编码,请写 GB2312,推荐使用 UTF-8 编码 "Content-Transfer-Encoding: 8bit\n" * 通常,po 文件里没有这一行。如果在 pot 而不是 po 文件基础上翻译,您会看到它。 在您正式开始工作之前,请务必删除这一行! "Plural-Forms: nplurals=1; plural=0;\n" |
修改完文件头以后接着就是实质性的翻译了,po 文件的格式是一句 msgid 跟着一句 msgstr,以“#”开头的行是注释。您需要做的是把 msgid 中的英文翻译成中文写到 msgstr 中。例如:
#: app/floating_sel.c:198 msgid "" "Cannot create a new layer from the floating\n" "selection because it belongs to a\n" "layer mask or channel." msgstr "" "无法从浮动选区创建新\n" "图层,因为它属于一个\n" "图层蒙板或通道。" #: app/gimphelp.c:194 msgid "Could not find GIMP Help Browser" msgstr "找不到 GIMP 帮助浏览器" |
5.测试翻译
测试您的翻译的方法是:首先用 msgfmt 命令把 po 文件编译成 mo 文件,然后把 mo 文件复制到正确的 locale 目录下,重新启动程序即可。locale 目录一般是:
/usr/share/locale/zh_CN/LC_MESSAGES/ 或者
/usr/locale/share/locale/zh_CN/LC_MESSAGES/
如果两者都不行,请在您软件的安装路径下找一找有没有相似的目录。通常一个 po 文件只要通过编译,就没有语法错误了。另外,可以用 msgfmt -cvv file.po 命令检查 po 文件是否有格式错误;用 msgfmt --statistics file.po 命令查看翻译统计信息。举个例子(输入文件为 gimp.po,输出文件为 gimp.mo):
msgfmt --statistics gimp.po -o gimp.mo cp gimp.mo /usr/share/locale/zh_CN/LC_MESSAGES/ gimp & |
如果您的翻译没有正常地在程序中显示出来,可能是由于编码原因。请试试把您的 po 文件中文件头的 charset 改为 UTF-8,再用下面提到的 iconv 或 msgconv 命令把文件转换成 UTF-8 编码,然后重新生成 mo 文件。
6.提交任务
文件完成翻译后,您需要再次登陆这里:http://i18n.ricetons.com 。 提交文件有三种方法:
对于不能自己提交的 GNU 软件翻译文件, 可以通过“Submit a File Not IN KDE/GNOME”链接提交,等待校对人员检查,然后由网络协调员提交到相应的 CVS 服务器上,请耐心等待。对于其他不属于 KDE/GNOME/GNU 工程的软件翻译文件, 也可以通过这种方法提交,然后将其 PO 文件在“Translation Pool”里的下载链接邮寄给软件的开发者。GNU 软件的提交方法参见这里 。 翻译后的 PO 文件一旦被提交到 CVS 服务器上,那么它们将从“Task”或“Translation Pool”中消失。以后如果需要更新您所负责的翻译,请登陆后到进度页面中重新 下载翻译文件(*.po),步骤同前,而不要在您旧的翻译文件基础上继续修改。 因为进度页面中的文件才是 CVS 服务器中最新的待翻译内容。如果翻译后的 PO 文件尚未被提交到 CVS 服务器上, 您应该可以按照上述方法,在“Task”或“Translation Pool”中找到您要重新翻译的文件,翻译后再按照上述方法选择“[Submit/Resubmit]”,重新提交一遍。因为“Translation Pool”中 的 PO 文件会与最新的 POT 文件动态合并,而“Task”中的文件实际就是“Translation Pool”中的文件。
7.注意事项
目前的翻译文件一般使用 UTF-8 编码。如果您的文本编辑器不支持 UTF-8,那么您需要在编辑文件之前和之后转换编码。在 Linux 下您可以用以下命令把文件从 UTF-8 转换成 GB2312。转换之后请务必将文件头部的 charset=utf-8 改为 charset=gb2312。 在 Windows 下也有相应的软件,不过没有必要使用它,可以直接使用支持 UTF-8 编码的编辑器,或者干脆把 GB2312 编码的 po 文件直接提交到邮件列表,由校对人员去处理。
转换 utf-8 --> gb2312
iconv -f utf-8 -t gb2312 inputfile > outputfile |
转换 gb2312 --> utf-8
iconv -f gb2312 -t utf-8 inputfile > outputfile |
如果您安装了 gettext 0.11.x 或者更新的版本,还可用“msgconv -t 目标编码 源文件 -o 目标文件”实现转换。 msgconv 会自动修改文件头部,避免错误。
msgconv -t gb2312 inputfile -o outputfile |
注意: 如果您的 gettext 软件包版本号小于 0.10.40,很多工具它都没有,更严重的是它不能正确处理 po/pot 文件头部的信息!那么,您需要到这里 下载最新版,编译安装:
ftp://ftp.gnu.org/gnu/gettext/
也可在这里 下载 gettext 0.12.1 和 libiconv 1.9.1 的 windows 版,后者为必需的依赖包。
判断版别,请输入:
msgfmt -V |
(2) 关于标点的使用问题。
一般的原则是:除了小括号、省略号和破折号保留不变以外,都应该使用中文(全角)标点符号。英文标点符号后方 常常跟随有一个半角空格,请在翻译成中文标点符号时将其去除。
原文 |
,
|
.
|
\"或`或'
|
:
|
( )
|
...
|
--
|
译文1 |
,
|
。
|
“
|
:
|
( )
|
...
|
--
|
译文2 |
。
|
,
|
”
|
:
|
(3) 关于菜单项中快捷字符的翻译问题。
快捷字符一律使用大写字母,用小括号括起来放到菜单文字的后面(如果有标点符号则放在标点符号的前面)。在 KDE 中,菜单快捷字符的前缀是“&”; 在 GNOME 中,菜单快捷字符的前缀是“_”。但是如果翻译保留了原文的英文单词或阿拉伯数字,且该单词或数字正好是快捷键所在的单词或数字时,应保留原文的快捷键方式(如下面的第二、四个例子) 。这里举几个例子:
# KDE menu
msgid "C&lear"
msgstr "清除(&L)"
msgid "&Glimmer Editor"
msgstr "Glimmer 编辑器(&G)"
msgstr "&Glimmer 编辑器"
# GNOME menu
msgid "_Setup..."
msgstr "设置(_S)..."
msgid "Get _CDDB Now" msgstr "现在读取 CDDB(_C)" msgstr "现在读取 _CDDB" msgid "/_Edit" msgstr "/编辑(_E)" * msgid "/Edit/C_opy" msgstr "/编辑(E)/复制(_O)" * msgid "/Edit/C_ut" msgstr "/编辑(E)/剪切(_U)" * * 注意:此处的翻译有点特别。由于“复制”和“剪切”均为“编辑”菜单的条目,只有这样翻译才能保证显示正确! |
(4) 关于翻译中参数的位置问题。
有时候原来的参数顺序不符合中文的语法,一方面, 翻译可以通过调整副词、语序等手法来符合中文习惯,另外一方面,在必要的情况下,需要改变参数的位置,例如在 KDE 中:
msgid "%1 articles match rule %2" msgstr "匹配规则 %2 的文章有 %1 个" |
如果是在 GNOME 中则应该这样写:
msgid "%d articles match rule %d" msgstr "匹配规则 %2$d 的文章有 %1$d 个" |
即用 1$、2$、3$ 等符号标明参数在原文里出现的位置。
(5) 关于空格问题。
为了美观,通常建议在中文与英文、中文与阿拉伯数字、英文与阿拉伯数字之间加入一个半角空格。例如:
msgid "Installing driver for %1" msgstr "正在安装 %1 的驱动程序" msgid "" "Parameter start_num specifies the character at which to start the search. " "The first character is character number 1. If start_num is omitted, it is " "assumed to be 1." msgstr "" "参数 start_num 指定开始搜索的字符位置。第一个字符序号为 1。如果省略 " "start_num,默认它为 1。" |
但对于小括号和全角双引号,其两侧不加空格。
msgid "Original idea and author (KDE1)" msgstr "原始创意和作者(KDE1)" msgid "" "The APM Management subsystem seems to be disabled.\n" "Try executing \"apm -e 1\" (FreeBSD) and see if \n" "that helps.\n" msgstr "" "APM 管理子系统似乎被禁用了。\n" "试试执行“apm -e 1”(FreeBSD)并看看\n" "是否有用。\n" |
包含 XML/HTML 标签的条目,如要在标签中的内容两侧添加空格,请把空格置于标签外侧,否则空格可能显示不出来。
这是 &lt;b&gt;HTML&lt;/b&gt; 的语法手册 |
(6) 关于注释语句和署名问题。
对于 msgid 中的注释语句(通常以 _: 开头),请不要翻译。它是给译者的一些说明,帮助您理解原文,以便给出正确的译文。例如:
#: _translatorinfo.cpp:1 msgid "" "_: NAME OF TRANSLATORS\n" <---请不要翻译它。署名处要加入我们组织的有关信息,然后才是翻译者的个人信息 "Your names" msgstr "KDE 中国" <--可以用英文(半角)逗号分隔多个人名,不要使用其他符号 #: _translatorinfo.cpp:3 msgid "" "_: EMAIL OF TRANSLATORS\n" "Your emails" msgstr "[email protected]" <--对应的多个邮件地址也要用英文(半角)逗号分隔 msgid "" "_: 1: hostname, 2: port number\n" "%1 port %2" msgstr "%1 端口 %2" |
(7) 关于换行问题。
对于很长的译文,就涉及到了换行问题。多数情况下没有限制,因为不影响最终的显示效果,只要阅读起来方便就行。下面几种格式都是正确的:
msgid "" "Preview failed: neither the internal KDE PostScript viewer (KGhostView) nor " "any other external PostScript viewer could be found." msgstr "" "预览失败:找不到 KDE 内建的 PostScript 查看器(KGhostView)或其它外部" "的 PostScript 查看器。" msgid "" "Preview failed: neither the internal KDE PostScript viewer (KGhostView) nor " "any other external PostScript viewer could be found." msgstr "预览失败:找不到 KDE 内建的 PostScript 查看器(KGhostView)或其它外部" "的 PostScript 查看器。" msgid "" "Preview failed: neither the internal KDE PostScript viewer (KGhostView) nor " "any other external PostScript viewer could be found." msgstr "" "预览失败:找不到 KDE 内建的 PostScript 查" "看器(KGhostView)或其它外部" "的 PostScript 查看器。" |
但是,如果 msgid 前方有 #, c-format 标记,或者原文中有强迫换行标记 \n ,那就要手工调整译文的换行,以便能最终正确地显示在程序界面上。原则是译文长度不大于原文长度,否则可能译文显示超出原有区域,或者译文后面部分被截 去,很难看。对于含有 HTML 标记的长译文还需要在浏览器中预览显示效果(如果您了解 HTML 基本语法的话),酌情调整行宽。例如:
#, c-format msgid "" "Error opening file '%s':\n" "%s" msgstr "" "打开文件“%s”出错:\n" "%s" msgid "" "Parse a theme dir and generate a \n" "gkrellmrc_ksim file that KSim will understand \n" "better and exit." msgstr "" "解析一个主题目录生成 KSim 容易理解\n" "的 gkrellmrc_ksim 文件,然后退出。" |
(8) 关于模糊译文问题。
如果看到 #, fuzzy 标记,则表示本段译文是由工具软件(通常是 msgmerge 命令)猜测翻译得到的。有时比较准确,有时却谬之千里。 另一种情况是译者或校对人员主动加上去的,因为他们对该条译文没有把握。因此请对其译文进行修订,然后去除 #, fuzzy 标记, 否则本段译文将不能显示在程序界面上。原则上,所有既往给出的译文,在翻译的时候都应该校对一遍。例如:
#: groupdlg.cpp:209 groupdlg.cpp:216 groupdlg.cpp:229 #, fuzzy msgid "Get Tagged Articles" msgstr "取得文章" #: groupdlg.cpp:623 #, fuzzy, c-format msgid "Connecting to server %s" msgstr "正在连接服务器" |
正确的译文为:
#: groupdlg.cpp:209 groupdlg.cpp:216 groupdlg.cpp:229 msgid "Get Tagged Articles" msgstr "取得标记的文章" #: groupdlg.cpp:623 #, c-format msgid "Connecting to server %s" msgstr "正在连接服务器 %s" |
(9) 关于已淘汰译文的问题。
老版本的程序中总有一些信息会在新版本中淘汰掉,这些译文都以 #~ 开头,并被置于整个 po 文件的后方,可以直接删除。例如:
#~ msgid "Error: no name" #~ msgstr "错误:没有姓名" #~ msgid "Configure" #~ msgstr "配置" |
(10) 关于单复数问题。
此问题主要见于 GNU 软件的翻译。由于某些语言的单复数变化极为复杂,为了应对这种局面,符合 i18n (internationalization) 国际化标准,gettext 技术通过读取 PO 文件头部如下一行中的信息来正确显示不同单复数的译文:
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
INTEGER 表示单复数变化形式的数量,他是一个正整数。中、日、韩文里没有单复数区分,也就是说单复数变化形式只有一种, 所以 nplurals=1,英文单复数有两种表现形式,所以 nplurals=2;
EXPRESSION 表示对第几种单复数变化取相应的第几种译文,他是一个标准的 C 语言表达式。如果有四种单复数变化,这个 表达式的值将包括 0、1、2、3,分别对应于译文 msgstr[0]、msgstr[1]、msgstr[2]、msgstr[3]。所以,有时这个表达式相当复杂。 在汉语里,只需 plural=0,译文只要保留 msgstr[0] 即可。
正确的设置:
"Plural-Forms: nplurals=1; plural=0;\n" |
原文例如:
#: src/msgcmp.c:338 src/po-lex.c:701 #, c-format msgid "found %d fatal error" msgid_plural "found %d fatal errors" msgstr[0] "" msgstr[1] "" |
正确的译文为:
#: src/msgcmp.c:338 src/po-lex.c:701 #, c-format msgid "found %d fatal error" msgid_plural "found %d fatal errors" msgstr[0] "找到 %d 个严重错误" |
(11) 关于时间译法的问题。
鉴于关于日期和时间的译法十分复杂,现在将国家标准中有关规定简要介绍一下,并给出推荐译法。
国标 GB/T 7408-94《数据元和交换格式 信息交换日期和时间表示法》
1994-12-06 发布,1995-08-01 实施
国家技术监督局发布
本标准等效采用国际标准 ISO 8601-1988《数据元和交换格式 信息交换日期和时间表示法》
可参见:
http://www.sznd.com/xslt/
这里说几个要点:
1. 在日期格式中不能出现空格,即“2003 年”这样的格式是不符合国标的。
2. 表示日期时,必须按照年月日的顺序;年份一般用四位数字,而月、日必须使 用带前导零的两位数字;必须使用“-”作为分隔符,或完全不使用分隔符。 即“2004-01-03”或“20040103”来表示 2004年1月3日。
3. 表示时间时,时、分、秒都必须使用两位数字,中间用“:”分隔,或完全不使 用分隔符。小时计法采用24小时制,不区分上下午。
4. 日期和时间写在一起的时候,应先写日期再写时间。在日期和时间都不使用分 隔符的情况下,在中间添加字母“T”进行分隔,即“19850412T101530”。
(12) 其他问题。
8. 一些帮助
如果遇到一些您不知道该如何翻译的词语,您可以:
对于一些常见的词语,为了跟其它人的翻译用语基本一致,也应该先参考在线字典。不过目前我们在统一翻译用语方面还做得很不够。:-(
对于 po 文件中一些以前翻译过的或者别人翻译过的翻译项,可以利用程序将其自动填充进模板文件(*.pot),减轻您的工作。 GNU gettext 软件包就是这样的工具,我们已经完成了它的翻译工作,不过暂时还要请您自己看帮助。它们几乎都是以 msg 开头的命令,在 bash 中输入 msg 然后连按两次 Tab 键就可以看到它们。输入命令并使用 --help 选项就可以看到帮助了。我们主页上也有一个自动翻译程序 ,完成类似的功能,您可以试试,不过它的功能很弱。
最后更新时间 2004-02-08 08:26
注:本文来自http://i18n.linux.net.cn/method.php ,但原网页已经丢失很久了,而且近日发现在Google中都没有缓存了,于是赶紧找来放上来了。(齐亮)
注:本文来自http://i18n.linux.net.cn/method.php 早期成员 heyuqi 的一段很短小的说明,很多内容都没有述及,我们在其基础上根据当时的翻译现状进行了全面修订,后来由于相关站点失去维护,上文提到的很多内容都已经不能使用,但是翻译原则还是有效的,希望对大家的翻译工作有所裨益。(刘松鹤)