XML文档本地化指南:从基础到高阶的翻译与处理技巧件
Hi,你好呀,我是May。
最近收到好多后台私信,说想学习 XML 文档。其实之前分篇章写过,但可能是时代太久远了,也不太好找,所以,超可爱又超贴心的我,今天分享 XML 文档翻译和本地化的详细攻略~
如果你想做本地化,不只是翻译哦,建议收藏~
如果有问题,可以留言,我从翻译与本地化项目管理的角度尽可能给答复~
如果你是问我关于程序代码应该怎么写,这个请去找更加专业的工程师hhhhh~
1. 本地化为什么要学 XML 格式
因为大家都是搞翻译的嘛,几乎每天都在和 XML 格式的文档打交道,只不过你可能不知道它是 XML 文档而已。比如(接下来你可能要惊叹了),我们用的 word 的.docx
文档,其实就是基于Office Open XML 标准的压缩文件格式,本质上就是一个 XML 文档。
是不是觉得不可思议,听都没听过?(接下来你可以拿一个docx的文档跟我一起试试:)
我们来看一个案例,这里有一个docx的文档,长这个样子:(我用Office word 打开的)
现在,我们对这个文档做如下操作:
将文档的后缀名由
docx
改为zip
格式,变成一个压缩包;把这个压缩包解压缩,打开解压后的文件夹,然后打开文件夹内的 word 的文件;
然后我们打开这个
document. XML
的文档,这就是原来的docx文档底层 XML 文档。
在这里我用vscode打开的,你也可以用任何一款文本编辑器打开,比如电脑自带的记事本,或者常用的Notepad++,sublime之类的都可以~
如果你电脑没有,建议装一个~(选一个安装就行,不用都装~)
除此之外呢,我们现在用CAT工具嘛,翻译记忆库是.tmx
格式,其实.tmx
格式也是 XML 文档。
包括大家都熟悉的xliff
格式,也是 XML 文档~
所以我们就来看看什么是 XML 文档~
TMX 和 XLIFF 格式 我后面会讲~
2. XML 的定义及其组成
百度百科是这样定义的:
XML(全称 Extensible Markup Language)可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。
我想,如果你是一个本地化新人伙伴,可能这里面没有一个能看懂的词:
- 语言?(纳尼脸)
- 标记语言?(纳尼脸again)、
- 标准通用标记语言(什么鬼?)、
- 可扩展标记语言(更看不懂)。
字我都认识,组在一起,emmm,真的看不懂对不对~
所以我们看看先来看这几个“名词”。
2.1 语言
语言,这里指的是计算机的语言。就像人之间交流用的是人类语言,什么中文、日语、英语等等不同的语言,当然也有手语、肢体语言等等,有了语言人与人之间才能交流~
可是,计算机理解不了人类语言。
所以我们要用计算机的语言,告诉计算机,“我在讲什么。”像小时候计算机课上学的0和1这种二进制数,就是一种机器语言(你可以理解为甲骨文),除此之外,还有HTML、GML、 XML 、C++、VC、VB、Delphi、Java、PHP、Python等等(你可以对标现在的中文、英文、日语等等),这些都是计算机的语言。
通过计算机语言,才能实现人与计算机进行交流和对话。
2.2 标记语言
标记语言,Markup Language,是一种将文本以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的电脑文字编码。(摘自百度百科)
如果看不懂标记的定义的话,我拿人类语言的标记举例子。
小时候一定遇到过这张图片吧:红叉标记——老师给我打的标记,标记我这里好像做错了;
同理,我们也有过:
- 荧光笔标记重点——我自己打的标记,标记这里有重点;
- 甚至用标点符号标记句子的含义,比如句号标记句子结束,问号标记疑问句,等等。
我们再回到标记语言这个话题,上述是人的标记。而这里的标记语言=标记计算机语言。
那,什么是标记计算机语言呢?
你可以理解为,给计算机文本用信息符号做个标记,告诉计算机“哦,这个符号代表啥文本信息,那个标记代表文本的啥结构”。(其实标记就是标签,tag)
在标记语言中,一定要说明:
- 标记的规则是什么,或者标签叫什么名字?
- 要标记的文本内容,也就是给什么做标记?
- 标记的结构是什么,也就是各个标签之间的关系是什么
举个例子,我写了这样一个标记。表示:
- 这是一个什么呢?——
<note>
!哦~这是一个笔记或者备注; - 这个备注给谁的呢?——
<to>Everyone</to>
!哦~给每个人的; - 这个备注是谁发的呢?——
<from>May</from>
!哦~原来是 May 发给大家的; - 这个备注的主题是什么呢呢?——
<heading>Say hello</heading>
!哦~原来是 May 跟大家打招呼的; - 这个备注的正文是什么呢?——
<body>This is May.</body>
!哦~原来是 May 跟大家打招呼,介绍了下自己。
上下结构和内容都很清楚,对不对?
你可能会有这样一个疑问:“那,我想怎么写就怎么写吗?”
比如,我在文本前输入井号加一个空格
,告诉计算机“只要是见到井号+空格,就表示标题。——这样可以吗?
是的,在标记语言中,你想标记什么就标记什么,你想怎么定义结构就怎么定义结构,你想怎么写就怎么写,只要你和你的计算机商量好了就行。
但是这会有一个问题,就是:但凡换一台计算机,都不知道你在说什么。那咋办?
为了解决“让大家都明白”的问题,在1986年国际标准化组织出版发布了一个信息管理方面的国际标准(ISO 8879:1986信息处理),也就是标准通用标记语言。
2.3 标准通用标记语言
标准通用标记语言,Standard Generalized Markup language,中文简称“通标语言”,英文简称SGML,就是计算机的文本结构和描述内容的国际标准语言。字面意思其实就可以理解:标记语言是标准通用的,只要你按照这个标准,甭管是哪台计算机,都遵循一个规范,这样就“听”得懂你说的啥,也就能顺利全球沟通啦~
既然是国际标准规范,那遵循什么规范呢?
一份“通用标言”文档可能有三部分组成:
“通用标言”声明:定义字符集分隔符集和关键字(以下在本文里头简称“声明”)。
文档类型序言:定义一般实体和元素类型
包含一个“!文档类型(外语全称加缩写:!DOCTYPE)声明”与各种“标记声明”,它们一起组成了一个文档类型定义(外语首字母缩略词:DTD)
实例:包含一个顶级元素和实例的内容
如果你想了解更多,建议自己去查一下~
不同的文档有不同的文档样式,比如我们的HTML文档有HTML文档的国标样式,你要是写HTML文档,遵循这个标准就行。
比如:
在HTML中我们用:
<p>这是一句话</p>
表示:文本
这是一句话
是段落。——这样就给文本赋予了一个段落结构。
如果你还是看不懂,你可以随意打开你的一个页面,查看这个页面的源代码。
对于这样一个文本而言,好处是什么呢?——你可以很清楚地看到这文本的布局。如果把源代码关掉,就可以看到图片、排版对不对?
可是问题呢?——HTML的复用率很低。你的文本格式、图片大小、宽度、固定值啥啥都固定了,当然很难复用了。
那怎么办?——变成可扩展标记语言,也就是 XML 嘛~
2.4 可扩展标记语言( XML )
XML 的全称是 Extensible Markup Language 就是 XML 的全称,我猜是因为发音就是/ex/=X,所以才缩写为 XML ,而不是 EML。我也查了一些资料,没找到什么答案,你们要是感兴趣可以自己研究研究~分享给我呀~
如果我们了解了标记语言,那“可扩展”应该比较容易理解,就是:你可以由一个 XML 扩展到新的语言,比如: WAP 和 WML 语言。
你只需要记住 XML 的几个特征:
既然 XML 也是一种语言,所以 XML 也是一种基于文本的结构化格式;
既然 XML 也是标记语言,那么你当然可以自定义标签名,或者我们叫“元素名”。比如,我们可以自定义标签名为
<seg>
,<source>
等。既然标签名是自定义的,那么在用CAT工具翻译的时候就需要明确标签的名称;
当然,有的名称来源于 XML 文件本身,但是有些来源于用于创建 XML 文件的定义文件,如 DTD(document type definition文档类型定义)文件, XSD( XML SCHEMA Definition)文件(定义 XML 文档的合法构建模块)。
XML 是用来传输和存储数据的,不是用来显示数据的,所以 XML 文档不包含格式或者布局信息,没有HTML布局明确;
既然 XML 不包含格式或者布局信息,那译员如果要预览布局怎么办呢?就需要借助XSLT(transformation style sheet) 文档, XML 文档转换为XHTML文档或其他 XML 。
既然 XML 也是SGML,那么 XML 当然要遵循 SGML 的规范。
我们一起来看一个 XML 文档。
第一行有 XML 声明,定义了 XML 当前的版本(1.0)和编码(utf-8);
<? XML version="1.0"? encoding="utf-8">
第二行描述文档的根元素,就像在告诉你,“hey,我是个例子而已嘛~”
当然最后一行是根元素的关闭标签。
<sample>
接下来有描述根元素的子元素
<document> <topic> ... </topic> </documen>
当然,也有描述
<topic>
的子元素
这样,就构成了一个完整的 XML 文档啦~
如果你听不懂上面讲的什么声明语句,也没关系,我们详细看一下这个 XML 的组成。
3. XML 的组成
我们拿上文提到的这个 XML ,给大家举例。
这是怎么组成的呢?
3.1 XML 的声明语句
XML 声明是 XML 文档的第一句,描述了版本号和编码,其格式如下:
<? XML version="1.0" encoding="utf-8"?>
你可以理解为这是 XML 的自我介绍:“Hi,我是一个 XML 文档的1.0版本,是 utf-8 编码格式。”
3.2 XML 的元素、标签和属性
3.2.1 XML 的元素
我们把代码片段中,从最左侧的尖括号到最右侧的尖括号之间的所有内容称为“元素”,英文名是Element,是 XML 文档中很重要的组成部分。
XML 元素包括标签、文本、属性、注释等等,比如:<text>Introduction</text>
,这就是一个元素。
一个 XML 文档可能包含很多的元素。
我们先来看看标签。
3.2.2 XML 的标签
关于标签,你需要了解:
- 标签是什么?标签,或者标记,就是你看到的尖括号括起来的部分,一个标签=一个左尖括号+元素名+一个右尖括号。比如:
<text>
和</text>
,都是标签,标签名是text。标签名一般不翻译。 - 标签有开始标签和结束标签之分,在这个例子中,
<text>
是开始标签,</text>
是结束标签。
具有同一个标签名的“开始标签+结束标签”是一对标签对,比如:<text></text>
是一对。
标签对之间的文本,我们称为元素内容。
3.2.3 XML 的文本
关于文本,你需要了解:
- 文本,或元素内容,一般需要翻译的文本。
比如,在这个例子中:Introduction才是要翻译的文本。
但是有时元素内容也可以不翻译,比如图中的“5-2b”就可以不翻译。
当然,有时候文本之间也有行内标签对的存在,比如图中的
<emphasis></emphasis>
标签对。
有时候因为元素内容为空,比如:
<text></text>
,有时把这样的标签也可写成<text/>
(斜杠在元素名称后面),这样的元素我们称为空标签,或者独立标记。你可能会问,空标签还需要翻译吗?——也要分析,我们往下看。
但是文本并不是你想写啥就写啥,有时候得换个写法才能呈现你想写的内容,也就是得改为实体。
3.2.4 XML 的实体
关于实体,你只需要了解:
XML 规范规定,如果下列字符出现在要显示的文本中(在我们的例子中是要翻译的),它们应该写成实体。
如果你想要 | 你需要改为: |
---|---|
< (小于号) | < |
> (大于号) | > |
&(和) | & |
‘ (英文单引号) | ' |
‘’ (英文双引号) | " |
如果你看不懂,我举个例子。
如果你想要这个文本:
你的 XML 应该怎么写呢?
看见了吗?大于号不是>,而是 >
,单引号不是’,而是 '
。这就是实体。
这告诉我们什么呢?——如果你在 XML 中遇到了实体,是不是要考虑在翻译的过程中把这些实体设置为标签呢?
如何设置标签,参见:正则篇(六):用正则将文本标记为标签
3.2.5 XML 的属性
关于属性,你需要了解:
属性是什么呢?有时我们会给标签加一些详细的描述,这些描述就是属性,你可以理解为标签的注释。
如果是成对标签,属性一般放在开始标签的标签名后面;当然如果是空标签的话,属性会跟在标签名后面。
属性由 属性名 + =(等号)+ 英文单引号/双引号标注属性值组成。
比如这样一个标签:
<button value="Cancel" />
,这个标签的意思是:- 这是一个空标签,标签名是button
- 有一个value的属性,属性值是cancel。
在遇到有属性值的标签时,要分析属性值是否要翻译。
比如,我们看一个属性值需要翻译的标签:
- 标签名是 text
- 有一个 info 属性
- info 属性值是 overview,需要翻译。
以及一个属性值不需要翻译的标签:
- 标签名是 image
- 有一个 src 属性
- src 属性值是 sample.jpg,不需要翻译,保留原文
有时候属性可能代表某些条件,可以应用于标签或行内标签之间的文本。比如下图中,
- 第一行,只有遇到 translate 标签是 yes 的时候,文本才需要翻译;
- 第二行,只有遇到 translate 的属性值是 yes 的时候,另一个 value 的属性值才需要翻译。
3.3 小结
我们回到再来回顾一下,今天讲了什么?
- 什么是标签?什么是标签对?什么是独立标记?如,
<text>...</text>
- 什么是属性?什么是属性值?属性如果表示条件怎么做?如,
value="OK"
- 什么是实体?如,
"
那,作为一名PM或者译员,了解 XML 的注意事项是什么呢?
- 标签名和属性名不能翻译。比如:
<button value="OK" />
中,button 和 value不能动。 - 标签文本和属性值要译前分析:是否需要翻译?是否是条件?是否是注释?等。
- 每一个开始标签一定要有结束标签:
<text>...</text>
- 独立标记格式必须正确:
<image.../>
。 - 实体不能翻译,所以为了防止实体出错,要提前译前处理成标签。
那,这样的 XML 文档如何用 memoQ 解析?
4. 常见的 XML 文档如何翻译?
在翻译一个文档时,最主要的选择和设置准确的过滤器, XML 文档也不例外。
memoQ中有默认的XML 过滤器,基本可以实现你对 XML 文档的需求。
不论是什么 XML 文档,都可以直接导入进memoQ,如果导入后发现导入的内容不对,那么我们再说~
那我们看看翻译 XML 文档有哪些需求,以及memoQ的过滤器如何解决。
4.1 memoQ 自动解析的 XML
正如我前两篇文章讲的,翻译单语言的 XML 文档一般就以下几个需求:
(1)标签名和属性名不能翻译。
——OK,memoQ的 XML 过滤器帮我们自动识别标签名和属性名。
这样我只需要翻译标签之间的文本,可以忽略标签名,就保证了标签名和属性名称不会被译员随意翻译和修改。
(2)标签文本和属性值要译前分析,比如是否可译?是否是条件?是否是注释?等。
——好办!我可以在这个 XML 过滤器中设置可译文本和条件,定义哪些标签对之间的文本要翻译?或者不翻译?哪些属性值要翻译或者不翻译?哪些属性值是注释?哪些属性值是条件?等等。
这样我在翻译的时候,非译的内容就不会影响到我,而且我就可以实时看到各种条件和属性了~
当然,以上提到的具体细节,我拿几个案例文档来演示。
我已经在memoQ中创建了一个项目,语种是英文翻译至简体中文。
以下所有的 XML 文档都在这一个项目中导入。
4.2 翻译常见的 XML
常规的 XML 一般只需要翻译标签对之间的文本。
我可以直接导入.导入后,
- 标签名会被自动过滤,
- 我只需要翻译我要翻译的文本就好了,
- 不需要考虑 XML 标签的问题。
4.3 翻译有行内标签和非译标签的 XML 文档
还有一些文本,标签对之间是有行内标签的,
我可以把标签设置为行内标签。
如果标签对之间的文本不需要翻译,
我也可以设置为非译。
4.4 翻译有属性值的 XML 文档
前面讲个,XML XML 文档中也是有属性值的。
如果属性值需要翻译,我也可以把需要翻译的属性值设置为要翻译,或者非译。
4.5 翻译属性值为条件的 XML 文档
有些属性值当中是包含条件的。比如下图中,我们希望:只有 translate 属性值是 yes 的时候,文本/另一个属性值才翻译。
我就可以设置翻译/非译条件。
4.6 小结
回顾这一节的内容,我讲了:
- 如何翻译常规的 XML 文档
- 如何翻译有行内标签和非译标签的 XML 文档
- 如何翻译有属性值的 XML 文档
- 如何翻译属性值包含条件的 XML 文档
当然,我们还有其它的 XML 文档,比如:
- 包含DTD或者XSD的 XML 文档;
- 有xslt的 XML 文档;
- 包含上下文ID的 XML 文档;
- 多语言的 XML 文档等。
我们继续看~
5. 包含 HTML 实体的 XML 文档如何翻译?
我这里有一个文本:
里面有一堆看上去乱七八糟的东西,比如:<
和 >
。——这些乱七八糟的东西其实是实体。
如果你看不懂这个文档,那么我再给你放另一个图:
其实有些同学可能发现了,上述两个图,除了第一张图多了一些乱七八糟的“实体”,其它都是一样的。
是的,这两个文档就是同一个文档,只是写法不同。
为什么写法不同呢?我们先讲实体的概念。
5.1 什么是实体?
XML 规范规定,如果有些字符(详见下列表格)出现在要显示的文本中,它们应该写成实体。
如果你想要 | 你需要改为: |
---|---|
< (小于号) | < |
> (大于号) | > |
&(和) | & |
‘ (英文单引号) | ' |
‘’ (英文双引号) | " |
我们来看个例子。
假设你想实现的文本是:
你的 XML 就应该这么写:
你瞅瞅,在这里:
- 大于号没有写成 >,而是
>
- 单引号也没有直接写为 ‘,而是
'
这就是实体。
XML 的实体是对数据的引用,而不是直接使用该数据。
通过上述表格,我们也发现了,实体的标准写法是:
- 以一个与字符(&)开始,
- 以一个分号(;)结束。
那,遇到包含实体的文本,应该怎么翻译呢?
5.2 如何翻译包含实体的 XML 文档
我们回到这个文档:
如果把这个文档直接导入memoQ进行翻译,默认情况下,memoQ默认的 XML 过滤器就可以自动识别这样的文本。
所以,如果这个文本直接导入memoQ,会是这样的:
是的,我们发现了:
- memoQ自动把
<
转为了<
, - 把
>
转为了>
。
这时候我们也发现,咦,memoQ自动转换为HTML的样式了:
<br>
不就是一个换行标签嘛!<b>
不就是一个加粗样式嘛!
所以你可以理解为:这个文本是在 XML 基础上包含了HTML样式。
那就简单了,我们可以用层叠过滤器决。
关于层叠过滤器,你可以查看帮助文档:https://docs.memoq.com/current/en/Places/create-new-filter-cascading.html?Highlight=cascading%20filter
我们以后也会再讲,慢慢涨姿势~
- 既然是 XML 文档,所以我们第一层过滤器还用XML 过滤器;
- 既然包含HTML样式,所以我们叠加一层HTML过滤器。
重新导入后,就OK啦!
该变为标签的也变为标签啦~
这样就不用担心出现字符串误译或者丢失的问题啦~
6. 包含 CDATA 样式的 XML 文档如何翻译?
包含CDATA的 XML 也是应用程序本地化中常遇到的一种文档格式。
我们先来看它长什么样子:
我们发现它是符合 XML 标准的:
- 第一行说明语句:
<? XML version="1.0" standalone="no"?>
- 第二行和最后一行根元素:
<doc>
- 中间有
<para>
是<doc>
的子元素。
但是也有点不一样,就是多了一些<![CDATA[...]]
的东西。
这就是 CDADA 文档。
那么它到底是个什么,又该如何翻译呢?
今天带大家看看~
如果我讲的不对,还请各位来批评啦~~~
6.1 什么是 CDADA?
我们知道,计算机在读取编程文件的时候,是一行一行来读的。
我用前面的 XML 文档为例。
计算机就会先读取第一行:<? XML version...?>
,然后计算机就知道了:“哦,原来是个 XML 文档,要识别为 XML 文档~”。
然后继续往下读<sample>
,“哦,是个示例呀~”。
可是如果遇到走不通的地方,计算机读不懂,就会提示你:“哎呀,出错惹,我读不懂啊”。(这就是我们经常说的报错。)
可是为什么会有报错呢?可能的原因有:
- 你的代码逻辑有问题。或者
- 这是个 XML 文档,你写的不是 XML 样式,所以你跟它说,它确实读不懂。(就像你跟一个不懂汉语的人说汉语,说的明明都是人话,就是无法交流。)
第一个原因我就不说了,自身原因自己找找看咯~
第二个原因,怎么解决呢?
- 改成它能懂得语言;——比如我们前面讲的改为实体,如果
'
读不懂,就改为'
- 既然读不懂,就别难为计算机了,跳过吧。——比如通过 CDATA 就是一种解决方法。
怎么解决呢?我们看看 CDATA 是什么。
CDATA 的全名是character data。
在 XML 文档中,文本均会被计算机读取和解析,但是被 CDATA 包起来的文本除外。
比如某些代码,包含像 <
、 >
、&
等字符,我们可以将其定义为 CDATA,这样计算机就不会读这部分内容,也就会减少出错了。
CDATA 部分由<![CDATA["
开始,由 "]]>
结束:
我们还是以本文开篇的 CDATA 文档为例,这次我们用 Chrome 打开看一下。
我们发现,由 CDATA 包起来的内容是没有读取的哦~
计算机想:“我干脆不读了,就不出错了嘛对不对~”。
是的,的确是这样,可是也不对。
我们其实想要的结果是:
我不管你是什么Java XML HTML 语言,你还是要读的,也还是要翻译的。
(当然了,辛辛苦苦写出来肯定是要用的,既然要用,当然要翻译了。)
这可如何是好呢?遇到 CDATA 该怎么翻译呢?
不要着急,都可以解决~
6.2 如何翻译包含CDATA 的 XML ?
我们先看源文档:
其实不是不能读,是不能用 XML 读了,要用它支持的语言读。
就像我们搞翻译一样,如果遇到原文本(英语)中夹杂了法语,难道你不翻译了?当然不是,不是不翻译了,是不把原文本作为英语翻译,而是要翻法语。
所以:如果要翻译出 CDATA 的部分,必须要知道 CDATA 包起来的部分是什么。
在这个例子中,我们发现,其实被 CDADA 包起来的内容是 HTML 样式,像<p>
、<b>
都是,当然也有实体,像&amul;
、ö
。
所以这就简单了嘛,我们还是用层叠过滤器:
- 既然是 XML 文档,那第一层过滤器还是用 XML 过滤器;
- 既然 CDATA 部分是 HTML 样式,那第二层我们就用 HTML 过滤器。
当当当当~我丢~竟然在最后一行有个漏网之鱼:####NAME####
~
没关系,我继续加过滤器,加一层正则表达式标注器,标记为标签。
搞定!该是段落识别为段落,该是标签识别为标签,该是特殊字符的还原特殊字符~真棒!
记得怎么用正则标注标签吗?不记得看这里回顾:正则篇(六):用正则将文本标记为标签
7. 多语言的 XML 文档
但是除此之外,我们也会遇到多语言的 XML 文档,尤其是游戏本地化和应用程序本地化中。
所以,今天带大家看看,多语言的 XML 文档长什么样子,以及如何翻译。
7.1 认识多语言的 XML
先来看一个多语言的 XML 文档示例,其实和单语言的也差不多,但是又有所不同。
我们来分析一下这个 XML :
声明语句:
<? XML version="1.0" encoding="utf-8"?>
有根元素:
<Config>
有多个子元素,比如
<Menu>
、<Item>
、<lang_DE>
、<lang_EN>
、<lang_FR>
、<lang_JP>
、<lang_ZH>
等。- 在这些元素中用不同的元素名表示需要对应的语种,如:
<lang_DE>
代表德语;<lang_EN>
代表英语;<lang_FR>
代表法语;<lang_JP>
代表日语;<lang_ZH>
代表简体中文;
<Item>
元素还包含两个属性,其中:segorigion
是注释;segID
是上下文。
认识了这个 XML 文档,应该怎么翻译呢?继续往下读。
7.2 翻译多语言的 XML 文档
我们一直在讲,翻译首先要设置对过滤器,翻译多语言的 XML 文档也不例外。
多语言的 XML 文档需要用多语言 XML 过滤器,通过设置XPATH实现。
我们看一下具体操作:
7.2.1 创建多语言的项目
多语言文档肯定项目也要多语言。所以首先要创建多语言项目。
在这个项目中,我的源语言是英文,目标语言是德语、法语、日语、中文(中国大陆)。
需要注意的是:多语言项目要记得为每个语种设置记忆库。
术语库可以是一个多语言的术语库。
7.2.2 设置并使用多语言 XML 过滤器
Step 1:选择性导入 > 选择 XML 文档 > 更改过滤器和配置 > 选择多语言 XML 过滤器 > 点击编辑导入规则。
Step 2:跳转至XML 导入规则窗口,我可以在左侧点击各个元素,预览 XML 全局。
Step 3:(重点!!!)设置 XPath。
多语言的 XML 文档是通过 XPath 来实现的。所以我们要定义每个内容,设置完成一个内容就可以点击“保存至规则集合”。
内容规则说明如下:
- 内容 XPath:指的是哪个元素代表哪个语种。元素名前面用//隔开。在这里输入:
//lang_DE
,选择memoQ语言为德语;//lang_EN
,选择memoQ语言为英语;//lang_FR
,选择memoQ语言为法语;//lang_JP
,选择memoQ语言为日语;//lang_ZH
,选择memoQ语言为简体中文;
内容的上下文(ID)XPath:指的是元素中是否有上下文属性。元素前同样是用//隔开,元素名与属性名之间用/@隔开。在这里,
segID
是上下文,所以输入://Item/@segID
内容 XPath的长度限制:指的是元素中是否有长度限制属性。在这里没有设置。
- 内容的注释 XPath:指的是元素中是否有注释属性。在这里输入:
//Item/@segorigin
点击完“保存至规则集合”,会在左侧预览设置好的内容。
说明如下:
- 蓝色底色为已导入文本;
橘黄色底色为上下文(ID);
绿色底色为注释;
- 褐色(好像是褐色吧)底色为长度。
全部内容设置完成后,预览如下:
Step 4: 点击“确定”,预览设置后的导入规则;
Step 5: 点击“确定” > 确定,完成多语言 XML 文档的导入
7.2.3 翻译并导出译文
首先,打开文档,预览并翻译。在这里,我用的小牛机器翻译进行预翻译。
翻译后导出。我们发现,导出后的译文,每个语种都应该在自己应该在的位置:
<lang_DE>
为德语;<lang_EN>
为英语;<lang_FR>
为法语;<lang_JP>
为日语;<lang_ZH>
为简体中文;
8. 包含 DTD 的 XML 文档
再来复习普通 XML 长什么样子:
在这里,
第一行的
<? XML version="1.0" encoding="utf-8"?>
是声明语句。从第二行开始,
<sample>
就是根元素了,根元素之间还有子元素<document>
- 元素必须要有完整标签对:
<document></document>
或者独立标记要完整标记:<button/>
- 元素可能有属性:value就是button的属性;
- 标签对之间的文本是我要翻译的内容;标签属性值也是我要翻译的内容;
有时候,我们也会收到这样的文件包:文件包里既有 XML 文档,又有一个dtd文档。
如果打开其中一个 XML 文档,是长这样的:
咦,细心的同学会发现:似乎和普通的 XML 不一样哦~
这个文档多了第二行:
<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">
——其实,这是DOCTYPE 声明的内容,用来告诉你:“这是这个文档类型是一个PartPage,引用的是外部的partpage.dtd文档”。
咦,细心的同学更会发现:这个第二行的最后”partpage.dtd”不就是文件包中的后缀名为*.dtd的partpage.dtd文档嘛!
是的!如果你打开这份*.dtd文档(其实这就是一个ASCII的文本文件)——也就是包含 DTD 的 “partpage.dtd” 文件,长这样:
这就是含有 DTD 的 XML 文档!那,DTD 是什么鬼?
8.1 什么是 DTD?
DTD 是英文Document Type Definition的首字母缩写,中文意思为“文档类型定义”。
通过DTD我们可以验证 XML 是“合法”,也就是说:验证你的 XML 文档结构是否拥有正确语法,或者你可以理为是否符合要求。
如果你不想知道这是什么,也可以直接往下划,直接看如何翻译含有DTD的 XML ,找到方法论。
那么问题来了:
- 正确语法是什么?或者说:要求是什么?
8.2 DTD 的构成
首先,在原 XML 中已经声明了:<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">
,你可以理解为自我介绍:
“Hi 我引入partpage文档;”
我们看一下DTD的这个构成:
8.2.1 DTD 的元素
在 DTD 中,元素通过ELEMENT来进行声明。语法如下:
<!ELEMENT 元素名称 (元素内容)>
所以我们看第2行,说明了:
根元素PartPage
元素应该包含哪几个子元素,这里有VendorInfo
、PartInfo
、Description
、Service
等。
所以你会发现,在右侧的正文 XML 中就是按照这几个元素及关系在定义的。
再比如第7行就定义了:父元素<VendorInfo>
应该包含Name
、Contact
两个子元素。
那元素名右上角的星号(*)、加号(+)号等等是什么意思呢?
类似我们前面讲的正则的符号表示,详见:正则篇(一):认识正则表达式:
- 星号(*)表示该元素出现零次或多次。
- 理解了星号,加号就很容易理解了:加号(+)表示该元素至少出现一次,也就是一次或多次。
所以,在上图中,右侧的 XML 文件有VendorInfo
、PartInfo
、Description
、Service
元素,但是没有<GeneralProcs>
或者<Operation>
等元素。
但是我们再看下图,在右侧的 XML 中就有了<GeneralProcs>
元素,但是却没有Service
元素。
8.2.2 DTD 的属性
在 DTD 中,属性通过 ATTLIST 声明来进行声明。语法如下:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
比如这里的第100行:
- Item元素包含了 priority 属性
<priority>
属性类型是CDATA。关于CDATA,参见:翻译包含HTML样式的 XML 文档 (CDATA篇)- 该元素默认值
#IMPLIED
,表示priority 属性不是必需的。所以第53行的Item有priority属性,但是像69行、74行、79行就没有priority属性。
更多属性类型和默认值你可以去网络上搜索啦~
8.2.3 DTD 的实体
前面我们讲过 XML 的实体,详见:翻译包含HTML样式的 XML 文档(实体篇)。
在 DTD 中,实体通过 ENTITY 来进行声明:<!ENTITY 实体名称 "实体的值">
,或者<!ENTITY 实体名称 SYSTEM "URI/URL">
。
因为这个文档中没有,所以我不介绍了,大家需要去网络上自查啦~
如果你已经懂了DTD是什么,特别好~我们继续讲DTD怎么翻译~
当然,emmmm听不懂。没关系,真的没关系,其实定义和构成也不是很重要~
说实话我也看得不是很懂,写 DTD 的时候我也是查各种资料,问我各种搞开发的朋友们~感谢感谢!)
但是我们是搞翻译的嘛!又不是搞编程的!我只要知道文档怎么翻译就好了!不用管你什么标签什么乱七八糟的对不对~(反正我是这样想的~)
我真的努力讲惹,如果我讲不明白,那我真的尽力了~你可以从网上找找其它关于DTD的资料~
所以我们继续看如何翻译包含DTD的 XML 文档~
8.3 包含 DTD 的 XML 文档如何翻译?
在翻译包含DTD的 XML 时,可以有2步:
- 检查翻译包
- 配置及测试过滤器
如果觉得步骤麻烦,也可以直接拖到本文底部,找到操作视频,看视频即可~
8.3.1 翻译包检查
在正式启动翻译之前,我们要检查源文档和翻译包。
你需要检查:
1、发送过来的翻译包是单个文档还是多个文件的翻译包;如果是多个文档的翻译包,哪几个文档需要翻译?
比如这个翻译包:文件包里有4个 XML 文档,以及一个dtd文档。
2、检查需要翻译的 XML 文档,看一下源文 XML 文档是否有外部引用;
比如,下图中就包含了一个”partpage”的dtd引用。
3、如果 XML 中有有外部引用,对比翻译包中的引用文档是否和声明中的引用一致。
在本案例中,根据上两张图,发现翻译包中的引用文档和声明中的引用是一致。
OK,既然收到的翻译包没有明显的错误,那我们导入memoQ进行翻译,试试看。
我们前面一直讲:导入翻译文档,需要设置正确的过滤器。
那么,包含DTD的 XML 文档应该如何配置呢?
8.3.2 为包含DTD的 XML 配置过滤器
当然,在CAT中,过滤器也可以叫解析器。都一样~
配置过滤器有三个步骤:
- 选择正确的过滤器
- 配置过滤器
- 检查过滤器。
8.3.2.1 选择正确的过滤器
既然是 XML 文档,那么我们就用 XML 过滤器即可。
所以在导入时,选择:导入 -> 找到需要翻译的4个 XML 文档 ->选择 XML 过滤器,如下图所示。
8.3.2.2 配置过滤器
默认的过滤器不能满足我们的需要,所以我们可以更改过滤器配置。
操作如下:
1、在文档导入选项 -> 点击“更改过滤器配置” -> 跳转出“文档导入设置”窗口;
2、在“文档导入设置”窗口 -> 点击“DTD/架构文件”的“浏览” -> 选择正确的dtd文档;
3、点击“①标签和属性” -> 配置 XML 过滤器。具体如下:
- 点击 “②填充” -> 自动填充 ③标签 和 ④标签属性
- 在 ⑤标签设置” -> 设置哪些标签需要翻译、哪些标签属于行内标签
- 在 ⑥属性设置” -> 设置哪些标签属性需要翻译、哪些标签属于非译元素或上下文等条件
- 可以参考 ⑦实例 为每一个 ③标签 和 ④标签属性单独设置不同条件
- 还可以在 ⑧预览区预览实际文件内容
- 你还可以点击 ⑨保存过滤器,保存并 ⑩重命名一个新的过滤器,供下次使用。
更多关于 XML 翻译的解析器设置,请参考:如何翻译单语 XML 文档?
4、过滤器配置完成后,点击确定即可导入翻译文档~
8.3.2.3 检查过滤器
按照前面的操作,导入后如下图所示:
但是这样就完事大吉了嘛?NONONO!
为了保障译文的格式准确性,我们要测试,看一下译文是否可以按照目标语言顺利导出~
比如在这里,我借助小牛机器翻译,利用MT进行了预翻译。
更多关于MT预翻译的内容,参考:机器翻译在CAT中的应用
并把MT的译文导出检查一下~如果导出后的译文如图所示,可以顺利显示,就说明是OK的:
果然没问题,那我们就可以正式启动翻译啦~
更多关于memoQ翻译的操作,详见:memoQ单机版入门指南。
给大家一个思考题:如果导出的译文是乱码,如下图所示,请问怎么解决呀~
这其实是在进行应用程序本地化中的另一个常见问题:编码问题。回头分享~
9. 包含 XSD 的 XML 文档
有时还会遇到一个 DTD 的替代者,XML Schema Definition(XSD),也是定义 XML 文档的合法构建模块,非常类似 XSD,也是应用程序本地化中常见的文档。
所以,我们来简单了解一下XML Schema Definition(XSD)。
9.1 XSD的定义?
XML Schema 的作用是定义 XML 文档的合法构建模块。
其实真的定义跟 DTD 也差不多~
通过XSD我们可以验证 XML 是“合法”,同理,我们通过xsd也是为了验证 XML 是否“合法”。
在这里我用一个翻译包给大家看一下:
文件包里既有 XML 文档,又有一个 *.xsd 文档。如图所示。
其实如果你在自己电脑中检索xsd的话,也会找到很多xsd文档,只不过你可能不知道而已。
比如我在我电脑里用 Everything 进行检索,就找到很多XSD文档,如图所示。
OK,这是题外话,我们回到接收到的翻译包。如果打开这两个文档,如图所示。
我们发现:
XML 中的元素名就是右侧XSD文档中定义好的,比如:
- XML 第2行的根元素
<Root>
,是右侧XSD文档第3行的name属性值; - XML 第3行的元素
<Customers>
,是右侧XSD文档第6行的name属性值; - XML 第4行的元素
<Customer>
,是右侧XSD文档第9行的name属性值。
- XML 第2行的根元素
左侧 XML 的结构是按照右侧XSD定义的,比如:
- 在右侧XSD文档中,第一个根元素
<xs:element>
属性值Root,就是左侧的 XML 的根元素<Root>
; - 在右侧XSD文档中,第二行子元素
<xs:element>
属性值Customers,就是左侧的 XML 的<Root>
的子元素<Customers>
。 - 同理,
<Customer>
也是<Customers>
的子元素。
- 在右侧XSD文档中,第一个根元素
- 左侧 XML 元素的数量是按照右侧XSD定义的,比如:
- 在右侧XSD文档中,第九行就说明了 XML 第4行的元素
<Customer>
,是可以出现0次-无数次的。
- 在右侧XSD文档中,第九行就说明了 XML 第4行的元素
当然还有很多其它的发现~
对 XML Schema来说,它可以:
- 定义文档中的元素名,元素的属性值
- 定义元素和属性的数据类型
- 定义各个元素的关系,哪个元素是子元素,哪些元素是兄弟元素
- 定义子元素的次序
- 定义子元素的数目等
所以说 XML Schema 比 XSD 更强大,而且据说很快会在大部分网络应用程序中取代 XSD。
9.2 XSD 的构成
如上图所示,首先,XSD也是 XML 文档,所以结构是符合 XML 的文档结构:
第一行的
<? XML version="1.0" encoding="utf-8" ?>
是声明语句。从第二行开始,
<xs:schema>
就是根元素<schema>
元素。<schema>
元素可包含属性。一个 schema 声明往往看上去类似这样:<xs:schema XML ns:xs="http://www.w3.org/2001/ XML Schema">
根元素之间还有子元素
<xs:element>
、<xs:complexType>
等。
我们看一下XSD的这个构成。
当然,我的原则还是:只认识这个文档,看看它有没有明显的错误,能进行译前分析就好了~
所以,写程序,不是我的初衷,更不是我的目的~
9.2.1 XSD 的元素
在 XSD 中,元素依然是通过element来进行定义。语法如下:
<xs:element name="xxx" type="yyy"/>
其中:
- name的属性值 xxx,指元素名
- type的属性值 yyy,指元素的数据类型
所以,如图所示,
- 在右侧xsd中(绿色方框)就定义了左侧 XML 的元素(红色方框)有:
<CompanyName>
<ContactName>
<ContactTitle>
等; - 其中,
- 如蓝色椭圆所示,元素
<Customers>
是根元素<Root>
的子元素; - 如灰黑色椭圆所示,元素
<Customer>
是元素<Customers>
的子元素;
- 如蓝色椭圆所示,元素
更多关于XSD的元素和数据类型,你可以去网络上查找~
比如复合元素(complexType)是什么,在这个案例中,其实
<Root>
、<Customers>
就是复合元素。
9.2.2 XSD 的属性
在 XSD 中,属性通过 attribute 来进行声明。语法如下:
<xs:attribute name="xxx" type="yyy"/>
如图所示,在右侧XSD中就声明了:
元素<ShipInfo>
的属性是ShippedDate
,其属性值(左侧 XML 文档的第65行)应该是日期时间数据类型,也就是在右侧第72行看到的dateTime
。
更多属性介绍你可以去网络上搜索啦~
9.2.3 关于 XSD 的其它
当然,其它内容xsd的介绍,大家感兴趣的话可以自行去网络上查找,比如:
通过sequence
元素来表示子元素出现的顺序,每个子元素可出现 0 到任意次数。
通过key
元素来指定属性或元素值(或一组值)必须是指定范围内的键。
当然还有其它的,我也不是程序猿,我也不会写,我只能看懂,所以我不班门弄斧了,大家需要去网络上自查啦~
如果你已经懂了XSD是什么,特别好~我们继续讲XSD怎么翻译~
当然,听不懂也没关系,真的没关系,其实定义和构成也不是很重要~
但是我们是搞翻译的嘛!又不是搞编程的!
我只要知道文档怎么翻译,保证本地化的质量就好了!
所以,我们继续讲XSD怎么翻译~。
9.3 翻译 XSD 的文档
在翻译包含XSD的 XML 时,也是有2步:
- 检查翻译包
- 配置及测试过滤器
9.3.1 翻译包检查
在正式启动翻译之前,我们要检查源文档和翻译包。
你需要检查:
1、发送过来的翻译包是单个文档还是多个文件的翻译包;如果是多个文档的翻译包,哪几个文档需要翻译?
比如这个翻译包:文件包里有1个 XML 文档,以及一个*.xsd文档。
明确一点:xsd是架构文件,不需要翻译,需要翻译的是其 XML 文档哦!
2、检查需要翻译的 XML 文档,看一下源文 XML 文档和xsd是否一致;
在这个案例中,我们发现:
- 左侧 XML 中的元素名和属性值和右侧XSD文档的定义是一致的,比如: XML 第2行的根元素
<Root>
,是右侧XSD文档第3行的name属性值; - 左侧 XML 的结构是按照右侧XSD定义的,比如:在右侧XSD文档中,第一个根元素
<xs:element>
属性值Root,就是左侧的 XML 的根元素<Root>
。
OK,既然收到的翻译包没有明显的错误,那我们就可以利用memoQ进行翻译了~
我们前面一直讲:导入翻译文档,需要设置正确的过滤器。
那么,包含XSD的 XML 文档应该如何配置呢?
9.3.2 为包含XSD的 XML 配置过滤器
和配置DTD完全一致!!!
我们在前面讲过,翻译包含DTD的 XML 文档,配置过滤器有三个步骤:
- 选择正确的过滤器
- 配置过滤器
- 检查过滤器。
翻译包含架构文件的 XML 操作也是一模一样!
9.3.2.1 选择正确的过滤器
既然是 XML 文档,那么我们就用 XML 过滤器即可。
所以在导入时,选择:导入 -> 找到需要翻译的 XML 文档 ->选择 XML 过滤器,如图所示。
9.3.2.2 配置过滤器
默认的过滤器不能满足我们的需要,所以我们可以更改过滤器配置。
操作如下:
1、在文档导入选项 -> 点击“更改过滤器配置” -> 跳转出“文档导入设置”窗口;
2、在“文档导入设置”窗口 -> 点击“DTD/架构文件”的“浏览” -> 选择正确的XSD文档;
3、点击“①标签和属性” -> “②填充”
4、自动弹出Namespace URL -> 点击确定
5、配置如图的 ③标签 和 ④标签属性
- 在 ⑤标签设置” -> 设置哪些标签需要翻译、哪些标签属于行内标签
- 在 ⑥属性设置” -> 设置哪些标签属性需要翻译、哪些标签属于非译元素或上下文等条件
- 可以参考 ⑦实例 为每一个 ③标签 和 ④标签属性单独设置不同条件
- 还可以在 ⑧预览区预览实际文件内容
- 你还可以点击 ⑨保存过滤器,保存并 ⑩重命名一个新的过滤器,供下次使用。
更多关于 XML 翻译的解析器设置,请参考:如何翻译单语 XML 文档?
过滤器配置完成后,点击确定即可导入翻译文档~
9.3.2.3 检查过滤器
按照前面的操作,导入后如下图所示:
我们发现:编辑器的界面看上去都是OK的,比如:
- ① 是memoQ的功能区;
- ② 是memoQ的翻译区,我们可以在这里翻译;
- ③ 是memoQ的预览区,我们可以在这里预览原文;
- ④ 是memoQ的翻译结果区,所有的翻译结果(机器翻译、术语库、记忆库、片段提示等)都在这里呈现;
- ⑤ 是文档的统计栏,我可以看项目和文档的统计情况,比如进度、已编辑的句段统计、QA统计、原文译文的长度比例和字符数量等等。
9.3.3 测试译文
但是,过滤器配置完,不代表万事大吉!!
记得我们之前讲过的编码问题吗?如图所示,虽然翻译好了,但是导出后的编码有问题。
所以说,为了保障译文的格式准确性,我们要测试,看一下译文是否可以按照目标语言导出~
比如在这里,我依然借助小牛机器翻译,利用MT进行了预翻译。
更多关于MT预翻译的内容,参考:机器翻译在CAT中的应用
并把MT的译文导出检查一下~如果导出后的译文如图所示,可以顺利显示,就说明是OK的:
果然没问题,那我们就可以正式启动翻译啦~
大家分享:如何在翻译的过程中基于样式表进行 XML 文档的显示预览。
10. 基于样式表预览 XML 文档的发布状态
我们前面讲过,XML 是没有样式的,HTML 有。
CSS 是 HTML 的样式表,通过 CSS 的设置,可以告诉浏览器:“我的网页布局是这样那样显示的~”。包括颜色、字体、文本大小、元素之间的间距、元素的位置和布局、要使用的背景图像或背景颜色、不同设备的不同显示和屏幕大小等等。
那,XML 的样式表怎么配置呢?就是借助 XSLT 生成的~
10.1 使用 XSLT 预览 XML
如果你不想了解 xslt,只想了解如何翻译的话,可以直接跳至下一节。
而 XSLT (eXtensible Stylesheet Language Transformations) 则是 XML 的样式表,它远比 CSS 更加完善。
通过 XSLT 的设置,可以告诉浏览器或者服务器:“我的 XML 文件是这样那样显示的。”
比如,这里我有一个样式表:
我们不讲样式表如何写,我也不是程序员,如果你感兴趣,可以去搜索 XSLT 教程: https://www.w3school.com.cn/xsl/index.asp)。
这是我需要翻译的 XML 文档,在这个 XML 文档中添加了 XSL 样式表引用:
10.2 翻译时,如何预览 XML 文件
如果没设置预览文档的话,导入后的预览仍然是按照 XML 文档格式来的:
memoQ 支持翻译过程中只需要配置 XSLT 样式表,即可预览 XML 文件。
你只需要:在导入文档时,使用”选择性导入“ -> “更改过滤器和配置“ -> 在默认的” XML 过滤器” 下,点击”常规” -> 并”指定 XSLT 文件“。
导入后即可在预览区显示 XML 啦!
好啦,我觉得关于 XML 的文档翻译已经很详细了,希望你上内容可以帮到你,有用可收藏~
更多翻译技术干货,欢迎关注职业译员玩转翻译技术公众号,嘻嘻~
喜欢可以星标哦~
下次见啦,拜~