Пользовательская локализация ASP.NET

Я провел немало исследований, и я не уверен, как мне поступить с этим.

Обычная локализация будет меняться только при изменении языка, поэтому Hello для французского языка будет Bonjour, но в моем приложении должны быть специальные ключевые слова для определенных пользователей, поэтому UserX может сказать, что "Hello" должен быть "Allo".

Я хотел бы иметь ключ ресурса с IdentityName_resourceKey и, если этот ключ присутствует, возьмите его в противном случае вернуться к resourceKey.

Я думаю, что мне нужен собственный ResourceProvider, но моя реализация является простым оператором if, поэтому я не хочу писать полный поставщик ресурсов.

Я написал расширение атрибута DisplayName, которое работает нормально, но это не очень хорошо, так как мне понадобится одно из них для каждого атрибута аннотации данных, и это не будет работать, если я использую ресурсы непосредственно в страницах или контроллерах...

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
    private readonly PropertyInfo _propertyInfo;

    public LocalizedDisplayNameAttribute(string resourceKey, Type resourceType) : base(resourceKey)
    {
        var clientName = CustomMembership.Instance.CurrentUser.Client.Name;

        _propertyInfo = resourceType.GetProperty(clientName + "_" + base.DisplayName, BindingFlags.Static | BindingFlags.Public) 
                            ?? resourceType.GetProperty(base.DisplayName, BindingFlags.Static | BindingFlags.Public);
    }

    public override string DisplayName
    {
        get
        {
            if (_propertyInfo == null)
            {
                return base.DisplayName;
            }

            return (string) _propertyInfo.GetValue(_propertyInfo.DeclaringType, null);
        }
    }
}

Я ищу лучший способ реализовать это с наименьшим количеством кода..

Спасибо!

1 ответ

Есть лучший способ, аннотации данных - ваш ответ!

это всего лишь пример, вам нужно углубиться в System.Globalization.CultureInfo и аннотации данных (System.ComponentModel.DataAnnotations)

вы можете определить свой класс модели следующим образом (при условии, что у нас есть файл ресурсов с именем CustomResourceValues ​​со значением "strHello")

public class SomeObject(){

    <Display(Name:="strHello", ResourceType:=GetType(My.Resources.CustomResourceValues))>
    public string HelloMessage{ get; set; }

}

поэтому, на наш взгляд, работа должна выполняться htmlhelper (при условии, что движок рендеринга похож на бритву, а модель имеет тип SomeObject)

@Html.LabelFor(Function(x) x.HelloMessage)

основная информация http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.displayattribute.resourcetype(v=vs.95).aspx

Другие вопросы по тегам