Я попытался добавить многоязычную функцию в свой проект asp.net-core, но есть некоторые изменения между .net 3.1 и 5.0 в RequestLocalization, и я не смог получить то, что хочу. Я добавил файлы ресурсов для каждого языка и использовал ресурс на своих страницах бритвы, он работает, но есть одна нежелательная ошибка маршрута по умолчанию, и я хочу, чтобы моя маршрутизация работала в соответствии с культурой по умолчанию.
Это то, что я хочу,
Для культуры по умолчанию (турецкий):
site.com/foo
site.com/foo/bar
site.com/foo/bar/5
Для языка и региональных параметров, отличных от стандартного (английский):
site.com/en/foo
site.com/en/foo/bar
site.com/en/foo/bar/5
Моя другая проблема; Мой проект отображает site.com/foo/foo/bar этот URL-адрес, например site.com/tr/foo/bar, это не нормально, и я думаю, что он должен перенаправлять на страницу 404.
Пример кода моего запуска ниже:
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.AddLocalization(opts => opts.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[]
{
new CultureInfo("tr-TR"),
new CultureInfo("en")
};
options.DefaultRequestCulture = new RequestCulture("tr");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.RequestCultureProviders.Insert(0, new RouteDataRequestCultureProvider());
});
services.AddControllersWithViews();
services.AddRazorPages();
services.AddRouting(options => options.LowercaseUrls = true);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseResponseCompression();
if (env.IsDevelopment())
app.UseDeveloperExceptionPage();
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
var supportedCultures = new string[] { "tr-TR", "en" };
app.UseRequestLocalization(options =>
options
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures)
.SetDefaultCulture("tr-TR")
.RequestCultureProviders.Insert(0, new CustomRequestCultureProvider(context => Task.FromResult(new ProviderCultureResult("tr-TR"))))
);
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(name: "culture-route", pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(name: "default", "{culture=tr}/{controller=Home}/{action=Index}/{id?}");
});
}
Навигация по использованию ресурсов Razor и изменению культуры
Файлы ресурсов
Как это решить или что я делаю не так?
РЕДАКТИРОВАТЬ
Я нашел этот подход. Он использует CookieRequestCultureProvider, и в URL-адресе нет информации о культуре, но, по крайней мере, нет поврежденных URL-адресов. Я не знаю, подходит ли это для SEO.