(建议收藏)面向译员和PM的正则指南
Hi,你好呀,我是May。
越来越多的小伙伴问我正则如何学习,如何使用。也有客户的PM来问我,如何给团队的译员讲解正则。
其实我前面写过很多了,举办过正则的webinar,详见职业译员玩转翻译技术——正则表达式。但是总有伙伴说找不到,或者跳转比较麻烦,所以我又做了新的整理,分享给大家~
网络上有很多正则的教学资料,但是我都觉得不适合职业译员,更多的是面向程序猿的,而我这篇更多是面向翻译与本地化从业人员的,比较适合译员入手~
先说好,我不是程序猿/媛,也没有做程序开发的打算,纯碎是本地化从业人员。推荐正则不是让大家写代码,纯粹是为了让大家在翻译时能提高效率。(反正正则就是谁用谁说好~)
一、概览
1.1 正则表达式是什么?
我们看看正则是怎么定义的:
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
听不懂,先放放定义。没关系,定义不重要,有啥作用和咋用比较重要。请继续。
1.2 为什么要用正则?
第一,当然是为了提高搜索效率。
比如,你可能通过正则搜索以下场景:
在一个文件中,你想搜索“cat”这个词,但不搜索含有cat这个单词的其它词,如catalogue、cataract、catch等类似的词;
你收集了一些用户信息,其中包含:中文姓名、联系电话、电子邮件等,那你可能希望检查用户填写的信息是否符合标准,那你就可以试试搜索“手机号为1开头的11位数字”;
收到译文后,你想看看译员翻译的日期到底对不对,那你可能会搜索一下日期,是不是格式一致;
还有你可能会想看看有没有两个连续空格啊,特殊符号啊等等。
第二,反正搜索有时候就是为了替换的嘛,所以用正则也是为了提高替换的效率。
在一个文件中,你想把“size”替换为“isize”,但不替换含有size的其它词,如oversize等类似的词;
在进行网站英译汉本地化的过程中,原文中的超链接网址都会变为标签,所以你可能希望把所有的标签网址中的en替换为zh;
等等。
总之,只要你觉得搜起来/替换起来很麻烦的,想搜但搜不到的,正则都能帮你。
1.3 正则适用于谁?
不论你是译员or项目经理or质检人员,只要你想借助CAT工具让翻译和项目管理效率更快一点or质量更高一点,欢迎一起来用;
如果你借助office让效率更快一点,欢迎一起来和正则的双胞胎弟弟“通配符”一起玩(通配符以后再讲);
如果你是程序猿/媛,欢迎来补充or更正~
二、正则表达式新手入门
2.1 点、星号、加号和问号
.(点)可以匹配任意单个字符。意思就是,只要是一个字符,就能搜出来。比如,如果我搜索 c.t
,那我搜出来的结果可能有:cat
、 cbt
、 cct
、 cdt
、 c0t
、 cAt
、等等。-----只要包含c什么什么t的都会被搜出来。
*(星号)可以匹配内容的零项、一项或者多项**。意思就是:如果没有就算惹;如果有麻烦帮我匹配一下。比如,如果我搜索 c.*t
,那我搜出来的结果可能有:cat
、 caat
、 caaaaaat
、 ct
等等。你看,c和t之间可能啥也没有,所以 ct
也会被搜出来。
+(加号)可以匹配内容的一项或者多项。意思就是,我知道肯定有,但是我不知道有几个这样的。比如,如果我搜索 c.+t
,那我搜出来的结果可能有:cat
、 cbbbt
、 ccct
、 c0t
、 cAAt
、等等, 但是ct
就不会被搜出来。
\?(问号)可以匹配内容的零项或者一项。意思就是,我不知道有没有,如果没有就算惹;如果有麻烦帮我只匹配有一次的内容。。比如,如果我搜索 c.?t
,那我搜出来的结果可能有:cat
、 cbt
、 cct
、 ct
等等,像 caat
就不会被搜出来。
2.2 ^开头和$结尾
做事情都讲究有始有终,使用正则也是一样的嘛~ 要想好从哪里开始搜索,和搜到哪里结束:从哪里开始用 ^
(插入符号,同时按下键盘的 shift+数字6
),从哪里结束用 $
(美元符号,同时按下键盘的 shift+数字4
)。
举个例子🌰
我想搜索1开头的任意内容,那我就可以使用 ^1.+
。这时候你可能会搜出来 12340
, 18293274
, 1是一个数字
等等,只要是数字1开头,一直到段落结束的所有内容都会被搜出来。
2.3 (\)反斜线,转义符
转义转义,帮忙转换一下意义。比如说,本来在正则中, .
表示匹配任意字符,如果是 \.
(在点前面加了个转义符),就表示匹配小数点,而不是匹配任意字符啦~ 再比如说, +
表示匹配任意字符,如果是 \+
(在加号前面加了个转义符),就表示匹配加号,而不是匹配一个或多个内容啦~
下次如果你也不知道到底有没有含义,可以试试在前面加一个转义符号。
常用的带转义符的正则公式有:
\s
表示匹配空格
\d
表示匹配数字
\n
表示匹配换行符
\r
表示匹配回车符
\t
表示匹配tab字符
2.4 字符集
字符集用
[]
(英文的中括号对)表示。我记得小时候,也不是小时候,好像是初高中吧,学“集合”,就是用的这个东西。数学中集合具有某种特定性质的具体的或抽象的对象汇总而成的集体,这里的含义和数学上那个是一样的。简单理解,就是一类字符。再理解不了往下看:
常见的字符集有:
[a-z]
表示匹配a至z之间的一个小写英文字母
[A-Z]
表示匹配A至Z之间的一个大写英文字母
[0-9]
表示匹配0至9之间的一个数字
[\u4e00-\u9fa5]
表示匹配中文字符
当然,也可以进行组合,比如说:
[A-Za-z0-9]
表示匹配任意大小写字母和单个数字
2.5 匹配重复次数
如果想设置一个精确匹配的次数,就可以用 {}
(英文的大括号对)表示。比如,如果搜索 c.{3}t
,那么就只能搜出 caaat
、 cbbbt
、 chhht
等等,只有c和t中间有三个字符的,才会被匹配出来。再比如,如果搜索 c.{3,5}t
,那么就只能搜出 caaat
、 caaaat
、 caaaaat
等等,只有c和t中间有3-5个字符的,才会被匹配出来。
2.6 总结和练习
理论得结合实践,光看不行可以练一下~我经常会用memoQ的正则过滤器测试,不过网上也有很多可以测试正则的网址,比如,你可以戳这里(https://tool.oschina.net/regex),自己造点文本练习一下,你也可以用以下文本拿去测试。(答案都给出了,白嫖的机会就练一练咯~)
日期 | 匹配规则 |
---|---|
2018-06-25 | \d+-\d+-\d+ |
06/25/2018 | \d+/\d+/\d+ |
2018年06月25 | \d+年\d+月\d+日 |
2018年06月25日 | \d+年\d+月\d+日 |
总之,这一节希望帮你引入一个提高翻译和项目管理效率的理念:
下次想查找替换的时候,或者想要处理什么文本的时候,先想想正则表达式 。
如果不会用,“百度一下”也是OK的啦~比如,百度一下“中文 正则”,也是可以的呀~(反正我也老这么干)
但是一定要先想着用才行~
三、如何写一个正则表达式
那具体应该怎么写出这样的正则呢?其实就三步:
一分析归类,二正则匹配,三测试匹配。
3.1 分析归类
分析归类指的是:分析一下你将要匹配的内容,然后将这些字符进行归类,比如你可把他们归类为数字、英文字母、汉字、一个字符等等。
3.2 正则匹配
正则匹配很容易理解,归类结束之后写出每一类的表达式,把这些拼起来就是一个完整表达啦。
3.3 测试匹配
测试匹配就更容易理解啦~写出来的表达式对不对呢?一定要测试一下。当然,测试的网站随便找一个可以匹配正则的都可以啦~在本文中,我用的是memoq的正则表达式小助手。
3.4 以日期的各种书写形式为例进行实际案例演示
我们可以用几个日期的表达来实际演示一下。
注意:在下列提供的案例,我们假设原文中每个格子代表一个字符~
25.06.2018
分析归类:
正则匹配:
当然,你也可以把
\d
换成[0-9]
,是一样的。
测试匹配
再来一个:
25. 06. 2018
分析归类:
正则匹配:
同样,你也可以把
\d
换成[0-9]
。
测试匹配
那,如果是以下内容,又该如何匹配呢?
25.06.2018
25. 6.2018
2. 6. 2018
25.6. 2018
25.6. 18
我们还是按照三步走~
分析归类
正则匹配
同样,你也可以把
\d
换成[0-9]
。
测试匹配
那么,在上一篇文章的结尾,曾经出了一道题,让大家练习匹配以下日期,同时也给出了几种匹配方式。
日期 | 匹配规则一 | 匹配规则二 |
---|---|---|
2018-06-25 | \d{4}-\d{2}-\d{2} | [0-9]+-[0-9]+-[0-9]+ |
06/25/2018 | \d+/\d+/\d+ | [0-9]+/[0-9]+/[0-9]+ |
2018年06月25 | \d+年\d+月\d+日 | [0-9]+年[0-9]+月[0-9]+日 |
2018年06月25日 | \d+年\d+月\d+日 |
我们也可以按照三步骤试试看,就拿第一个举例子好了,剩下的交给大家~
2018-06-25
分析归类
4个数字
+-
+2个数字
+-
+2个数字
或者可以可以理解为:
多个数字
+-
+多个数字
+-
+多个数字
正则匹配
\d{4}
-
\d{2}
-
\d{2}
如果是第二种理解,那就是
\d+
-
\d+
-
\d+
测试正则
怎么样,是不是很简单~
3.5 总结
再次回顾一下写正则的三个步骤:
分析归类
正则匹配
测试匹配
四、用正则在CAT中查找和替换
但是作为职业译员,对于正则表达式若只是停留在“了解”层面,就无异于纸上谈兵,最终我们还是要在实际翻译中应用起来,才能真正发挥正则在提高翻译和项目管理效率方面的作用。
所以,今天我们就来看看,在实际翻译环节,如何利用正则进行搜索和替换,从而提高翻译和项目管理的效率。
4.1 在编辑器页面进行高级筛选
我们知道,在翻译时,我想搜索什么,就直接在搜索框中进行搜索。
关于如何在memoQ中进行筛选,详见:如何在memoQ中快速筛选原文或译文句段。
⚠️需要注意的是,如果要利用正则进行高级筛选,首先要打开使用regex
按钮。
方法:点击右侧的小齿轮,也就是
设置
> 勾选使用regex
按钮,然后会在搜索框中显示出Rx
字样。
在搜索框中输入要使用的正则,进行搜索即可。
举几个例子🌰
4.1.1 查找“原文句段中,有多个连续数字
”
操作:在搜索框中输入\d+
> 按下回车
4.1.2 查找原文句段中,开头结尾包含多个连续数字
温馨提示:第二次搜索前,别忘了先把前面搜索的点击❎号,清除一下哦~
(视频3)
操作:在搜索框中输入^\d+$
> 按下回车
4.1.3 查找“原文句段中有行内标签
”
操作:在搜索框中输入\itag
> 按下回车
4.1.4 查找“原文和译文中都包含3个及以上连续大写字母
”
操作:在搜索框中输入[A-Z]{3,}
> 按下回车
4.2 用正则表达式进行高级查找和替换
查找和替换我们放在一起说哈~
如果你只用查找,那就只查找就好了,可以不进行替换~
利用正则,可以查找错误的表达,替换为正确的表达。
⚠️需要注意的是,如果要利用正则进行高级查找和替换,首先切换到正则模式。
方法:点击快速访问
> 查找
/替换
> 点击点击以在纯文本和正则之间进行切换
按钮,同样会在查找框中显示出 Rx
字样。
更多关于如何在memoQ中进行查找,详见如何在memoQ中实现快速查找;
更多关于如何在memoQ中进行查找,详见如何在memoQ中实现快速替换。
举几个例子🌰
4.2.1 修改译文日期表达
将译文25.06.2018
(日.月.年)修改为2018-06-25
(年-月-日)
查找:
(\d+)\.(\d+)\.(\d+)
替换:
$3-$2-$1
当然,我们还可以切换到高级查找和替换
功能之后,再使用正则,是一样的。
将译文2018-06-26
(年-月-日)修改为2018年06月25日
(中文的日期表达)
查找:
(\d{4})-(\d{1,2})-(\d{1,2})
替换:
$1年$2月$1日
4.2.2 修改数字和缩写单位之间的空格
将译文中25mm/25cm/25m
修改为25 mm/25 cm/25 m
按照常见风格手册规定,数字和缩写单位之间不允许有空格。秒(s)、角度、温度及百分号除外。
查找:
(\d+)\s*(mm|cm|m)
替换:
$1 $2
将译文中25 %
修改为25%
解释同上。
查找:
(\d+)\s+%
替换:
$1%
当然,不同行业、不同公司对于质量管理的模型是不同的,可以根据风格指南的译文质量要求,在翻译时利用正则进行查找和替换,从而提高翻译的质量和效率。
但,所有的工具都能很好地支持正则嘛?我前段时间和我闺蜜聊天的时候发现,并不是的。要看工具的正则支持能力。
五、用正则进行译前文件处理(PM篇)
我们还可以用正则可以进行源文件准备,比如,原文中含有html样式的xliff文档进行译前准备。
我在跟译员和PM们沟通的时候,发现一个困扰大家许久的问题,就是源文档分析和导入,尤其是那些有问题的源文档。
可能你会说,源文档嘛,拿过来翻译就好了,这有什么难的呢?还真不是。
不信我们来看一个案例。
这是一份*.xliff
格式的文档,源语言是英语,目标语言是德语。但是你看,这个文档的每个开标签<target xml:lang="de"/>
后都缺失了关闭标签</target>
,标签对并不成立。
如果你还不知道什么是标签对,先来学习 认识XML文档(二)XML的元素、标签、文本、属性和实体。
当然,这不是最主要的问题,最主要的问题是,原文中含有有HTML
样式,确实不建议导入翻译。
不信我们看,如果将这个文本直接导入到CAT工具中,效果是不尽如人意的。
需要说明的是:在这里我没有做任何设置,直接将文档进行导入。导入后有几个明显的问题:
虽然原文中即使缺失了标签对,但是不影响导入;
原文中的HTML样式导入不理想,比如
<p>
、<ul>
、</p>
、</span>
等等;一个句段太长,或者断句不理想,影响翻译时候的视图。
那,怎么解决呢?其实很简单:
进行译前文件准备,将原文件标签对补充完整
将完善后的文本作为原文,再次导入至CAT中
5.1 译前处理原文
原文中是缺失了标签对的,
那么,我们可以借助正则,把一个标签<target xml:lang="de"/>
补充为完整的标签对<target xml:lang="de"/></target>
。
现在的原文:
<source xml:lang="en">TMGMT Demo</source>开标签前其实有四个空格,但是手机不好显示,我就先删了。
写正则的时候我是按照原文有四个空格写的。
<target xml:lang="de"/>
理想的原文:
<source xml:lang="en">TMGMT Demo</source><target xml:lang="de"/>TMGMT Demo</target>
要实现理想的原文也很简单。根据第三章讲过的写正则的方法:分析归类,正则匹配,测试匹配。
第一步:分析归类
查找:
开头多个空格开头
+<source xml:lang="en">
+任意内容
+</source>
+换行符
+多个空格
+<target\sxml:lang="de"/>
替换:
开头多个空格开头
+<source xml:lang="en">
+任意内容
+</source>
+换行符
+多个空格
+<target\sxml:lang="de"/>
+和开头一样的空格
+<target xml:lang="de">
+同前面的任意内容
+</target>
第二步:正则匹配
匹配出来后,应该查找:
替换为:
第三步:正则匹配
大家可以用任意的文本编辑器即可。在这里我用的是sublime,当然,大家也可以用notepad++都可以的~
同时,在查找替换的时候一定要记得开用正则进行查找/替换!!!
补充完整标签对后的原文:
5.2 导入至CAT工具检查
我们将修改后的文档另存,直接导入至CAT工具,导入后效果是不变的。因为xliff文档默认有自己的断句规则,也不能搭配html样式。
因此,我们要换一种方式,也就在XML过滤器
基础上加一层HTML过滤器
,组成层叠过滤器
。
如果用这个过滤器导入之后,再来对比一下结果。
这样的话我们是不是就把标签和断句两个问题都解决啦~
方法总比困难多~
六、用正则进行文本解析
文本解析也是我们拿到原文之后遇到的比较头疼的问题。正则表达式不仅可以应用于文件准备,还可以在文档导入至CAT工具的时候,帮我们解析原文本。
只导入原文中需要翻译的内容
排除原文中不需要翻译的内容
6.1 仅需要导入引号内的内容
这份文档原文是*.txt
格式。通过下方的文档你也能看出,需要翻译的其实只有引号内的内容。
ID124:edit.menu="Insert symbol...",
ID125:edit.menu.formatting="Apply formatting",
如果全都导入到CAT工具中,我们看看效果~
我们发现,如果不对文本进行解析,那导入之后就会有一些问题:
很明显,工作量增加了。比如第一句,我实际上只有
Open file in new window
需要翻译,但是凭空多了前面很多字符;质量也有可能出现问题。甭说别的,复制粘贴也容易出错啊!少一个冒号、多一个空格都是会影响程序后期的测试上线。
要是碰上个不懂的译员,好嘛连代码也一并给翻译了,那可就坏事儿了~后期光调整代码就挺费时间的~~
为什么会这样呢?
任何一款CAT工具,在进行文本解析的时候,都是基于默认的文件后缀名,也就是文档的默认格式,进行文本解析的。
不同的文件后缀名有不同的默认过滤器。
如果你理解不了过滤器,我举一个例子。
我们知道,*.docx
的word文档,底层其实是由很多代码组成的,但是如果你用office或者wps打开,只能看到这些文字,看不到这些代码,原因就是工具帮你过滤/解析掉了~
在CAT工具里,这些默认的工具就是各种过滤器~
如果你不懂什么是CAT,不懂什么是过滤器或者解析器,建议先读一下我写的关于CAT的基本知识(以memoQ为例)~
比如:
我们最常见的
*.docx
文档,导入时候默认用的是Microsoft Word过滤器
;*.xlsx
文档,导入时默认用的是Microsoft Excel过滤器
;*.txt
文档,导入时默认用的是纯文本过滤器
;*.xml
文档,导入时默认用的是xml过滤器
。
当然,还有各种各样类型的文档,默认情况下都是用默认的过滤器~
至于每个过滤器在memoQ中可以怎么使用,可以找到对应的帮助文档去查一下,在这里我先不详细展开哈哈哈哈哈~
怎么解决呢?
通过正则表达式文本进行文本解析,把要翻译的引号内的内容解析出来,让译员只翻译该翻的就好了~
memoQ中用的是正则表达式文本过滤器
在这里我们用memoQ来演示操作:
6.1.1. 分析原文,定义正则
分类:ID123
:
file.menu
="
Open file in new window
",
其中,
ID123
是上下文;file.menu
是注释;Open file in new window
是需要翻译的内容;
写正则:(ID\d+)
:
(.+)?
="
(.+)?
",
其中,
第一个括号内
ID\d+
是上下文;第二个括号内
.+
是注释;第三个括号内
.+
是需要翻译的内容;
6.1.2. 测试过滤器
我们先按照上文的正则内容,设置过滤器。
设置完成后一定要预览一下效果~
6.1.3. 导入至CAT工具中进行翻译
过滤器没有问题之后,我们可以用这个过滤器将文档导入~
操作:选择性导入
> 选择文档
> 更改过滤器和配置
> 正则表达式文本过滤器
> 选择过滤器
> 确定
。
解析过后我们再来看一下效果~
同时还可以看到上下文和注释~
6.2 其他案例
我们再来看其它几个案例。
6.2.1 案例二
原文来自通信领域,原文是*.txt
格式,只需要翻译引号内的内容。
button.confirm: "Ok",
button.cancel: "Cancel",
button.create.new: "Create new",
button.edit: "Edit",
button.save: "Save",
modal.bulkActionWarning.title: "Warning",
这次我们换一个更简单的方法来设置正则~
导入前正则:
"
导入后正则:
"
需要导入的内容规则:
.+
过滤器设置如下:
我们对比一下:
6.2.2 案例三
原文是*.txt
格式,只需要翻译特殊符号后面(如##)的内容。
$$ID 1
&&Number
##More text to translate
$$ID 2
我们用案例二提到的正则文本过滤器导入这个文档试试~
6.2.3 案例四
原文是*.txt
格式,只需要翻译等号后面的内容。
TITLE=Choose Setup Language
DESCRIPTION=Select the language for this installation from the choices below.
OK=OK
Cancel=Cancel
1100=Setup Initialization Error
1101=InstallShield Wizard
1102=Checking Operating System Version
1103=Checking Windows(R) Installer Version
1104=Configuring Windows Installer
1105=Setup has completed configuring the Windows Installer on your system. The system needs to be restarted in order to continue with the installation. Please click Restart to reboot the system.
我们还是用正则文本过滤器导入这个文档试试~
6.3 小语
正则可以帮助我们解析很多无法搞定的特殊文本,比如不规则的*.md
、word
、PO文档
等等。
规则的文档还是用默认的过滤器即可~
下次再有复杂搞不定的文本,可以尝试这个方法啦~
七、用正则将文本标记为标签
资深的职业译员或者是项目经理一看标题就明白,这一章,我要讲如何定义标签。
但是可能还是有些新人朋友,还是不太理解什么意思。这里有两个词:正则、标签。
正则是什么呢?请参考我之前写的第一章:认识正则表达式。
标签又是什么呢?标签,英文名字是Tag,又是什么意思呢?技术百科里有一个定义:
A tag is a piece of information that describes the data or content that it is assigned to. Tags are nonhierarchical keywords used for Internet bookmarks, digital images, videos, files and so on. A tag doesn't carry any information or semantics itself.(摘自技术百科:https://www.techopedia.com/definition/5240/tag-metadata)
通过定义我们不难发现,
标签是信息,用来描述数据和内容。——这说明,如果丢了这个标签,就一定会丢掉某些信息。这在本地化的时候是绝对不允许的。
丢了标签研发会生气的,因为人家辛辛苦苦写好的代码,你给人家搞丢了。测试跑不通了😭,产品上不了线了😡,研发要挨骂了💢~
更多关于标签的介绍,详见认识XML文档(二)XML的元素、标签、文本、属性和实体。
既然不能丢,我应该怎么办呢?
——当然是保留这些标签了。
可是问题来了:万一翻译看不懂这些标签,就给翻译了。这可怎么办?
所以,为了防止译员在看不懂的情况下,也不要乱来,项目经理就可以用正则表达式提前把这些不能动的“信息”内容(一般是代码、结构化标签等)标记起来,让译员不要动。
在memoQ中,需要用到正则表达式标注器。
这个操作是怎么样呢?我们来看两个示例。
7.1 多语言excel文档
这是一份游戏领域的常见文本,源文档是excel表格,其中C列是需要翻译的中文原文。但是我们发现,原文中有[color=f0abfe]
、[/color]
等代码块,不需要且不能翻译,翻译完成后要保留代码块。
这个文本的内容节选自九月份新出的一款游戏《哈利波特:魔法觉醒》中的剧情片段。
游戏文本的样式基本都是这样的,每一列的内容不重要,除了C列,其他都是我编的我编的我编的~只是为了给大家演示~
如果直接把这个文本导入到memoQ中,译员说丢就丢了~
就算没有丢,如果译员不懂,说不定就给改了~
所以,为了防止译员数据丢失,我们需要将原文中的代码,比如[color=#f0abfe]
、[/color]
和{Propstring}
。
(如果你还是听不懂,不要着急,往下看标记后的内容,我想应该会有些帮助吧~)
在这里,我们借助正则表达式标注器,添加一个正则:
(\[|{)\/*.+?(\}|])
当然,为了防止我以后还会用这个表达式,我可以保存到我的正则库里面,或者我保存为一个新的正则表达式标注器的过滤器供下次试用。
那么设置完成后,这类文本就会变为标签啦~
7.2 PO文档
这是一份本地化项目的常见文本,源文档是PO格式,我们看其中几句话。
#: spyder/app/mainwindow.py:503msgid "An error occurred while creating a socket needed by Spyder. Please, try to run as an Administrator from cmd.exe the following command and then restart your computer: <br><br><span style='color: #555555'><b>netsh winsock reset</b></span><br>"
msgstr ""
这份文本如果直接导入后,同样,译员在处理的过程中会遇到一些问题。比如这里的<br>
、<span>
、</span>
和</br>
等。
因此,我们需要同样的方法,利用正则表达式标注器定义一条符合这几个内容的正则。
你可以试一下:\<.+?>
。
这时候,如果译员丢了标签或被修改了内容,在确认句段的时候就会有警告提醒~
Opps~你的标签缺失啦~
如果是这样,如果通过正则表达式把这些代码块给标注起来,PM就再也不同担心代码被乱动啦~
当然我们在处理项目的过程中,会遇到各种各样的文本,比如XML、Json、String、txt、Markdown等等,它们都有可能含有标签和实体,但是我们可以有这个解决问题的方法,那就是通过正则表达式将这类文本标记为标签,可以从一定程度上降低这类质量问题发生可能性不是?
重点‼️
定义的前提是要先识别出这类文本,如果你都识别这类文本,那~是另一回事了~
7.3 游戏文本中常用的正则
原文示例
举两个原文本示例:
是否消耗{0}个道具?
{PropString}已售罄
你如何处理{0}
和{PropString}
这样的文本呢?
当然,还有可能这样的原文本:
<color=yellow>使用后获得10金币</color>
这里的`<color=yellow>
和</color>
又应该如何处理呢?
我们把上述几个例子放在原文本中看,游戏中常见的文本一般是这样的多语言Excel:
A列是id列;
B列是中文原文列;
C列是英文译文列;
D列有译文的字符限制。
当然,不同的项目可能会有细微的区别,但是基本都是不同的列代表不同含义。
首先你要明确:字符串是不能翻译的,不能动的!
那么,怎么保证这些字符串不能被译员误翻译呢?
解决方案
我们先来看,如果你不做任何处理,可能会出现的风险,如图2。
我们发现:
译员确实"不小心"修改了标签。
译员也确实丢失了标签
这可不行,这在游戏本地化过程中是不可以的!
你可能会说,“哎呀,让译员不要修改就好了嘛”
——但是,资深的PM知道,口头的规定往往是靠不住的~
或者你可能会说,“哎呀我的译员都是高级译员,不会犯这样的低级错误。”
——那太好了,恭喜你找到了一个好译员!但是如果你的译员是新人呢?
那应该怎么办呢?
嗯!跟我一块玩的小伙伴一定会说:”用正则设置为标签“就好了。
没错!是要设置为标签。可是:
怎么将这些字符串设置为标签呢?
正则应该如何写呢?
游戏文本中有哪些常用的正则呢?
所以,这一节就跟大家分享一些游戏文本中常见的字符串,当然,有些也同样适用于APP本地化。
在本文中,我们需要用到memoQ自带的正则标注器。
7.3.1 {0} 等被大括号包裹的字符串
第一个最常见的其实就是被大括号包裹的字符串,这样的字符串比如前面提到的:{0}
、{1}
、{PropString}
。
推荐正则:{[^/]*?}
我们可以用正则表达器输入规则,可以在结果中看到设置后的效果,如图所示:
当然,如果你不确定,也可以先用memoQ的正则小助手测试一下嘛。
设置完成后,这一条就搞定啦~
7.3.2 <color=yellow>和</color>等被尖括号包裹的字符串
被尖括号包裹的字符串在游戏类文本也很常见,比如<color=yellow>
、</color>
、</font>
、</string>
等。
推荐正则:<\*[^/]*?>
其实这里有一条注意事项:
<color=yellow>
是开标签,而</color>
是关闭标签,这是一组标签对。所以更加精确的正则应该是把这两条分开,标签类型选择一个是打开,一个是关闭。但是在这个案例中,我们把两个字符串都当做空标签处理了。
我们可以用正则表达器输入规则,可以在结果中看到设置后的效果,如图所示:
设置完成后,这一条就搞定啦~
7.3.3 [text]等被中括号包裹的字符串
推荐正则:\[[^/]*?]
我们依然可以用正则表达器输入规则,可以在结果中看到设置后的效果,如图所示:
设置完成后,又搞定一条啦~
7.3.4 单个或多个\n
推荐正则:(\\n)+
设置完成后,如图所示。
7.3.5 单个或多个$var
推荐正则:(\$var)+
设置完成后,如图所示。
7.3.6 %s字符串型格式符
推荐正则:(%s)+
设置完成后,如图所示。
7.3.7 @符号
当然,有时也会有一些其他的特殊符号,比如@。那你可以试试:@+
设置完成后,如图所示:
你可以把所有的正则保存为一个正则库,这样下次就可以使用啦~如图所示~
这样的话下次在导入原文本的时候,你就可以在第一层过滤器的基础上加一层正则标注器啦。
注意:memoQ为用户提供了一个常见的tags and entities的正则过滤器,这样即使不会写正则,你也可以直接使用哦~
是不是有一种要打我的感觉“怎么不早说!”嘻嘻~
这样你导入进来就可以直接是设置为标签的译文啦~
八、用正则检查译文质量
在进行翻译项目管理的时候,我们经常关注的两个比较重要的点:翻译质量、翻译效率。
通过前面几章的讲解,我们看到,在进行查找替换和文件准备时,利用正则,可以提高翻译项目管理效率。那翻译质量呢,正则会有帮助吗?有什么帮助呢?
今天我们就来看看,正则是如何帮助检查译文质量的。
8.1 为什么需要检查译文质量?
在进行翻译项目管理时,项目经理通常会提前列一个check list,在CAT中,这个工具叫QA checker。
这些QA可能包含术语一致性、原文和译文的长度比例限制、上下文的一致性、目标语言的数字和大小写以及格式规范等。比如下图所见的错误:
通过QA checker,CAT工具本身可以在译员翻译的过程中自动提示质量错误。
其实这就是项目经理制定的译文质量标准,每一条标准都可能有对应的代码,如果有问题工具可以按照这个标准把错误和问题标记出来,这样译员就知道“哦,原来这句话我犯了这个错误。我需要按照提示纠正,这样我的译文才符合规范。”
更多关于翻译过程中QA的检查,详见如何在译中实时进行QA检查。
可是有的时候,我们的质量标准可能不止这么简单。比如:
数字和缩写单位之间的空格是否准确使用
不同语言之间的习惯语序差异
等等
针对这些问题,我们就可以通过正则表达式,检查出无法进行设置的质量错误。我们一起来看几个案例。
8.2 用正则检查译文质量
8.2.1 数字和缩写单位之间的空格是否准确使用
数字和缩写单位之间的空格要取决于目标语言的规范;如
案例一:25cm、25 cm, 25°cm
按常见风格手册规定,在汉译英时,数字和缩写单位之间要有一个空格。秒(s)、角度、温度及百分号除外。
但是有时候原文可能不规范,比如25cm、25 cm, 25°cm,即使如此,我们也要规范译文的表达:数字+行空格+度量衡单位。我们就可以试用以下正则:
原文中查找:
(\d+)\s*cm
译文中检查:
$1 cm
若没有按照标准表述,我们就会得到一个来自QA的警告提示。
只有按照准确的译文修改完成后,错误的警告提示才会消失。
当然,如果担心其他度量衡出现,可以你能想到的度量衡一起考虑进来。正则只需要用|
把各个度量衡隔开就好了。(你可以自己尝试一下~)
案例二:25% or 25 %
在法语中,百分号必须以不间断的空格隔开。
原文中查找:
(\d+)%
译文中检查:
$1 %
同样,若没有按照标准表述,就会有警告提示。
8.2.2 不同语言之间的习惯表达差异
语言的表达习惯要根据目标语言的标准随之发生变化。
案例三:长*宽*高
在表达尺寸的时候,中文习惯了“长*宽*高”的顺序,可如果翻译为美国英语,需要处理为“Height x Width x Depth”。
原文中查找:
长\*宽\*高
错误译文:
\(H x W x D\)
若没有按照标准翻译,就会有警告提示。
按照准确的译文修改完成后,警告提示即可消失。
案例四:25% or %25
在土耳其语和其他突厥语中,百分号位于数字前,而不是其后,中间没有空格。所以,为了这一标准规范,我们就需要进行检查:
原文中查找:
(\d+)%
译文中检查:
%$1
若没有按照标准翻译,就会有警告提示。
按照准确的译文修改完成后,警告提示即可消失。
案例五:~ or -
英文不使用顿号、书名号、波浪线、6个点的省略号等符号,所以在翻译的时候要特别注意。例如,如果检查波浪线是否在英文译文中存在,就可以使用以下正则
原文中查找:
(.+?)~(.+?)
译文中检查:
$1-$2
若没有按照标准翻译,就会有警告提示。
按照准确的译文修改完成后,警告提示即可消失。
案例六:日期的译文
不同目标语言可能有不同的日期表达。我们依然可以借助正则检查日期是否符合规范。如:
原文:2021/11/29
译文:11/29/2021
则可以使用:
原文中查找:
(\d+)\/(\d+)\/(\d+)
译文中检查:
$2\/$3\/$1
若希望的翻译为:
原文:11/29/2021
译文:2021年11月29日
则可以使用:
原文中查找:
(\d+)\/(\d+)\/(\d+)
译文中检查:
$3年$1月$2日
当然,还有其它日期表达方式,你可以根据自己需求进行检查和调整。
8.3 设置正则警告条件
当然,在利用正则表达式进行检查的时候,我们还可以根据需求正则的警告条件,比如:
原文译文中均有禁用的正则表达式匹配
译文中有缺失的正则表达式匹配
译文中有禁用的正则表达式匹配
正则表达式计数不同
译文中正则表达式替换缺失
等等
借助正则,我们就可以很“轻松”地解决那些自带QA检查不出来的问题啦~
当然如果你是新人,不太熟悉正则,可能也没那么轻松~
不过,总是要先试试嘛不是?
九、memoQ的正则表达式助手
其实可能很多人都已经知道了正则的好处,也知道能带来很大的帮助,但是一个很严重的问题:“不会写啊!”——整个白费。
说实话,一个搞翻译的,不会写复杂的正则也正常,也不用瞧不起什么的,但是有时候把叭~
我确实是需要这个东西~可是我确实是不想花太多时间在上面~肿么搞呢?
我个人是不支持这个观点的哦!我反正是建议好好学习!别偷懒~
行,我是真没想到啊,这个懒,memoQ 9.8版本之后真帮着偷了~
memoQ9.8版本以后,增加了一个正则表达式小助手的功能,对PM和职业译员来说简直就是一款“神器”!
为啥说它是一款神器呢?带你们看看~
更多关于 memoQ 9.8 及正则表达式小助手的功能介绍,详见memoQ 9.9新功能惊喜绽放。
9.1 正则表达式库
其实正则最困难的应该是”写正则“吧?——为了让大家写正则更简单,这个正则表达式小助手首先提供了一个正则表达式资源库,里面有一些常见的正则表达式,这样你就可以直接用了。
9.2 添加和编辑自己的正则库
写好了正则之后,保存到自己的正则表达式库里,这样下次就可以直接用啦~
在添加和编辑的时候,你还能添加名称、关键词、注释等信息;
9.3 测试正则是否可用
其实有时候我们写了一些正则,可能不知道写的对不对,所以就可以利用正则库测试一下~
在
查找什么
的框里输入正则在
测试场
的框里输入你要测试的原文本(当然你也可以直接把原文\译文直接插入在测试场,这个更快~)在
测试场
中,符合条件的内容就会高亮啦~
举例:
查找什么:
\d
测试场:
ID 1
高亮的内容:
1
9.4 应用正则
好不容易写好了一个正则,怎么应用呢?
之前需要通过复制粘贴
的方式,把正则粘贴到需要使用的位置。
但是借助小助手,可以直接把正则插入在对应的地方~
比如在这里,我可以直接插入在筛选的原文框~(是不是比复制粘贴要快?)
9.5 共享正则库
正则库还能共享呢!
只要把你需要共享的库导出,就可以共享给别人啦~
同理,只需要把别人的库导入,就可以自用啦~
9.6 怎么调用出正则表达式小助手呢?
这么神奇的小助手在哪里可以调用呢?任何一个可以使用正则的地方都可以用正则表达式小助手。
你只要开启了使用正则之后,就能看到这个Rx
的标志,点击它,就调出正则小助手啦~
比如:筛选、查找替换、QA检查、正则过滤器等等~
当然,小助手还支持一些智能搜索,在这里我先不做过多介绍啦~自己摸索去吧~
联系我:
你可以点击阅读原文,下载pdf版本,方便学习。
更多使用中的问题,您可以通过我的邮箱✉️ mayjiang@datalsp.com联系我。
扫码关注职业译员玩转翻译技术,解锁更多memoQ应用:
祝工作愉快!