Hi,你好呀,我是May。
在进行游戏和应用程序本地化时,我们最常见的文档是多语言Excel文档,详见游戏本地化时,如何翻译多语言的Excel文档。
此外,还有一种常见的语言包文档,就是 PO 文件。比如我在电脑一搜,就找到很多语言包的 PO 文档,如剪映云的PO文件。
所以今天分享,游戏本地化中 PO 文件的处理技巧,推荐给游戏本地化项目经理~
认识游戏本地化中的 PO 文本
PO 是 portable object (可跨平台对象)的缩写,可以被 Java 程序、GNU gettext 或其他软件程序作为属性文件引用,是应用程序本地化时常见的文档。
我的观点还是:我们本地化人员不是程序员,不需要会写,只要认识就行!
我们来以一个demo文档认识一下,什么是 PO 文档:
这里的例子我就用我下载好的剪映云自带的 PO 文档做案例了,如有侵权,联系修改~
PO 文件的数据结构
PO 文件的数据结构长这样。其中:
#
井号后面一般是注释;msgid ""
——msgid空格引号,引号内是原文。msgstr ""
——msgstr空格引号,引号内是原文翻译结束后的译文的内容。
PO 中的占位符
根据编程语言不同,原文可能会含有HTML样式或其它占位符,翻译时必须保留这些字符串。
句段的注释
既然是注释,也注释的类型怎么区分呢?在PO 中,具体的注释类型由紧随井号的字符决定,比如:
#
—— 井号后面紧跟空格,是译员的注释;#.
——井号后面紧跟紧跟句点,是额外注释,一般是从源代码注释生成#:
—— 井号后面紧跟冒号,表明待翻译语句的出处,一般标记源代码文件及行数#,
—— 井号后面紧跟逗号,一般是由编译器生成的格式注释。
上下文的场景
有时,同一个句子在不同的场景里要翻译成不同的意思。所以为了区分上下文的场景,在 PO 文件中也会通过 msgctxt
字段,来明确句子在程序中的具体位置和含义。
单复数区分
对于有单复数的语言而言,PO 支持设置单复数区分。
CCJK(简中繁中日韩)是没有单复数的,就不行~
那,这样的文件如何翻译呢?
译前处理:导入 PO 文档至 memoQ
memoQ 中支持直接导入 PO 文件。
对于含有占位符或 HTML 样式的文档,还可以借助层叠过滤器实现。
层叠层叠嘛,第一层是PO gettext(也就是 PO) 过滤器,第二层是HTML过滤器,也可以再加一层正则表达式标注器。
PO gettext(也就是 PO) 过滤器,帮助解析不同列。
直接将文件导入至项目即可。
字符串和占位符的处理
如果原文中有想<color=yellow>
和{PropName}
或者 \n
这样的字符串和非译元素,需要再加一层正则表达式标注器,并设置正则定义方式。
——这样的话原文中的非译元素可以固定为标签,译员就不会误翻译。
Step 1:在导入项目时,使用“选择性导入”;
Step 2:选择好原文后,默认用的过滤器是 PO gettext过滤器。因为原文有字符串,这里选择“更改过滤器和配置”;
Step 3:添加一层正则表达式标注器,并设置正则定义方式。
Step 4:设置完成过滤器,保存层叠过滤器,以供下次使用。然后,点击“确定”即可。
关于正则表达式如何写
我写过一篇应用程序本地化中常用字符串和正则表达式推荐,你可以来学习正则。
当然,memoQ 自带了一个 tags and entities 的标注器,内嵌了像
<color>
这样的标签,也设置了哪些是开标签哪些是关闭标签,你也可以直接使用,还是不错的。
PO 文件中的注释的处理
在带大家认识 PO 文件时,我提到:在PO 文件中,具体的注释类型由紧随井号的字符决定,比如:
#
—— 井号后面紧跟空格,是译员的注释;#.
——井号后面紧跟紧跟句点,是额外注释,一般是从源代码注释生成#:
—— 井号后面紧跟冒号,表明待翻译语句的出处,一般标记源代码文件及行数#,
—— 井号后面紧跟逗号,一般是由编译器生成的格式注释。
那,在导入 PO 文件时,如何将下图所示的译员的注释也导入 memoQ 中进行参考呢?
我们只需要:更改 PO 过滤器即可。
具体操作:
Step 1:点击 ① ”导入”的下拉菜单 -> 找到“选择性导入” -> ② 找到该 PO 文件的路径 -> ③ 选择该文件 -> ④ 打开;
这时,会弹出“文档导入选项”窗口,过滤器使用”默认PO gettext(也就是 PO) 过滤器“。
Step 2:这时,我们选择“更改过滤器和配置” -> 弹出“文档导入设置”窗口,默认使用的 PO Gettext 过滤器。
开始更改该PO过滤器:
① 勾选“导入/导出译员注释” ->
② -> ③ 保存过滤器供下次使用。
同样,如果有标签的话,可以再次添加层叠过滤器,并保存:
导入完成文档后,在 memoQ 编辑器中进行检查和翻译。
我们通过编辑器右侧的黄色小云朵发现,这时:译员的注释就已经作为注释导入至 memoQ 了~
记得么,黄色小云朵表示这里有个注释;蓝色表示没有注释。详见:在memoQ中,如何像Word一样添加注释?
如果你对翻译编辑器界面还很陌生,参考:认识翻译编辑器界面
译中翻译和管理:
在 memoQ 中进行翻译
导入完成文档后,即可在memoQ中进行翻译了。
在翻译过程中,你会发现:
msgid中的原文就提取出来了,可以安心做翻译。
下方还可以预览原文和译文。
筛选指定注释的句段内容
基于部分译员注释内容,筛选指定句段
其实我之前写过一篇在游戏本地化时,如何基于Key ID或注释筛选句段并锁定句段?的文章,这里的操作是一样的原理,我们同样可以借助筛选功能,筛选包含特定注释的句段。
筛选特定上下文/注释的句段,你只需要:
① 点击”筛选选项“按钮 -> 根据查找条件,勾选”查找位置“的”包括注释/包括上下文 ID“选项,
② 在筛选框中输入Key值或注释内容,按下回车后,
③ 包含特定注释内容的句段,
④ 即可筛选出来啦~
所以今天,跟大家分享,如何基于注释内容,筛选 PO 文件中指定的待翻译句段,并进行锁定。
在PO文件中筛选,包含全部译员注释的句段
不论注释内容是什么,如果是希望筛选出包含全部注释的句段呢?——我们依然可以借助筛选功能的使用正则查找句段来实现~
你只需要:
① 点击”筛选选项“按钮 -> 根据查找条件,勾选”使用正则“、”包括注释“和”不包括源文本或目标文本“,
② 在筛选框中
.+
,按下回车后,③ 包含注释的全部句段即可筛选出来啦~
锁定特定注释的句段
这时,如果希望在筛选出来句段后把上述的句段锁定,就可以使用memoQ的锁定和解锁句段的操作,将上述句段锁定。
锁定特定注释的句段
具体操作为:
① 使用
shift
按键,选中这些筛选出来的句段,② 点击”锁定/解锁句段“按钮,弹出”锁定句段”窗口,
③ 在操作中选中”锁定“,
④ 确定即可。
耶!锁定成功!
锁定除特定 Key ID 的其它句段
如果这时,我希望:“咦,我只想要这些我只想要这些特定 Key ID 的句段,能不能锁定其它句段?”当然可以。
我们可以像前面一样,使用memoQ的视图 (View) 功能,除特定 Key ID 的句段,锁定其它句段。具体操作为:
按照上述的操作,先筛选出特定 Key ID 的句段,并锁定。
创建两个视图文件:一个仅包含”非锁定句段”的视图文件,一个仅包含”锁定句段”的视图文件。
以创建包含”非锁定句段”的视图文件为例:
用同样的方法,再创建一个仅包含”锁定句段”的视图文件。
在”项目主页”的 ① “翻译”界面下,选择 ① 需要处理的文件;
点击上方菜单的 ② “创建视图“,弹出”创建视图”窗口;
在”创建视图”窗口,选择 ③ “仅限未锁定“句段,并 ④ 给这个视图命名;
设置完成,⑤ “确定“即可。
这时你会得到两个视图:
除UI_SCENARIO之外的句段——未锁定状态;
仅包含UI_SCENARIO——锁定状态。
锁定”除UI_SCENARIO之外的句段”,解锁”仅包含UI_SCENARIO”:
把锁定和非锁定的位置换过来就好了嘛~
选择”仅包含UI_SCENARIO”这个视图 -> 点击”锁定/解锁句段“的”解锁“。
选择”除UI_SCENARIO之外的句段”这个视图 -> 点击”锁定/解锁句段“的”锁定“,
搞定!实现除特定 Key ID 的句段,锁定其它句段。
导出译文
翻译结束后,导出就OK啦。
导出译文的操作可以参考如何在memoQ中导出最终译文
这里用了机器翻译的结果。
如何导入 PO 的全部注释至memoQ?
前面我们提到,在PO 文件中,具体的注释类型由紧随井号的字符决定,比如:
#
—— 井号后面紧跟空格,是译员的注释;#.
——井号后面紧跟紧跟句点,是额外注释,一般是从源代码注释生成;#:
—— 井号后面紧跟冒号,表明待翻译语句的出处,一般标记源代码文件及行数#,
—— 井号后面紧跟逗号,一般是由编译器生成的格式注释。
在导入 PO 文件时,默认只有译员的注释才会导入 memoQ 中进行参考,那其它类型的注释呢?
——既然 memoQ 中不能导入,那我们可以通过译前和译后处理,修改 PO 文档的注释类型就好了呀~(总是能解决问题的对不对~~)
译前处理:修改 PO 文档注释类型
我们可以这样做译前处理:将原本另存一个副本文件 -> 通过替换的方式,把前缀替换成memoQ可识别的译员注释形式,如:
#.
替换为“# 点”(这里是井号空格中文汉字点);#:
替换为“# 冒号”(同理,这里是井号空格中文汉字冒号)
译中:导入 memoQ 中进行翻译和筛选处理
这样的文档使用 memoQ 导入译员注释的功能,就可以顺利导入memoQ啦~
这时再根据需求使用筛选功能就可以啦~
如,筛选部分注释:
或筛选全部注释:
通过译后处理,修改译文注释类型
Step 3:别忘了翻译完成导出文档后,需要再进行译后处理替换回来哦,如:
# 点
替换为#.
# 冒号
替换为#:
温馨提示:再译后替换时,别忘记空格哦~如井号冒号空格)
这样不是就可以了嘛~
好啦,今天先这样,还有什么翻译需求,欢迎来问~
我写的其它好文
(请游戏本地化PM收藏!)本地化所需要的 Excel 标准源文档