ものえおさむ

C#で作る、あなただけのメモ帳 ~メニューの多言語対応~

2009-09-25 18:13:00

はじめに
このブログでは、"Windows アプリケーションってどう作るのかよくわからない" といったプログラマ向けに Visual C# 2008 Express Edition (無償) を使用した Windows アプリケーションに作り方について説明しています。
Visual C# 2008 Express Edition (無償)(※) の入手方法については
この記事 を、プロジェクトのコンパイル方法については この記事を参照してください。

(※1)大学生、専門学校生の方は DreamSpark で、商用の Visual Studio を無償で入手することもできます。
(※2)設立 3 年未満のベンチャー企業の方は BizSparkで、Microsoft の開発製品、およびサーバー製品を無償で使用することができます。

最近、『少年メリケンサック』なる映画を観たのですが、劇中のビジュアル系アーティスト・TELYA が歌う 『アンドロメタおまえ』 という曲が脳内でループして鳴り止みません。

TELYA は歌っています、「アンドロメダ おまえは何人だ?」 と。

そんなわけで今回は、作成したアプリケーションを異国の方々にも使っていただけけるよう、リソースファイルを使用したアプリケーション メニューの多言語対応の方法について書いてみたいと思います。(え、強引ですか? そうですか。)

ちなみに今回ご紹介する方法はあくまでも、メニューやメッセージボックスで表示する文字列をリソースファイルで一括管理する方法のみであり、国際化対応の方法ではありませんのであしからず。

真に国際化対応を行うには、さまざまな状況を検討し、それにあった機能を組み込んだ開発が必要になります。詳細については以下のドキュメントをご参照ください。

『.NET Framework ベースの国際対応アプリケーションの概要』
http://msdn.microsoft.com/ja-jp/library/t18274tk.aspx

 

リソースファイルで管理するもの

コード中に、メッセージボックスに表示される文字列や、UI に表示するキャプションの内容を記述していて、こう思うことはないでしょうか?

「こんな、何の処理も行わない文字列なぞを、どうしてプログラムの中に含めなければならないのか?」 と。

リソースファイルは、そういった "何の処理も行わない" = "非実行可能 データ" をまとめて管理し、ロジックとデータの分離を徹底したい完全主義で潔癖なプログラマのモヤモヤを解消してくれる(?)便利なものなのです。

リソースファイルは文字列だけを扱うだけでなく、ファイル等も扱えます。たとえばアプリケーションが使用する画像やマルチメディア、アイコンと言ったものをリソースファイルに含めることができます。

よって、上記のようになんらロジックの処理にかかわらず (非実行可能) 、状況によっては変更する可能性のあるデータをリソースファイルにまとめておけば、複数個所にわたる情報の変更の際にもリソースファイルを置き換えるだけで済ませることができます。

今回のサンプルアプリケーションを使用して紹介する、メニューの多言語対応などは良い例で、これは日本語用、英語用のリソースファイルを各々用意しておいて、コンパイルスイッチで使用するリソースファイルを変更します。

 

リソースファイルの操作

サンプルでの説明を行う前に、リソースファイルの基本的な使用方法についてご紹介しておきましょう。

プロジェクトにリソースファイルを追加するには、[ソリューション エクスプローラ] 上でプロジェクト名を右クリックし、表示されたコンテキストメニューより [追加] - [新しい項目] を選択します。

[新しい項目の追加] ダイアログボックスが表示されるので、ダイアログボックス内左の [カテゴリ] で "全般" を選択し、右の [テンプレート] から "アセンブリ リソース ファイル" を選択、[ファイル名] ボックスに任意の名前を指定して [追加] ボタンをクリックします。

 

[ソリューション エクスプロ―ラー] で追加したリソースファイルをダブルクリックすると、以下のようなリソースの設定画面が表示されます。

既定では文字列の設定画面になっており、以下のように設定することができます。

 

プログラムコードから使用するには以下のように記述します。

string msgString = Resource1.resTestString;

リソースファイルで扱えるのは文字列だけではありません。デザイン画面上部のツールバーのボタンをクリックすると、追加可能なリソースの種類が表示されます。

たとえば、"Flower" という名前で追加した画像ファイルをピクチャーボックスにロードさせるには以下のようにコードを記述します。 

pictureBox1.Image = Resource1.Flower;

このようにリソースファイルを使用すると、その種別に関わらず "非実行可能 データ" を "リソース" というひとつの単位で扱うことができるようになるのです。

 

サンプルアプリケーションでのリソースファイルの使用

前回までの使用したサンプルアプリケーション用のリソースファイルを用意しました。

ここから myEditorRes.zip ファイルをダウンロードして解凍し、中身の  *.resx ファイルをプロジェクトに含めてください。

その後、各フォームのインスタンスを生成するための *.Designer.cs ファイルをオープンし、以下のようにリテラルでキャプションの文字列を指定している部分を、リソースファイル内のアイテムを参照するように変更していきます。

this.ファイルToolStripMenuItem.Text = "ファイル(&F)";
  ↓
this.ファイルToolStripMenuItem.Text = Form1_Res.MenuCaption_File;

ただし、*.Designer.cs ファイル内のコードは結構な量があり、これをいちいち直すのは大変なので、今回は私のほうで用意した修正済みのサンプル sample07.zip をダウンロードして使用することをお勧めします。

この sample07.zip に含まれるプロジェクトは、コントロールのキャプション、アプリケーションの実行中に表示されるメッセージボックスの文字列等を、リソースファイル内のアイテムを参照するように記述を変更してあります。

また、Form1 関連のファイルのみですが、コンパイルスイッチを変更することにより、メニューを英語表記に変更することが出来ます。

この動作を確認するには以下の手順を実行します。

1. sample07.zip から取り出したプロジェクトを Visual Studio でオープン

2. [F5] キーを押下してプロジェクトを実行し、起動したアプリケーションのメニューが日本語表記であることを確認してアプリケーションの実行を終了

3. ソリューションエクスプローラーから Form1.designer.cs をオープンし、コード先頭の "//#define string_mode_US" のコメントアウト ("//") を削除

4. Form1.cs のコードを表示し、同じくコード先頭の "//#define string_mode_US" のコメントアウト ("//") を削除

5. [F5] キーを押下してアプリケーションを実行し、メニューが英語表記になっていることを確認

このように、コントロールのキャプション、メッセージボックスの文字列をリソースとして一括管理することで、多言語対応なども簡単にできることがご理解いただけたかと思います。

それではまた。

<参考>
MSDN ライブラリ - 『リソース ファイルの操作』
http://msdn.microsoft.com/ja-jp/library/zabda143.aspx 

 

※マイクロソフト社員のコミュニティ参加について

 

※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ