Пользовательская локализация ASP.NET - PullRequest
3 голосов
/ 20 марта 2012

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

Обычная локализация изменится только при изменении языка, так что Hello for french будет 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 Ответ

0 голосов
/ 29 мая 2012

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

это всего лишь пример, вам нужно углубиться в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...