3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(.NET)多言語対応化

要件

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