Lokalisierung in ASP.MVC: Multi-Language User Interface (MUI)

Multikulti im Web (Teil 2)
Kommentare

Windows Developer

Der Artikel „Multikulti im Web“ von Timm Bremus ist erstmalig erschienen im Windows Developer 8.2012
Validierung des Models
Unsere Lösung hat nach den vorherigen Anpassungen schon

Windows Developer

Der Artikel „Multikulti im Web“ von Timm Bremus ist erstmalig erschienen im Windows Developer 8.2012

Validierung des Models

Unsere Lösung hat nach den vorherigen Anpassungen schon einen sehr vorzeigbaren Stand. Was noch fehlt ist die Lokalisierung der Validierungsnachrichten, die bei auftretenden Eingabefehlern angezeigt werden. Hierzu schauen wir uns die Model-Klassen einmal genauer an und bedienen uns eines sehr einfachen Mechanismus: der Data Annotations. Mittels Attributen legen wir nicht nur Validierungen fest, sondern können auch die angezeigten Fehlermeldungen beeinflussen. Das ist genau die richtige Stelle also, um unsere lokalisierten Meldungen einzubringen. Listing 6 zeigt eine beispielhaft erweiterte RegisterModel -Klasse. Alle Übersetzungen für die Validierungen packen wir in die zu Beginn angelegte ValidationDictionary -Ressourcendatei.

Listing 6

public class RegisterModel
{
  [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ModelRes.Shared.ValidationDirectory))]
  [Display(Name = "User name")]
  public string UserName { get; set; }

  [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ModelRes.Shared.ValidationDirectory))]
  [DataType(DataType.EmailAddress)]
  [Display(Name = "Email address")]
  public string Email { get; set; }

  [Required(ErrorMessageResourceName = "Required", ErrorMessageResourceType = typeof(ModelRes.Shared.ValidationDirectory))]
  [StringLength(100, ErrorMessageResourceName = "StringLength", ErrorMessageResourceType = typeof(ModelRes.Shared.ValidationDirectory), MinimumLength = 6)]
  [DataType(DataType.Password)]
  [Display(Name = "Password")]
  public string Password { get; set; }

  [DataType(DataType.Password)]
  [Display(Name = "Confirm password")]
  [Compare("Password", ErrorMessageResourceName = "Compare", ErrorMessageResourceType = typeof(ModelRes.Shared.ValidationDirectory))]
  public string ConfirmPassword { get; set; }
}  
Namen der Attribute

Wer die Anwendung zum jetzigen Zeitpunkt ausführt, wird feststellen, dass nur noch die Übersetzung der eigentlichen Eigenschaftsnamen der Models fehlt. Ungeduldige werden bei der Anpassung der Validierungsattribute im vorherigen Abschnitt versucht haben, auch das Display-Attribut anzupassen. Hierbei stößt man auf das Problem, dass das Display-Attribut keine Lokalisierung unterstützt. Der findige Entwickler erkennt nun schnell den Ernst der Lage und macht sich gleich an die Implementierung eines eigenen Display -Attributs. Listing 7 zeigt ein mögliches Ergebnis einer Eigenimplementierung. Wichtig ist hier zu verstehen, dass die Eigenschaft bei jedem Aufruf ausgelesen werden muss. Aus diesem Grund wird die GetValue -Methode im Getter der DisplayName -Eigenschaft aufgerufen und nicht im Konstruktor. Im letzten Schritt ersetzt man im jeweiligen Model nur noch das Display -Attribut eines jeden Properties durch das LocalizedDisplayNameAttribute:

[LocalizedDisplayName("Username", NameResourceType = typeof(ModelRes.Account.AccountDictionary))]  
Listing 7

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
{
  private PropertyInfo _nameProperty;
  private Type _resourceType;
  public LocalizedDisplayNameAttribute(string displayNameKey)
  : base(displayNameKey)
  {
  }
  public Type NameResourceType
  {
    get 
    {
      return _resourceType;
    }

    set
    {
      _resourceType = value;
      //initialize nameProperty when type property is provided by setter
      _nameProperty = _resourceType.GetProperty(base.DisplayName, BindingFlags.Static | BindingFlags.Public);
    }
  }
  public override string DisplayName
  {
    get
    {
      //check if nameProperty is null and return original display name value
      if (_nameProperty == null)
      {
        return base.DisplayName;
      }
      return (string)_nameProperty.GetValue(_nameProperty.DeclaringType, null);
    }
  }
}  
Fazit

Dieser Artikel hat gezeigt, wie einfach man eine ASP.NET-MVC-Anwendung in mehreren Sprachen zur Verfügung stellen kann. Hat man einmal den Mechanismus konsequent implementiert, ist es leicht, weitere Sprachen in seine Anwendung zu integrieren und somit die Anwenderschaft seines Produkts signifikant zu vergrößern. Nicht zuletzt tut man auf diesem Weg etwas für die Barrierefreiheit und macht die Bedienung seiner Software einfacher und das Arbeiten damit effizienter. Das hier behandelte Beispiel ist als Visual-Studio-Projekt als Download verfügbar.

Timm Bremus arbeitet als IT-Consultant für die Coding Ant GmbH. Er entwickelt dort maßgeschneiderte IT-Lösungen rund um das Portfoliomanagement, die optimal auf die Wertschöpfungsprozesse ausgerichtet sind. Coding Ant unterstützt marktführende Kapitalanlagegesellschaften und Vermögensverwalter dabei, effizienter zu sein. Sein besonderes Interesse gilt der Entwicklung von Server- und Mobileanwendungen sowie WPF und Silverlight (timm.bremus@coding-ant.com).
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -