我遵循this文档在我的ASP.NET Core
应用程序中实现本地化,并尝试在页脚中显示一个select,其中包含我的应用程序支持的所有语言。
因此,我按照文档的建议创建了一个名为_SelectLanguagepartial
的文件:
@using Microsoft.AspNetCore.Builder
@using Microsoft.AspNetCore.Http.Features
@using Microsoft.AspNetCore.Localization
@using Microsoft.AspNetCore.Mvc.Localization
@using Microsoft.Extensions.Options
@inject IViewLocalizer Localizer
@inject IOptions<RequestLocalizationOptions> LocOptions
@{
var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureItems = LocOptions.Value.SupportedUICultures
.Select(c => new SelectListItem { Value = c.Name, Text = c.DisplayName })
.ToList();
var returnUrl = string.IsNullOrEmpty(Context.Request.Path) ? "~/" : $"~{Context.Request.Path.Value}";
}
<div title="@Localizer["Request culture provider:"] @requestCulture?.Provider?.GetType().Name">
<form id="selectLanguage" asp-controller="Language"
asp-action="SetLanguage" asp-route-returnUrl="@returnUrl"
method="post" class="form-horizontal" role="form">
<label asp-for="@requestCulture.RequestCulture.UICulture.Name">@Localizer["Language:"]</label>
<select name="culture" onchange="this.form.submit();"
asp-for="@requestCulture.RequestCulture.UICulture.Name"
asp-items="cultureItems"></select>
</form>
</div>
我用下面的方式把它加载到页脚:
@await Html.PartialAsync("_SelectLanguagePartial")
这很有效,但问题是我只得到了italian
语言,但我应该也得到英语,实际上,在我指定这些语言的Configure
方法中:
var supportedCultures = new[]
{
new CultureInfo("it-IT"),
new CultureInfo("en-EN")
};
app.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture("it-IT"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
});
正如您所看到的,我将italian
设置为默认语言,但我也有english
语言,我还尝试在en-US
中进行编辑,但在select中我只能得到italian
语言。
我做错了什么?
发布于 2018-08-30 09:36:42
对于@inject IOptions<RequestLocalizationOptions> LocOptions
,它从RequestLocalizationOptions
检索区域性,您需要在ConfigureServices
中配置RequestLocalizationOptions
,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<CookiePolicyOptions>(options =>
{
//rest code
services.AddMvc()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
new CultureInfo("ar-YE")
};
// State what the default culture for your application is. This will be used if no specific culture
// can be determined for a given request.
options.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
// You must explicitly state which cultures your application supports.
// These are the cultures the app supports for formatting numbers, dates, etc.
options.SupportedCultures = supportedCultures;
// These are the cultures the app supports for UI strings, i.e. we have localized resources for.
options.SupportedUICultures = supportedCultures;
});
}
您可以通过RequestLocalizationOptions
进行配置,然后在Configure
中使用它,如下所示,以避免重复代码。
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
https://stackoverflow.com/questions/52085239
复制相似问题