C#でローカリゼーションを使用する方法


268

ローカリゼーションが機能していないようです。

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

どうやってやるの?


PS:Visual Studio用の無料のMicrosoft MAT(Multilingual App Toolkit)拡張機能がインストールされていることを確認してください;-)
juFo

回答:


571
  • 次の操作を行って、リソースファイルをプロジェクトに追加します( "strings.resx"と呼ぶことができます)。プロジェクトの
    [ プロパティ ]を右クリックし、コンテキストメニューの[ 追加]-> [新しい項目... ]を選択し、次にリストからビジュアルC#項目選ぶ「リソースファイル」とそれに名前を付けますstrings.resx
  • 文字列リソースをresxファイルに追加し、適切な名前を付けます(例:「Hello」という名前を付け、値「Hello」を付けます)。
  • リソースファイルを保存します(注:これはデフォルトます)リソースファイル、それは2文字の言語コードを持っていないので)
  • あなたのプログラムへの参照を追加しますSystem.Threadingと、System.Globalization

このコードを実行します。

Console.WriteLine(Properties.strings.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に入れることができます。


24
答えは、Visual Studioによって行われている「舞台裏」の配管を参照することができます。resx.designer.csファイルは、インテリセンスを機能させます。クラスライブラリでコンパイルされたサテライトアセンブリは、コンパイルされたアセンブリとそれを使用する後のプロジェクトで展開する必要があります。 Visual Studioは使用しません。
Tao

13
+1投稿!手動でファイルを作成するのではなく、ゼータリソースエディター(zeta-resource-editor.com/index.html)を試してください。これは無料で、VSだけでなく、これらの種類の翻訳をはるかに迅速に行うのに役立ちます。
Killnine 2012

4
Access ModifierPublic生成するリソースクラスに設定する必要があります。クラスは必ずしもプロパティ名前空間にある必要はありません。そこに.resxファイルを配置します。
Andrey Moiseev 2016年

3
VS 2017では、バグが原因でwinformでローカライズされたresxが機能しないことに注意してください(少なくともバージョン15.4まで)。チケットは入手可能です:developercommunity.visualstudio.com/content/problem/63772/...
muccix

4
.NET 4.5以降では、Thread.CurrentThread.CurrentUICultureの代わりにSystem.Globalization.CultureInfo.DefaultThreadCurrentCultureを使用して、スレッドごとではなくアプリケーション全体のロケールを変更することもできます
GrixM

41

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

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

次に、文字列を作成します。名前の付いた文字列を考えてみましょう。 HelloWorld。。にStrings.resx、この文字列に値「Hello、world!」を追加します。Strings.de.resx「ハロー、ウェルトを!」を追加します。そして、Strings.de-AT.resx「Servus、Welt!」を追加します。ここまでです。

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

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


ロケールを設定するには?
Matheus Simon、

1
@MatheusSimon:必要はありません。デフォルトでは、ユーザーの現在のロケールが使用されます。特定のロケールを強制したい場合(ユーザーが手動で言語を変更できるようにする場合など)は、リソースが初めてロードされる前に、各スレッドでSystem.Threading.Thread.CurrentCultureおよびCurrentUICultureを設定する必要があります。実行時に更新するよりも、アプリケーションを再起動する方が簡単です。
OregonGhost 2018

15

さらに、@ FredrikMörkの文字列に対するすばらしい回答として、フォームにローカライズを追加するには、次のようにします。

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

編集:Windowsフォームのローカライズに関するこのMSDNの記事は、私がリンクした元の記事ではありません... (古いものが取り除かれました)


msdnの記事はもう利用できません。
fuomag9

わかりません-私が見た中で最高のものをリンクしましたが、7年前の記事がどのようなものだったか思い出せません;)
noelicus

14

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」)の元の名前空間を必ず保持してください


2
名前空間(y)の保持に関するコメントに感謝します。これを怠るとエラーは発生せず、フォールバックリソースに戻ります。
Mosca Pt

11

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

  • strings.resxプロジェクトにリソースファイル(または別のファイル名)を追加する
  • 設定Access ModifierするPublic(開かれたに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.resxまたはのような国固有のリソースを追加できstrings.fr-CA.resxます。

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

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

言語固有のリソースがサテライトアセンブリを生成することに注意してください

またCurrentCultureCurrentUICulture こちらとの違いもご覧ください


1

私の場合

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

AssemblyInfo.csの問題により、通常どおり機能しなくなりました。


0

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

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

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

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


0

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

通常、翻訳はリソースファイル(resources.resxなど)に入れます。

特定のカルチャごとに異なる名前があります。たとえば、resources.nl.resx、resources.fr.resx、resources.de.resx、…

ソリューションの最も重要な部分は、翻訳を維持することです。Visual Studioで、Microsoft MATツール(Multilingual App Toolkit(MAT))をインストールします。winforms、wpf、asp.net(コア)、uwpなどで動作します…

一般に、たとえばWPFソリューションの場合、WPFプロジェクト

  • Visual Studio用のMicrosoft MAT拡張機能をインストールします。
  • ソリューションエクスプローラーで、プロジェクト>プロパティ> AssemblyInfo.csに移動します。
  • AssemblyInfo.csにデフォルトのニュートラル言語(私の場合は英語)を追加します。 [assembly: System.Resources.NeutralResourcesLanguage("en")]
  • ソリューションエクスプローラーとVisual Studioでプロジェクトを選択し、トップメニューから[ツール]> [多言語アプリツールキット]> [選択を有効にする]をクリックして、プロジェクトでMATを有効にします。
    • ソリューションエクスプローラーでプロジェクトを右クリックし、[多言語アプリツールキット]> [翻訳言語を追加…]を選択して、翻訳を追加する言語を選択します。例:オランダ語。

表示されるのは、....nl.xlfファイルを含む「MultilingualResources」と呼ばれる新しいフォルダが作成されることです。

あなたが今しなければならない唯一のことは:

  1. 翻訳をデフォルトのresources.resxファイルに追加します(私の場合は英語)
  2. .xlfファイルは.resxファイルを生成/更新するため、.xlfファイル(.resxファイルではない)をクリックして翻訳します。

(.xlfファイルは「Multilingual Editor」で開く必要があります。そうでない場合は、.xlfファイルを右クリックして「Open With…」を選択し、「Multilingual Editor」を選択します。

楽しんで!翻訳されていないものを確認したり、xlfの翻訳を外部の翻訳会社にエクスポートしたり、再度インポートしたり、他のプロジェクトから翻訳をリサイクルしたりすることもできます...

より詳しい情報:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.