【发布时间】:2018-02-12 00:01:30
【问题描述】:
我正在尝试在 ASP.NET Core 1.0 Web 应用程序中为我的 MVC 视图本地化。
到目前为止,我已经使用 ConfigureServices 方法设置了我的 Startup.cs 文件:
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting(configureOptions => configureOptions.LowercaseUrls = true);
services.AddMvc()
.AddViewLocalization(setupAction => setupAction.ResourcesPath = "Resources")
.AddDataAnnotationsLocalization();
}
然后是我的Configure 方法:
public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
{
loggerFactory.MinimumLevel = LogLevel.Information;
loggerFactory.AddConsole();
loggerFactory.AddDebug();
CultureInfo defaultCulture = new CultureInfo("en");
List<CultureInfo> supportedCultures = new List<CultureInfo>
{
defaultCulture,
new CultureInfo("fr")
};
RequestLocalizationOptions requestLocalizationOptions = new RequestLocalizationOptions
{
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures,
};
RequestCulture defaultRequestCulture = new RequestCulture(defaultCulture);
//Insert this at the beginning of the list since providers are evaluated in order until one returns a not null result
requestLocalizationOptions.RequestCultureProviders.Insert(0, new UrlCultureProvider());
app.UseRequestLocalization(requestLocalizationOptions, defaultRequestCulture);
app.UseIISPlatformHandler();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "defaultWithCulture",
template: "{culture}/{controller}/{action}/{id?}",
defaults: new { culture = "en", controller = "Home", action = "Index" },
constraints: new { culture = "en|fr" });
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { culture = "en", controller = "Home", action = "Index" });
});
app.UseStatusCodePages();
}
最后是我的 UrlCultureProvider 类,它可以帮助我在 url 中提供文化时设置文化:
public class UrlCultureProvider : IRequestCultureProvider
{
public Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
var url = httpContext.Request.Path;
//Quick and dirty parsing of language from url path, which looks like "/api/de-DE/home"
//This wont be needed in RC2 since an extension method GetRouteData has been added to HttpContext
//which means we could just get the the "language" parameter from the route data
var parts = httpContext.Request.Path.Value.Split('/');
if (parts.Length < 2)
{
return Task.FromResult<ProviderCultureResult>(null);
}
var hasCulture = Regex.IsMatch(parts[1], @"^[a-z]{2}$");
if (!hasCulture)
{
return Task.FromResult<ProviderCultureResult>(null);
}
var culture = parts[1];
return Task.FromResult(new ProviderCultureResult(culture));
}
}
如果它出现在 url 中,则文化设置为 fr 或 en。 比我的“资源”文件夹中有两个资源文件:
Views.Home.Index.cshtml.resx
Views.Home.Index.cshtml.fr.resx
在我的_ViewImports.cshtml 文件中,我有这个代码:
@using Microsoft.AspNet.Mvc.Localization
@inject IViewLocalizer Localization
最后,我的索引视图中有一个资源调用:
@Localization["Test"]
我使用“en”文化而不是“fr”文化。
你知道那里发生了什么吗?
谢谢。
【问题讨论】:
标签: c# asp.net-core asp.net-core-mvc