如何从ASP.NET Core Controller使用IStringLocalizer获取本地化的字符串?
有点困惑,在ASP.Net Core 2.0中本地化超级简单的hello-world示例。 我的关于页面设置为呈现两个本地化的字符串:
IViewLocalizer
) IStringLocalizer<HomeController>
) 控制器中的代码拒绝适当地获取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>
^请注意两个字符串:“消息”将使用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
^其中有两个值:
我的结果:
本地主机:56073 /首页/
^这在en-US中按预期呈现字符串(默认情况下不会发现任何内容,使用实际上硬编码的字符串)
本地主机:56073 /首页/关于文化= FR-CH
^这只会渲染第二个字符串:“使用此区域... fr-CH成功!”,这明显意味着所有连接的代码正在工作并按预期找到fr-CH.resx。
但是,第一个字符串(在代码中设置为ViewData["Message"]
)没有得到fr-CH版本! 这就像IStringLocalizer<HomeController>
没有意识到有指定的lang,或未能找到清晰可用的fr-CH.resx。
为什么???
此外,顺便说一句,我也试过使用ShareResource的例子(见下面的链接),并在工厂传递给HomeController作为IStringLocalizerFactory factory
,也没有爱,仍然没有得到fr-CH资源。 叹。
其他说明:
使用这个作为我的主要参考:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization
使用VS 2017,最新的更新,与ASP.Net核心2.0
您在控制器中使用IStringLocalizer<HomeController>
作为本地化器来查找本地化字符串。 本地化程序将在Resources
文件夹中查找以查找YouControllerNameSpace.HomeController
资源文件,并且由于它未找到它,它将返回传递给本地化程序的原始密钥。
要解决该问题,可以使用以下任一选项:
IStringLocalizer<T>
IStringLocalizerFactory
有关资源文件名的更多信息,请查看文档中的资源文件命名部分。
注入IStringLocalizer <T>
使用这个选项,你应该有一个与全名T相同的资源文件,在你的情况下,控制器代码应该和它一样:
IStringLocalizer _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
对于资源文件:
YouControllerNameSpace.HomeController
资源文件。 ( YouControllerNameSpace
只是一个占位符,使用你的控制器命名空间。) 注入IStringLocalizerFactory
使用这个选项你可以使用任何文件作为资源文件。 例如,如果您想从Views.Home.About
资源文件读取资源,则应该将控制器代码更改为:
IStringLocalizer _localizer;
public HomeController(IStringLocalizerFactory factory)
{
_localizer = factory.Create("Views.Home.About",
System.Reflection.Assembly.GetExecutingAssembly().GetName().Name);
}
对于资源文件:
Views.Home.About
资源文件。 尝试在这个答案中由tmg描述的技术。
具体而言,请尝试添加行
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
到您的ConfigureServices()函数
链接地址: http://www.djcxy.com/p/52539.html上一篇: How to get localized string from ASP.NET Core Controller using IStringLocalizer?