ローカリゼーションが機能していないようです。
クラスライブラリがあります。次に、そこにresxファイルを作成し、スレッドカルチャに基づいていくつかの値を返します。
どうやってやるの?
ローカリゼーションが機能していないようです。
クラスライブラリがあります。次に、そこにresxファイルを作成し、スレッドカルチャに基づいていくつかの値を返します。
どうやってやるの?
回答:
strings.resx
。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に入れることができます。
Access Modifier
Public
生成するリソースクラスに設定する必要があります。クラスは必ずしもプロパティ名前空間にある必要はありません。そこに.resxファイルを配置します。
実際、それは非常に簡単です。たとえば、新しいリソースファイルを作成しますStrings.resx
。に設定Access Modifier
しPublic
ます。適切なファイルテンプレートを使用して、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
クラスもそれを使用します。
さらに、@ FredrikMörkの文字列に対するすばらしい回答として、フォームにローカライズを追加するには、次のようにします。
"Localizable"
しますtrue
Language
プロパティを必要な言語に変更します(ドロップダウンをすべて表示した状態で)編集:Windowsフォームのローカライズに関するこのMSDNの記事は、私がリンクした元の記事ではありません... (古いものが取り除かれました)
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」)の元の名前空間を必ず保持してください
@FredrikMörkの回答の修正と詳細。
strings.resx
プロジェクトにリソースファイル(または別のファイル名)を追加するAccess Modifier
するPublic
(開かれたにstrings.resx
ファイル]タブ)Hello
、value Hello
)Visual Studio strings
は、実際にに配置されるそれぞれのクラスを自動生成しstrings.Designer.cs
ます。クラスは、新しく作成された.cs
ファイルが配置されるのと同じ名前空間にあります。
これHello
はデフォルトのリソースであり、言語固有のリソースは利用できないため、このコードは常にを出力します。
Console.WriteLine(strings.Hello);
次に、新しい言語固有のリソースを追加します。
strings.fr.resx
(フランス語の場合)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
言語固有のリソースがサテライトアセンブリを生成することに注意してください。
@Eric Bole-Feysotの回答に加えて:
サテライトアセンブリのおかげで、ローカリゼーションは.dll / .exeファイルに基づいて作成できます。こちらです:
.dll / .exeファイルに基づいてローカリゼーションを作成できるLSACreator(非商用利用または購入オプションに対して無料)と呼ばれるほとんど知られていないツールがあります。実際、内部(言語プロジェクトのディレクトリ内)では、ローカライズされたバージョンのresxファイルを作成/管理し、@ Eric Bole-Feysotと同じ方法でアセンブリをコンパイルします。
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) );
}
}
¹(私はそのライブラリの管理者です)
通常、翻訳はリソースファイル(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プロジェクト
[assembly: System.Resources.NeutralResourcesLanguage("en")]
表示されるのは、....nl.xlf
ファイルを含む「MultilingualResources」と呼ばれる新しいフォルダが作成されることです。
あなたが今しなければならない唯一のことは:
(.xlfファイルは「Multilingual Editor」で開く必要があります。そうでない場合は、.xlfファイルを右クリックして「Open With…」を選択し、「Multilingual Editor」を選択します。
楽しんで!翻訳されていないものを確認したり、xlfの翻訳を外部の翻訳会社にエクスポートしたり、再度インポートしたり、他のプロジェクトから翻訳をリサイクルしたりすることもできます...
より詳しい情報: