コードによるアプリケーションの国際化『Visual Studio .NET 2003 を使用して、Windows アプリケーション UI の国際化を行う』 ではWindows アプリケーションの起動時に各カルチャに応じたUIを表示する方法について解説しました。 |
| 項目 | 値 |
|---|---|
| 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 ファイルの画像データを入力・変更することができます。

ボタン クリック時の処理として、下記のコードを記述します。
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 msg As 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

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

図 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() メソッドを参照してみてください。
ここで解説したものと同じ方法で実現されていることがご覧いただけます。
実際の開発においては、アプリケーションの国際化を行う場合、技術的な側面だけでなく、ローカライズ対象のカルチャに深い造詣が必要となります。
例えば数値や日付に関していえば、同じ表現であったとしても、カルチャによってその捕らえ方が異なる場合があります。
また、あるイメージや表現がほかのカルチャでは適さないということもありますので、アプリケーションの設計時には特に注意してください。
Top of Page