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

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

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

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

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

Объем приложения составляет около 400 - 600 полей данных.

UPDATE: мне также потребуется поддержка для обновления небольших разделов текста в приложении, таких как имена страниц и введения в каждую форму (небольшой абзац).

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

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

[MyResource("email", 123)]

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