65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 JavaScript 和 XSLT 进行全球化

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.82/5 (4投票s)

2006 年 10 月 9 日

CPOL

3分钟阅读

viewsIcon

34069

描述如何实现 JavaScript 和 XSLT 代码的全球化。

引言

在本文中,我将解释如何构建一个面向世界的 Web 应用程序,以及如何在考虑全球化目标的情况下使用 JavaScript 和 XSLT。

本文使用 .NET Framework 1.1。

什么是全球化?

全球化是开发一个程序核心的过程,其功能和代码设计不单单基于单一语言或区域设置。相反,它们的设计是为了输入、显示和输出定义的一组 Unicode 支持的语言脚本以及与特定区域设置相关的数据。

.NET 中的全球化

.NET Framework 提供了三个命名空间来帮助您开发面向世界的应用程序:System.Threading, System.GlobalizationSystem.Resources

System.Threading 包含一个非常著名的类,名为 ThreadThread 类有一个属性,名为 CurrentCulture,您可以使用它来获取/设置线程的当前文化。

System.Globalization 命名空间包含定义与文化相关信息的类,包括语言、国家/地区、正在使用的日历、日期、货币和数字的格式模式以及字符串的排序顺序。这些类对于编写全球化(国际化)应用程序很有用。

System.Resources 命名空间提供类和接口,允许开发人员创建、存储和管理在应用程序中使用的各种特定于文化的资源。System.Resources 命名空间最重要的类之一是 ResourceManager 类。

使用资源文件和 ResourceManager 类

资源文件是 XML 文档,其中包含特定文化的全部资源。ResourceManager 类提供对运行时特定于文化的资源的便捷访问。

检索存储在资源文件中的值就像调用 ResourceManagerGetString 方法一样简单。

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 具有以下格式

resource file format

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 中。

一如既往,欢迎提出意见/建议!

谢谢。

© . All rights reserved.