C# 如何使用IStringLocalizer从ASP.NET核心控制器获取本地化字符串?
这里有点混乱,ASP.NETCore2.0中的超级简单HelloWorld本地化示例。MyAbout页面设置为呈现两个本地化字符串:C# 如何使用IStringLocalizer从ASP.NET核心控制器获取本地化字符串?,c#,asp.net-core,localization,asp.net-core-2.0,asp.net-core-localization,C#,Asp.net Core,Localization,Asp.net Core 2.0,Asp.net Core Localization,这里有点混乱,ASP.NETCore2.0中的超级简单HelloWorld本地化示例。MyAbout页面设置为呈现两个本地化字符串: 从视图中(使用IViewLocalizer) 来自代码(通过控制器使用IStringLocalizer) 控制器中的代码拒绝正确获取loc字符串。这并不复杂,我遗漏了什么明显的东西 关于.cshtml @使用Microsoft.AspNetCore.Mvc.Localization @注入IViewLocalizer定位器 @{ ViewData[“Title”]
IViewLocalizer
)@使用Microsoft.AspNetCore.Mvc.Localization
@注入IViewLocalizer定位器
@{
ViewData[“Title”]=“关于”;
}
@ViewData[“标题”]
@ViewData[“消息”]
@定位器[“使用此区域提供附加信息。”]
^注意这两个字符串:“Message”将使用IStringLocalizer
从代码中本地化(请参见下面的HomeController),而@Localizer将使用IViewLocalizer
类
HomeController.cs
公共类HomeController:控制器
{
专用只读IStringLocalizer\u localizer;
公共家庭控制器(IStringLocalizer)
{
_定位器=定位器;
}
公共IActionResult索引()
{
返回视图();
}
公共IActionResult About()
{
ViewData[“Message”]=“本地化程序[“您的应用程序描述页];
返回视图();
}
}
Startup.cs(相关部分)
public void配置服务(IServiceCollection服务)
{
services.AddLocalization(options=>options.ResourcesPath=“Resources”);
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.后缀)
.AddDataAnnotationsLocalization();
配置(选项=>
{
var supportedCultures=new[]
{
新文化信息(“美国”),
新文化信息(“fr CH”),
};
options.DefaultRequestCulture=newrequestculture(culture:“en-US”,uiCulture:“en-US”);
options.SupportedCultures=SupportedCultures;
options.supportedCultures=supportedCultures;
});
}
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
var locOptions=app.ApplicationServices.GetService();
app.UseRequestLocalization(locOptions.Value);
if(env.IsDevelopment())
{
app.UseBrowserLink();
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Home/Error”);
}
app.UseStaticFiles();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}
资源:
Views.Home.About.fr-CH.resx
^其中包含两个值:
- “使用此区域可提供其他信息。”=“使用此区域” 区域…fr CH的成功!“
- “您的应用程序说明页。”= “您的应用程序描述……fr CH成功!”
ViewData[“Message”]
)没有获得fr CH版本!这就像IStringLocalizer
未能意识到指定了lang,或者未能找到明显可用的fr-CH.resx
为什么
顺便说一句,我也尝试过使用ShareResource示例(参见下面的链接),并在工厂中以IStringLocalizerFactory工厂
的形式将其传递给HomeController ctor,同样没有love,仍然没有获得fr CH资源。唉
其他注意事项:
将此作为我的主要参考:
使用VS 2017,最新更新,使用ASP.Net Core 2.0您正在控制器中使用
IStringLocalizer
作为定位器来查找本地化字符串。本地化程序将在Resources
文件夹中查找YouControllerNameSpace.HomeController
资源文件,由于找不到该文件,它将返回您传递给本地化程序的原始密钥
要解决此问题,可以使用以下选项之一:
- 注入
IStringLocalizer
- Inject
IStringLocalizerFactory
IStringLocalizer _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
对于资源文件:
- 确保您有
资源文件视图.Home.About
- 确保资源文件中有指定的字符串
- 确保您有不同区域性的资源文件
options.RequestCultureProviders = new List<IRequestCultureProvider>
{
new QueryStringRequestCultureProvider(),
new CookieRequestCultureProvider()
};
options.RequestCultureProviders=新列表
{
新建QueryStringRequestCultureProvider(),
新CookiierRequestCultureProvider()
};
对于ConfigureServices()函数,问题在于ASP.NET Core使用IStringLocalizer为本地化创建了错误的RESX命名空间。如果代码中有
services.AddLocalization(options => options.ResourcesPath = "Resources");
然后注入服务IStringLocalizer的实例在名称空间中有两个“Resources”,名称空间看起来是“Resources.Resources”。这是无法找到RESX的根本原因。sna
services.AddLocalization(options => options.ResourcesPath = "Resources");