在剃刀页面中使用资源文件

这是一系列涵盖本地化的一系列文章 ASP.NET Core Razor 页面应用程序。在里面 上一篇文章,我看了基本的配置 需要与培养物合作,这些文化是基本建筑块 本土化。我展示了如何指定应用程序的文化 支持,如何为当前请求设置文化,以及一些项目, 如日历是根据当前文化翻译的。本文 在上一篇文章中介绍的应用程序上构建,并探索如何配置和使用资源来存储翻译版本的 static content.

资源是编译的键/值的集合 。资源 文件。那里 are a 创建资源的方法数。最简单的选项是使用Visual Studio Resources Designer生成基于XML的设计器 .resx. 文件,在您选择时调用的文件 资源文件 作为 要添加到项目的项目类型。这是我使用的方法。

添加特定于页面的资源文件

在这项工作中,我将生产资源来容纳翻译的资源 在最后一篇文章中开发的网站中的索引页面,显示 如何 配置剃刀页面应用程序以获取本地化,然后如何工作 with cultures。将翻译的两个项目是欢迎标题和 下面的文字邀请访问者了解更多有关使用ASP.NET开发的更多信息 核心,在这里突出显示:

模板网站

  1. 添加名为的新文件夹 资源 到了 application.

  2. 添加名为的文件夹 页面 到了 资源 folder.

  3. 将资源文件添加到 页面 文件夹并命名它 IndexModel.en.Resx.. This resource will contain the content for the EN. (English) 文化。生成的文件夹结构如下所示:

    添加资源

    该结构很重要,因为它镜像为此 index.chtml.cs. 文件设计的文件 for(忽略root 页面 或者 资源 文件夹)。这 approach adopts the 路径命名约定 确保正确的 找到资源的旨在使用它的类。这 替代公约被称为 点命名.  If you were to 采用DOT命名约定,您将在其中创建资源文件 资源文件夹命名 pages.indexmodel.en.resx..

  4. 添加一个名叫的密钥 到资源文件,并在欢迎下复制并粘贴HTML 从索引页面转向设计人员:

    添加资源

    重要的: 确保资源的访问修改程序设置为公共,如上所述所示。

  5. Add the following using directive to the ViewImports file

    @using Microsoft.Extensions.本土化;
    
  6. 改变代码 index.chtml. 使代码到HTML表 介绍了最后一篇文章 looks like this:

    @page
    @inject IStringLocalizer<IndexModel> localizer
    @inject IHtmlLocalizer<IndexModel> htmlLocalizer
    @model IndexModel
    @{
        ViewData["Title"] = "Home page";
        var requestCultureFeature = HttpContext.Features.Get<IRequestCultureFeature>();
        var requestCulture = requestCultureFeature.RequestCulture;
    }
     
    <div class="text-center">
        <h1 class="display-4">@localizer["Welcome"]</h1>
        <p>@htmlLocalizer["Learn"]</p>
    </div>
    

    Two view localisation services have been injected into the page - IStringLocalizer<T> and IHtmlLocalizer<T>。第一个负责定位和 渲染资源中指定的资源中的字符串 T 范围。第二个服务与HTML相同。他们都在工作 相同的方式 - 它们根据名称的组合找到正确的资源 传入的类型(因此在步骤中的正确配置的重要性 3)和当前要求的文化。然后他们检索 如果可以找到索引器的键,则该项目将找到索引器。如果不 找到匹配,无论是键还是预期的资源文件 呈现传入索引器的字符串。

  7. 就像其余的本地化API一样,默认情况下未注册视图定向程序服务,因此您需要注册然后in ConfigureServices:

    services.AddMvc().AddViewLocalization();
    

    在剃刀页之前,将大部分定位API包含在MVC的一部分中 became a thing. The AddViewLocalization method is an extension method on the IMvcBuilder interface. Hence the need to call AddMvc first.

    如果您在目前运行应用程序,请单词“欢迎”和 “学习”呈现给页面:

    剃刀页面本地化

    此刻,应用程序正在寻找root中的资源文件 文件夹。由于它们不在那里,您需要告诉本地化服务在哪里找到它们。这是如此 ConfigureServices.

  8. Adjust the existing AddLocalization call (在第一篇文章中添加)以包括指定的相关选项 资源Path:

    services.AddLocalization(options => options.资源Path = "Resources");
    

    现在,当您运行应用程序时, 占位符被添加到资源文件中的HTML替换为:

    剃刀页面本地化

    资源文件通过拍摄传递的类型的全名来找到 the T parameter (e.g WebApplication1.Pages.IndexModel) and removing the assembly name (leaving 页面.IndexModel). Then the culture is added to the resource name, so the framework will look in the ResourcePath folder for a resource named either pages.indexmodel.en.resx. (点表示法)或 页面/ indexmodel.en.resx. (路径符号,这是这里使用的)。

  9. 将另一个资源文件添加到资源/页面文件夹,这个命名 IndexModel.fr.Resx.在其中,添加以下两个条目:

    En savoir plus <a href="//docs.microsoft.com/aspnet/core">sur la création d'applications Web avec ASP.NET Core</a>.
    欢迎生物等保
  10. 然后添加一个名为 indexmodel.de.resx.,以下两个条目:

    erfahren嘲笑mehr.<a href="//docs.microsoft.com/aspnet/core">über das Erstellen von Web应用程序MIT ASP.NET核心</a>.
    欢迎威廉伦

    注意:Bing Translator提供的所有翻译,如果他们离开,请为......

现在在运行应用程序时,您可以使用文化切换器(再次, 在第一篇文章中添加了在德语和法语之间切换,以查看正在使用的新资源。 如果您尝试任何未提供资源的语言,请您 将看到呈现的键值。

共同资源

到目前为止已经开发的资源是特定于页面的。他们是 typed to the IndexModel. Technically, there is nothing to stop you injecting an IStringLocalizer<IndexModel> into any page. But there 是注册更多的资源的替代方法 页面 - 无止境的翻译。它是基于使用的 IStringLocalizerFactory interface to create IStringLocalizer 实例。还有一个等效的工厂 creating IHtmlLocalizer instances.

  1. 第一步是创建一个将用于键入本地化器的虚拟类。将新类文件添加到 资源 文件夹命名 CommonResources。这是一个空的课,只不过是占位符:

    public class CommonResources
    {
    }
  2. 将新文件夹添加到名为的项目的根目录 服务。将C#类文件添加到名为的文件夹 commonlocalizationservice.cs. 使用以下代码, 确保您调整命名空间以适合您的应用程序:

    using Localisation.资源;
    using Microsoft.Extensions.本土化;
    using System.Reflection;
     
    namespace Localisation.服务
    {
        public class CommonLocalizationService
        {
            private readonly IStringLocalizer localizer;
            public CommonLocalizationService(IStringLocalizerFactory factory)
            {
                var assemblyName = new AssemblyName(typeof(CommonResources).GetTypeInfo().Assembly.FullName);
                localizer = factory.Create(nameof(CommonResources), assemblyName.Name);
            }
     
            public string Get(string key)
            {
                return localizer[key];
            }
        }
    }
    

    The class takes an IStringLocalizerFactory as an injected dependency and then uses the dummy CommonResources class to create an IStringLocalizer. The service also exposes a public Get 返回与传递密钥匹配的资源值的方法。

  3. Register the CommonLocalizationService with the DI system:

    services.AddSingleton<CommonLocalizationService>();
    
  4. 将资源文件添加到 资源 文件夹命名 commonresources.de.resx.。将以下条目添加到其中:

    本土化Lokalisierung.
    隐私privatsphäre.
  5. 将另一个资源文件添加到 资源 文件夹命名 commonresources.fr.resx. 有以下条目:

    本土化Accueil.
    隐私vieprivée.
  6. 将最终资源文件添加到 资源 文件夹命名 commonresources.en.resx. 只需翻译一个条目 “本地化”进入美国方言:

    本土化本土化
  7. Inject the CommonLocalizerService into the Layout page:

    @inject CommonLocalizationService localizer
    
  8. 更改为布局文件,如下所示:

    <title>@ViewData["Title"] - @localizer.Get("Localisation")</title>
    
    <a class="navbar-brand" asp-area="" asp-page="/Index">@localizer.Get("Localisation")</a>
    
    <ul class="navbar-nav flex-grow-1">
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Index">@localizer.Get("Home")</a>
        </li>
        <li class="nav-item">
            <a class="nav-link text-dark" asp-area="" asp-page="/Privacy">@localizer.Get("Privacy")</a>
        </li>
    </ul>
    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - @localizer.Get("Localisation") - <a asp-area="" asp-page="/Privacy">@localizer.Get("Privacy")</a>
        </div>
    </footer>

    更改应影响站点的标题,导航和页脚。

运行该站点并使用文化切换器在英语,法语和德语之间切换,然后尝试一个或两种语言,没有资源文件。

剃刀页面本地化

如果您选择英语(英国)文化,您应该注意到日历和货币按预期翻译。在没有任何的情况下 EN. -GB. 资源文件,您可能希望标题,导航和页脚中的站点名称倒回传入字符串定位器的键,但实际上,该值从中拉动 EN. 资源文件而不是。这是因为 EN. 是父母 culture for EN. -GB., 父母文化是第一个缺席的回力 区域设置的资源。倒下的级联如下工作,从最特定于最小特定:地区特异性培养(例如 typename.en-gb.resx.) » Parent culture (例如typename.en.resx.) »默认文化(指定 Startup) »字符串传递给localizer键。

剃刀页面本地化

概括

本文查看了如何使用资源文件作为本地化的一部分 剃刀页面应用程序的静态内容。资源是为特定页面开发的,并且在网站周围更普遍使用。 我介绍了资源文件的替代命名约定,以确保 它们被拾取,以及如何配置资源文件的路径。我也 简要介绍了选择和后退过程。

在下一篇文章中,我将研究如何与数据注释属性结合使用资源,以便为表单标签和错误消息提供翻译。