ASP.NET MVC4 многоязычные аннотации данных

В стандартном приложении у меня есть следующее:

[Required]
[DisplayName("Email Address")]
public string EmailAddress { get; set; }

... это автоматически генерирует метку для этого поля формы на английском языке.

Теперь, если мне нужно, чтобы мое приложение поддерживало 5 языков, каков наилучший подход из приложения ASP.NET MVC для этого?

Сфера применения составляет около 400 - 600 полей данных.

ОБНОВЛЕНИЕ: мне также потребуется поддержка для обновления небольших разделов текста в приложении, таких как названия страниц и введения в каждую форму (небольшой абзац).

3 ответа

Решение

Вместо присвоения фактических значений свойствам атрибутов присваивайте ключи для строк ресурсов. Затем вы можете использовать пользовательский ModelMetadataProvider который осведомлен о контексте локализации и предоставит соответствующую строку. Чтобы получить лучшее решение, вы можете сделать свой заказ ModelMetadataProvider выводить соглашения (что сокращает необходимость в подробных атрибутах).

У Фила Хаака есть статья в блоге " Метаданные модели и локализация проверки с использованием соглашений", в которой объясняется, как это работает. Существует также соответствующий пакет NuGet под названием ModelMetadataExtensions с исходным кодом, доступным на github по адресу https://github.com/Haacked/mvc-metadata-conventions.

В качестве примечания я бы порекомендовал рассмотреть некоторые из замечательных ответов, которые я получил на мой старый вопрос: " Эффективные стратегии локализации в.NET". Они конкретно не отвечают на ваш вопрос, но будут очень полезны, если вы работаете над многоязычным приложением.NET.

Я бы сделал пользовательский атрибут, например [MyDisplayName("Раздел", "Ключ")], и это обеспечило бы перевод на основе выбранного языка. Также ознакомьтесь с менеджером ресурсов, управляемым базой данных, например, http://www.west-wind.com/presentations/wwDbResourceProvider/

Лучший подход к локализации - хранить строки в базе данных, а не в файлах ресурсов, если только

  1. Ваше приложение очень статично
  2. Ваш языковой набор очень статичен

Вы можете украсить свою модель с помощью пользовательского атрибута, где вы устанавливаете строку по умолчанию и идентификатор БД для ресурса, например

[MyResource("email", 123)]

Вы можете написать собственный обработчик делегирования http, чтобы вывести ресурс из кэша (например). Как только вы аутентифицируете клиента, вы знаете языковой спрос клиента и идентификатор ресурса. Таким образом, клиент с испанским и ресурсом id = 1 получит "Si", а с английским - "Да". Идентификатор ресурса будет привязан к конкретной языковой строке.

Другие вопросы по тегам