Die Lokalisierung .NET; Fallback-Sprache bei der Verwendung von ResourceManager
Ich war vor kurzem eintauchen in die Lokalisierung mit .NET. Im wesentlichen habe ich gelernt, wie man ein Formular anzupassen (Verwendung der Sprache und die Localizable-Eigenschaft), und ändern Sie dann die Kultur entsprechend.
Allerdings fand ich, dass bei der Migration von meinem hart codiert englischen strings in den automatisch erstellten Ressourcendateien, und verwenden Sie .GetString("Key") - na ja, sagen wir einfach, es war nicht glücklich :P.
Habe ich beschlossen, einen separaten resx-Dateien ausschließlich mit der hart codierten string-übersetzungen. Sie folgten der Konvention/Anforderung der [name].[Kultur-code].resx. Ich machte von dieser für die jeweilige Sprache; z.B. appstrings.de.resx (Für Deutsche) und appstrings.resx (als invariante baseline).
Zur Nutzung dieser neuen Ressourcen, erstellte ich eine Instanz der ResourceManager-und Ressourcen-Festlegen
Dim resManager As New ResourceManager("LanguageTest.appstrings", Assembly.GetExecutingAssembly)
Dim resSet As ResourceSet = resManager.GetResourceSet(My.Application.UICulture, True, True)
Die aktuelle UI-Kultur gesetzt wurde (zum Beispiel Deutsch) mit
My.Application.ChangeUICulture("de")
Original-Ausgabe
Es sei denn, der resSet.GetString("Key") ist ausdrücklich definiert in der appstrings.de.resx, es gibt eine leere Zeichenfolge. Gibt es trotzdem kann ich es machen fallback auf die appstrings.resx (wobei "Key" existiert), das ich davon ausgegangen wäre, die Standard-baseline?
Update
Rhapsody machte ein Vorschlag unten, während der eigentliche Tipp selbst nicht funktioniert, es hat in der Tat Funken ein interessanter Punkt, der mit resManager.GetString("Key"), im Gegensatz zu resSet.GetString("Key"). Dies scheint zu arbeiten, ohne Fehler bisher. Das heißt, Werte zu präsentieren, die in der spezialisierten Sprache Datei zurückgegeben, während die 'fehlenden' Werte fallen wieder auf die Standard-Kultur, wenn der Zugriff von einem einzigen Schlüssel.
Späteren Ausgabe
Die einzige Verbleibende Frage wäre, ob die Auswirkungen auf die Leistung mit ResourceManger im Gegensatz zu einem Cache ResourceSet werden, die schädlich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, die Deklaration einer default-Kultur für die Anwendung wie unten
Dieser code deklariert, dass Ihre Standard-Kultur en-US. In deinem Beispiel, wenn die aktuelle Kultur "de-DE" es sieht für für Ressourcen in "de-DE", dann sieht das für die Eltern "de" Kultur und so weiter und Ultimatly geht zu der angegebenen Kultur (en-US) Ressource-Datei. siehe MSDN für fallback-Strategien von resourceManage.
Der obige code normalerweise geht das in der assenblyInfo.cs. Der zweite parameter sagt der Ressource-manager, wo sind die Ressourcen, die sich in Haupt -, Montage-oder Sat.
Leider wird bei dieser Lösung ist die Verwendung einer Kultur den Namen, Nicht die Ressource-Datei Namen. allerdings könnte man erweitern RM für die Verwendung einer bestimmten Ressource-Datei Namen, Sondern seinen Weg einfacher zu Holen, eine Standard-Kultur und benennen Sie die Ressource-Datei, die Kultur und haben Sie die Lösung aus der box.
Versuchen
Wo
Strings
ist der name der resx-Dateien in Ihrem Projekt.Diese wird automatisch wieder dem baseline-Wert, wenn es nicht für die aktuelle Kultur.
Es ist ein einfaches Beispiel, möchten Sie vielleicht, um es narrensicher.
Habe ich einmal erstellt eine web-Anwendung, die hatte en-US als fallback-Sprache, sondern haben andere mehr spezifisch, wie .de basierend auf den Einstellungen in der Benutzer-web-browser
Im Grunde, um es arbeiten ich die xml im web.config
Von dort aus benutzte ich die interne statische ResourceManager aus .cs-Datei, die mit der Standard-Sprache, z.B.
und in .aspx-Dateien:
Wie ich es verstehe, dann ist es bezeichnend, wo Ihre .cs-Datei enthält die ResourceManager-Klasse lebt, ist es hinter dem .de-Sprachdatei oder die fallback-Sprache ? Da es kompiliert als ein seperate Sat-Montage, dann ist es davon abhing, wo die .cs-Klasse kompiliert wird und was die Satelliten-assembly, in der Sie ein Teil ist.
Als eine Regel, die ich schon immer hatte der ResourceManager-Klasse als ein code hinten auf der en-US, weil die Sprache, die ich verwenden möchten, die als fallback-Sprache, wenn die mehr spezifisch sind, nicht gefunden
Mit diesem setup, ich habe noch nie einen leeren Wert, es ist immer die fallbacksprache, obwohl ich die swap-satellite-assemblies zur Laufzeit.