MVC 6: как использовать файлы RESX?
Я пытаюсь перенести мой существующий проект ASP.NET MVC 5 в проект MVC 6 vNext, в то время как мне удалось пройти и решить большинство проблем, я не могу найти какую-либо документацию о том, как использовать RESX файлы ресурсов для локализации в MVC 6
Мои модели ViewModels используют выражения типа
[Required(ErrorMessageResourceType = typeof(Resources.MyProj.Messages), ErrorMessageResourceName = "FieldRequired")]
Это отлично работало в MVC 5 до тех пор, пока RESX был включен правильно, а модификаторы доступа были установлены правильно, но он, похоже, не работает в проекте vNext
Кто-нибудь знает, как RESX может использоваться в проектах MVC 6 vNext?
Я видел несколько сообщений здесь и на веб-узле GIT, где говорится, что история локализации для ASP.NET 5/MVC 6 завершена, но я не могу найти достойный образец, в котором использовались строки ресурсов.
Использование приведенного выше кода дает мне ошибку
Ошибка CS0246 Тип или имя пространства имен "Ресурсы" не найдено (вам не хватает директивы using или ссылки на сборку?)
Изменить: Изменен текст, чтобы уточнить, что я ищу реализацию локализации в проектах vNext (MVC 6), я могу заставить его работать в MVC 5.
Изменить 2: Получил бит локализации, после выполнения ответа от Мохаммеда, но теперь я застреваю новую ошибку.
Как только я включу
"Microsoft.AspNet.Localization": "1.0.0-beta7-10364",
"Microsoft.Framework.Localization": "1.0.0-beta7-10364",
и добавьте следующую строку в ConfigureServices в Startup.cs
services.AddMvcLocalization();
Я получаю новую ошибку при выполнении следующего кода.
public class HomeController : Controller
{
private readonly IHtmlLocalizer _localizer;
public HomeController(IHtmlLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
....
Ошибка:
При обработке запроса произошла необработанная ошибка.
InvalidOperationException: невозможно разрешить службу для типа "Microsoft.Framework.Runtime.IApplicationEnvironment" при попытке активировать 'Microsoft.Framework.Localization.ResourceManagerStringLocalizerFactory. Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite(ServiceProvider провайдер, ISet`1 callSiteChain)
Невозможно выяснить, есть ли у меня зависимость, которую я потерял, или есть проблема в коде
Изменить 3:
Кому все еще нужно найти решение. На данный момент вы можете использовать код в ответе Muhammad Rehan Saee, чтобы получить поддержку локализации в вашем CSHTML. Однако история включения локализации в атрибуты проверки еще не выполнена (на момент редактирования: 08/Sep/2015)
Посмотрите этот вопрос на сайте GITHUB для mvc ниже:
https://github.com/aspnet/Mvc/issues/2766#issuecomment-137192942
PS: Чтобы исправить исключение InvalidOperationException, я сделал следующее
Взятие всех зависимостей в качестве бета7- * и очистка всего содержимого моих пакетов C:\Users \.dnx\избавились от этой ошибки.
Подробности по проблеме, которую я поднял:
https://github.com/aspnet/Mvc/issues/2893#issuecomment-127164729
Изменить: 25/Dec/2015
Теперь он наконец работает в MVC 6.
Написал быстрый блог: http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/
Ответы
Ответ 1
Вы можете посмотреть полный образец проекта ASP.NET MVC GitHub здесь. На момент написания это все очень новый код и может быть изменен. Вам нужно добавить в свой запуск следующее:
public class Startup
{
// Set up application services
public void ConfigureServices(IServiceCollection services)
{
// Add MVC services to the services container
services.AddMvc();
services.AddMvcLocalization();
// Adding TestStringLocalizerFactory since ResourceStringLocalizerFactory uses ResourceManager. DNX does
// not support getting non-enu resources from ResourceManager yet.
services.AddSingleton<IStringLocalizerFactory, TestStringLocalizerFactory>();
}
public void Configure(IApplicationBuilder app)
{
app.UseCultureReplacer();
app.UseRequestLocalization();
// Add MVC to the request pipeline
app.UseMvcWithDefaultRoute();
}
}
Кажется, что IStringLocalizerFactory
используется для создания экземпляров IStringLocalizer
из типов resx. Затем вы можете использовать IStringLocalizer
для получения локализованных строк. Вот полный интерфейс (LocalizedString
- это просто пара значений имени):
/// <summary>
/// Represents a service that provides localized strings.
/// </summary>
public interface IStringLocalizer
{
/// <summary>
/// Gets the string resource with the given name.
/// </summary>
/// <param name="name">The name of the string resource.</param>
/// <returns>The string resource as a <see cref="LocalizedString"/>.</returns>
LocalizedString this[string name] { get; }
/// <summary>
/// Gets the string resource with the given name and formatted with the supplied arguments.
/// </summary>
/// <param name="name">The name of the string resource.</param>
/// <param name="arguments">The values to format the string with.</param>
/// <returns>The formatted string resource as a <see cref="LocalizedString"/>.</returns>
LocalizedString this[string name, params object[] arguments] { get; }
/// <summary>
/// Gets all string resources.
/// </summary>
/// <param name="includeAncestorCultures">
/// A <see cref="System.Boolean"/> indicating whether to include
/// strings from ancestor cultures.
/// </param>
/// <returns>The strings.</returns>
IEnumerable<LocalizedString> GetAllStrings(bool includeAncestorCultures);
/// <summary>
/// Creates a new <see cref="ResourceManagerStringLocalizer"/> for a specific <see cref="CultureInfo"/>.
/// </summary>
/// <param name="culture">The <see cref="CultureInfo"/> to use.</param>
/// <returns>A culture-specific <see cref="IStringLocalizer"/>.</returns>
IStringLocalizer WithCulture(CultureInfo culture);
}
Наконец, вы можете ввести IStringLocalizer
в свой контроллер таким образом (обратите внимание, что IHtmlLocalizer<HomeController>
наследует от IStringLocalizer
):
public class HomeController : Controller
{
private readonly IHtmlLocalizer _localizer;
public HomeController(IHtmlLocalizer<HomeController> localizer)
{
_localizer = localizer;
}
public IActionResult Index()
{
return View();
}
public IActionResult Locpage()
{
ViewData["Message"] = _localizer["Learn More"];
return View();
}
}
Ответ 2
Изменения были изменены в mvc 6.0.0-rc1-final. Пройдя через многие другие форумы, ниже конфигурация будет работать, если кто-то планирует работать с последними изменениями в функции локализации.
В startup.cs configure
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization();
services.AddSingleton<IStringLocalizerFactory, CustomStringLocalizerFactory>();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var requestLocalizationOptions = new RequestLocalizationOptions
{
SupportedCultures = new List<CultureInfo>{
new CultureInfo("en-US"),
new CultureInfo("fr-CH")
},
SupportedUICultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("fr-CH")
}
};
app.UseRequestLocalization(requestLocalizationOptions, new RequestCulture(new CultureInfo("en-US")));
}
и вы можете начать использовать IHtmlLocalizer в контроллере.
и вы можете протестировать с помощью querystring http://localhost:5000/Home/Contact?culture=fr-CH или изменить культуру в хроме, добавив предпочтительный язык в разделе "Язык и настройки ввода"