ローカリゼーションを機能させることができないようです。
クラスライブラリがあります。ここでresxファイルを作成し、スレッドカルチャに基づいていくつかの値を返します。
どうやってやるの?
strings.resx
と名前を付けます。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に入れることができます。
実際には非常に簡単です。 Strings.resx
などの新しいリソースファイルを作成します。 Access Modifier
をPublic
に設定します。適切なファイルテンプレートを使用すると、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
クラスもそれを使用します。
さらに、文字列に関する@FredrikMörkの素晴らしい答えは、フォームにローカリゼーションを追加するために次のようにします:
"Localizable"
をtrue
に設定しますLanguage
プロパティを目的の言語に変更します(すべてが入ったNiceドロップダウンから)この 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
言語固有のリソースは satellite assembly を生成することに注意してください。
CurrentCulture
がCurrentUICulture
とどのように異なるかについても学びます here 。
私の場合
[Assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]
assemblyInfo.csで、通常どおりに機能しませんでした。
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) );
}
}
¹(私はそのライブラリの管理者です)
@ Eric Bole-Feysot答えに加えて:
サテライトアセンブリのおかげで、ローカライズは。dll/.exeファイルに基づいて作成できます。こちらです:
LSACreator (非営利使用または購入オプションの場合は無料)と呼ばれる、あまり知られていないツールがあります。これにより、.dll/.exeファイルに基づいてローカライズを作成できます。実際、内部(言語プロジェクトのディレクトリ内)では、resxファイルのローカライズバージョンを作成/管理し、@ Eric Bole-Feysotと同様の方法でアセンブリをコンパイルします。