如何翻译 KDE

csslayer | 2012/12/15

这篇的主要内容比较实用主义……后面很多也适合其他项目。

1、工具

lokalize,svn。为什么不是poedit或者gtranslator,或者linguist,这是有原因的。lokalize的项目才用的是和KDE一样的工作流,所以更好管理。其次lokalize的翻译存储很强大,很适合这种大型项目的翻译。svn是因为KDE的翻译还是svn管理。

2、下载翻译

# 下载翻译的根目录
# 如果你有账号请自行更改 svn 地址
# kf5 的目录是 l10n-kf5,kde4 的是 l10n-kde4
svn co svn://anonsvn.kde.org/home/kde/ --depth empty
cd kde
svn up trunk branches --depth empty
cd branches/
svn up stable --depth empty
cd stable/
svn up l10n-kf5 --depth empty
cd l10n-kf5/
svn up zh_CN templates
cd ../../../trunk
svn up l10n-kf5 --depth empty
cd l10n-kf5/
svn up zh_CN templates
无论你翻译哪个,下载全部的翻译都是很必要的,因为能够填充本地的翻译存储的内容。此步需要下载上百MB数据,准备个好网络,然后喝口茶吧。

3、lokalize的配置

设置-> 配置 lokalize,填写个人信息。

工程->创建新工程

目录选择 zh_CN 的根目录,检查高级标签下模板文件的目录是否指向了templates,填写正确其他信息。中文翻译的邮件列表是 kde-china@kde.org

4、工程概述

工程->工程概述,或者 F4 查看,之前步骤正确,应该只显示了 messages 和 docmessages 两个目录。

5、翻译存储

工具->翻译存储,第一次使用会有个 KDE 的任务进度提示。等他完成。完成后查看下”管理翻译存储“里面的项目是不是 en_US 到 zh_CN 的对应。如果不是删除手动创建一个……然后选择重新扫描工程,扫描完 KDE 的总量应该约有 20 万的记录。也请检查数量是否正确。

6、选择翻译文件

然后你就可以去工程概述选文件翻译了。如果这个文件从未有个中文翻译,双击会创建这个文件,记得保存后手动修改:

“Plural-Forms: nplurals=2; plural=n != 1;\n”

改成 “Plural-Forms: nplurals=1; plural=0;\n”

修改是中文的复数设置。

7、翻译

以下内容比较零散,作为指导和参考。

中英混合:中英混合时在英文两侧加入空格。

标点:常见使用全角的标点都使用全角,括号使用半角,并在括号周围留空格,例外包括括号后紧跟其他标点,或者是为了快捷键字符的括号。引号无论内容是单引号还是双引号,优先使用双引号,嵌套时才使用单引号。

省略号使用三个点。

注意句尾的句号,如果有不要忘记写句号,如果没有不要擅自加上。

例:

Size (mb)
对应
大小 (mb)
快捷键
&Ok
对应
确定(&O)
上面两个例子的区别是后者无空格。

&表示的是经常在界面中的下划线快捷键,Alt + 字母可以直接激活。这个表示法是 Qt 的。其他Toolkit不通用。无论原文快捷键对应的字母是大写或者小写,翻译后一律使用大写。

快捷键项目之后带省略号一般表示为会打开新窗口,翻译时

&Open
对应
打开(&O)...
省略号放在后面。

参数:QString 在 format 时使用 %1 %2 等等作为占位符,翻译时请注意保持,以及按对应语言调整顺序。参数一般也视作和中英混合一样需要加空格。

KRunner:KRunner的翻译有两点需要注意,krunner的功能是基于搜索词的,搜索词一般都标注了本地化,但是针对中文这种情况,不要翻译。例如 kill 作为杀进程的搜索词,如果翻译成杀,那么必须在 krunner 里面使用 杀 才能触发这个功能,是很不方便的。外加 krunner 有帮助可查,所以本地化搜索词只会让 krunner 使用上添加不便。

其次,krunner 的搜索句的占位符是 :q: ,需要注意保留。

X-KDE-KeywordKeywords:KDE 的关键词,在krunner 这种搜索程序时使用,采用半角逗号 (老格式)或者分号分割 (新格式),采用哪种参照原文即可。翻译时建议保留全部原文,然后附加上翻译内容。保证使用英文依然可以搜索到内容。其次,遇到一词多个翻译,可以把认为相关的翻译都附加上。

keyboard,num pad keyboard
可以对应
keyboard,num pad keyboard,键盘,小键盘,数字键盘
表达方式:同一个程序内,经常会有类似说法,但是只换了一个动词和名词的句子,注意表达方式的一致。不同程序也需要考虑这个情况。

上下文:对于短词,直译的选择可能有很多,因此需要考虑上下文。例如 Start,单独翻译成开始,但是在 Start,Pause,Resume都作为需要被的词时也许可以采用,启动,暂停,恢复这样的翻译。

同样拿不准的应当到源代码或者程序中参考当时的语境。

-er的名词:英语喜欢把一个动词名词化,类似情况可以考虑翻译成 XXXX 器,例如 cleaner 翻译成清理器

没有合适的对应名词:例如 ksecrets 里面的密码容器这个概念,在 #kde-cn 上讨论后决定翻译成密匣。拿不准的翻译总可以和其他人讨论,也许有时候还可以发明个比较中国风的词出来。

you的翻译:需要翻译 you 时翻译成您,但要注意有时候这类句子可以省略主语。中文的说法一般都可以更加简洁。例如:

Do you want to save?
对应
是否保存?
并不一定非要把you翻译掉。

褒义和贬义:同一个词的准确翻译在不同语言里面的褒贬可能不同。例如 fancy,选择翻译成花俏可能就更偏贬义(无聊的附注,尤其是一群人都喜欢用花俏来喷KDE的场合……花俏这词就更糟了……),考虑对应的语境,可以选择”有趣“,”漂亮“这一类的词。例如 legacy,经常用于形容老硬件,或者老设备,但形容对方的电脑老可能会让人感觉不愉快,这个词例如可以翻译成”传统“。

通顺:翻译出来是给人看的,所以保持语句的通顺很重要,多读两遍不会有什么坏处。

中文的习惯:中文和英文的语序在习惯上有很大差别,英语很多内容都后置了,对应的中文可能采用前置更好。以及英语喜欢用被动,中文喜欢用主动,原文是被动不代表你也要用被动。

例如:

File is being saved.
对应
正在保存文件。
时态:界面中很多地方都使用了现在分词,用来表示正在进行的动作,例子参见上一个。还有过去时,翻译时需要注意是否加上”了“,”已经“表达时之前发生的事情。

8、申请自己的账号

最近 KDE 申请账号似乎变严格了,所以在申请之前还请先做出足够的贡献。(如何定义实在拿不清楚……),然后找其他人来 back up 你的申请。在此之前如果想参与将翻译好的 po 文件发到邮件列表即可。上面的svn地址是不需要账号的。

9、什么时候翻译

翻译和发布周期之间的关系是很重要的,如果你想要你的翻译在某个版本之前被包括,那可要注意什么时候发布正式版,正式版之前的几天会tag,所以尽量早点完成是有好处的。其次如果说为了避免string的频繁改动,在String Freeze之后翻译是可行的(事实上KDE即使不String freeze你也不会做太多无用功),但是除了 KDE SC之外,其他的软件,例如 Amarok,KDevelop 可不一定都有这个阶段或者你能找到这个阶段……发现一个软件 Beta 了就抓紧开始吧。(当然也有完全不 Beta 的……)

订阅 Planet KDE 来注意新闻是个不错的选择。

感谢 Ni Hui 对我曾经的指导,还有 Amesists 今天听我白活了半天,让我有机会整理下这些内容。

Update:

(日期不详……) 更新标点,快捷键和中英混合。 (2015/9/15) 更新新的 Keywords 部分。

Tags: ,

6 FEEDBACKS

  1. 精华文啊…… 不过话说翻译的时候一定要用最新版本的软件吗?

    • 1、用最新版本的有助于你了解出现内容的上下文……当然不用也无所谓,一般来讲不是所有翻译都有必要用程序去测试…… 2、如果你真的用的的话会很有动力翻译……

  2. tmk

    总结得很好啊,尤其是Krunner翻译要注意的

  3. 总结得很不错,尤其是关于语言的翻译细节部分,比如中文习惯部分,很看不惯一些老的但还自称是经典的翻译,老学外国人的说话方式,不仅仅是生硬,而且还阴阳怪气的。

  4. 千里孤坟

    大小 (mb) -> 这里括号前的空格非特殊情况不需要吧。

Leave a Reply

Your email address will not be published. Required fields are marked *

Note: Commenter is allowed to use '@User+blank' to automatically notify your reply to other commenter. e.g, if ABC is one of commenter of this post, then write '@ABC '(exclude ') will automatically send your comment to ABC. Using '@all ' to notify all previous commenters. Be sure that the value of User should exactly match with commenter's name (case sensitive).