**ステップ 7 ハンズオン:

.NET Framework を活用し、コードによる Windows アプリケーションの国際化を行う**

マイクロソフト株式会社 デベロッパーマーケティング本部
デベロッパーエバンジェリスト 近藤和彦

最終更新日 2005 年 1 月 26 日

目標 .NET Framework を活用し、プログラミングによりWindows アプリケーションを各カルチャに対応する方法について理解
使用技術
  • Windows フォーム
  • Visual Basic .NET
取り上げるトピックス
  • .NET Framework 対応アプリケーションの国際化方法
前提知識
備考 特になし

コードによるアプリケーションの国際化

Visual Studio .NET 2003 を使用して、Windows アプリケーション UI の国際化を行う』 ではWindows アプリケーションの起動時に各カルチャに応じたUIを表示する方法について解説しました。
しかし、アプリケーションの要件によっては、実行中に文字列を操作したり、UI を変更する必要があることも考えられます。 この場合には、.NET Framework が提供するクラス ライブラリを活用することで、アプリケーションの国際化を柔軟に実現することができます。

アプリケーションの設計を行います。
設計時においてはグローバリゼーションを考慮し、できる限り特定のカルチャ (文化や言語など) に依存しない、汎用的なデザインや機能を設計することがポイントです。
ここでは、ボタンがクリックされたときに、カルチャに応じた文字列が表示されるアプリケーションを作成します。

図 1 : サンプル アプリケーションの実行例 (日本)

 

また、事前にアプリケーションでサポートするカルチャを決定しておきます。ここでは、日本と韓国に対応したアプリケーションを作成します。

Windows アプリケーションを新規に作成します。
Windows アプリケーションの作成方法の手順については、『10 行でズバリ !! Windows フォームによるクライアント アプリケーション開発』を参考にしてください。
ここでは、サポートするすべてのカルチャで共通となるデザインを行います。Buttonコントロールを貼り付け、下記の図ようにレイアウトしてください。

図 2 : サンプル アプリケーションのデザイン

 

リソースファイルを作成します。
まず、既定のリソース ファイルを作成しましょう。アプリケーションが想定していないカルチャが指定された場合 (このサンプル アプリケーションでは日本と韓国以外が指定された場合) に、ここで設定したリソース情報が適用されます。ここでは既定のカルチャを英語とします。
Visual Studio .NET 2003 の[ソリューション エクスプローラ] より該当プロジェクトを右クリックし、[追加]-[新しい項目の追加] を選択します。表示された[新しい項目の追加] ダイアログのテンプレートの中から"アセンブリ リソース ファイル" を選択し、ファイル名に "MyStrings.resx" とつけます。

図 3 : リソース ファイルの作成 (既定)

 

リソース デザイナより[データ]を選択し、表の列に下記の行を追加します。

項目
name HelloMessage
value Hello
comment (Null)
type (Null)
mimetype (Null)

 

図 4 : リソース ファイルの設定 (既定)

 

同様に、日本向けのリソース ファイルを作成します。
ファイル名は "MyStrings.ja-JP.resx" とつけてください。ファイル名は .NET Framework および Visual Studio .NET が正しくリソース ファイルを認識するために非常に重要です。
リソース デザイナの下部より[データ]を選択し、表の列に下記の行を追加します。

項目
name HelloMessage
value こんにちは
comment (Null)
type (Null)
mimetype (Null)

 

同様に、韓国向けのリソース ファイルを作成します。
ファイル名は "MyStrings.ko-KR.resx" とつけてください。ファイル名は .NET Framework および Visual Studio .NET が正しくリソース ファイルを認識するために非常に重要です。
リソース デザイナの下部より[データ]を選択し、表の列に下記の行を追加します。

項目
name HelloMessage
value 안녕하세요
comment (Null)
type (Null)
mimetype (Null)

 

resx ファイルに画像データを埋め込む方法
Visual Studio .NET 2003 を使用して、Windows アプリケーション UI の国際化を行う」で解説した方法とは異なり、リソース デザイナから resx ファイルに画像データを入力したり、変更したりする方法はありません。
この場合、下記 2 つの方法で resx ファイルの画像データを入力・変更することができます。

  • resx ファイルの XML データを直接編集する
  • .NET Framework SDK に付属の ResEditor を使用する。詳細については「ResEditor を使用したリソース ファイルの作成および編集」を参照

ボタン クリック時の処理として、下記のコードを記述します。

 

Private Sub Button1_Click (…) Handles Button1.Click
    Dim rm As System.Resources.ResourceManager … (1)
    rm = New System.Resources.ResourceManager("WindowsApplication1.MyStrings", _
Me.GetType().Assembly) … (2)
    Dim msgAs String = rm.GetString("HelloMessage") … (3)
    msg = msg + ":" + DateTime.Now.ToLongDateString () … (4)
    MessageBox.Show(msg) … (5)
End Sub
  (1) ResourceManager 型の変数を定義します。ResourceManager クラスはアセンブリに埋め込まれたリソースを検索、取得、管理します。
(2) ResourceManager クラスのインスタンスを作成し、リソースを取得します。コンストラクタの第1 パラメータにはリソースのルート名を、第2 パラメータにはリソースのメイン アセンブリを指定します。
リソースのルート名は「リソースが埋め込まれている名前空間」と「既定のリソース ファイルのファイル名 (拡張子なし) 」の組み合わせを指定します。ここでは、WindowsApplication1 という名前空間と、MyStrings.resx というリソース ファイル名から "WindowsApplication1.MyStrings" と指定します。
(3) ResourceManager クラスのGetString メソッドを使用して、文字列リソースを取得します。GetString のパラメータには、Step 4 で指定した項目名 (name) "HelloMessage" を指定します。イメージなどのその他の種類のリソースを取得する場合、GetObject メソッドを呼び出します。GetObject で取得したリソースは、適切な形式に明示的に型変換 (キャスト) して使用する必要があります。
(4) DateTime.Now プロパティで現在日時を取得し、ToLongDateString メソッド文字列として表示します。このような日付や数値は、現在のアプリケーション (スレッド) に設定されているカルチャ設定をもとに書式体系が決定されます。
(5) 取得した文字列をメッセージ ボックスで表示します。

カルチャ切り替えのためのテスト コードを埋め込みます。
カルチャの要素は UI に関するものと、内部処理に関するものの 2 つに分けられます。
文字列や画像、コントロールのサイズといった UI に関するものに関するものは、Windows OS の言語バージョンによって自動的に決められます。例えば、日本語バージョンのOS を使用している場合には、日本語の UI が常に選択され、韓国語バージョンの OS を使用している場合には、韓国語のUI が選択されます。多言語バージョンのOS を使用している場合には、ユーザーごとにコントロール パネルよりカルチャの変更が可能です。
ResourceManager はこの UI に関するカルチャ設定に依存します。コードでカルチャを設定するには、Thread クラスの CurrentUICulture プロパティを変更します。
それに対して、内部処理にかかわるもの、例えばカレンダーや通貨・数値の書式などについては、どの言語バージョンを使用しているかに関わらず、コントロール パネルより指定することが可能です。
内部処理に関するカルチャをコードで指定する場合には、Thread クラスの CurrentCulture プロパティを変更します。

ここでは、特定の言語バージョンの OS を使用していることを前提に、テストコードを埋め込み、プログラムで 2 つのカルチャを変更する方法を行います。
まず、韓国語 (韓国) にカルチャを明示的に切り替えるための、テスト コードを埋め込みます。下記赤字のコードを New メソッド (コンストラクタ) に記述してください。

Public Sub New()
    MyBase.New()
    'ko-KR (韓国語(韓国)) を UI カルチャとして明示的に設定する
    System.Threading.Thread.CurrentThread.CurrentUICulture = _
        New System.Globalization.CultureInfo("ko-KR")
    'ko-KR (韓国語(韓国)) をカルチャとして明示的に設定する
    System.Threading.Thread.CurrentThread.CurrentCulture = _
        New System.Globalization.CultureInfo("ko-KR")
    'この呼び出しはWindows フォーム デザイナで必要です。
    InitializeComponent()
    'InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub

(注意事項)

  • New メソッド (コンストラクタ) はWindows フォーム デザイナで生成されたコードの中にあります。
  • テスト コードは、InitializeComponent() より前に記述する必要があります。これは InitializeComponent() の中でコントロールの初期化が行われるためです。
  • CultureInfo メソッドの引数には、該当のカルチャ コードを指定します。詳細については MSDN Library 「CultureInfo クラス」 を参考にしてください。

アプリケーションを実行してみましょう。まず、韓国対応されていることを確認します。

図 5 : サンプル アプリケーションの実行例 (韓国語)

 

次に日本対応されていることを確認します。
Step 5 で記述したテスト コードを下記のように変更して実行します。なお日本語OS を使用している場合は、テスト コード自体を削除してください。

Public Sub New()
    MyBase.New()
    'ja-JP (日本語(日本)) をUI カルチャとして明示的に設定する
    '日本語OS を使用している場合、このコード自体不要
    System.Threading.Thread.CurrentThread.CurrentUICulture = _
        New System.Globalization.CultureInfo("ja-JP")
    'ja-JP (日本語(日本)) をカルチャとして明示的に設定する
    '日本語OS を使用している場合、このコード自体不要
    System.Threading.Thread.CurrentThread.CurrentCulture = _
        New System.Globalization.CultureInfo("ja-JP")
    'この呼び出しはWindows フォーム デザイナで必要です。
    InitializeComponent()
    'InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub

図 5 : サンプル アプリケーションの実行例 (日本語)

 

カルチャに応じた処理が行われることが確認できました。

次にアプリケーションが想定していないカルチャが指定されたときの動作を確認します。
ここでは、Step 5 で記述したテスト コードを下記のように変更し、カルチャとしてドイツ語 (オーストリア) を指定します。

Public Sub New()
    MyBase.New()
    'de-AT (ドイツ語(オーストリア)) をUI カルチャとして明示的に設定する
    System.Threading.Thread.CurrentThread.CurrentUICulture = _
        New System.Globalization.CultureInfo("de-AT")
    'de-AT (ドイツ語(オーストリア)) をカルチャとして明示的に設定する
    System.Threading.Thread.CurrentThread.CurrentCulture = _
        New System.Globalization.CultureInfo("de-AT")
    'この呼び出しはWindows フォーム デザイナで必要です。
    InitializeComponent()
    'InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub

 

図 7 : サンプル アプリケーションの実行例 (既定)

 

リソース フォールバック プロセスに従って、ユーザーインタフェースに関わるリソースに関しては最終的に既定カルチャが適用され、MyStrings.resx に定義した文字列が表示されることが確認できます。
しかし、内部処理に関わる日付の表示に関しては、オーストリアのカルチャ (ドイツ語) で表示されることが確認できます。

まとめ

このように .NET Framework のクラス ライブラリによって、プログラミングによってアプリケーションの国際化を柔軟に行うことができます。
なお、『 Visual Studio .NET 2003 を使用して、Windows アプリケーション UI の国際化を行う』で作成したソースコードを開き、Visual Studio .NET で自動生成されたInitializeComponent() メソッドを参照してみてください。
ここで解説したものと同じ方法で実現されていることがご覧いただけます。

実際の開発においては、アプリケーションの国際化を行う場合、技術的な側面だけでなく、ローカライズ対象のカルチャに深い造詣が必要となります。
例えば数値や日付に関していえば、同じ表現であったとしても、カルチャによってその捕らえ方が異なる場合があります。
また、あるイメージや表現がほかのカルチャでは適さないということもありますので、アプリケーションの設計時には特に注意してください。

参考資料

  • アプリケーションのグローバライズとローカライズ
  • 国際対応アプリケーションの開発
  • リソースの作成および取得
  • Global Development and Computing Portal

 


 

ページのトップへ