Я работаю над многоязычным приложением mvc. У меня есть таблица переводов в базе данных, которую я открываю при запуске приложения и сохраняю в памяти приложения.
Структура базы данных: {TextId, LanguageId, Translation}. TextId назначается каждому элементу пользовательского интерфейса (например, метке, валидаторам, тексту раскрывающегося списка и т. д.). Существует интерфейс администратора для управления текстом перевода.
Я хочу знать, как лучше всего отображать переведенный текст в пользовательском интерфейсе и где лучше всего сделать фактический перевод. Я не хочу использовать диспетчер ресурсов, так как база данных используется в других приложениях веб-форм Asp и Asp.Net.
Вот модель (для примера)
public class UserLoginModel
{
[Required(ErrorMessage="ER001")]
[Range(6,10,ErrorMessage="ER002")]
[Display(Description="TX001", Name="TX002")]
public string LoginId { get; set; }
[Required(ErrorMessage="ER003"), DataType(DataType.Password)]
public string Password { get; set; }
public bool RememberMe { get; set; }
}
Идентификатор языка будет находиться в Session["LanguageId"], а TranslationText находится в переменной приложения.
Модели находятся в отдельном проекте, поэтому прямого доступа к сеансу нет, но я могу использовать DI (не знаю, хорошая ли это практика!)
Вот следующие вещи, которые я рассматривал:
Напишите вспомогательное расширение Html, например @Html.TranslateText("TX001"). Я начал с этого метода, но вскоре понял, что @Html.ValidationMessage принимает только одно сообщение, независимо от нескольких атрибутов валидатора свойства. Я также не могу использовать шаблоны EditorFor.
Используйте javascript для замены текстовых идентификаторов соответствующими сообщениями
Используйте отражение в модели и замените текстовые идентификаторы на атрибуты.
Я склоняюсь к варианту 3, расширяя ModelMetadataProvider, или записывая атрибут фильтра действий, или в шаблоне EditorForModel.
Я очень смущен тем, как действовать дальше. Я все еще в процессе изучения MVC. Следовательно. Я хотел бы спросить экспертов о том, как решить эту проблему наилучшим образом.
Спасибо,