要件
・Windows Formアプリで多言語対応したい。 ・どの言語にするかは、App.config にカルチャコード(jaとかes)とかを指定する。 (今回、英語で作ったアプリを日本語化する例となってます。)
Formの多言語化
Form の[Localizable]プロパティを True にします。
そして、[Language]プロパティを (規定値) から多言語対象言語に変更します。
この際、[Language]プロパティの言語選択プルダウンを見ると、 [日本語] だけでなく [日本語(日本)] というようにカッコで地域名が書いたものがあります。言語名だけのものは、ニュートラル・カルチャ と呼び、地域・国名が入ってるものは特定のカルチャ(固有カルチャ)と呼ばれるようです。適用順序としては、ニュートラル・カルチャ → 特定のカルチャ となるようです。今回はニュートラル・カルチャのみ使用することにしました。
次に、フォーム上の文言を多言語対象言語に修正します。
そうすると、以下のようにFormに規定値のほかに対象言語用のリソースファイルが作成されます。
Form以外のリソース(ダイアログボックスに表示するメッセージなど)の多言語化
メッセージなどの文字列をリソースファイルで定義していない(ソース埋め込み等)の場合は、Properties の下に、新たに規定言語用のリソースファイルファイルを作成し、そのリソースファイルにメッセージの内容を定義、それを参照するようソースコードを修正します。
そして規定言語用のリソースファイルをコピー → Properties配下でペーストし、末尾に多言語対象言語のカルチャコードを加えます。
追加した多言語対象言語のリソースファイルの内容を、対応言語の内容に変更します。
以下は日本語用のリソースファイルを追加した場合の例です。
各言語のカルチャコードは、[MS-LCID]: Appendix A: Product Behavior | Microsoft Learn の Language tag で知ることができます。
ちなみに、リソースファイルの文字列を参照するには以下のようにします。(HOGEという名前で定義)
MessageBox.Show( Properties.Resources.MSG_HOGE );
余談ですが、リソースファイル化すると以下のような文字列補完式は使えません。
string str = "piyo" ; MessageBox.Show( $"hoge {str}" );
代わりに以下のようにString.Format を使うことで対応することができます。
リソースファイルの内容。
hoge {0}
string str = "piyo" ; MessageBox.Show( String.Format( Properties.Resources.MSG_HOGE , str);
利用する言語を指定する方法
デフォルトでアプリを実行するユーザー環境によって、自動的に対応するカルチャ(言語)のリソースが使用されるようです。 でも、コードでどのカルチャか指定することも可能です。
以下は、App.config に指定されたカルチャ使用するにした例です。
public MainForm() { //言語設定 String language = Properties.Settings.Default.Language; _culture = new CultureInfo(language); Thread.CurrentThread.CurrentUICulture = _culture; InitializeComponent(); }
Windowsフォームなどのリソース関連の場合は、Thread.CurrentThread.CurrentUICulture プロパティで指定できます。
参考:
多言語対応(C#、Windows Forms編) | tocsworld
【Windows Forms】C#で多言語化対応をしてみる | ReMIXのブログ
Windowsフォームを多言語対応にするには?:.NET TIPS - @IT
[C#] Windows Formアプリの多言語対応 | OsadaSoft