1. ホーム
  2. c#

[解決済み】C#でローカライゼーションを使用する方法

2022-03-31 14:42:12

質問

どうしてもローカライズがうまくいきません。

私はクラスライブラリを持っています。今、私は resx ファイルを作成し、スレッドカルチャーに基づいていくつかの値を返します。

どうすればいいのでしょうか?

どのように解決するのですか?

  • 以下のようにして、プロジェクトにResourceファイル("strings.resx"と呼ぶことができます)を追加してください。

    右クリック プロパティ を選択し 新規追加 -> 新規項目... をクリックし、コンテキストメニューの ビジュアルC#アイテム ピック リソースファイル" という名前をつけて strings.resx .
  • resxファイルに文字列のリソースを追加し、良い名前を付けます(例:"Hello"と名付け、値として"Hello"を与えます)。
  • リソースファイルを保存する ( をメモしておきます。 になります。 デフォルト リソースファイルは、2文字の言語コードを持っていないので、)
  • プログラムへの参照を追加します。 System.ThreadingSystem.Globalization

このコードを実行してください。

Console.WriteLine(Properties.strings.Hello);

Hello"と表示されるはずです。

ここで、新しいリソースファイルを追加します。名前は "strings.fr.resx" ("fr" の部分に注意してください。このファイルにはフランス語のリソースが含まれます。)。strings.resxと同じ名前で、値がフランス語の文字列リソースを追加します(Name="Hello", Value="Salut" )。これで、次のコードを実行すると、Salutと表示されるはずです。

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

何が起こるかというと、システムが "fr-FR" のリソースを探すのです。しかし、(あなたのファイルで"fr"を指定したため)見つかりません。そこで、"fr"のチェックに戻り、それが見つかりました(そして、使用されました)。

次のコードは、"Hello" を表示します。

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

これは、"en-US"リソースも"en"リソースも見つからないため、最初から追加しておいたデフォルトにフォールバックしてしまうからです。

必要に応じて、より具体的なリソースを含むファイルを作成することができます(たとえば、フランスとカナダのフランス語にはそれぞれstrings.fr-FR.resxとstrings.fr-CA.resxを使用します)。このような各ファイルでは、フォールバックするリソースと異なる文字列のリソースを追加する必要があります。つまり、あるテキストがフランスとカナダで同じであれば、strings.fr.resxに、カナダのフランス語で異なる文字列はstrings.fr-CA.resxに入れることができるのです。