使用 JavaScript 和 XSLT 进行全球化






2.82/5 (4投票s)
描述如何实现 JavaScript 和 XSLT 代码的全球化。
引言
在本文中,我将解释如何构建一个面向世界的 Web 应用程序,以及如何在考虑全球化目标的情况下使用 JavaScript 和 XSLT。
本文使用 .NET Framework 1.1。
什么是全球化?
全球化是开发一个程序核心的过程,其功能和代码设计不单单基于单一语言或区域设置。相反,它们的设计是为了输入、显示和输出定义的一组 Unicode 支持的语言脚本以及与特定区域设置相关的数据。
.NET 中的全球化
.NET Framework 提供了三个命名空间来帮助您开发面向世界的应用程序:System.Threading
, System.Globalization
和 System.Resources
。
System.Threading
包含一个非常著名的类,名为 Thread
。Thread
类有一个属性,名为 CurrentCulture
,您可以使用它来获取/设置线程的当前文化。
System.Globalization
命名空间包含定义与文化相关信息的类,包括语言、国家/地区、正在使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。这些类对于编写全球化(国际化)应用程序很有用。
System.Resources
命名空间提供类和接口,允许开发人员创建、存储和管理在应用程序中使用的各种特定于文化的资源。System.Resources
命名空间最重要的类之一是 ResourceManager
类。
使用资源文件和 ResourceManager 类
资源文件是 XML 文档,其中包含特定文化的全部资源。ResourceManager
类提供对运行时特定于文化的资源的便捷访问。
检索存储在资源文件中的值就像调用 ResourceManager
的 GetString
方法一样简单。
protected System.Web.UI.HtmlControls.HtmlAnchor LinkDetalhes;
protected System.Web.UI.WebControls.Label TituloIndex;
private void Page_Load(object sender, System.EventArgs e)
{
ResourceManager rm = new ResourceManager("sample",
Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
TituloIndex.Text = rm.GetString(TituloIndex.ID, ci);
LinkDetalhes.InnerText = rm.GetString(LinkDetalhes.ID, ci);
}
全球化的 JavaScript
现在,如果我们可以在 JavaScript 代码中调用 GetString
方法,那就太好了。由于我们不能这样做,我们必须以某种方式将资源文件内容注入到 HTML 中,使用隐藏的输入。然后,可以通过调用 document.getElementById
来获取存储在这些隐藏输入中的值。
将资源文件内容注入到 HTML 中
我们要做的第一件事是获取资源文件内容。ResourceManager
有一个名为 GetResourceSet
的方法,该方法获取一个 ResourceSet
,它表示为指定文化本地化的资源。
然后,我们必须找到页面的表单控件并开始创建具有资源 ID 和值的隐藏输入。
protected void AddResourceSetToHtml()
{
HtmlForm theForm = null;
for(int i=0;i!=this.Page.Controls.Count;++i)
{
theForm = Page.Controls[i] as HtmlForm;
if(theForm!=null)
break;
}
if(theForm==null)
return;
ResourceSet rs = rm.GetResourceSet(ci, true, true);
IDictionaryEnumerator de = rs.GetEnumerator();
while(de.MoveNext())
{
HtmlInputHidden ih = new HtmlInputHidden();
string key = de.Key as String;
string val = de.Value as String;
if(key!=null && val!=null)
{
ih.ID = "res"+key;
ih.Value = val;
theForm.Controls.Add(ih);
}
}
rs.Close();
}
由于我的控件 ID 等于存储在资源文件中的资源 ID,因此在创建隐藏输入时,我必须向 ID 添加一些内容。如果我不这样做,结果将是两个具有相同 ID 的控件。如果存储在资源文件中的 ID 与控件的 ID 不同,则不需要这样做。
全球化的 JavaScript 代码将如下所示
<script language="javascript" type="text/javascript">
var btnAlert;
function load()
{
btnAlert = document.getElementById("btnAlert");
btnAlert.value = document.getElementById("resBtnAlertTitulo").value;
}
function btnAlertClick()
{
alert(document.getElementById("resBtnAlertMsg").value);
}
</script>
全球化的 XSLT
为了实现全球化的 XSL 转换,我们遵循与实现全球化的 JavaScript 代码相同的方法。我们必须将资源文件的 XML 注入到 XSLT 的输入 XML 中。
资源文件的 XML 具有以下格式
RSS 标头包含有关资源类型的一些信息。我们感兴趣的元素是 data
元素。data
元素表示资源文件中的一个条目。就像字典中的一个条目一样,您会找到一个对:名称和值。名称是一个属性,值是一个元素。
让我们看一个使用这种方法的 XSLT 示例
<xsl:template match="/">
<table border="1">
<tr>
<th colspan="2">Globalization + XSL</th>
</tr>
<xsl:apply-templates select="root/data"/>
</table>
</xsl:template>
<xsl:template match="data">
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="value"/></td>
</tr>
</xsl:template>
结论
在本文中,我展示了一种实现全球化 JavaScript 和 XSLT 代码的可能方法。实现这一目标的基本思想是将指定文化的资源文件的 XML 注入到 HTML 中,以便 JavaScript 代码可以引用它,或者注入到 XSLT 的输入 XML 中。
一如既往,欢迎提出意见/建议!
谢谢。