2

WPF: Resources.resx und Sprache ändern (Localization)

C# bietet die Möglichkeit Strings in einer Resource-Datei abzulegen und diese dann aus dem Code aufzurufen. Ebenfalls ist es möglich so Mehrsprachigkeit zu ermöglichen. Im Folgenden wird beschrieben, wie das in einer WPF-Anwendung angewendet werden kann.

  • Als erstes erstellt man sich mehrere Resources-Dateien im Properties-Ordner.
    • Resources.resx
    • Resources.de-DE.resx
    • Resources.en-US

    Resources.resx ist die Standard-Datei. Auf diese wird zurückgesprungen, falls ein String in den Sprach-Resources-Dateien nicht gefunden wird. Das kann ausgenutzt werden, wenn man Strings definieren will, die in jeder Sprache gleich sind. Zum Beispiel der Name des Programms oder ähnliches. Diese werden also nur in der Resources.resx angelegt.
    Die sprachspezifischen Dateien müssen den jeweiligen Länder-Code im Namen enthalten.

    Wichtig: Um aus den XAML-Dateien auf die Resources-Dateien zugreifen zu können, muss der Access Modifier im Designer auf Public geändert werden.

  • Als nächsten Schritt setzt man in der App.xaml.cs im App()-Konstruktor die gewünschte Sprache:

    string culture = "de-DE";
    System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
    System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo(culture);
    MYPROGRAMNAME.Properties.Resources.Culture = new CultureInfo(culture);
    

    MYPROGRAMNAME muss mit dem eigenen Projekt-Namen ersetzt werden.
    Diese drei Einstellungen müssen gesetzt werden, damit die Strings sowohl aus den .cs-Dateien als auch aus den .xaml-Dateien der richtigen Sprachdatei geholt werden.

  • Um in .cs-Dateien auf die Resources-Dateien zugreifen zu können, braucht man zunächst in jeder dieser .cs-Dateien einen ResourceManager. Dieser muss nicht neu erstellt werden, sondern kann einfach geholt werden:

    private static ResourceManager resManager = MYPROGRAMNAME.Properties.Resources.ResourceManager;
    

    MYPROGRAMNAME muss wieder mit dem eigenen Projekt-Namen ersetzt werden.

    Auf die Strings aus den Resourcen kann man dann folgendermaßen Zugreifen:

    resManager.GetString("MYSTRING");
    

    MYSTRING ist der Bezeichner des Strings in den Ressourcen.

  • Um in XAML-Dateien die Ressourcen-Strings zu verwenden, muss zunächst der Namespace angegeben werden. Dazu im allerersten Tag (hier Window) als ein Attribut setzen. Ich wähle die Abkürzung resx:

    <Window ...
        xmlns:resx="clr-namespace:MYPROGRAMNAME.Properties" >
    

    MYPROGRAMNAME ist durch den Projekt-Namen zu ersetzen.
    Dann kann man so darauf zugreifen: (hier anhand eines Buttons erklärt)

    <Button Content="{x:Static resx:Resources.MYSTRING}" />
    

    MYSTRING ist der Bezeichner des Strings in den Ressourcen.

  • Zusätzlich noch einige Tipps:

  • Um einen Zeilenumbruch im Designer der Ressourcen zu erreichen, drückt man [Shift]+[Return]
  • Auch Variablen kann man in den Resourcen anzeigen. Dazu setzt man in den Strings Platzhalter: {0}, {1}, usw… In den .cs-Dateien gibt man dann die Variablen per string.Format weiter.

    string.Format(resManager.getString("MYSTRING"), VARIABLENAME)
    

    MYSTRING muss durch den Resourcen-String ersetzt werden, VARIABLENAME durch die Variable, die anstelle des „{0}“ angezeigt werden soll.

2 Kommentare

  1. Hallo,

    Danke für den tollen und hilferichen Artike. Die Localization klappt super bei mir. Nun eine kleine Frage, ist es möglich die Cultur, Sprache zu ändern während das Programm läuft ? Oder kann man die Sprache nur in der App.xaml.cs festelgen und dann nicht mehr yur Laufzeit ändern ?

    Liebe Grüße,
    Rosa

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert