При попытке локализовать мое приложение локализация строки запроса сработала, и заголовок языка также работает, но маршрутизация не работает. Вот мой код:
Startup.cs
public static IServiceCollection AddLocalizationServices(this IServiceCollection services, IConfiguration _config)
{
string defaultCulture = _config.GetValue<string>("DefaultCulture");
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(
options =>
{
var supportedCultures = new[]
{
new CultureInfo("en"),
new CultureInfo("ar")
};
options.DefaultRequestCulture = new RequestCulture(culture: defaultCulture, uiCulture: defaultCulture);
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider()
{
Options = options,
RouteDataStringKey = "lang",
UIRouteDataStringKey = "lang"
});
options.RequestCultureProviders.Insert(1, new QueryStringRequestCultureProvider());
//options.RequestCultureProviders.Insert(2, new CookieRequestCultureProvider());
options.RequestCultureProviders.Insert(3, new AcceptLanguageHeaderRequestCultureProvider());
});
services.Configure<RouteOptions>(options =>
{
options.ConstraintMap.Add("lang", typeof(LanguageRouteConstraint));
});
return services;
}
public static IApplicationBuilder AddLocalizationBuilder(this IApplicationBuilder app)
{
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
return app;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddLocalizationServices(_config);
services.AddControllersWithViews()
.AddDataAnnotationsLocalization(options =>
{
options.DataAnnotationLocalizerProvider = (type, factory) =>
{
var assemblyName = new AssemblyName(typeof(ValidationResource).GetTypeInfo().Assembly.FullName);
return factory.Create("ValidationResource", assemblyName.Name);
};
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
//app.ConfigureExceptionHandler();
}
else
{
//Global error handling instead of try, catch
app.ConfigureExceptionHandler();
//app.UseHsts();
}
app.AddLocalizationBuilder();
//app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
string defaultCulture = _config.GetValue<string>("DefaultCulture");
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{lang:lang}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "default",
pattern: "{*catchall}",
defaults: new { controller = "Home", action = "RedirectToDefaultLanguage", lang = defaultCulture });
});
}
_ViewImports.cshtml
@using CoreCMS.MVC
@using CoreCMS.Data
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<SharedResource> _loc
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
Index.cshtml
@_loc["Title"]
При попытке доступа к веб-сайту со следующим URL-адресом: http://localhost:14896/en или http://localhost:14896/ar культура не работает, но при использовании этот URL-адрес http://localhost:14896/?culture=ar или http://localhost:14896/?culture=en культура работает хорошо
lang
. Итак, первый шаг — попробовать отладить, чтобы увидеть, действительно ли существует значение маршрута, ключ которого равенlang
. Также вы можете попробовать изучить культуру запроса (проверено черезCultureInfo.CurrentCulture
), чтобы увидеть, действительно ли она установлена, как можно скорее, убедитесь, что нет никакого другого кода, который изменяет ее на что-то другое. - person King King   schedule 08.03.2021app.AddLocalizationBuilder()
вот такapp.Use((context,next) => { /* examine the CultureInfo.CurrentCulture here */ return next();})
. Таким образом, вы, по крайней мере, будете уверены, что промежуточное ПО раньше работало или нет. - person King King   schedule 08.03.2021IRequestCultureProvider
, но, если возможно, вы можете сначала попробовать очистить всех поставщиков и добавить толькоRouteDataRequestCultureProvider
, чтобы посмотреть, работает ли он. Это довольно странно, потому что код конфигурации почти стандартный, а самRouteDataRequestCultureProvider
является встроенным провайдером, параметры выглядят нормально... - person King King   schedule 08.03.2021RouteDataRequestCultureProvider
github .com/dotnet/aspnetcore/blob/ это довольно просто, и поэтому трудно потерпеть неудачу, как в вашем случае. - person King King   schedule 08.03.2021RouteDataRequestCultureProvider
код отлично работает для параметра строки запроса, как в вашем примере -?culture=en
. Вы должны создать собственную реализацию интерфейсаRequestCultureProvider
для своей задачи. Взгляните на этот ответ - person DarkSideMoon   schedule 09.03.2021RouteDataRequestCultureProvider
по умолчанию вполне достаточно. Кстати, OP настраивает свой ключ данных маршрута какlang
(а неculture
, как используется по умолчанию). Это должно просто работать, и, конечно, это так странно, когда это не работает на его стороне. Иногда мы не можем помочь из-за чего-то глупого, простого, скрытого на стороне ОП. - person King King   schedule 10.03.2021