So verwenden Sie die Lokalisierung in C #

Ich kann einfach keine Lokalisierung zur Arbeit bringen.

Ich habe eine classnbibliothek. Jetzt möchte ich resx- Dateien dort erstellen und einige Werte basierend auf der Thread-Kultur zurückgeben.

Wie kann ich das machen?

  • Fügen Sie Ihrem Projekt eine Ressourcendatei hinzu (Sie können es “strings.resx” nennen), indem Sie folgendermaßen vorgehen:
    Klicken Sie mit der rechten Maustaste auf Eigenschaften im Projekt, wählen Sie Hinzufügen -> Neues Element … im Kontextmenü, dann wählen Sie in der Liste der Visual C # -Elemente die Option “Ressourcendatei” und nennen Sie sie strings.resx .
  • Fügen Sie eine Zeichenfolge resouce in der resx-Datei hinzu und geben Sie ihr einen guten Namen (Beispiel: benennen Sie sie mit “Hello” und geben Sie ihr den Wert “Hello”)
  • Speichern Sie die Ressourcendatei ( Hinweis: Dies ist die Standard- Ressourcendatei, da sie keinen aus zwei Buchstaben bestehenden Sprachcode hat)
  • Fügen Sie Verweise auf Ihr Programm hinzu: System.Threading und System.Globalization

Führen Sie diesen Code aus:

 Console.WriteLine(Properties.strings.Hello); 

Es sollte “Hallo” drucken.

Fügen Sie nun eine neue Ressourcedatei mit dem Namen “strings.fr.resx” hinzu (beachten Sie den Teil “fr”; dieser enthält Ressourcen in französischer Sprache). Fügen Sie eine Zeichenfolgenressource mit demselben Namen wie in strings.resx hinzu, aber mit dem Wert in Französisch (Name = “Hello”, Value = “Salut”). Wenn Sie nun den folgenden Code ausführen, sollte Salut gedruckt werden:

 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(Properties.strings.Hello); 

Was passiert, ist, dass das System nach einer Ressource für “fr-FR” sucht. Es wird keinen finden (da wir in Ihrer Datei “fr” angegeben haben). Es wird dann darauf zurückgegriffen, nach “fr” zu suchen, welches es findet (und verwendet).

Der folgende Code wird “Hallo” drucken:

 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); Console.WriteLine(Properties.strings.Hello); 

Das liegt daran, dass es keine “en-US” -Ressource und auch keine “en” -Ressource findet, so dass es auf den Standard zurückgreift, der von Anfang an hinzugefügt wurde.

Sie können bei Bedarf Dateien mit spezifischeren Ressourcen erstellen (z. B. strings.fr-FR.resx und strings.fr-CA.resx für Französisch in Frankreich bzw. Kanada). In jeder dieser Dateien müssen Sie die Ressourcen für diese Zeichenfolgen hinzufügen, die sich von der Ressource unterscheiden, auf die sie zurückgreifen würde. Wenn also ein Text in Frankreich und Kanada gleich ist, können Sie ihn in strings.fr.resx ablegen, während Strings, die im kanadischen Französisch anders sind, in strings.fr-CA.resx eingehen könnten.

Es ist eigentlich ganz einfach. Erstellen Sie eine neue Ressourcendatei, z. B. Strings.resx . Setzen Sie Access Modifier auf Public . Verwenden Sie die Apprioriate-Dateivorlage, damit Visual Studio automatisch eine Accessorklasse generiert (in diesem Fall lautet der Name Strings ). Dies ist Ihre Standardsprache.

Wenn Sie nun beispielsweise die deutsche Lokalisierung hinzufügen möchten, fügen Sie eine lokalisierte resx-Datei hinzu. Dies wird in diesem Fall in der Regel Strings.de.resx . Wenn Sie zusätzliche Lokalisierung für zB Österreich hinzufügen möchten, erstellen Sie zusätzlich eine Strings.de-AT.resx .

Jetzt erstellen Sie eine Zeichenfolge – sagen wir eine Zeichenfolge mit dem Namen HelloWorld . Strings.resx in Ihrer Strings.resx diese Zeichenfolge mit dem Wert “Hello, world!” Strings.resx . In Strings.de.resx füge “Hallo, Welt!” Strings.de.resx . Und in Strings.de-AT.resx , fügen Sie “Servus, Welt!” Strings.de-AT.resx . Das ist es soweit.

Jetzt haben Sie diese generierte Strings class, und sie hat eine Eigenschaft mit einem Getter HelloWorld . Wenn Sie diese Eigenschaft bekommen, wird “Servus, Welt!” Wenn Ihr Gebietsschema de-AT ist, “Hallo, Welt! wenn Ihr Gebietsschema ein anderes Gebietsschema ist (einschließlich de-DE und de-CH), und” Hello, World! “wenn Ihr Gebietsschema etwas anderes ist. Wenn ein String ist In der lokalisierten Version fehlt der Ressourcenmanager automatisch die Kette von der am meisten spezialisierten zur invarianten Ressource.

Sie können die ResourceManager class für mehr Kontrolle darüber verwenden, wie genau Sie Objekte laden. Die generierte Strings class verwendet sie ebenfalls.

Große Antwort von F.Mörk. Wenn Sie jedoch nach der Veröffentlichung der Anwendung die Übersetzung aktualisieren oder neue Sprachen hinzufügen möchten, stecken Sie fest, da Sie sie immer neu kompilieren müssen, um die Datei resources.dll zu generieren.

Hier ist eine Lösung zum manuellen Kompilieren einer Ressource-DLL. Es verwendet die Tools resgen.exe und al.exe (installiert mit dem SDK).

Angenommen, Sie haben eine Strings.fr.resx-Ressourcendatei, können Sie eine Ressourcen-DLL mit dem folgenden Stapel kompilieren:

 resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll" del WpfRibbonApplication1.Strings.fr.resources pause 

Achten Sie darauf, den ursprünglichen Namespace in den Dateinamen zu behalten (hier “WpfRibbonApplication1”)

Darüber hinaus @Fredrik Mörk große Antwort auf Strings, um Lokalisierung zu einem Formular hinzuzufügen , tun Sie Folgendes:

  • Legen Sie die Eigenschaft des Formulars "Localizable" auf true
  • Ändern Sie die Language Eigenschaft des Formulars in die gewünschte Sprache (aus einem Drop-down-Menü mit allen darin)
  • Übersetze die Steuerelemente in dieser Form und verschiebe sie wenn nötig (zerquetsche diese wirklich langen, vollständigen französischen Sätze!)

Dieser MSDN-Artikel zum Lokalisieren von Windows Forms gibt weitere Informationen dazu.

Eine Reparatur und Ausarbeitung von @Fredrik Mörk Antwort.

  • Fügen Strings.resx Ihrem Projekt eine Strings.resx Ressourcendatei hinzu (oder einen anderen Dateinamen)
  • Setzen Sie Access Modifier auf Public (in der geöffneten Registerkarte Strings.resx Datei)
  • Fügen Sie eine Zeichenfolge resouce in der resx-Datei hinzu: (Beispiel: Name Hello , Wert Hello )
  • Speichern Sie die Ressourcendatei

Visual Studio generiert automatisch eine entsprechende Strings class, die tatsächlich in Strings.Designer.cs platziert Strings.Designer.cs . Die class befindet sich im selben Namespace, in dem Sie eine neu erstellte .cs Datei erwarten würden.

Dieser Code gibt immer Hello , da dies die Standardressource ist und keine sprachspezifischen Ressourcen verfügbar sind:

 Console.WriteLine(Strings.Hello); 

Fügen Sie nun eine neue sprachspezifische Ressource hinzu:

  • Strings.fr.resx (für Französisch)
  • Fügen Sie eine Zeichenfolge mit dem gleichen Namen wie zuvor, aber anderen Wert hinzu: (Name Hello , Wert Salut )

Der folgende Code druckt Salut :

 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); Console.WriteLine(Strings.Hello); 

Welche Ressource verwendet wird, hängt von Thread.CurrentThread.CurrentUICulture . Sie wird abhängig von der Windows-Benutzeroberflächensprache festgelegt oder kann wie in diesem Beispiel manuell festgelegt werden. Erfahren Sie mehr darüber hier .

Sie können länderspezifische Ressourcen wie Strings.fr-FR.resx oder Strings.fr-CA.resx .

Die zu verwendende Zeichenfolge wird in dieser Prioritätsreihenfolge festgelegt:

  • Von länderspezifischen Ressourcen wie Strings.fr-CA.resx
  • Von sprachspezifischen Ressourcen wie Strings.fr.resx
  • Von Standard- Strings.resx

Beachten Sie, dass sprachspezifische Ressourcen Satelliten-Assemblys generieren.

CurrentUICulture auch, wie sich CurrentCulture von CurrentUICulture unterscheidet.

Neben @Eric Bole-Feysot Antwort:

Dank Satelliten-Assemblies kann Lokalisierung basierend auf .dll / .exe- Dateien erstellt werden. Diesen Weg:

  • Quellcode (VS-Projekt) könnte vom Sprachprojekt getrennt werden,
  • das Hinzufügen einer neuen Sprache erfordert keine Neukompilierung des Projekts,
  • die Übersetzung könnte sogar vom Endbenutzer vorgenommen werden.

Es gibt ein wenig bekanntes Tool namens LSACreator (kostenlos für nichtkommerzielle Nutzung oder Kauf-Option), mit dem Sie eine Lokalisierung basierend auf .dll / .exe-Dateien erstellen können. Tatsächlich erstellt / verwaltet intern (im Verzeichnis des Sprachprojekts) lokalisierte Versionen von Resx-Dateien und kompiliert eine Assembly auf ähnliche Weise wie @Eric Bole-Feysot beschrieben.

In meinem Fall

 [assembly: System.Resources.NeutralResourcesLanguage("ru-RU")] 

in der AssemblyInfo.cs verhindert Dinge wie üblich zu arbeiten.