2016-04-15 29 views
1

Wir haben einen seltsamen Fehler mit unseren lokalisierten Ressourcen in Chinesisch, wenn .Net 3.5 verwendet. Dieses Problem betrifft Konsolenanwendungen UND Windows Forms-Apps und ist einfach zu reproduzieren.Chinesische Ressourcen funktionieren nicht mit .Net 3.5

Grundsätzlich werden die chinesischen Ressourcen nicht verwendet, aber andere Ressourcen (z. B. Französisch und Englisch) werden verwendet. Außerdem funktioniert es gut, wenn wir .Net 4.x verwenden.

Es läuft auf Windows 7 und Windows 10 falsch (Ich habe Windows 8.x nicht versucht, aber ich erwarte, dass das auch schief gehen würde).

Es ist einfach, mit einer Konsole-Anwendung zu reproduzieren:

  1. Erstellen Sie eine Standard .NET 3.5-Konsolenanwendung.
  2. eine Standard-Ressource-Datei hinzufügen „Resources.resx“ und ihm einen Namen/Wert-Paar hinzu: -Test, ich bin Englisch
  3. eine „Resources.fr.resx“ Datei hinzufügen und ihm hinzufügen ein Name/Wert-Paar: -Test, ich bin Französisch
  4. eine "Resources.zh.resx" Datei hinzufügen und ihm einen Namen/Wert-Paar hinzu: -Test, ich bin Chinese
  5. Fügen sie den Code unten zu der Main() Methode

Code:

System.Threading.Thread.CurrentThread.CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentCulture; 
Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentUICulture); 
Console.WriteLine(ConsoleApplication1.Properties.Resources.Test); 

(Die erste Zeile ist nur eine Bequemlichkeit, so dass wir diesen Code auf einem nicht-chinesisches System testen. Wir können diese Zeile entfernen, wenn sie auf einem tatsächlichen chinesischen System ausgeführt wird, weil das CurrentUICulture-Gebietsschema bereits Chinesisch ist, ohne dass es geändert werden muss - und der Fehler weiterhin auftritt.

In der Systemsteuerung | Region, ändern Sie das Format in Englisch (USA) und führen Sie das Programm aus. Der Ausgang wird sein:

en-US 
I'm English 

nun die Region Format-Französisch (Frankreich) ändern und das Programm auszuführen. Der Ausgang wird sein:

fr-FR 
I'm French 

nun die Region Format Chinesisch ändern (vereinfacht, China) und das Programm auszuführen. Die Ausgabe ist:

zh-CN 
I'm English 

Beachten Sie, dass es nicht funktioniert.

Ändern Sie jetzt die Projekteigenschaften, um eine .Net 4 oder höhere Version zu erstellen, ohne etwas anderes zu ändern, und führen Sie sie erneut aus. Jetzt ist der Ausgang:

zh-CN 
I'm Chinese 

So funktioniert es mit .Net 4!

Meine Fragen sind:

  • Kann jemand anderes dieses reproduzieren?
  • Ist das ein bekannter Fehler?
  • Gibt es einen Workaround?
+1

Bit einer Landmine, zh-CN und zh-CHS und zh-Hans alle bedeuten vereinfachtes Chinesisch. Wenn Sie eine Übereinstimmung auf zh-CN möchten, müssen Sie das vereinfachte Chinesisch auswählen, das spezifisch für das chinesische Festland ist. Betitelt "Chinesisch (vereinfacht, PRC)" im Designer. Wenn du einen Fallback willst, musst du zh-Hans für deine Ressource verwenden. So ähnlich. –

+0

@HansPassant Ich werde das versuchen. Dies scheint eine Art von Bug zu sein, den sie in .Net 4.x behoben haben, da sie für alle Subkulturen von Chinesisch auf "Resources.zh.resx" zurückgreifen sollte (und tatsächlich in .Net 4.x). Ich habe entdeckt, dass die Verwendung von "Resources.zh-CN.resx" in .Net 3.5 funktioniert, aber dann die anderen Dialekte nicht, würde ich annehmen. –

+0

Ich fand diesen Blog, der verwandt scheint: https://blogs.msdn.microsoft.com/shawnste/2007/12/13/zh-hans-zh-hant-and-the-old-zh-chs-zh- cht /. Auch die [Dokumentation für CultureInfo] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx?f=255&MSPPError=-2147217396) erwähnt dies ausdrücklich, also sieht es so aus Sei die Antwort: Verwende 'zh-Hans' wie du vorgeschlagen hast. –

Antwort

1

Dank Hans Kommentar (was die richtige Antwort war) habe ich jetzt die vollständige Antwort.

Es scheint, dass in .Net 3.5, "zh" NICHT als neutrale chinesische Kultur erkannt wird.

In .Net 4.x wird "zh" als eine neutrale chinesische Kultur anerkannt.

Wir können den Unterschied sehen, indem wir the .Net 3.5 documentation für CultureInfo.IsNeutralCulture mit .Net 4.0 documentation vergleichen.

Die Net 3.5 Dokumentation listet die folgenden neutral und spezifische Ressourcennamen:

zh-CHS Chinese (Simplified)     : neutral 
zh-TW Chinese (Taiwan)      : specific 
zh-CN Chinese (People's Republic of China) : specific 
zh-HK Chinese (Hong Kong S.A.R.)    : specific 
zh-SG Chinese (Singapore)      : specific 
zh-MO Chinese (Macao S.A.R.)     : specific 
zh-CHT Chinese (Traditional)     : neutral 

die .NET 4.0-Dokumentation Änderungen:

zh-Hans Chinese (Simplified)     : neutral 
zh-TW Chinese (Traditional, Taiwan)   : specific 
zh-CN Chinese (Simplified, PRC)    : specific 
zh-HK Chinese (Traditional, Hong Kong S.A.R.) : specific 
zh-SG Chinese (Simplified, Singapore)   : specific 
zh-MO Chinese (Traditional, Macao S.A.R.)  : specific 
zh  Chinese         : neutral 
zh-Hant Chinese (Traditional)     : neutral 
zh-CHS Chinese (Simplified) Legacy    : neutral 
zh-CHT Chinese (Traditional) Legacy   : neutral 

Wir können sehen, dass .NET 4.0 hat gewonnen " zh "als eine neutrale chinesische Kultur.

Dies ist also kein Fehler in .NET 3.5, sondern eine dokumentierte Funktion.

Wenn Sie sowohl mit .Net 3.5 als auch mit .Net 4.x kompatibel sein müssen, müssen Sie "zh-CHS" (für vereinfachtes Chinesisch) verwenden, obwohl nicht klar ist, ob dies weiterhin funktioniert unbegrenzt.