如何本地化 XSLT






4.88/5 (7投票s)
XSLT 中的文本可以通过从 XML 文档读取翻译后的字符串来进行本地化。数字也可以进行本地化。
引言
XSLT 中的文本可以通过从 XML 文档读取翻译后的字符串来进行本地化。数字也可以进行本地化。
XML 文档可以包含一种语言,并为每种语言使用一个 XML 文档,或者,也可以包含一个包含所有语言的单个 XML 文档。本示例中的 XML 格式遵循 Microsoft .NET 资源 (.resx) 文件(每个语言一个文件),或者包含所有语言的单个 TMX(翻译记忆交换)文档。但是,可以使用任何格式,只要用于读取文本的 XPath 保持一致即可。
使用代码
两种选项都使用 XPath document
函数来读取包含翻译后字符串的 XML。为 XSLT 中使用的每个字符串定义参数。使用参数而不是变量允许在转换 XSLT 时覆盖这些值。使用 xsl:value-of
来显示翻译后的文本。在处理转换时,传递语言代码,例如“fr”,以及所需语言的资源 XML 文档的 URL。
在 .NET 中,XSLT 参数使用 XsltArgumentList
类传递。
System.Xml.Xsl.XsltArgumentList args = new System.Xml.Xsl.XsltArgumentList();
args.AddParam("lang", "", "fr");
args.AddParam("localeUrl", "", "Resources.fr.resx");
但首先,考虑一个要处理的示例数据 XML 和一个国际化之前的示例 XSLT。
示例 XML 数据文档
<?xml version="1.0"?>
<root>
<Number>34567.89</Number>
</root>
未进行国际化的示例 XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" omit-xml-declaration="yes"/>
<xsl:template match="/root">
The number is: <xsl:value-of select="Number"/>
</xsl:template>
</xsl:stylesheet>
示例结果
数字是:34567.89。
请注意,结果中的数字未进行格式化。
XSLT 的本地化
选项 1:为每种语言创建一个 XML 文件
在 XSLT 中,定义一个参数以接受用于所选语言的资源 XML 文档的 URL。
为 RESX 格式本地化的 XSLT,每个语言一个 RESX 文件
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" omit-xml-declaration="yes"/>
<xsl:param name="lang" select="'en'"/>
<xsl:param name="localeUrl" select="'Resources.resx'"/>
<xsl:variable name="localeXml" select="document($localeUrl)/*" />
<xsl:param name="NumberFormat"
select="$localeXml/data[@name='NumberFormat']/value/text()"/>
<xsl:param name="NumberCaption"
select="$localeXml/data[@name='NumberCaption']/value/text()"/>
<xsl:decimal-format name="en"
grouping-separator="," decimal-separator="." />
<xsl:decimal-format name="es"
grouping-separator="." decimal-separator="," />
<xsl:decimal-format name="fr"
grouping-separator=" " decimal-separator="," />
<xsl:template match="/root">
<xsl:value-of select="$NumberCaption"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="format-number(Number, $NumberFormat, $lang)"/>
</xsl:template>
</xsl:stylesheet>
英语、西班牙语 (es) 和法语 (fr) 的资源文件
Resources.resx
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema ...
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<data name="NumberFormat" xml:space="preserve">
<value>#,###.00</value>
</data>
<data name="NumberCaption" xml:space="preserve">
<value>The number is:</value>
</data>
</root>
结果
数字是:34,567.89。
请注意,数字使用“,”作为千位分隔符进行格式化。
Resources.es.resx
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema ...
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<data name="NumberFormat" xml:space="preserve">
<value>#.###,00</value>
</data>
<data name="NumberCaption" xml:space="preserve">
<value>El número es:</value>
</data>
</root>
结果
El número es: 34.567,89
Resources.fr.resx
<?xml version="1.0" encoding="utf-8" ?>
<root>
<xsd:schema ...
</xsd:schema>
<resheader name="ResMimeType">
<value>text/microsoft-resx</value>
</resheader>
<data name="NumberFormat" xml:space="preserve">
<value># ###,00</value>
</data>
<data name="NumberCaption" xml:space="preserve">
<value>Le nombre est:</value>
</data>
</root>
结果
Le nombre est: 34 567,89
选项 2:创建一个包含所有语言的单个 XML 文件
为 TMX 格式本地化的 XSLT,一个 XML 文件包含所有语言
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="utf-8" omit-xml-declaration="yes"/>
<xsl:param name="lang" select="'en'"/>
<xsl:variable name="tmx" select="document('tmx.xml')/tmx/body"/>
<xsl:param name="NumberFormat"
select="$tmx/tu[@tuid='NumberFormat']/tuv[lang($lang)]/seg"/>
<xsl:param name="NumberCaption"
select="$tmx/tu[@tuid='NumberCaption']/tuv[lang($lang)]/seg"/>
<xsl:decimal-format name="en" grouping-separator="," decimal-separator="." />
<xsl:decimal-format name="es" grouping-separator="." decimal-separator="," />
<xsl:decimal-format name="fr" grouping-separator=" " decimal-separator="," />
<xsl:template match="/root">
<xsl:value-of select="$NumberCaption"/>
<xsl:value-of select="' '"/>
<xsl:value-of select="format-number(Number, $NumberFormat, $lang)"/>
</xsl:template>
</xsl:stylesheet>
翻译后的 XML 文档
tmx.xml
<?xml version="1.0"?>
<tmx>
<body>
<tu tuid="NumberFormat">
<tuv xml:lang="en"><seg>#,###.00</seg></tuv>
<tuv xml:lang="es"><seg>#.###,00</seg></tuv>
<tuv xml:lang="fr"><seg># ###,00</seg></tuv>
</tu>
<tu tuid="NumberCaption">
<tuv xml:lang="en"><seg>The number is:</seg></tuv>
<tuv xml:lang="es"><seg>El número es:</seg></tuv>
<tuv xml:lang="fr"><seg>Le nombre est:</seg></tuv>
</tu>
</body>
</tmx>
走向全球!