この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?」や「TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?」では、ASP.NETのWebフォームを多言語対応させる方法、つまりカルチャ/ロケールの設定(=ユーザー環境の言語コードの設定)に従って表示するメッセージを切り替える方法が紹介されている。
本稿では、Windowsフォームを多言語対応(国際化対応)にする方法を紹介する。なお、本稿ではVisual Studio .NET(以降、VS.NET)を使うことを前提とする。
Windowsフォームに多言語の文字列や画像を設定するには、VS.NETのWindowsフォーム・デザイナ上でフォームを選択し、[プロパティ]ウィンドウにある次のプロパティをそれぞれ設定すればよい。
※ Languageプロパティに設定できる項目は、基本的に「<言語名> (<国・地域名>)」という形式で表記されている。例えば、日本における日本語ならば、「日本語 (日本)」という表記になる。詳しくは後述する。
Windowsフォームを多言語でデザインする際のポイントは、最初に、Languageプロパティを「(既定値)」にしたうえで、すべての基本的な画面デザインを行うことである。次の画面は実際にそれを行っているところだ。
そして次に、多言語対応のための設定を行っていく。例えばユーザーの環境が「日本における日本語」のときに表示するメッセージ(各コントロールの文字列や画像など)を設定するには、フォームのLanguageプロパティを「日本語 (日本)」に設定変更したうえで、それらのメッセージを修正すればよい。
具体的には、次の画面のようにして行う。
以上の修正が終われば、再びLanguageプロパティを「(既定値)」に戻しておこう。そうすると、「(既定値)」の状態で作成した最初のフォーム・デザイン(表示文字列や画像など)に戻るはずだ。
以上でWindowsフォームの多言語対応は完了だ。
以上のようにして設定したプロパティ値が、Windowsフォームのデザインに適用される順序は次のとおりだ。
つまり、ここで設定したプロパティ値には、「(既定値)」→「ニュートラル・カルチャ」→「特定のカルチャ」の(親→子の)順で継承関係がある。
以上の作業により、ユーザーの実行環境(=カルチャ)に合わせてWindowsアプリケーションの表示内容が(適切な言語のものへと)切り替えられるようになる。
この動作は、そのユーザー環境ごとにアプリケーションが利用するリソース・ファイルが切り替えられることで実現されている。つまり、先ほど設定したLanguageプロパティの設定ごとに、複数のリソース・ファイルがVS.NETプロジェクト内に自動作成されているわけである(リソース・ファイルについては、「TIPS:VS.NETで画像などのリソースを利用するには?(準備編)」を参照してほしい)。
例えば本稿で先ほど作成したWindowsフォームの場合、次の画面のようなリソース・ファイル(.resxファイル)が作成される。
※ 上の画面で説明した「ニュートラル・カルチャ」や「特定のカルチャ」のカルチャ・コード(例えば「ja」や「ja-JP」など)の書き方については、MSDNの「CultureInfoクラス」や「CultureInfo.Nameプロパティ」、「TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?」の説明を参考にされたい。ちなみに「(既定値)」のカルチャ・コードは、「""」(空文字列)で表現される。またニュートラル・カルチャの記述形式には例外があり、“zh-CHS”(簡易字中国語)と“zh-CHT”(繁体字中国語)は特定のカルチャのように見えるが、ともにニュートラル・カルチャである。
上の画面のVS.NETプロジェクトをビルドすると、次の画面のように、カルチャごとにフォルダが分けられてDLLファイルが生成される。これらのDLLファイルは、単一のカルチャのリソース(=文字列や画像などの情報)のみを含むアセンブリとなるので、通常のメイン・アセンブリに対比して、「サテライト・アセンブリ」と呼ばれる(サテライト・アセンブリについては「インサイド .NET Framework [改訂版]第2回」を参照してほしい)。
後は例えばユーザーが英語(米国)環境で実行すれば、既定のWindowsフォームが表示され、日本語(日本)の環境で実行すれば、日本語でデザインしたWindowsフォームが表示されるはずだ。
なお本稿のようにVS.NETで国際化対応を行った場合、アプリケーションをユーザーに配布する際には、生成されたサテライト・アセンブリを含むサブディレクトリをすべてセットでユーザーに提供しなければならない。
もちろん、単にユーザー環境のカルチャに従うだけでなく、カルチャをプログラム側で強制的に指定することもできる。これを行えば、表示したい言語のデザインを、アプリケーションの実行時に、意図的に切り替えて呼び出すことができる。最後にこのコーディング方法を紹介しておく。
ここで紹介するサンプル・プログラムは、次のような内容のプログラムである。
まずは、すべてのカルチャ情報を、ComboBoxコントロールに追加する。
これには、フォームがロードされたときのイベントをハンドルして、そこに次のコードを記述すればよい。なお.NETでは、各カルチャ情報はCultureInfoクラス(System.Globalization名前空間)のオブジェクトとして提供される。
using System.Globalization;
private void Form1_Load(object sender, System.EventArgs e)
{
// すべてのカルチャ情報(=CultureInfoオブジェクトの配列)を取得
CultureInfo[] cultures =
CultureInfo.GetCultures(CultureTypes.AllCultures);
// ComboBoxに取得したカルチャ情報を設定する
this.comboBox1.DataSource = cultures;
// CultureInfoオブジェクトのDisplayNameプロパティの値が
// ComboBoxのリストに表示されるように設定する
this.comboBox1.DisplayMember = "DisplayName";
}
Imports System.Globalization
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' すべてのカルチャ情報(=CultureInfoオブジェクトの配列)を取得
Dim cultures() As CultureInfo = _
CultureInfo.GetCultures(CultureTypes.AllCultures)
' ComboBoxに取得したカルチャ情報を設定する
Me.ComboBox1.DataSource = cultures
' CultureInfoオブジェクトのDisplayNameプロパティの値が
' ComboBoxのリストに表示されるように設定する
Me.ComboBox1.DisplayMember = "DisplayName"
End Sub
後は[フォームを表示]ボタンがクリックされたときに、ComboBoxコントロールで選択されているカルチャを、現在のスレッドで使用するカルチャとして指定すればよい。この現在のスレッド(=Threadクラスのオブジェクト)は、Threadクラス(System.Threading名前空間)のCurrentThreadプロパティ(=静的プロパティ)から取得できる。
現在のスレッドに対してカルチャ情報を設定するプロパティには、実は、次の2種類がある(どちらもCultureInfoオブジェクトを指定する)。
スレッドの正式なカルチャ情報は1のCurrentCultureプロパティの方だが、Windowsフォームなどのリソース関連では、2のCurrentUICultureプロパティが使われている。従って、ここでは2のCurrentUICultureプロパティの方を設定しなければならない。
これを設定してフォームを表示(Show)すれば、Windowsフォームのデザインが指定したカルチャに合ったものになるはずである。
以上の内容を記述したのが次のコードである。
using System.Threading;
private void button1_Click(object sender, System.EventArgs e)
{
// 選択されているカルチャ情報を取得する
CultureInfo culture = (CultureInfo)this.comboBox1.SelectedItem;
try
{
// Windowsフォームのリソースに対応したUIカルチャを設定する
//Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
// フォームを表示する
Form2 myform = new Form2();
myform.Show();
}
Imports System.Threading
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' 選択されているカルチャ情報を取得する
Dim culture As CultureInfo = _
CType(Me.ComboBox1.SelectedItem, CultureInfo)
Try
' Windowsフォームのリソースに対応したUIカルチャを設定する
'Thread.CurrentThread.CurrentCulture = culture
Thread.CurrentThread.CurrentUICulture = culture
Catch ex As Exception
MessageBox.Show(ex.Message)
Return
End Try
' フォームを表示する
Dim myform As New Form2()
myform.Show()
End Sub
現在のスレッドにWindowsフォームでデザインしていないカルチャが指定された場合は、当然ながら、既定のWindowsフォームのデザインで表示されることになる。これは前述した「(既定値)」→「ニュートラル・カルチャ」→「特定のカルチャ」の継承関係に基づく動作だ。
ちなみに、CurrentCultureプロパティにカルチャ情報を設定する場合、「ニュートラル・カルチャ」を指定することはできないので、注意してほしい。
カテゴリ:Windowsフォーム 処理対象:リソース
使用ライブラリ:CultureInfoクラス(System.Globalization名前空間)
使用ライブラリ:Threadクラス(System.Threading名前空間)
関連TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
関連TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?
関連TIPS:VS.NETで画像などのリソースを利用するには?(準備編)
Copyright© Digital Advantage Corp. All Rights Reserved.