Локализация MVC4 с DisplayName в базе данных

1

У меня есть сайт 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

Мой вопрос: как мне это сделать?

Теги:
asp.net-mvc
localization
asp.net-mvc-4

1 ответ

0
Лучший ответ

Ответ на этот вопрос был предоставлен Ксвеном первым, а Томи Ламми вторым в комментариях:

Поскольку Thread.CurrentThread.CurrentUICulture не является значением времени компиляции, он не может быть предоставлен в качестве аргумента для атрибута LocalizedDisplayName. Таким образом, решение заключается в том, чтобы использовать его в методе атрибута вместо предоставления его в качестве аргумента:

public override string DisplayName
{
   get
   {
        var culture = Thread.CurrentThread.CurrentUICulture; 
        var displayName = db.sp_getValueFromDatabase(id, culture.Name).firstOrDefault();
   }
}

Поскольку я не могу принимать комментарии в качестве принятого ответа, я сделал свой собственный ответ. Если один из вышеперечисленных комментаторов мог бы опубликовать свое решение в качестве ответа, я сделаю свой ответ принятым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню