与剃刀网页全球化和本地化

全球化是准备您的网站的过程,以便尽可能广泛地访问它。这通过在访问者的母语中呈现内容来大部分地实现。本文探讨了如何在ASP.NET网页框架内接近此任务。

ASP.NET已经提供了一个本地化框架,它基于文化和资源。网页有文化财产和绒文物。其中的第一个控制文化敏感格式是如何管理日期,货币,数字等。第二个属性适用于.NET资源文件。更多这些在一秒钟内。使用a定义了文化和绒毛价值 MSDN上描述的标准值集。这些值通常由定义语言的两个小写字母组成,以及定义语言环境的两个大写字母。例如,英语被定义为"en"。英国被定义为"GB"。因此,英国英语被定义为"en-GB",虽然美国英语被定义为"en-US"。这些文化代码很重要,因为ASP.NET全球化框架使用它们来定位正确的资源文件。

如果您想根据其语言向用户呈现不同版本的相同内容,您需要一种组织同一内容的多个版本的方式。您可以在.NET世界中执行此操作的方式是通过资源文件,这是结尾的XML文件 .resx.。资源文件包含名称/值,该名称/值表示在网页中使用的字符串。 WebMatrix没有(当前)提供一种方法来生成资源文件,这意味着您有两个选项:下载并使用Visual Web Developer的免费版本(如果您拥有它,则使用Visual Studio),或者 创建文本文件并使用Resgen.exe工具 Windows SDK附带将它们转换为有效 .resx. 文件。在以下示例中,我使用了Visual Studio。您还可以使用数据库作为资源存储而不是资源文件。您将看到此示例中使用的两种方法。

用于说明这里讨论的概念的示例网站是一个简单的概念:

它显示了一些内容,该内容由用户从顶部下拉列表中选择的语言确定。英文版如上所示,这是法语版本:

一旦创建了一个新的空网站,它需要在Visual Web开发人员或Visual Studio中打开,这是通过单击色带栏中的“启动”按钮实现的。右键单击“解决方案资源管理器”中的“项目名称”,然后选择“添加新项”,然后从“对话框中”结果,选择“资源文件”。

我命名为Mine TestResource.Resx,但您可以称之为您喜欢的任何东西。单击“添加”按钮时,系统将提示您将文件保存到名为App_GlobalResources的文件夹。同意此选项,因为app_globalresources是一个特殊的ASP.NET文件夹,预计会容纳资源文件。你会看到这次约定的工作方式很快。资源文件本身几乎不仅仅是复制的名称/值对。 VS / VWD中的资源文件编辑器为您提供了一种简单的方法,可以输入名称/值配对。这是一个屏幕截图,显示了示例网站资源文件:

在里面 名称 列,您可以看到有效的标签。这些实际上是在首次运行时编译资源文件时返回字符串的方法。这些方法返回的字符串是相应的 价值 参赛作品。编译资源文件时,它将成为文件名之后命名的类 - 在这种情况下 testResource..

此刻,您有一个资源文件,它表示网站的默认文化。您需要其他语言的其他资源文件。这些需要仔细命名,因为框架预计将找到有效的文化代码作为文件名的一部分。可以通过复制英语一个来创建法国资源文件,并重命名结果 testresource.fr-fr.resx.。请注意文件名与其扩展之间出现的文化代码FR-FR。文化码中的任何错误都将导致编制对效果的反对意见"命名空间“资源”已包含“testResource”的定义", where testResource. 是资源文件的名称。将命名有效的德语版本的资源文件 testresource.de-de.resx.。留下名称列条目,因为它们并分别用法语和德语版本替换价值条目。所以现在你应该有三个不同的资源文件:

图像中还有其他文件,但它们可以等待一点。接下来,您需要一个数据库。这是一个简单的单表数据库。该表有四列 - 和ID列(INT Identity),一个名为部分的列,它定义了内容的位置,内容本身 - 存储在NText字段中,以及称为文化的列。此列将为每行数据保存文化代码。对于资源文件表示的每个语言,内容本身将为默认页面输入三次。

回到早期图像中的其他文件...这是_layout.cshtml页面:

@使用 资源;
<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title></title>
    </head>
    <body>
        <div>
            <form method="post">
                @testResource..SelectLanguage
                <select name="lang">
                    <option></option>
                    <option value="en-GB." @(文化 == "en-GB." ? "selected=\"selected\"" : "")>English</option>
                    <option value="fr-FR" @(文化 == "fr-FR" ? "selected=\"selected\"" : "")>French</option>
                    <option value="de-DE" @(文化 == "de-DE" ? "selected=\"selected\"" : "")>German</option>
                </select>
                <input type="submit" value="@testResource..Submit" />
            </form>
        </div>
        @RenderBody()
    </body>
</html>

有一个 使用 在文件顶部的语句,它使资源类通过其命名空间(它在编译时自动生成)。生成的命名空间始终是 资源。布局页面包含一个下拉作为语言选择器。这将在使用布局文件的任何其他页面上使用。您可以看到第一个引用其中一个 testResource. 班级的方法 - 选择语言。这返回基于页面文化的相应字符串。这是由使用SELECT LIST的选择驱动。请注意页面的 文化 只需按属性名称引用属性。

文化在_pageStart.cshtml文件中设置:

@{
    Layout = "~/_Layout.cshtml";
    if(!Request["lang"].IsEmpty()){
        Culture = UICulture = Request["lang"];
    }
}

事实上,这里设定了文化财产和绒涵财产。

最后页面是默认页面本身:

@使用 资源;
@{
    var db = Database.Open("Localization");
    var sql = "SELECT Content FROM Content WHERE Section = 'Default' AND Culture = @0";
    var content = db.QueryValue(sql, Culture);
}
<h1>@testResource..Welcome</h1>
<p><img SRC. ="images/@testResource..FlagImage" /></p>
<p>@testResource..Intro</p>
<p>@content</p>
<p>Currency: @(10000.ToString("c"))</p>
<p>Date: @DateTime.Now</p>

这个页面也使得 资源 通过a可用的命名空间 使用 陈述。您可以看到许多示例 testResource. 参考类方法。其中一个示例返回一个文件名,该名称用作其中的一部分 SRC. 属性到图像。其他人返回逐字逐字呈现。数据库查询使用页面的值 文化 属性以获取当前文化的正确版本的文本。最后,两个例子显示了 文化 工作中的财产 - 决定货币和日期格式化显示的方式。

本文探讨了本地化剃刀网页网站的基础知识。您已经看到了两种方法 - 资源文件和数据库。资源文件在应用程序首次运行时编译为DLL。因此,它们最适合变化不经常的内容。由于它们最容易使用专业工具时,它们不适合存储用户提供的值。数据库对用户提供的内容更好,并且可能定期更改。

包含所有代码的示例站点是 可作为github repo提供.