I18N – Es mangelt an Ressourcen

Heute möchte ich einen kurzen Einblick in bzw. ein paar Tipps für Resource-Dateien in C#.NET geben. Für alle, denen der erste Teil der Überschrift – i18n – nichts sagt, sei zuerst dieser Link ans Herz gelegt. Wem das zuviel zu lesen ist: es geht um Übersetzungen für Anwendungen.

Resource-Dateien (mit der Dateiendung *.resx) werden in klassischen C#-Projekten dazu verwendet, verschiedene Ressourcen für unterschiedliche Sprachen zu definieren. Das können Texte sein, aber beispielsweise auch Bilder. Mir geht es heute um Texte, also um Strings. Einen String direkt an der Stelle zu schreiben, an der er verwendet wird, ist – in meinen Augen – nicht optimal. Möglicherweise benötige ich den String an mehreren Stellen, unter Umständen fällt mir irgendwann ein, dass er geändert werden muss. Und dann vergesse ich sicher eine Stelle. Daher definiere ich mir meine Strings alle als Konstanten (Ausnahme: Log-Nachrichten) und verwende diese im Code. Allerdings handelt es sich dabei nicht um Texte, die der Anwender des Programms zu sehen bekommt, sondern um Dateipfade, Bezeichner oder was ich sonst so benötige.

Nehmen wir an, ich schreibe folgenden Text in meinem Code und weise ihn einem (WinForms-) Label zu, das in meiner Oberfläche angezeigt wird:

Den Text kann ich natürlich in eine Konstante auslagern. Allerdings schlägt mir ReSharper vor, diesen Text in eine Resource-Datei auszulagern. Über die Quick-Fix Aktion von ReSharper (Alt + Enter) wähle ich aus, den Text auszulagern, und gebe ihm den Namen USER_LABEL. ReSharper erzeugt mir automatisch eine Resources.resx Datei – wenn diese noch nicht vorhanden ist – und schreibt da für den Eintrag USER_LABEL den Wert Dieser Text ist für den Anwender sichtbar. rein. Soweit, so gut. Im Code steht nun Folgendes:

Wenn ich mit der Maus über USER_LABEL fahre, wird mir ein Kommentar angezeigt, welcher mir erklärt, welcher Text sich dahinter verbirgt.

Doch wie komme ich jetzt zu meiner Übersetzung? Im ersten Schritt kopiere ich die *.resx-Datei und füge sie an gleicher Stelle noch einmal ein. Die Kopie benenne ich um in Resources.en.resx, für meine englische Übersetzung. Darin passe ich den Text für das Label an, in dem ich ihn mit dem passenden englischen Äquivalent ersetze. Fertig. Visual Studio erzeugt jetzt sogenannte Satelit-Bibliotheken für jede Sprache, für die eine Resource-Datei existiert. Abhängig von der eingestellten Sprache der Anwendung wird entweder die deutsche Datei (default) oder die englische Datei gewählt.

Strings in Resource-Dateien können auch Zeilenumbrüche enthalten. Allerdings dürft ihr dafür im Resource-Editor nicht \n oder \n\r einfügen, sondern müsst mit Shift+Enter einen Umbruch erzeugen.

Außerdem kann man die ausgelagerten Strings auch mit Platzhaltern versehen und dann zur Laufzeit befüllen. Nehmen wir folgenden String, der in der Resource-Datei für einen Schlüssel PRODUCT_ADVERTISEMENT hinterlegt ist:

Dann kann ich in meinem Code den String über die Funktion string.Format mit Werten für den Produktnamen und das Datum befüllen, in etwa so:

Somit habe ich mit Texten in Resource-Dateien annähernd genauso viele Möglichkeiten wie mit Konstanten oder Variablen. Allerdings kann ich zusätzlich Übersetzungen verwenden, ohne meinen Code anpassen zu müssen.

 

Leave a Reply

Your email address will not be published. Required fields are marked *