2016-04-15 18 views
1

.Net 3.5を使用すると、中国語のローカライズされたリソースに奇妙なバグがあります。この問題は、コンソールアプリケーションやWindowsフォームアプリケーションに影響し、再現するのは簡単です。中国語のリソースが.Net 3.5で動作しない

中国のリソースは基本的には使用されていませんが、他のリソース(フランス語や英語など)が使用されています。さらに、.Net 4.xを使用するとうまく動作します。

Windows 7とWindows 10では間違っています(Windows 8.xは試していませんが、間違っていると思います)。

これは、コンソールアプリケーションで再現するのは簡単です:

  1. はデフォルト.NET 3.5コンソールアプリケーションを作成します。
  2. は、「Resources.resx」デフォルトのリソースファイルを追加し、それに名前/値のペアを追加します。テスト、私は英語だ
  3. 「Resources.fr.resx」ファイルを追加し、それに追加します名前/値ペア:テスト、私はフランスの
  4. だが、「Resources.zh.resx」ファイルを追加し、それに名前/値のペアを追加します。テストを、私は中国の
  5. だのコードを追加します。 Main()メソッドの下にあります。

コード:私たちは非中国のシステム上でこのコードをテストすることができるように

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

(最初の行は単に便宜上です。 CurrentUICultureのロケールが変更されずに既に中国語になっているため、実際の中国語システムで実行しているときにその行を削除できますが、それでもバグは発生します)。

コントロールパネル|地域、英語(米国)にフォーマットを変更し、プログラムを実行します。出力は次のようになります。

en-US 
I'm English 

フランス語(フランス)に地域の形式を変更し、プログラムを実行します。出力は次のようになります。

fr-FR 
I'm French 

中国語(簡体字、中国)にを地域の形式を変更し、プログラムを実行します。出力は次のようになります。

zh-CN 
I'm English 

これは機能していないことに注意してください。

他に何も変更せずに、プロジェクトのプロパティを変更して.Net 4以降のバージョンをビルドし、再実行します。今度の出力は

zh-CN 
I'm Chinese 

です.Net 4で動作します。

私の質問は以下のとおりです。

  • 誰がこれを再現することはできますか?
  • これは既知のバグですか?
  • 回避策はありますか?
+1

地雷のビット、zh-CNとzh-CHS、およびzh-Hansはすべて簡体字中国語を意味します。あなたがzh-CNにマッチしたければ、中国本土に特化した簡体字中国語を選ぶ必要があります。 "中国語(簡体字、中華人民共和国)"というタイトルのデザイナー。フォールバックが必要な場合は、リソースにzh-Hansを使用する必要があります。そんな感じ。 –

+0

@ハンスパッサン私はそれを試みます。これは、.Net 4.xで修正された何らかのバグのようです。なぜなら、中国語のすべてのサブカルチャーのために "Resources.zh.resx"に戻ってしまうからです(実際は.Net 4.xでもそうです)。私は、 "Resources.zh-CN.resx"を.Net 3.5で使用することを発見しましたが、他の方言は使用できません。 –

+0

関連していると思われるこのブログが見つかりました:https://blogs.msdn.microsoft.com/shawnste/2007/12/13/zh-hans-zh-hant-and-the-old-zh-chs-zh- cht /。また、[CultureInfoのドキュメント](https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx?f=255&MSPPError=-2147217396)もこれを明示しているので、答えは:あなたが示唆したように 'zh-Hans'を使用してください。 –

答えて

1

ハンスのコメント(正解であった)のおかげで、今私は完全な答えを得ています。

.Net 3.5では、 "zh"は中国の中立文化として認識されていないようです。

.Net 4.xでは、 "zh"は中国の中立文化として認識されています。

.Net 4.0 documentationとを比較すると、違いがわかります。 「私たちは.NET 4.0を獲得していることがわかります

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 

:へ

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 

.NET 4.0のドキュメントの変更:

.NET 3.5のマニュアルは、次の中性および特定のリソース名を一覧表示します中国の中立文化としての「zh」

これは.NET 3.5のバグではなく、文書化された機能です。

.Net 3.5と.Net 4.xの両方と互換性が必要な場合は、zh-CHS(簡体字中国語)を使用する必要があるようですが、これが引き続き機能するかどうかは不明です無期限に。

関連する問題