Lokalisierung mit WinRT

6. Dezember 2012
Bei der Programmierung von Anwendungen spielt oftmals Lokalisierung eine wichtige Rolle, um sowohl die Anwendung international anbieten als auch dem Anwender den Komfort geben zu können, seine gewünschte Sprache einzustellen. Auch in WinRT ist Lokalisierung ein Thema, gerade weil im Windows Store per default nur Anwendungen in der Betriebssystemsprache angeboten werden.

Für den Entwickler bietet WinRT eine einfache Möglichkeit, Anwendungen zu lokalisieren. Damit die App bei allen unterstützten Sprachen im Windows Store aufgelistet wird, müssen diese Sprachen zunächst im AppxManifest definiert werden. Dort gibt es einen Abschnitt Resources, in dem alle verfügbaren Sprachen angegeben werden:

   1: <Resources>

   2:   <Resource Language="x-generate" />

   3:   <Resource Language="en" />

   4:   <Resource Language="de" />

   5: </Resources>

Für die lokalisierten Daten selbst werden ResW-Dateien verwendet, in denen Zeichenfolgen als Key-Value-Paar abgespeichert werden. Diese Dateien sind Ressourcendateien mit der Build Action PRIResource und können mit dem in Visual Studio integrierten Editor bearbeitet werden.

Der Zugriff auf diese Dateien erfolgt mit Hilfe der Klasse ResourceLoader. Darüber können diese Dateien sowohl manuell durch Angabe des Namens als auch automatisch geladen werden, wenn sie Resources.resw heißen. Um sprachspezifische Ressourcen zu verwalten und automatisch die richtige laden zu lassen, sind Ordner zu erstellen, die mit einem entsprechenden Culture Name benannt sind. Dadurch werden genau die für die eingestellte Sprache hinterlegten Ressourcen-Dateien geladen:

image

Strings in XAML

Um auf die lokalisierten Strings zuzugreifen, können XAML-Elemente direkt an die hinterlegten Ressourcen gebunden werden.

Hierzu sind folgende Schritte notwendig:

  • Hinzufügen eines x:Uid-Attributes auf dem Element,

    z. B. <TextBlock x:Uid="HelloWorld" />
  • In der Ressourcen-Datei entsprechende Einträge im Format [Uid].[Property] hinterlegen. Dadurch ist es möglich, mehrere Eigenschaften zu einer Uid zu setzen, z. B. den Text und die Schriftgröße über HelloWorld.Text und HelloWorld.FontSize.

Obwohl als Werte nur Strings hinterlegt werden, können für alle Eigenschaften, für die es vom Framework bereitgestellte Converter gibt, Werte hinterlegt werden. Es ist also möglich, z. B. für eine Color-Eigenschaft die Werte Green oder #00FF00 zu hinterlegen, die automatisch in die passenden Typen umgewandelt werden. Eigene Converter können jedoch nicht verwendet werden.

Die Uid ist auch nicht auf die Verwendung auf genau einem Element beschränkt. Es können mehrere Elemente auf die gleiche Uid verweisen, wodurch alle Elemente die gleichen Eigenschaften bekommen.

Manuelles Laden von Strings

Strings können manuell aus den Ressourcen-Dateien über die Klasse ResourceLoader geladen werden. Zunächst wird ein Objekt der Klasse ResourceLoader instanziiert, danach kann über die GetString-Methode auf die Werte zugegriffen werden.

   1: var loader = new ResourceLoader();

   2: loader.GetString("HelloWorld");

Um eine spezifische Datei zu laden, kann diese dem Konstruktor als String mitgegeben werden:

   1: var customLoader = new ResourceLoader("Custom");

   2: var str = customLoader.GetString("MyString");

Weitergehende Betrachtungen

Wer sich umfassender über die Möglichkeiten der Lokalisierung unter WinRT informieren möchte, dem sei die Artikelreihe „Building Global Windows 8 Metro XAML Apps“ empfohlen. Hier werden Themen wie z. B. die Lokalisierung von Bildern, der interne Aufbau der Ressourcen-Dateien, UnitTests und auch das Laden von Ressourcen aus Assemblies behandelt.

Building Global Windows 8 Metro XAML Apps Part 1–Localizing Strings

Building Global Windows 8 Metro XAML Apps Part 2 Localizing Files and Custom Layouts

PRI Files Deep Dive – Building Global Windows 8 Metro XAML Apps Part 3