gpt4 book ai didi

c# - 如何使用 IStringLocalizer 从 ASP.NET Core Controller 获取本地化字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 22:48:54 25 4
gpt4 key购买 nike

这里有点困惑,ASP.Net Core 2.0 中本地化的 super 简单的 hello-world 示例。我的关于 页面设置为呈现两个本地化字符串:

  1. 从 View (使用 IViewLocalizer )
  2. 来自代码(通过 Controller 使用 IStringLocalizer<HomeController>)

controller 中的代码拒绝正确获取 loc 字符串。这并不复杂,我错过了什么明显的事情?

About.cshtml

@using Microsoft.AspNetCore.Mvc.Localization

@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "About";
}
<h2>@ViewData["Title"]</h2>
<h3>@ViewData["Message"]</h3>

<p>@Localizer["Use this area to provide additional information."]</p>

^ 注意这两个字符串:“Message”将使用 IStringLocalizer 从代码中本地化。 (参见下面的 HomeController),@Localizer 将使用 IViewLocalizer类。

HomeController.cs

public class HomeController : Controller
{
private readonly IStringLocalizer _localizer;

public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}

public IActionResult Index()
{
return View();
}

public IActionResult About()
{
ViewData["Message"] = _localizer["Your application description page."];

return View();
}
}

Startup.cs(相关部分)

    public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");

services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();

services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr-CH"),
};

options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);

if (env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

资源:

Views.Home.About.fr-CH.resx

^ 里面有两个值:

  • “使用此区域提供更多信息。” = "使用这个地区……fr-CH 的成功!”
  • “您的应用程序描述页面。” =“您的应用描述...fr-CH 的成功!”

我的结果:

localhost:56073/主页/关于

^ 这会按照 en-US 中的预期呈现字符串(默认找不到任何内容,使用实际硬编码的字符串)

localhost:56073/Home/About?culture=fr-CH

^ 这仅呈现第二个字符串:“使用此区域... fr-CH 成功!”,这清楚地意味着所有连接的代码都在工作并按预期找到 fr-CH.resx。

但是,第一个字符串(在代码中设置为 ViewData["Message"] )没有获得 fr-CH 版本!就像 IStringLocalizer<HomeController> 未能意识到指定了一个语言,或者未能找到明确可用的 fr-CH.resx。

为什么???

此外,我也尝试使用 ShareResource 示例(参见下面的链接),并将工厂作为 IStringLocalizerFactory factory 传递给 HomeController ctor。 , 也没有爱,仍然没有得到 fr-CH 资源。叹息。

其他注意事项:

以此作为我的主要引用: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization

使用 VS 2017,最新更新,带有 ASP.Net Core 2.0

最佳答案

问题是 ASP .NET Core 使用 IStringLocalizer 为本地化创建了错误的 RESX 命名空间。如果你在代码中有

services.AddLocalization(options => options.ResourcesPath = "Resources");

然后注入(inject)服务 IStringLocalizer 的实例在命名空间中有两次“Resources”,命名空间看起来是“Resources.Resources”。这就是找不到RESX的根本原因。

关于c# - 如何使用 IStringLocalizer 从 ASP.NET Core Controller 获取本地化字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48528878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com