Windowsフォームを多言語対応にするには?.NET TIPS

» 2005年06月17日 05時00分 公開
[一色政彦デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「.NET TIPS」のインデックス

連載目次

 「TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?」や「TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?」では、ASP.NETのWebフォームを多言語対応させる方法、つまりカルチャ/ロケールの設定(=ユーザー環境の言語コードの設定)に従って表示するメッセージを切り替える方法が紹介されている。

 本稿では、Windowsフォームを多言語対応(国際化対応)にする方法を紹介する。なお、本稿ではVisual Studio .NET(以降、VS.NET)を使うことを前提とする。

Windowsフォームに多言語の文字列や画像を設定する方法

 Windowsフォームに多言語の文字列や画像を設定するには、VS.NETのWindowsフォーム・デザイナ上でフォームを選択し、[プロパティ]ウィンドウにある次のプロパティをそれぞれ設定すればよい。

  • Localizableプロパティ=「True」
  • Languageプロパティ=「<適切な言語>」

Languageプロパティに設定できる項目は、基本的に「<言語名> (<国・地域名>)」という形式で表記されている。例えば、日本における日本語ならば、「日本語 (日本)」という表記になる。詳しくは後述する。


 Windowsフォームを多言語でデザインする際のポイントは、最初に、Languageプロパティを「(既定値)」にしたうえで、すべての基本的な画面デザインを行うことである。次の画面は実際にそれを行っているところだ。

多言語対応Windowsフォームの基本的な画面デザイン
基本となるWindowsフォームの画面デザインを行っているところ。
 (1)フォームを選択した状態でLanguageプロパティを「(既定値)」にする。
 (2)Localizableプロパティを「True」にする。
 (3)通常のWindowsフォームの構築と同じように、コントロールを配置し、プロパティで外観をカスタマイズしていく。

 そして次に、多言語対応のための設定を行っていく。例えばユーザーの環境が「日本における日本語」のときに表示するメッセージ(各コントロールの文字列や画像など)を設定するには、フォームのLanguageプロパティを「日本語 (日本)」に設定変更したうえで、それらのメッセージを修正すればよい。

 具体的には、次の画面のようにして行う。

特定のカルチャに対応したWindowsフォームのデザイン
ユーザー環境が「日本語 (日本)」の場合のWindowsフォームをデザインしているところ。
 (1)フォームを選択した状態でLanguageプロパティを「日本語 (日本)」に設定変更する。
 (2)LabelコントロールやButtonコントロールのTextプロパティを編集して、日本語の表示に修正する。この画面例のように、[プロパティ]ウィンドウを使って、フォーム・デザインをカスタマイズしていく必要があるので、注意してほしい(その理由は、VS.NETのフォーム・デザイナが持つ多言語対応機能を活用しているためだ)。

 以上の修正が終われば、再びLanguageプロパティを「(既定値)」に戻しておこう。そうすると、「(既定値)」の状態で作成した最初のフォーム・デザイン(表示文字列や画像など)に戻るはずだ。

 以上でWindowsフォームの多言語対応は完了だ。

Windowsフォームのデザインに適用される順序

 以上のようにして設定したプロパティ値が、Windowsフォームのデザインに適用される順序は次のとおりだ。

  1. 「(既定値)」で設定したプロパティ値(=基本の情報)は、すべてのカルチャのWindowsフォーム・デザインに対して適用される(ちなみにこの「(既定値)」は、「インバリアント・カルチャ」とも呼ばれ、Languageプロパティのリストにある「Invariant言語 (Invariant国)」と同じである)
  2. 続いて、「ニュートラル・カルチャ」(例えば「日本語」などのように「<言語名>」という形式で記述されたカルチャ)で設定したプロパティ値(=差分の情報)が適用される
  3. 最後に、「特定のカルチャ」(例えば「日本語 (日本)」などのように「<言語名> (<国・地域名>)」という形式で記述されたカルチャ)で設定したプロパティ値(=差分の情報)が適用される(これは「固有カルチャ」と呼ばれることもある)

 つまり、ここで設定したプロパティ値には、「(既定値)」→「ニュートラル・カルチャ」→「特定のカルチャ」の(親→子の)順で継承関係がある。

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回」を参照してほしい)。

多言語対応のDLLファイルとして生成されたサテライト・アセンブリ
VS.NETで多言語対応したWindowsフォームをビルドすると、このように設定したカルチャごとにフォルダが作成されて、その中にサテライト・アセンブリが生成される。
 (1)Debugビルドを行うと、(C#の場合のデフォルトの設定では)このDebugフォルダにメイン・アセンブリ(本稿の例では、WindowsApplication1.exe)が出力される。
 (2)メイン・アセンブリが出力された配下にカルチャ・コード名のフォルダ(本稿の例では、「ja」や「ja-JP」)が作成され、その中に各カルチャのサテライト・アセンブリが出力される。

 後は例えばユーザーが英語(米国)環境で実行すれば、既定のWindowsフォームが表示され、日本語(日本)の環境で実行すれば、日本語でデザインしたWindowsフォームが表示されるはずだ。

 なお本稿のようにVS.NETで国際化対応を行った場合、アプリケーションをユーザーに配布する際には、生成されたサテライト・アセンブリを含むサブディレクトリをすべてセットでユーザーに提供しなければならない。

カルチャ情報を強制的に切り替えるには?

 もちろん、単にユーザー環境のカルチャに従うだけでなく、カルチャをプログラム側で強制的に指定することもできる。これを行えば、表示したい言語のデザインを、アプリケーションの実行時に、意図的に切り替えて呼び出すことができる。最後にこのコーディング方法を紹介しておく。

 ここで紹介するサンプル・プログラムは、次のような内容のプログラムである。

カルチャを選択してWindowsフォーム・デザインを切り替えるサンプル・プログラム
カルチャ情報をプログラムで指定することで、表示されるWindowsフォームのデザインを実行時に切り替えることができる。
 (1)ComboBoxコントロールからカルチャを選択する。ここでは「日本語 (日本)」を選択している。
 (2)[フォームを表示]ボタンをクリックすると、多言語対応したWindowsフォームが表示される。
 (3)カルチャの選択に基づき、各コントロールの文字列が適切な言語で表示される。この例では正しく日本語で表示されている。

 まずは、すべてのカルチャ情報を、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";
}

ComboBoxコントロールへのカルチャ情報の設定(C#)
CultureInfoオブジェクトのDisplayNameプロパティでは、「日本語 (日本)」のような表記(ユーザーにとって分かりやすい表示名)を得ることができる。なおリソース・ファイルなどに使われるカルチャ・コード(例えば、「ja」や「ja-JP」などの表記)を得たい場合には、CultureInfoオブジェクトのNameプロパティを取得すればよい。

 

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コントロールへのカルチャ情報の設定(VB.NET)
上記のC#の解説を参照されたい。

 後は[フォームを表示]ボタンがクリックされたときに、ComboBoxコントロールで選択されているカルチャを、現在のスレッドで使用するカルチャとして指定すればよい。この現在のスレッド(=Threadクラスのオブジェクト)は、Threadクラス(System.Threading名前空間)のCurrentThreadプロパティ(=静的プロパティ)から取得できる。

 現在のスレッドに対してカルチャ情報を設定するプロパティには、実は、次の2種類がある(どちらもCultureInfoオブジェクトを指定する)。

  1. ThreadオブジェクトのCurrentCultureプロパティ
  2. ThreadオブジェクトのCurrentUICultureプロパティ

 スレッドの正式なカルチャ情報は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();
}

現在のスレッドに対するUIカルチャ情報の設定(C#)

 

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

現在のスレッドに対するUIカルチャ情報の設定(VB.NET)

 現在のスレッドにWindowsフォームでデザインしていないカルチャが指定された場合は、当然ながら、既定のWindowsフォームのデザインで表示されることになる。これは前述した「(既定値)」→「ニュートラル・カルチャ」→「特定のカルチャ」の継承関係に基づく動作だ。

 ちなみに、CurrentCultureプロパティにカルチャ情報を設定する場合、「ニュートラル・カルチャ」を指定することはできないので、注意してほしい。

カテゴリ:Windowsフォーム 処理対象:リソース
使用ライブラリ:CultureInfoクラス(System.Globalization名前空間)
使用ライブラリ:Threadクラス(System.Threading名前空間)
関連TIPS:[ASP.NET]リソース・ファイル活用で国際化対応サイトを構築するには?
関連TIPS:[ASP.NET]国際化対応サイトをプログラムレスで実現するには?
関連TIPS:VS.NETで画像などのリソースを利用するには?(準備編)

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。