Ich kann die Lokalisierung einfach nicht zum Laufen bringen.
Ich habe eine Klassenbibliothek. Jetzt möchte ich dort Resx- Dateien erstellen und einige Werte basierend auf der Thread-Kultur zurückgeben.
Wie kann ich das machen?
Ich kann die Lokalisierung einfach nicht zum Laufen bringen.
Ich habe eine Klassenbibliothek. Jetzt möchte ich dort Resx- Dateien erstellen und einige Werte basierend auf der Thread-Kultur zurückgeben.
Wie kann ich das machen?
Antworten:
strings.resx
.System.Threading
undSystem.Globalization
Führen Sie diesen Code aus:
Console.WriteLine(Properties.strings.Hello);
Es sollte "Hallo" drucken.
Fügen Sie nun eine neue Ressourcendatei 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, jedoch mit dem Wert in Französisch (Name = "Hallo", Wert = "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 keine gefunden (da wir "fr" in Ihrer Datei angegeben haben "). Es wird dann auf die Suche nach" fr "zurückgegriffen, die es findet (und verwendet).
Der folgende Code gibt "Hallo" aus:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
Dies liegt daran, dass keine "en-US" -Ressource und auch keine "en" -Ressource gefunden wird, sodass auf die Standardeinstellung zurückgegriffen wird, die wir von Anfang an hinzugefügt haben.
Bei Bedarf können Sie 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 die Zeichenfolgen hinzufügen, die sich von der Ressource unterscheiden, auf die zurückgegriffen werden würde. Wenn ein Text in Frankreich und Kanada identisch ist, können Sie ihn in strings.fr.resx einfügen, während Zeichenfolgen, die sich in kanadischem Französisch unterscheiden, in strings.fr-CA.resx eingefügt werden können.
Access Modifier
sollte Public
für die zu generierende Ressourcenklasse festgelegt werden. Die Klasse befindet sich nicht unbedingt im Eigenschaften-Namespace. Hier platzieren Sie die .resx-Datei.
Eigentlich ist es ganz einfach. Erstellen Sie beispielsweise eine neue Ressourcendatei Strings.resx
. Set Access Modifier
zu Public
. Verwenden Sie die entsprechende Dateivorlage, damit Visual Studio automatisch eine Accessor-Klasse generiert ( Strings
in diesem Fall lautet der Name ). Dies ist Ihre Standardsprache.
Wenn Sie beispielsweise die deutsche Lokalisierung hinzufügen möchten, fügen Sie eine lokalisierte Resx-Datei hinzu. Dies ist normalerweise Strings.de.resx
in diesem Fall der Fall. Wenn Sie beispielsweise für Österreich eine zusätzliche Lokalisierung hinzufügen möchten, erstellen Sie zusätzlich eine Strings.de-AT.resx
.
Erstellen Sie nun eine Zeichenfolge - sagen wir eine Zeichenfolge mit dem Namen HelloWorld
. Fügen Sie in Ihrem Strings.resx
diesen String mit dem Wert "Hallo Welt!" Hinzu. In Strings.de.resx
, fügen Sie "Hallo, Welt!". Und Strings.de-AT.resx
fügen Sie "Servus, Welt!" Hinzu. Das war's soweit.
Jetzt haben Sie diese generierte Strings
Klasse und sie hat eine Eigenschaft mit einem Getter HelloWorld
. Wenn Sie diese Eigenschaft erhalten, 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" Hallo Welt! ", wenn Ihr Gebietsschema etwas anderes ist. Wenn eine Zeichenfolge ist In der lokalisierten Version fehlt der Ressourcenmanager automatisch die Kette, von der spezialisiertesten zur invarianten Ressource.
Sie können die ResourceManager
Klasse verwenden, um mehr Kontrolle darüber zu erhalten, wie genau Sie Dinge laden. Die generierte Strings
Klasse verwendet es ebenfalls.
Um die Lokalisierung zu einem Formular hinzuzufügen , gehen Sie wie folgt vor: @Fredrik Mörks großartige Antwort auf Zeichenfolgen :
"Localizable"
auftrue
Language
Eigenschaft des Formulars in die gewünschte Sprache (aus einem netten Dropdown-Menü mit allen in).Bearbeiten: Dieser MSDN-Artikel zum Lokalisieren von Windows Forms ist nicht der ursprüngliche, den ich verlinkt habe ... kann aber bei Bedarf mehr Licht ins Dunkel bringen. (der alte wurde weggenommen)
Tolle Antwort von F.Mörk. Wenn Sie jedoch die Übersetzung aktualisieren oder neue Sprachen hinzufügen möchten, sobald die Anwendung veröffentlicht wurde, stecken Sie fest, da Sie sie immer neu kompilieren müssen, um die resources.dll zu generieren.
Hier ist eine Lösung zum manuellen Kompilieren einer Ressourcen-DLL. Es verwendet die Tools resgen.exe und al.exe (mit dem SDK installiert).
Angenommen, Sie haben eine Strings.fr.resx-Ressourcendatei. Sie können 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 beizubehalten (hier "WpfRibbonApplication1").
Eine Korrektur und Ausarbeitung der Antwort von @Fredrik Mörk .
strings.resx
Ihrem Projekt eine Ressourcendatei hinzu (oder einen anderen Dateinamen).Access Modifier
auf Public
(in der geöffneten strings.resx
Datei tab)Hello
, Wert Hello
)Visual Studio generiert automatisch eine entsprechende strings
Klasse, in die tatsächlich eingefügt wird strings.Designer.cs
. Die Klasse befindet sich im selben Namespace, in dem eine neu erstellte .cs
Datei abgelegt werden soll.
Dieser Code wird immer gedruckt 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)Hello
, Wert Salut
)Der folgende Code wird gedruckt Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
Welche Ressource verwendet wird, hängt davon ab Thread.CurrentThread.CurrentUICulture
. Sie wird abhängig von der Spracheinstellung der Windows-Benutzeroberfläche festgelegt oder kann wie in diesem Beispiel manuell festgelegt werden. Mehr dazu hier .
Sie können länderspezifische Ressourcen wie strings.fr-FR.resx
oder hinzufügen strings.fr-CA.resx
.
Die zu verwendende Zeichenfolge wird in dieser Prioritätsreihenfolge festgelegt:
strings.fr-CA.resx
strings.fr.resx
strings.resx
Beachten Sie, dass sprachspezifische Ressourcen Satellitenassemblys generieren .
Erfahren Sie auch, wie CurrentCulture
sich von CurrentUICulture
hier unterscheidet .
Zusätzlich zu @Eric Bole-Feysot Antwort:
Dank Satelliten-Assemblys kann die Lokalisierung basierend auf DLL- / EXE- Dateien erstellt werden. Diesen Weg:
Es gibt ein wenig bekanntes Tool namens LSACreator (kostenlos für nichtkommerzielle Zwecke oder Kaufoptionen), mit dem Sie eine Lokalisierung basierend auf DLL- / EXE-Dateien erstellen können. Intern (im Verzeichnis des Sprachprojekts) werden lokalisierte Versionen von Resx-Dateien erstellt / verwaltet und eine Assembly auf ähnliche Weise wie bei @Eric Bole-Feysot beschrieben kompiliert .
ResourceManager und .resx sind etwas chaotisch.
Sie können Lexical.Localization ¹ verwenden, mit dem Standardwerte und kulturspezifische Werte in den Code eingebettet und in externe Lokalisierungsdateien für weitere Kulturen (wie .json oder .resx) erweitert werden können.
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
¹ (Ich bin Betreuer dieser Bibliothek)
Im Allgemeinen legen Sie Ihre Übersetzungen in Ressourcendateien ab, z. B. resources.resx.
Jede spezifische Kultur hat einen anderen Namen, z. B. resources.nl.resx, resources.fr.resx, resources.de.resx,…
Der wichtigste Teil einer Lösung besteht nun darin, Ihre Übersetzungen zu pflegen. Installieren Sie in Visual Studio das Microsoft MAT-Tool: Multilingual App Toolkit (MAT). Funktioniert mit winforms, wpf, asp.net (core), uwp,…
Im Allgemeinen, z. B. für eine WPF-Lösung, im WPF-Projekt
[assembly: System.Resources.NeutralResourcesLanguage("en")]
Sie werden sehen, dass ein neuer Ordner mit dem Namen "MultilingualResources" erstellt wird, der eine ....nl.xlf
Datei enthält.
Jetzt müssen Sie nur noch Folgendes tun:
(Die XLF-Dateien sollten mit dem "Mehrsprachigen Editor" geöffnet werden. Wenn dies nicht der Fall ist, klicken Sie mit der rechten Maustaste auf die XLF-Datei, wählen Sie "Öffnen mit ..." und wählen Sie "Mehrsprachiger Editor".
Habe Spaß! Jetzt können Sie auch sehen, was nicht übersetzt wurde, Übersetzungen in xlf an externe Übersetzungsunternehmen exportieren, erneut importieren, Übersetzungen aus anderen Projekten recyceln usw.
Mehr Info: