У меня есть сайт MVC4 с различными связанными с ним файлами ресурсов, и локализация работает нормально.
Но то, что я хочу сделать, это получить значения из базы данных, а не обращаться к файлам resx.
Я расширил класс DisplayNameAttribute, чтобы взять ключ (целое число) и объект CultureInfo и использовать их для извлечения значений из базы данных.
Вещь, которую я хочу от CultureInfo, - это строковое представление (например, "en-US" или "fr-FR").
Моя проблема в том, что я могу передать целое число в конструктор расширенного класса, но не в CultureInfo.
Пример кода расширенного атрибута:
public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
private int ResourceKey { get; set; }
private CultureInfo Culture { get; set; }
public LocalizedDisplayNameAttribute(int resourceKey, CultureInfo culture)
{
ResourceKey = resourceKey;
Culture = culture;
}
public override string DisplayName
{
get
{
string displayName = "Get from database.. TEST";
return string.IsNullOrEmpty(displayName) ? string.Format("[[{0}]]", ResourceKey) : displayName;
}
}
}
Что я хотел бы сделать:
[LocalizedDisplayName(1, Thread.CurrentThread.CurrentUICulture))]
public string userName { get; set; } //The full name of the user
Или еще лучше:
private CultureInfo culture = Thread.CurrentThread.CurrentUICulture;
[LocalizedDisplayName(1, culture))]
public string userName { get; set; } //The full name of the user
Мой вопрос: как мне это сделать?
Ответ на этот вопрос был предоставлен Ксвеном первым, а Томи Ламми вторым в комментариях:
Поскольку Thread.CurrentThread.CurrentUICulture не является значением времени компиляции, он не может быть предоставлен в качестве аргумента для атрибута LocalizedDisplayName. Таким образом, решение заключается в том, чтобы использовать его в методе атрибута вместо предоставления его в качестве аргумента:
public override string DisplayName
{
get
{
var culture = Thread.CurrentThread.CurrentUICulture;
var displayName = db.sp_getValueFromDatabase(id, culture.Name).firstOrDefault();
}
}
Поскольку я не могу принимать комментарии в качестве принятого ответа, я сделал свой собственный ответ. Если один из вышеперечисленных комментаторов мог бы опубликовать свое решение в качестве ответа, я сделаю свой ответ принятым.