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/
Лучший подход к локализации - хранить строки в базе данных, а не в файлах ресурсов, если только
- Ваше приложение очень статично
- Ваш языковой набор очень статичен
Вы можете украсить свою модель с помощью пользовательского атрибута, где вы устанавливаете строку по умолчанию и идентификатор БД для ресурса, например
[MyResource("email", 123)]
Вы можете написать собственный обработчик делегирования http, чтобы вывести ресурс из кэша (например). Как только вы аутентифицируете клиента, вы знаете языковой спрос клиента и идентификатор ресурса. Таким образом, клиент с испанским и ресурсом id = 1 получит "Si", а с английским - "Да". Идентификатор ресурса будет привязан к конкретной языковой строке.