Ядро Asp.net Локализация всегда возвращает английский язык
Я пытаюсь разработать мультиязычный проект. Для статического значения я использовал ресурс (файл.resx)
Я создаю два файла ресурсов Home.resx(по умолчанию или английский) и home.resx(для арабского языка), он работает по умолчанию или английский
Затем я пытаюсь изменить язык
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ar");
var home = Resources.Home.Home1;
Но он все равно возвращает английское значение вместо арабского значения
вот мой запуск. Функция настройки
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
var supportedCultures = new List<System.Globalization.CultureInfo>
{
new System.Globalization.CultureInfo("en-US"),
new System.Globalization.CultureInfo("ar-AR"),
};
var options = new RequestLocalizationOptions
{
DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
app.UseRequestLocalization(options);
......
что не так с моим кодом?
1 ответ
Хорошо, я расскажу вам, что я делаю в своих проектах. Введите следующий код после services.AddMvc() в методе ConfigureServices файла Startup.cs.
IList<CultureInfo> supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR"),
new CultureInfo("el-GR"),
};
var MyOptions = new RequestLocalizationOptions()
{
DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
MyOptions.RequestCultureProviders = new[]
{
new RouteDataRequestCultureProvider() { RouteDataStringKey = "lang", Options = MyOptions }
};
services.AddSingleton(MyOptions);
Теперь определите следующий класс в вашем проекте
public class LocalizationPipeline
{
public void Configure(IApplicationBuilder app, RequestLocalizationOptions options)
{
app.UseRequestLocalization(options);
}
}
Измените маршрут по умолчанию:
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{lang=en-US}/{controller=Home}/{action=Index}/{id?}");
});
Используйте MiddlewareFilter для каждого из ваших контроллеров.
[MiddlewareFilter(typeof(LocalizationPipeline))]
public class HomeController : Controller
{
public string GetCulture()
{
return $"CurrentCulture:{CultureInfo.CurrentCulture.Name}, CurrentUICulture:{CultureInfo.CurrentUICulture.Name}";
}
}
Вы можете изменить текущий язык следующим образом:
<ul>
<li>@Html.ActionLink("EN", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "en-US" })</li>
<li>@Html.ActionLink("FR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "fr-FR" })</li>
<li>@Html.ActionLink("GR", ViewContext.RouteData.Values["action"] as string, ViewContext.RouteData.Values["controller"] as string, new { lang = "el-GR" })</li>
</ul>
Если вы хотите также поддерживать Razor Pages, внесите следующие изменения. Добавьте следующее изменение servcies.AddMvc().
services.AddMvc()
.AddRazorPagesOptions(options =>
{
options.Conventions.AddFolderRouteModelConvention("/", model =>
{
foreach (var selector in model.Selectors)
{
var attributeRouteModel = selector.AttributeRouteModel;
attributeRouteModel.Template = AttributeRouteModel.CombineTemplates("{lang=el-GR}", attributeRouteModel.Template);
}
});
});
Используйте следующий атрибут MiddlewareFilter над вашими PageModels
[MiddlewareFilter(typeof(LocalizationPipeline))]
public class ContactModel : PageModel
{
public string Message { get; set; }
public void OnGet()
{
Message = "Your contact page.";
}
}
Единственное, что мне не удалось сделать, - это автоматически определить LocalizationPipeline для всех контроллеров и PageModel, программно добавив MiddlewareFilter в Startup.cs.