游戏本地化中PO文件的翻译和本地化策略

职场   2024-12-04 22:48   浙江  

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 的句段,锁定其它句段。具体操作为:

  1. 按照上述的操作,先筛选出特定 Key ID 的句段,并锁定

  2. 创建两个视图文件:一个仅包含”非锁定句段”的视图文件,一个仅包含”锁定句段”的视图文件

    创建包含”非锁定句段”的视图文件为例

    用同样的方法,再创建一个仅包含”锁定句段”的视图文件

  • 在”项目主页”的 ① “翻译”界面下,选择 ① 需要处理的文件

  • 点击上方菜单的 ② “创建视图“,弹出”创建视图”窗口;

  • 在”创建视图”窗口,选择 ③ “仅限未锁定“句段,并 ④ 给这个视图命名

  • 设置完成,⑤ “确定“即可。

这时你会得到两个视图:

  • 除UI_SCENARIO之外的句段——未锁定状态;

  • 仅包含UI_SCENARIO——锁定状态。

  1. 锁定”除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 标准源文档

游戏本地化文件中,为什么导入至memoQ多了些rpr标签?

海外发行,本地化能帮忙规避什么风险?

黑神话悟空的本地化是在一个月内完成的?

服务了40多个游戏客户后,感觉我已经无所不能了!

又来分享一个项目管理中,解决问题的小巧思~

本地化项目经理会被 AI 替代吗?——从问题解决来看PM的价值

本地化界面做成这样你愿意付费么

圈圈的翻译之路
分享外语人赚钱的可能性。加入【圈圈翻译与本地化】社群,联系quanquanfanyi
 最新文章