[英]How to get localized string from ASP.NET Core Controller using 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>
^注意兩個字符串:“Message”將使用IStringLocalizer
從代碼本地化(請參閱下面的HomeController),@ Local將使用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示例(參見下面的鏈接),並將工廠作為IStringLocalizerFactory factory
傳遞給HomeController ctor,也沒有愛,仍然沒有獲得fr-CH資源。 嘆。
其他說明:
使用它作為我的主要參考: https : //docs.microsoft.com/en-us/aspnet/core/fundamentals/localization
使用VS 2017,最新更新,使用ASP.Net Core 2.0
您正在控制器中使用IStringLocalizer<HomeController>
作為本地化程序來查找本地化字符串。 本地化程序將在Resources
文件夾中查找YouControllerNameSpace.HomeController
資源文件,因為它找不到它,它將返回您傳遞給本地化程序的原始密鑰。
要解決此問題,您可以使用以下任一選項:
IStringLocalizer<T>
IStringLocalizerFactory
有關資源文件名的更多信息,請查看文檔中的“ 資源文件命名”部分。
使用此選項,您應該擁有一個與T的全名同名的資源文件,在您的情況下,控制器代碼應該與它相同:
IStringLocalizer _localizer;
public HomeController(IStringLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
對於資源文件:
YouControllerNameSpace.HomeController
資源文件。 ( YouControllerNameSpace
只是一個占位符,使用您的控制器命名空間。) 使用此選項,您可以將任何文件用作資源文件。 例如,如果要從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()函數
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.