[帮助理解PO文件]KDE中国/I18N/L10N

引用自:

http://www.kdecn.org/l10n/method.php

 

本文有相当的历史,文中很多链接已经过期,但工作的准则仍然是有效的,相关背景请参阅文末。如果您想加入我们现在的工作,请先看这里

如果您希望加入 Linux 中文化计划,请阅读下面的说明。

1.加入我们

您需要首先加入我们

2.准备工作

如果条件允许,您最好有个 GNU/Linux,这样可以一边翻译一边测试您正在翻译的程序。如果您在 Windows 下工作,可以去 RedHat 的网站下载并安装 CygWin 这个 Linux 仿真环境。强烈推荐使用 Windows 2000,不仅体积相对小巧,打补丁后稳定性和兼容性都很好。目前 RedHat 已经完整地移植了几乎整个 Linux 到 Windows 下,而且更新非常快,请看屏幕截图 。GNOME/KDE 也移植到了 CygWin 环境下,称为 CygnomeKDE 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 编码)文本编辑器。 KBabelgtranslator 、以及 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,再用下面提到的 iconvmsgconv 命令把文件转换成 UTF-8 编码,然后重新生成 mo 文件。

6.提交任务

文件完成翻译后,您需要再次登陆这里:http://i18n.ricetons.com 。 提交文件有三种方法:

  • 点击左侧的“任务”(Task),找到自己占据的文件,点击它, 并选择“[Submit/Resubmit]”,点击“浏览”,在您的计算机上找到要提交的文件,在下面填上适当的注释,点击“Submit”即可提交到 服务器。等待校对人员处理后,即可提交到官方 CVS 服务器。 如果文件有错误,会看到错误提示。请找到相应的行,修改后重新提交一遍。
  • 点击左侧的“翻译池”(Translation Pool),然后再按上述步骤操作即可。
  • 在“翻译统计”(Translation Statistics)页面点击您占据的文件,在弹出的信息页面点击“[File In The Pool]” 从而转到“Translation Pool”,然后再按上述步骤操作即可。

对于不能自己提交的 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.注意事项

(1) 关于文件编码格式的问题。

目前的翻译文件一般使用 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. 英文中的 \" %s\" 应该翻译为 %s , 而不是 \" %s\" 或者 \“ %s\” ,而且后 者是不符合换码序列要求的。` something'' something' 以及 \" something\" 都应该翻译为 某事
  4. 英文中的 : 应 该翻译为 而不是 : , 而作为分隔符时(例如时间),: 保留为英文(半角)的, 因为这个时候不是标点符号
  5. 英文中的( ) 应该保持不变。由于全角小括号( ) 很难看,也占地方,所以一律使用半角小括号 ( )
  6. 英文中的 ... 应该保持不变。由于翻译的时候常常难以分清哪些条目是菜单项,哪些条目是一般语句,而后者才能使用中文的省略号 …… ,所以现在统一翻译为 ...
  7. 英文中的 -- 应该保持不变。由于全角破折号 —— 兼容性不好,有时显示为两个方格,所以不再使用。
原文
,
.
\"或`或'
:
( )
...
--
译文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 标签的条目,如要在标签中的内容两侧添加空格,请把空格置于标签外侧,否则空格可能显示不出来。

这是 &amp;lt;b&amp;gt;HTML&amp;lt;/b&amp;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 的一段很短小的说明,很多内容都没有述及,我们在其基础上根据当时的翻译现状进行了全面修订,后来由于相关站点失去维护,上文提到的很多内容都已经不能使用,但是翻译原则还是有效的,希望对大家的翻译工作有所裨益。(刘松鹤)

你可能感兴趣的:(C++,linux,软件测试,C#,cvs)