【问题标题】:Using .resx files in asp.net core在 asp.net 核心中使用 .resx 文件
【发布时间】:2021-04-21 13:31:57
【问题描述】:

我目前正在努力思考如何使网站以多种语言提供,但我真的不知道从哪里开始。 我已经阅读了 microsoft 的文档 -->

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-5.0

我也关注了这个 stackoverflow 线程,目前正在进行第 5 步 -->

How to get the .resx file strings in asp.net core

我目前制作了一个名为“Layout.nl.resx”的 .resx 文件,它应该可以识别 Layout.cshtml 的名称。 我也在我的 startup.cs 中做了这个来本地化路径并配置我将使用的文化信息。

using System.Globalization;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Localization;

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddLocalization(options => options.ResourcesPath = "Resources");
            services.Configure<RequestLocalizationOptions>(options =>
            {
                var supportedCultures = new[]
                {
                new CultureInfo("nl-NL"),
                new CultureInfo("en-US"),
                new CultureInfo("dk-DK"),
                new CultureInfo("de-DE")
                };
                options.DefaultRequestCulture = new RequestCulture("nl-NL", "nl-NL");
                //Formatting Numers, Dates, etc.
                options.SupportedCultures = supportedCultures;
                //UI strings that we have localized
                options.SupportedUICultures = supportedCultures;

            });
            services.AddMvc()
                .AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
            services.AddRazorPages();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, UserManager<JagerUser> userManager, RoleManager<IdentityRole> roleManager)
        {
            var supporterCultures = new[] { "nl-NL", "en-US", "dk-DK", "de-DE" };
            var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supporterCultures[0])
                .AddSupportedCultures(supporterCultures)
                .AddSupportedUICultures(supporterCultures);

            app.UseRequestLocalization(localizationOptions);
            Console.WriteLine("The current Culture Language is: " + CultureInfo.CurrentCulture + "The Thread CultureInfo is: " + Thread.CurrentThread.CurrentCulture);
            
        }

现在我的目标是将 Layout.cshtml 中的 Headers 值从“Products”和“My Orders”更改为 Layout.nl.resx 文件中描述的“Producten”和“Mijn Orders”位于“资源”文件夹中。

HomeController
        [HttpPost]
        public IActionResult SetLanguage(string culture, string returnUrl)
        {
            Response.Cookies.Append(
                CookieRequestCultureProvider.DefaultCookieName,
                CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
                new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) });

            Console.WriteLine("The new CultureInfo is now: " + CultureInfo.CurrentCulture);
            //this will display on the console: The new CultureInfo is now: en-US
            return LocalRedirect(returnUrl);
        }
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options


@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
    var requestCulture = Context.Features.Get<IRequestCultureFeature>();
    var cultureItems = LocOptions.Value.SupportedUICultures
        .Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
        .ToList();

    var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~" : $"~{Context.Request.Path.Value}";
}

<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider.GetType().Name">
    <form id="selectLangue" asp-controller="Home" asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
          method="post" class="form-horizontal" role="form">
        <label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label> 
        <select name="culture" onchange="this.form.submit();" asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="cultureItems">
        </select>
    </form>

</div>

我的问题是:如何从 .resx 文件中访问这些信息,我必须在哪里初始化 IStringLocalizer 并更改 Layout.cshtml 中的值

更新

我添加了一个下拉列表,它现在创建一个 cookie 并将 CultureInfo 设置为可以在上面的代码字段中看到的所选语言。 我当前的问题是访问或能够使用我制作的资源文件。它被称为“Views.Home.Index.nl-NL.resx”。因为它必须与文件夹名称中的视图名称相匹配(我认为)。

【问题讨论】:

  • 从文档看来,在 .NET 核心中,推荐的方法是将本地化包装类注入到您的控制器中。这些示例似乎显示了每个控制器的资源,但是,如果您更喜欢跨控制器的共享资源,则向下滚动到 private readonly IStringLocalizer _sharedLocalizer。然后,您可以在视图代码示例中查看如何访问 @Localizer。 docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • 所以为了访问所有文件,我必须像顶部的数据库一样初始化 IStringLocalizer,然后将该本地化器传递给视图以便能够更改文本?
  • 往下看“本地化中间件”部分。似乎可以将请求配置为从提供程序中提取文化字符串,例如 cookie、查询字符串、http 标头或自定义(我认为这就是您更改文本的意思。例如:localhost:5000/?culture=es-MX)。您可以通过提供者获得文化。在 .net 框架中,通过设置 Thread.CurrentCulture 实现了相同的目的。另请参阅“以编程方式设置区域性”部分。
  • 正确,我想使用 url 栏为我提供文化信息(因为我有 4 个可点击的链接应该更改文化信息)通过单击其中一个链接,标题应该将文本更改为对应的 .lang.resx 文件
  • 是的,这是我的理解。

标签: c# asp.net asp.net-mvc asp.net-core


【解决方案1】:

好的,经过大量阅读和询问后,我找到了有关如何使用资源文件的答案。 我已经完成了大部分设置。 您在services.Configure() 中定义文化类型,使用serivices.AddLocalization() 定义您希望在哪个路径中找到您的资源,并使用services.AddMvc().AddViewLocalization() 指定您的视图格式。

然后在public void Configure() 方法下,您将定义您将要查找的支持的语言类型。又名 Index.en-US.resc。您正在使用 app.UseRequestLocalization() 添加 RequestLocalizationMiddleware,它将根据您的客户提供给您的信息设置文化。

现在.. 重要的部分是了解如何访问您的资源文件是了解如何设置寻路。 在资源文件命名中,他们谈到了路径Resources/View/Home/Index.fr.resc 在您的 Resources 文件夹中,您必须映射一个结构,就像您的普通视图放置在层次结构中一样 Views -> into Home -> into the Index.cshtml 文件。

一旦设置完成,您就可以使您的内容可本地化,这可以在文档的使应用的内容可本地化查看本地化下找到:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-5.0.

【讨论】:

  • 如果这里有任何错误,请指出来,因为我还在学习如何理解全球化和本地化的工作原理。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2018-12-17
  • 1970-01-01
相关资源
最近更新 更多