在 Epic 中国的团队内,边工作边聊天是一种状态,有一个话题是讨论过由各个不同职能的同事,能够定期或不定期(坏笑)的写一些工作日志,给更多虚幻引擎的爱好者和社区大神了解我们的工作日常状态、Epic 内部的工作流程、各种八卦(误)和业内秘闻(大雾)。对于这个话题也多次提起,但由于我们团队中的每个人(其实也没几个人)都长期处于忙到爆炸的状态,这类的文章迟迟没有成型一篇。所以,这里准备起个头,我先来写一篇,是关于本地化(Localization)的文章,也是拖了很久,但是,无论拖了多么久,还是希望将来会有更多这类充满了小秘密类的文章从 Epic 中国团队的内部写出来。通过这篇本地化相关的文章,希望能够说明我们在虚幻引擎这个大家都热爱的产品上,是如何做本地化的,虚幻引擎的本地化历史(黑历史?滑稽),现状,和将来的预期。
这篇文章也是断断续续,在办公室,在咖啡店,在航站楼,在招待所,零零散散的思路拼凑,所以如果很杂乱的话也请各位观众老爷轻拍。
先简单的介绍一下我自己,这篇文章的杜撰者。我叫谢添敏(微博),现在为 Epic Games 工作,目前正式的职务是商务总监,负责中文地区的虚幻引擎开发团队在商业授权和技术支持上的一些沟通事务,努力的做一根在开发团队和 Epic Games 之间的纽带和一座不至于摇摇欲坠的小木桥,由于我们人力太过缺乏,我也同时在兼任开发者关系经理,本地化经理的工作任务。因此由我来在本地化这个话题上坑蒙拐骗一番也算职责范围。很多年前,我刚加入游戏行业时,从开发 PS2 的游戏起步,先后为世嘉、育碧、英佩这三家日资、法资和合资的游戏企业工作过,曾经开发过 PS2,PS3,Xbox,Xbox360,GameCube 等多个主机平台的游戏,加入 Epic 之前最后一段工作经历是一个国内射击网游的制作人兼主程,因此也号称上个世代的全机种制霸。游戏开发的部分,除了没有在项目中实际做过渲染的实现和声音的实现以外,其他模块几乎都做过一些,从 UI,AI 的实现(注意,游戏中通常所说的 AI 和通常大家理解的打败了柯洁的人工智能,完全是两种存在,这里暂且不表),到内存分析,多线程优化,磁盘读取,引擎迭代,项目管理,吹牛划水,开会写 PPT,订餐团建。。。咦咦,哪里来的西红柿。。。哦,好像说偏了。
好吧,简单说下平凡经历后,以下开始正文,为了显得很有条理的样子,这篇文章尝试通过 4 个方面来阐述问题。从 我们做了哪些本地化,哪些做得正确,哪些做的不够,以及最后一部分的其他内容和硬广。
UE4 作为一个软件产品,我们在哪些方面做本地化。
启动器(下称 Launcher)和编辑器(下称 Editor)
作为软件工具,最重要的本地化自然是软件本身的界面。多少人年少时不懂日语的时候硬记最终幻想、三国志亦或圣斗士星矢游戏中的菜单选项,而现在,魔兽世界那洋洋洒洒的世界观和优秀的中文游戏内容和潜行者这样的特色文字,让多少青春少年沉(chen)浸(mi)在游戏世界中,学科学,学知识,学历史,学考古,还学各种野外生存技能。自然作为虚幻引擎这样一款软件,我们也希望我们的中文用户能够看到界面上的方块字,让用户更容易在我们的软件中学习和工作。
虚幻引擎四目前是属于源代码完全可以获取的,当然这里也需要指出 Open Source!= Free,也请各位老爷下载软件和源码的时候,稍微阅读一下 最终用户协议,对于 Launcher 和 Editor,如果愿意的话都能找到它们的源码,如果有心翻看源码的话,会看到一些需要本地化的字串在源码中被特殊的宏标记了起来。每次的版本制作(下称 build)的过程中,会使用脚本会扫描代码中特定的用于 localization 的宏,并把它标记的内容自动的生成一个 key, value 对应关系的文本中。
字符串在代码中如何定义,如何根据不同语言设置切换显示的实现细节这里暂且不表,先来描述一下我们做启动器和编辑器的中文化内容的工具,整个翻译的过程主要是通过 Onesky 这一平台来完成的。虽然我们目前已经不再使用 Onesky 并正准备搬迁到一个新的平台上,但这里不妨碍我来描述一下我们是如何在这个平台上工作的。
Onesky 是一个翻译平台,也提供翻译服务,我们每次 build 会把自动生成的 key,value 对应关系的文件推送到 Onesky 的一个相应项目的接口上,译员可以无需打开引擎,直接在 Onesky 的网页界面上工作,对一个个 key 中 value 是英文的内容进行翻译,并保存。Onesky 提供历史记忆库可以让翻译的工作变得更有效率,但未必是正确的,由于译员是脱离语义上下文,在不打开 Editor 或者 Launcher 的情况下进行翻译工作,因此也出现了之前,在材质编辑器中应该为 法线,在蓝图中应该为 正规化 的 Normal 译为 普通 这样的窘境。Onesky 平台上会为 Launcher 和 Editor 保留几个项目空间用于持续翻译。刚才说道,引擎每次 build 会 scan 源代码,将标记为需要翻译的内容单独的生成新的文件并推送到 Onesky 上,这里是一个闭环,它的大致流程是:每次 build 前,引擎会从 Onesky 上获取当前最新的每个项目空间的翻译结果,下载为对应的各个语言的 key value 文件,并和重新 scan 的 key value 文件合并。如果理解了整个闭环,就很容易能够理解每次 build 的过程和 Onesky 上翻译项目的过程是并行的,不会互相依赖,只是在每次 build 的时候有一个同步点互相更新。对于译员来说,在 Onesky 上工作,始终能看到最新的引擎中还剩哪些文字没有翻译,对于 build 来说,始终能获取到最近译员的工作结果并更新在当前这个 build 完成的编辑器版本上。
引擎的技术文档
引擎的技术文档,也就是 docs.unrealengine.com 这一网站的内容。它表现形式为静态的 html 网页,实际制作源格式是我们自定义的一种标记语法,有我们 Perforce 权限的小伙伴们可以看到我们的文档源都写在 *.udn 的文档上,并以多个语言区分。技术文档是我们对引擎本地化重中之重的一个工作。
Markdown 语法的释义并不仅仅是在文档中用到,在我们的 UDN 网站 和 AnswerHub 网站 上,也用了同样的 Markdown 语法。有点像传统的 wiki 格式规则,但又不完全一致。该语法定义了粗体、斜体、列表、超链、图片的各种标记格式。
关于技术文档的组织形式,技术文档从源文件格式编译到目标文件格式(HTML 或者 PDF 或者 CHM),以及 HTML 最终发布到在线网站上的过程,本文决定略过不解释……有兴趣的话以后开新帖说明。关于技术文档内嵌的 Youtube 视频是如何自动内嵌在 HTML 上,文档的花花绿绿的各种标签,一些参考图片可以通过鼠标滑动快速对比画面效果,以及一些蓝图截图可以直接复制并粘帖到编辑器中,这里也准备略过。这里想着重讲一下技术文档的组织原则,英文的更新原则和中文的更新原则,以便普通的虚幻引擎玩家能够了解到对我们的文档网站如何善加利用。
首先是文档的组织原则,秉承先易后难,从入门到高(fang)阶(qi),从工具使用到原理设计,从教程到理论,从设计、美术到程序(这里是从工具、美术制作和代码工程的复杂度上升考虑,并非对不同的工种有难易之分,请策划美术程序小伙伴们团结友爱),从通用平台到特殊平台这样几条线贯穿始终。
其次,英文的更新方式也值得向大家交代一下。虽然 Epic 在本地化上的投入目前还在逐步追加中,但对原生英语的文档和学习材料的制作可谓不遗余力。一个精英小队,由一些明明都会写代码但非要自称为 技术作家 Technical Writer 的人士组成,不断的输出最新的引擎使用文章,技术讲解和视频教程,还有每周都在 Twitch 上更新的直播推流介绍引擎的动态和新闻。就文档方面,每次引擎新推出的版本中的特性都会尽快更新如何使用的教程,比如 4.17 中的 Composure 功能,相应的教程 也已经很快跟上来。Markdown 的语法语义分析处理,转换成 HTML 等多种格式的源代码也是存在在引擎中的,虽然其实对大部分人应该并没有什么用处。
虚幻引擎的网站
主要是跟进英文主站的更新,改进中文站点,以及 博客、案例 等最新的内容。另外我们时不时也也会在博客、案例中发中文地区产生的内容,并且内容优秀的话也会反向的翻译成英文并在主站上推送,比如这篇文章,就直接发在了中文 Blog 区块,但很可能并不会翻译成英文在主站上推送。
在 博客 的内容和 案例 的内容下,有着非常多最新的引擎的信息和动态,有技术类的专题文章,也有案例类的成功项目的推广,更有各个地区的各种大大小小的活动以及 Epic 参与其中的身影,通常活动都会写预告,便于同在现场的小伙伴们勾搭,结束后也会写 Recap,便于刺激没去现场的小伙伴羡慕顺便敲敲黑板划下重点。
对于网站内容的维护,提供给本地化工作流程的是一个称为 CMS 的后台管理系统,CMS 全程叫 Content Management System,一般用于管理网站后台,毕竟不是每个翻译都像本人一样对 html 语言了(lue)如(dong)指(pi)掌(mao)的,因此需要一个即能向译员或者编辑提供内容管理的界面,用要避免对网页页面编辑不是很熟悉的译员,通过各种骚操作搞垮整个网站的风险。
Epic 的其他网站和项目产品
除了 unrealengine.com 以外,Epic Games 还有其他一些网站,包括 epicgames.com,epicgameschina.com 等以及游戏项目的站点。作为虚幻引擎在国内业务和技术团队,我们同时也在负责 epicgameschina.com (现已合并到 epicgames.com 的中文语言)页面,以及为其他游戏项目的网站提供重要内容的建议和复审。还有一些隐藏内容是基于网页的,或者说是基于 HTTP 的,但用于应用程序的内嵌显示,比如 Launcher 上的学习页面,Marketplace 页面等,也是作为一个网站网页产品在做本地化工作。
Epic 曾经的游戏有虚幻竞技场和战争机器,在这篇叫做《Epic 的四条命》的文章中(中文版),我们可以看到,公司始终在即开发引擎,又开发游戏或产品,保持 “两条腿走路”,将引擎用于游戏产品开发中,并用游戏开发过程来验证并改进引擎功能,随着这几年行业的发展,游戏形式已经发生了很大的转变。传统的单机游戏的开发模式已经逐渐被一个长期的订阅服务式的游戏产品软件服务逐渐取代,因此,现在在仍然在的游戏有 虚幻争霸,堡垒之夜 都是面向在线、多人、快速迭代更新的游戏类型。同样还有 Robo Recall,Battle Breaker,Shadow Complex,Spyjinx 等游戏作品,以及依然在随便更新的 UT 产品。
哪些是正确的
写完了枯燥的,没有底气的翻译说明后,准备稍稍吹嘘一下本地化的工作。
我接手本地化工作后,最正确的工作是,我们做到了向中文用户提供中文的技术文档手册,并且保持接近 100% 文章的翻译率,并在努力的提高中文文档的质量。虽然目前文章的更新率(稍后解释我们对更新率的定义)仍然不够,但相比较另一家 U 姓的引擎产品,虽然已简单易用著称,但迄今仍然没有中文的技术文档着实令人汗颜。这里说接近 100% 的文章翻译率,指的是每一个英文页面的文章,都已经有对应的中文页面,但对于新更新的英文页面,可能会迟滞中文页面更新 1~3 周。比如在写这篇文章的当下,英文页面更新的 Composure 系列,中文的译文就尚未部署到在线环境。除了新文章外,我们另外还有一个数值来衡量已经存在的文章,也就是前面提到的更新率,英文的原文档做了更新,中文页面的要不要更新,什么时候更新。目前对于这类文章,我们处于始终统计并保持关注,目前只能人为的选择更新部分落后英文特别多的页面提高它的更新翻译优先级。由于我们投入的本地化人力资源依然有限,暂时很难在短期内快速的追平每一篇英文的新文章以及英文的老文章。还望观众老爷理解。同时,也希望各位老爷多多给我们提供反馈意见,给我们工作优先级以更符合用户的参考信息。除了对现有文档提出反馈意见外,也可以对目前没有的文档,但各位老爷心中已经产生的疑问给我们提供反馈,我们也可以推动新的文档编写的车轮。
对于做的正确的事情,近 2 年,Epic Games 投入了专门的人力和资源为中文负责。避免了以前把 Normal 翻译成 普通,把 Level 永远翻译成 等级,把 Player 永远翻译成 玩家 但有时候可能是指 播放器 等等各种脱离上下文的直译错误。在这里我可以负责任的说,这两年中更新的中文内容,不敢说每个字我都读到并且改正了错误,但几乎每篇文章的大体内容我都是看过并且没有严重问题的。对于各种文章内的 bug 而言,我们怎么处理,在下一章中我继续和各位说明。同样,由于我在做 Proofreading,我可以对文章的画风、格式作出统一的要求,在信达雅上如何平衡取舍,在各种规则定义上如何界定,也会在下一节中重点说明。在这里,对于正确的事情,只想表达我们终于做了统一的,容易差错修改的,对质量下限有保证的中文化工作。
视频。这是一个视频的年代,英文世界中做了海量的视频教程、新手引导、案例阐述等内容。那么对于我们说着中文唱着歌的聪明群众,并不是每个人都愿意学英文,也不是每个人都自带翻越技能而言,在各类大家喜闻乐见的网站上(Youku,Bilibili)提供本地化的内容,则是我们最近半年的一个努力方向。大家可以看到,我们有社区爱好者做了大量基础课程的字幕视频,有我们亲爱的社区经理亲自制作了一套入门教程,中文讲解哟,以及官方字幕组为一些优秀的系列视频做字幕整理工作(骨骼资源,Sequencer 介绍)。希望这些工作能给大家入门虚幻引擎带来一些帮助,推迟放弃学习的时间点。当大家自己能够走上自我学习的道路时,再回头看这些视频,会觉得是多么的简单,但又多么的困难。
哪些有待改进
A
有待引入中文的本地化 QA 流程。目前的本地化流程,几乎都是靠翻译方自我检查来保证中文的质量。对于翻译方来说,质量和效率是矛盾组合体,希望提高效率必然会损失质量。没有第三方来对本地化结果进行检查,很难保证中文内容阅读起来是正确的,更不用提阅读的顺畅。我们的目标是,希望能够像游戏产品的测试一样,对中文翻译结果进行检查,提交 BUG,并针对 BUG 逐一修复,或者将 BUG 变成其他诸如“重复”,“不修改”等各种状态来管理译文,持续改进虚幻引擎中文内容的质量。为此,我也专门申请了一个邮箱用来收集来自各位观众老爷的反馈意见,在 Epic 内部建立对本地化 QA 流程前,各位观众老爷就是监督我们的强大力量,对任何翻译上的 BUG,请发送邮件到 ue-locbug-chn(避免 SPAM 的故意分开的后缀为 @epicgames.com),我们会尽可能的修复它们。这个邮箱请勿用于发送简历、市场合作、商业合作等其他目的。。。如果发了的话,我看到还是会帮忙转发的。
B
急需改进引擎代码中对本地化内容的规范化写法规则,如前文所说,在引擎的每次 build 中,会扫描源代码中特殊的标记,并生成需要本地化的 key value 文本文件。虽然我们也知道有些业内大厂软件也是类似的处理方式,但这其实并不是一个优雅的处理手段。它的缺点包括:需要写代码的人主动的意识到文字内容会被做本地化,对于同样含义的本地化内容可能存在多个不同大小差异的变种存在于代码中不利于一致性。对这一功能的改进早就提上了记事议程,对于 Launcher 和 Editor 中需要做本地化的字符串,将会通过一个 string table 来规范,任何需要做本地化的文字,比如菜单、按钮名称等,都会优先在 string table 中新增,并提供一个标识,代码中将不再直接编写字符串,而是应该始终通过调用唯一标识来表达所需要表达的字符串,也能较容易的做本地化。
C
稍微了解一下翻译专业的小伙伴应该都知道,翻译行业追求的是 信、达、雅 三个层次。
信 指意义不悖原文,即是译文要准确,不偏离,不遗漏,也不要随意增减意思;达 指不拘泥于原文形式,译文通顺明白;雅 则指译文时选用的词语要得体,追求文章本身的古雅,简明优雅。 - 严复
那么目前我对翻译译员的要求是 信。我自己在努力的作 达,随缘做到 雅。举个栗子,英文的原文是
一个合格的译员是the GPUSprite TypeData allows you to spawn tens to hundreds of thousands of particles
GPUSprite TypeData 使您可以生成从几十个到几十万个粒子
我觉得比较好的翻译是
GPUSprite TypeData 可以生成几十万个粒子而开销相当于 CPU 计算的几十个粒子
但这样的翻译结果实在不能强求,需要对翻译有真爱。英文的语序是一棵树,有一个一个的分支组成完整的句子,而中文的语序是一根竹子,由一个个顺序的段落来组成句子。所以在中文汉化的过程中,理想的情况是完整的理解了英文要表达的内容,包括字面上的含义和字里行间的含义后,重新用中文的习惯描述,并保留字面的含义和字里行间的含义。
当然,也有中二的翻译,比如像这样子的
GPUSprite TypeData 使您可以生成从几十个到千千万万的粒子
好吧,这个千千万万把原文中一个具体量化的数量级,变成了一个虚词,我只能对这位中二的译员说,你开心就好。这样子的中二翻译方式,好像文章润色了很多,但实际上要么改变了原意,要么改变了话风,这都不是我们想要的结果。
D
对于文字的排版,我个人有着苛刻的要求,以下是我的原则,也欢迎各位观众老爷给我反馈。首先要说的是中英文混编下的空格,这一格也被称为逼格。虽然这并非是一个正式的规定,但我想其源头是因为类似 WORD,PPT 这类专业的文字编辑软件,在制作全角半角混编文字的时候,会在半角和全角字符之间主动的增加间隔以提高阅读的舒适度,但 WEB 端的字体显示通常不会做这种处理,因此 WEB 端如果能够手动的加入一个半角空格,在一些常用字体下,会显得比较美观。当然,用不用空格这件事情,是见仁见智的话题,比它更重要的是,全篇文章,或者整个系列,要么都用空格,要么都不用空格,规则必须一致。不能随心所欲的有时候高兴了空一格,不高兴了不空格,特别高兴空两个,这就特别的贰了。除了空格以外,udn 文件中的 markdown 语法由于天然的对全角半角处理不是很正确(捂脸扭来扭去中),导致加粗、斜体等一些标记在前后必须要有半角空格(见本文前图示),否则该转义标记语法不能被正确的识别,这也是大家在文档中看到凡是加粗、斜体的部分,即使是整段的中文,也会在被标记的文字前后留有空格。虽然说这是一个字符处理的 BUG,但最终的效果也是不错的,反而是一个逼的译员主动加空格的行为(难道写这段字符处理的码农是故意的?)。
E
做一个第二语言插件。不知道有多少人想要这个功能?我总是幻想编辑器的语言切换像是看美剧加载字幕一样,并且还能够加载第二套字幕。当编辑器的本地化工作功能开发进展到没有 BUG 可改,闲的蛋疼的时候,就可以把这个插件开发提上议程了。当然这个功能也一定会面临诸多问题,比如当加载了两套语言的时候,按钮或者菜单这样的 UI 控件留给字符显示位置有限怎么办?做两套语言支持编辑器工具到底是在方便用户还是开发人员自嗨?
F
Epic Games 北美总部有固定的 Twitch 直播计划,而在中文地区各大直播平台也在如火如荼的展开,电竞、唱歌、户外,喊麦,直播已经渗透到了很多人的生活。中文直播方面,我们团队也在做一些打算,希望能够通过直播平台,定期的和大家在线上聊聊天,介绍引擎的最新动态,展示一些小的 DEMO 演示功能,做一些教学和线上交流,全中文的环境,配合观众老爷的观看习惯,当然也接受各种打赏和投食。
其他内容,以及最重要的硬广
本地化的流程有很多,相信不同的行业、不同的公司也有各自不同的方法,无论是公司内部团队翻译,找专业的翻译公司翻译,有或没有流程管理的,用或不用兼职学生的,可谓八仙过海,各显神通。这件工作我们觉得只要优先服务好观众读者,不管过程正义是否做得尽善尽美,也要以结果质量为导向。这也是为什么我们可以接受引擎代码中 HardCode 本地化内容,也要优先提供一个可用的中文版本,同时在资源允许的情况下在逐渐改进到 String Table 的实现方式,都是体现了以观众老爷为本的精神。
为了避免自己硬广而先插播别人的硬广。虚幻引擎作为游戏行业的一个引擎技术的引领方,希望游戏行业的观众老爷能够得到更多的资讯。这个知乎专栏非常值得一读,其中有游戏开发人员的成长,项目制作的经验,以及虚幻引擎团队的成员招募信息。
真正的硬广来了,Epic Games 的上海部门正在招募专职的 Localization Manager 欢迎 踊跃投递简历。