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 的结构是按照右侧XSD定义的,比如:
在右侧XSD文档中,第一个根元素
<xs:element>
属性值Root,就是左侧的 XML 的根元素<Root>
;在右侧XSD文档中,第二行子元素
<xs:element>
属性值Customers,就是左侧的 XML 的<Root>
的子元素<Customers>
。同理,
<Customer>
也是<Customers>
的子元素。左侧 XML 元素的数量是按照右侧XSD定义的,比如:
在右侧XSD文档中,第九行就说明了 XML 第4行的元素
<Customer>
,是可以出现0次-无数次的。
当然还有很多其它的发现~
对 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 的文档翻译已经很详细了,希望你上内容可以帮到你,有用可收藏~
更多翻译技术干货,欢迎关注职业译员玩转翻译技术公众号,嘻嘻~
喜欢可以星标哦~
下次见啦,拜~