web-dev-qa-db-ja.com

C#でローカライズを使用する方法

ローカリゼーションを機能させることができないようです。

クラスライブラリがあります。ここでresxファイルを作成し、スレッドカルチャに基づいていくつかの値を返します。

どうやってやるの?

250
JL.
  • 以下を実行して、プロジェクトにリソースファイルを追加します( "strings.resx"と呼ぶことができます)。
    プロジェクトでPropertiesを右クリックし、コンテキストメニューでAdd-> New Item ...を選択してから、のリストでVisual C#Items pick "Resources file"に名前を付けてstrings.resxと名前を付けます。
  • Resxファイルに文字列リソースを追加し、適切な名前を付けます(例:「Hello」と名前を付け、値「Hello」を付けます)
  • リソースファイルを保存します(注:これはデフォルトリソースファイルになります。2文字の言語コードがないためです)
  • プログラムへの参照を追加します:System.ThreadingおよびSystem.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に入れることができます。

539
Fredrik Mörk

実際には非常に簡単です。 Strings.resxなどの新しいリソースファイルを作成します。 Access ModifierPublicに設定します。適切なファイルテンプレートを使用すると、Visual Studioが自動的にアクセサークラスを生成します(この場合、名前はStringsになります)。これがデフォルトの言語です。

ここで、たとえばドイツ語のローカライズを追加する場合は、ローカライズされたresxファイルを追加します。この場合、通常はStrings.de.resxになります。たとえば、オーストリアのローカライズを追加する場合は、Strings.de-AT.resxを追加で作成します。

次に、文字列を作成します-HelloWorldという名前の文字列を考えてみましょう。 Strings.resxで、この文字列に値「Hello、world!」を追加します。 Strings.de.resxに、「Hallo、Welt!」を追加します。 _Strings.de-AT.resxに「Servus、Welt!」を追加します。これで終わりです。

これで、生成されたStringsクラスがあり、ゲッターHelloWorldを持つプロパティがあります。このプロパティを取得すると、「Servus、Welt!」がロードされます。ロケールがde-ATの場合、「Hallo、Welt!ロケールが他のdeロケール(de-DEおよびde-CHを含む)の場合」、および「Hello、World!」のロケールが他の場合。文字列がローカライズ版では欠落しているため、リソースマネージャーは、最も特殊なリソースから不変のリソースまで自動的にチェーンをたどります。

ResourceManagerクラスを使用すると、ロードの正確性をより詳細に制御できます。生成されたStringsクラスもそれを使用します。

37
OregonGhost

さらに、文字列に関する@FredrikMörkの素晴らしい答えは、フォームにローカリゼーションを追加するために次のようにします:

  • formのプロパティ"Localizable"trueに設定します
  • フォームのLanguageプロパティを目的の言語に変更します(すべてが入ったNiceドロップダウンから)
  • そのフォームのコントロールを翻訳し、必要に応じて移動します(本当に長い完全なフランス語の文章をつぶしてください!)

この Windowsフォームのローカライズに関するMSDNの記事 では、さらに詳しい情報が得られます。

15
noelicus

F.Mörkによる素晴らしい回答。ただし、アプリケーションのリリース後に翻訳を更新したり、新しい言語を追加したりする場合は、リソースを再コンパイルしてresources.dllを生成する必要があるため、行き詰まっています。

リソースdllを手動でコンパイルするソリューションを次に示します。 resgen.exeおよびal.exeツール(sdkと共にインストール)を使用します。

Strings.fr.resxリソースファイルがあるとします。次のバッチでリソースdllをコンパイルできます。

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

ファイル名には元の名前空間を必ず入れてください(ここでは "WpfRibbonApplication1")

14

@ FredrikMörk回答の修正と詳細化。

  • プロジェクトにstrings.resxリソースファイル(または別のファイル名)を追加します
  • Access ModifierPublicに設定します(開かれたstrings.resxファイルタブ内)
  • Resxファイルに文字列リソースを追加します(例:name Hello、value Hello
  • リソースファイルを保存する

Visual Studioは、それぞれのstringsクラスを自動生成します。これは実際にはstrings.Designer.csに配置されます。クラスは、新しく作成された.csファイルが配置されると予想されるのと同じ名前空間にあります。

このコードは常にHelloを出力します。これは、これがデフォルトのリソースであり、言語固有のリソースが利用できないためです。

Console.WriteLine(strings.Hello);

次に、新しい言語固有のリソースを追加します。

  • strings.fr.resxを追加(フランス語の場合)
  • 以前と同じ名前で異なる値の文字列を追加します:(name Hello、value Salut

次のコードはSalutを出力します。

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

使用されるリソースはThread.CurrentThread.CurrentUICultureに依存します。 Windows UIの言語設定に応じて設定されますが、この例のように手動で設定することもできます。詳細についてはこちらをご覧ください こちら

strings.fr-FR.resxstrings.fr-CA.resxなどの国固有のリソースを追加できます。

使用される文字列は、次の優先順位で決定されます。

  • strings.fr-CA.resxなどの国固有のリソースから
  • strings.fr.resxなどの言語固有のリソースから
  • デフォルトからstrings.resx

言語固有のリソースは satellite assembly を生成することに注意してください。

CurrentCultureCurrentUICultureとどのように異なるかについても学びます here

9
Andrey Moiseev

私の場合

[Assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

assemblyInfo.csで、通常どおりに機能しませんでした。

0
Aleksandr

ResourceManagerと.resxは少し面倒です。

Lexical.Localization ¹を使用すると、デフォルト値とカルチャ固有の値をコードに埋め込むことができ、さらにカルチャ(.jsonや.resxなど)の外部ローカリゼーションファイルで展開できます。

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) );
    }
}

¹(私はそのライブラリの管理者です)

0
Tag

@ Eric Bole-Feysot答えに加えて:

サテライトアセンブリのおかげで、ローカライズは。dll/.exeファイルに基づいて作成できます。こちらです:

  • ソースコード(VSプロジェクト)を言語プロジェクトから分離できます。
  • 新しい言語を追加するためにプロジェクトを再コンパイルする必要はありません。
  • 翻訳はエンドユーザーでも行うことができます。

LSACreator (非営利使用または購入オプションの場合は無料)と呼ばれる、あまり知られていないツールがあります。これにより、.dll/.exeファイルに基づいてローカライズを作成できます。実際、内部(言語プロジェクトのディレクトリ内)では、resxファイルのローカライズバージョンを作成/管理し、@ Eric Bole-Feysotと同様の方法でアセンブリをコンパイルします。

0
Tomasz Malik