入门XML的时候,您只需要知道:
这一部分我再带来高阶一点的XML文档的知识。先从包含HTML样式的XML文档讲起。
比如,这里有一个文本:
里面有一堆看上去乱七八糟的东西,比如:<
和>
。
这些乱七八糟的东西其实是实体。
如果您看不懂这个文档,我再给您放另一个图:
上述两个图,除了第一张图多了一些乱七八糟的“实体”,其它都是一样的。
是的,这两个文档就是同一个文档,只是写法不同。
为什么写法不同呢?我们先讲实体的概念。
XML规范规定,如果有些字符(详见下列表格)出现在要显示的文本中,它们应该写成实体。
如果您想要 | 您需要改为: |
---|---|
< (小于号) | < |
> (大于号) | > |
&(和) | & |
‘ (英文单引号) | ' |
” (英文双引号) | " |
我们来看个例子。
假设您想实现的文本是:
您的XML应该这么写:
在这里:
>
'
这就是实体。XML的实体是对数据的引用,而不是直接使用该数据。
通过上述表格,我们也发现了,实体的标准写法是:
那,遇到包含实体的文本,应该怎么翻译呢?
我们回到图一的文档:
如果把这个文档直接导入memoQ进行翻译,默认情况下,memoQ默认的XML过滤器就可以自动识别这样的文本。
所以,如果这个文本直接导入memoQ,会是这样的:
是的,我们发现了:
<
转为了<
,>
转为了>
。这时候我们也发现,咦,memoQ自动转换为HTML的样式了:
<br>
不就是一个换行标签嘛!<b>
不就是一个加粗样式嘛!所以您可以理解为:这个文本是在XML基础上包含了HTML样式。
那就简单了,您可以用层叠过滤器解决。
关于层叠过滤器,您可以查看帮助文档:https://docs.memoq.com/current/en/Places/create-new-filter-cascading.html?Highlight=cascading%20filter
我们以后也会再讲,慢慢涨知识
重新导入后,就OK啦!
该变为标签的也变为标签了
这样就不用担心出现字符串误译或者丢失的问题了
在这一部分我会讲另一种XML 中包含 HTML 的文本,也就是包含 CDATA 的文档。
包含CDATA的XML也是应用程序本地化中常遇到的一种文档格式。
我们先来看它长什么样子:
我们发现它是符合 XML 标准的:
<?xml version="1.0" standalone="no"?>
<doc>
<para>
是<doc>
的子元素。但是也有点不一样,就是多了一些<![CDATA[...]]
的东西。
这就是 CDADA 文档。
那么它到底是个什么,又该如何翻译呢?
我们知道,计算机在读取编程文件的时候,是一行一行来读的。
我用前面的 XML 文档为例。
计算机就会先读取第一行:<?xml version...?>
,然后计算机就知道了:“哦,原来是个xml文档,要识别为XML文档~”。
然后继续往下读<sample>
,“哦,是个示例呀~”。
可是如果遇到走不通的地方,计算机读不懂,就会提示您:“哎呀,出错惹,我读不懂啊”。(这就是我们经常说的报错。)
可是为什么会有报错呢?可能的原因有:
如果是代码有问题,您可以自行检查并解决
第二个原因,怎么解决呢?
'
读不懂,就改为'
怎么解决呢?我们先来看看 CDATA 是什么。
CDATA 的全名是character data。
在 XML 文档中,文本均会被计算机读取和解析,但是被 CDATA 包起来的文本除外。
比如某些代码,包含像 <
、 >
、&
等字符,我们可以将其定义为 CDATA,这样计算机就不会读这部分内容,也就会减少出错了。
CDATA 部分由<![CDATA["
开始,由 "]]>
结束:
我们还是以本文开篇的 CDATA 文档为例,这次我们用 Chrome 打开看一下。
我们发现,由 CDATA 包起来的内容是没有读取的
但我们其实想要的结果是:
不管是什么Java XML HTML 语言,都是要读的,也还是要翻译的。
那么遇到 CDATA 该怎么翻译呢?
我们先看源文档:
其实不是不能读,是不能用 XML 读了。要用它支持的语言读。
所以:
如果要翻译出 CDATA 的部分,必须要知道 CDATA 包起来的部分是什么。
在这个例子中,我们发现,其实被 CDADA 包起来的内容是 HTML 样式,像<p>
、<b>
都是,当然也有实体,像&amul;
、ö
。
所以还是用层叠过滤器:
记得怎么用正则标注标签吗?不记得看这里回顾:正则篇(六):用正则将文本标记为标签
有时候,我们也会收到这样的文件包:文件包里既有xml文档,又有一个dtd文档。
如果打开其中一个XML文档,是长这样的:
您会发现:似乎和图1的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是什么?
DTD 是英文Document Type Definition的首字母缩写,中文意思为“文档类型定义”。
通过DTD我们可以验证XML是“合法”,也就是说:验证您的XML文档结构是否拥有正确语法,或者您可以理解为是否符合要求。
如果您不想知道这是什么,也可以直接往下划,直接看如何翻译含有DTD的XML,找到方法论。
那么问题来了:正确语法是什么?或者说:要求是什么?
首先,在原XML中已经声明了:<!DOCTYPE PartPage PUBLIC "-//Interleaf//DTD partpage//EN" "partpage.dtd">
,您可以理解为自我介绍:
“我引入partpage文档;”
我们看一下DTD的这个构成:
在 DTD 中,元素通过ELEMENT来进行声明。语法如下:
<!ELEMENT 元素名称 (元素内容)>
所以我们看第2行,说明了:
根元素PartPage
元素应该包含哪几个子元素,这里有VendorInfo
、PartInfo
、Description
、Service
等。
所以您会发现,在右侧的正文XML中就是按照这几个元素及关系在定义的。
再比如第7行就定义了:父元素<VendorInfo>
应该包含Name
、Contact
两个子元素。
那元素名右上角的星号(*)、加号(+)号等等是什么意思呢?
类似我们前面讲的正则的符号表示,详见:常规XML文档的翻译与本地化:
所以,在上图中,右侧的XML文件有VendorInfo
、PartInfo
、Description
、Service
元素,但是没有<GeneralProcs>
或者<Operation>
等元素。
但是我们在右图,在右侧的XML中就有了<GeneralProcs>
元素,但是却没有Service
元素。
在 DTD 中,属性通过 ATTLIST 声明来进行声明。语法如下:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
比如这里的第100行:
<priority>
属性类型是CDATA。关于CDATA,参见:翻译包含HTML样式的XML文档 (CDATA篇)#IMPLIED
,表示priority 属性不是必需的。所以第53行的Item有priority属性,但是像69行、74行、79行就没有priority属性。前面我们讲过XML的实体,详见:翻译包含HTML样式的XML文档(实体篇)。
在 DTD 中,实体通过 ENTITY 来进行声明:<!ENTITY 实体名称 "实体的值">
,或者<!ENTITY 实体名称 SYSTEM "URI/URL">
。
因为这个文档中没有,所以我不介绍了,大家需要的话去网络上查找
在翻译包含DTD的XML时,可以有2步:
在正式启动翻译之前,您需要检查源文档和翻译包。
您需要检查:
1、发送过来的翻译包是单个文档还是多个文件的翻译包;如果是多个文档的翻译包,哪几个文档需要翻译?
比如这个翻译包:文件包里有4个xml文档,以及一个dtd文档。
2、检查需要翻译的XML文档,看一下源文XML文档是否有外部引用;
比如,下图中就包含了一个”partpage”的dtd引用。
3、如果XML中有有外部引用,对比翻译包中的引用文档是否和声明中的引用一致。
在本案例中,根据上面两张图,发现翻译包中的引用文档和声明中的引用是一致的。
既然收到的翻译包没有明显的错误,那我们导入memoQ进行翻译
我们前面一直讲:导入翻译文档,需要设置正确的过滤器。
那么,包含DTD的XML文档应该如何配置呢?
当然,在CAT中,过滤器也可以叫解析器。都一样~
配置过滤器有三个步骤:
既然是XML文档,那么我们就用XML过滤器即可。
所以在导入时,选择:导入 -> 找到需要翻译的4个XML文档 ->选择 XML 过滤器,如图所示。
默认的过滤器不能满足我们的需要,所以我们可以更改过滤器配置。
操作如下:
1、在文档导入选项 -> 点击“更改过滤器配置” -> 跳转出“文档导入设置”窗口;
2、在“文档导入设置”窗口 -> 点击“DTD/架构文件”的“浏览” -> 选择正确的dtd文档;
3、点击“①标签和属性” -> 配置XML过滤器。具体如下:
更多关于XML翻译的解析器设置,请参考:常规XML文档的翻译与本地化-如何翻译单语XML文档?
4、过滤器配置完成后,点击确定即可导入翻译文档
按照配置过滤器的操作,导入后如图所示:
为了保障译文的格式准确性,我们要测试,看一下译文是否可以按照目标语言顺利导出
比如在这里,您可以借助小牛机器翻译,利用MT进行预翻译。
并把MT的译文导出检查一下~如果导出后的译文如图所示,可以顺利显示,就说明是成功的:
如果没问题,那就可以正式启动翻译了
更多关于memoQ翻译的操作,详见:memoQ入门指南。
XML Schema Definition(XSD),也是定义 XML 文档的合法构建模块,非常类似 XSD,也是应用程序本地化中常见的文档。
所以,我们来简单了解一下XML Schema Definition(XSD)。
在看本文前,请确保您已经:
XML Schema 的作用是定义 XML 文档的合法构建模块。
其实真的定义跟XSD也差不多~
通过XSD我们可以验证XML是“合法”,同理,我们通过xsd也是为了验证XML是否“合法”。
在这里我用一个翻译包给大家看一下:
文件包里既有xml文档,又有一个 *.xsd 文档。
打开这两个文档,如图所示。
我们发现:
<Root>
,是右侧XSD文档第3行的name属性值;<Customers>
,是右侧XSD文档第6行的name属性值;<Customer>
,是右侧XSD文档第9行的name属性值。<xs:element>
属性值Root,就是左侧的XML的根元素<Root>
;<xs:element>
属性值Customers,就是左侧的XML的<Root>
的子元素<Customers>
。<Customer>
也是<Customers>
的子元素。<Customer>
,是可以出现0次-无数次的。对XML Schema来说,它可以:
所以说 XML Schema 比 XSD 更强大,而且据说很快会在大部分网络应用程序中取代 XSD。
如图所示,首先,XSD也是XML文档,所以结构符合XML的文档结构:
<?xml version="1.0" encoding="utf-8" ?>
是声明语句。<xs:schema>
就是根元素<schema>
元素。<schema>
元素可包含属性。一个 schema 声明往往看上去类似这样:<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element>
、<xs:complexType>
等。我们看一下XSD的构成。
在 XSD 中,元素依然是通过element来进行定义。语法如下:
<xs:element name="xxx" type="yyy"/>
其中:
所以,如图所示,
<CompanyName>
<ContactName>
<ContactTitle>
等;<Customers>
是根元素<Root>
的子元素;<Customer>
是元素 <Customers>
的子元素;更多关于XSD的元素和数据类型,您可以去网络上查找~
比如复合元素(complexType)是什么,在这个案例中,其实
<Root>
、<Customers>
就是复合元素。
在 XSD 中,属性通过 attribute 来进行声明。语法如下:
<xs:attribute name="xxx" type="yyy"/>
如图所示,在右侧XSD中就声明了:
元素<ShipInfo>
的属性是ShippedDate
,其属性值(左侧XML文档的第65行)应该是日期时间数据类型,也就是在右侧第72行看到的dateTime
。
当然,其它内容xsd的介绍,若您感兴趣的话可以去网络上查找,比如:
通过sequence
元素来表示子元素出现的顺序,每个子元素可出现 0 到任意次数。
通过key
元素来指定属性或元素值(或一组值)必须是指定范围内的键。
在翻译包含XSD的XML时,也是有2步:
在正式启动翻译之前,您需要检查源文档和翻译包。
您需要检查:
1、发送过来的翻译包是单个文档还是多个文件的翻译包;如果是多个文档的翻译包,哪几个文档需要翻译?
比如这个翻译包:文件包里有1个xml文档,以及一个*.xsd文档。
明确一点:xsd是架构文件,不需要翻译,需要翻译的是其XML文档
2、检查需要翻译的XML文档,看一下源文XML文档和xsd是否一致;
在这个案例中,您会发现:
<Root>
,是右侧XSD文档第3行的name属性值;<xs:element>
属性值Root,就是左侧的XML的根元素<Root>
。如果既然收到的翻译包没有明显的错误,那您就可以利用memoQ进行翻译了
我们前面一直讲:导入翻译文档,需要设置正确的过滤器。
那么,包含XSD的XML文档应该如何配置呢?
和配置DTD完全一致
我们在前面讲过,翻译包含DTD的XML文档,配置过滤器有三个步骤:
翻译包含架构文件的XML操作也是一模一样
既然是XML文档,那么我们就用XML过滤器即可。
所以在导入时,选择:导入 -> 找到需要翻译的XML文档 ->选择 XML 过滤器,如图所示。
默认的过滤器不能满足我们的需要,所以我们可以更改过滤器配置。
操作如下:
1、在文档导入选项 -> 点击“更改过滤器配置” -> 跳转出“文档导入设置”窗口;
2、在“文档导入设置”窗口 -> 点击“DTD/架构文件”的“浏览” -> 选择正确的XSD文档;
3、点击“①标签和属性” -> “②填充”
4、自动弹出Namespace URL -> 点击确定
5、配置如图所示的 ③标签 和 ④标签属性
更多关于XML翻译的解析器设置,请参考:如何翻译单语XML文档?
6、过滤器配置完成后,点击确定即可导入翻译文档~
按照配置过滤器的操作,导入后如下图所示:
我们发现:编辑器的界面看上去都是正常的,比如:
但是,过滤器配置完,不代表万事大吉
记得我们之前讲过的编码问题吗?如图所示,虽然翻译好了,但是导出后的编码有问题。
所以,为了保障译文的格式准确性,我们要测试,看一下译文是否可以按照目标语言顺利导出
比如在这里,我依然借助小牛机器翻译,利用MT进行了预翻译。
并把MT的译文导出检查一下~如果导出后的译文如图所示,可以顺利显示,就说明是OK的:
果然没问题,那我们就可以正式启动翻译啦~
更多关于memoQ翻译的操作,详见:memoQ 入门指南。
© Copyright 2023. 大辞科技 沪ICP备17050550号 沪公网安备 31011402006110号