SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

C#による多言語対応アプリケーション開発のコツ

Visual C# 2008で多言語対応を行う

3.Windows Form Application とコンポーネントの多言語化

 さっそくWindows フォーム アプリケーションの多言語化について議論していきましょう。

 まずは土台となるプロジェクトを用意します。いつものようにVC#を起動し、新規プロジェクトを作成してください。作成するプロジェクトは「Windowsフォームアプリケーション」で、適当な名前を付けてプロジェクトを作成し、フォームのデザイン画面を表示させておきます(Fig.1)。

Fig.1 Windowsフォームアプリケーションを選択

 さて、ここでいつも通りアプリケーションを組み立てていくわけですが、多言語化を行う際には、2つだけフォームのプロパティを設定する必要があります。LanguageプロパティとLocalizableプロパティです(Fig.2)。

Fig.2 LanguageプロパティとLocalizableプロパティ

 はじめに、LocalizableプロパティをTrueに設定します。これによって、必要な多言語リソースファイルをVC#が自動生成してくれるようになり、多言語化がぐっと楽になります。

 次にLanguageプロパティが(既定値)となっていることを確認します。これによってアプリケーションがこれから既定の言語で構築されることを明示できます。

 ここでいう既定の言語とは、アプリケーションにとっての既定の言語であって、アプリケーションが運用される環境においての既定の言語ではありません。つまり、プログラムがメインターゲットとするべき言語で、Windowsフォームアプリケーションを構築する必要があります。

 裏を返せば、Languageプロパティを(既定値)とした状態で開発されたWindowsフォーム アプリケーションは、言語パックを用意できない環境においては、その言語で表示されることになります。

 従って、既定の言語として日本語やハングル、アラビア圏の言語などを選択した場合、その言語を表示させるためのフォント等を持たない環境で実行されれば、プログラムは文字化けを起こすなどの症状に見舞われることでしょう。

 こういった理由から、Language(既定値)とした状態でWindowsフォームアプリケーションを作成するときには、英語(特に使用する文字をASCII文字に限定したもの)を用いて作成するべきだと言えます。

 今回は多言語化することが前提になっているので、今回の例だけでいえば、日本語や他の言語を既定の言語として作成したところで、後で英語表示用のファイルを用意すればよいわけで、結果的には問題ありません。

 この2つのプロパティを確認したら、フォーム上にプログラムが必要とするコンポーネントを配置して、そのコンポーネントの持つTextプロパティやHintプロパティといった、多言語化に必要なプロパティを設定していきます(Fig.3)。

Fig.3 ラベルをひ配置し、文字を書き込む

 例では、ラベルコンポーネントをフォームに張り付けて、そのTextプロパティに半角英数字でHello Worldを設定しました。

 一通りコンポーネントの配置と既定の言語での入力作業が終わったら、プロジェクトを保存してから[ビルド]を行い、期待通り動くことを確認しておきます。当然、多言語化を必要としないロジックの部分は、ここで組み上げてしまって構いません。

 動作が確認できたら、続いて多言語化の作業に入ります。このとき必要な作業は、フォームを選択し、Languageプロパティを多言語化のターゲットとする値に変更することです(Fig.4)。

Fig.4 Languageプロパティを変更する

 今回の例ではLanguageプロパティを日本語に設定していますが、ターゲットとする言語は読者各々で異なると思うので、適宣読み替えてください。

 こうしてLanguageプロパティを再設定したら、先ほど配置したコンポーネント類のTextプロパティやHintプロパティを、ターゲットとする言語で書き直していきます。

 一見、既定の言語で組み立てた環境を破壊しているように見えるかもしれませんが、ソリューションエクスプローラをのぞいてみると、もともとあったフォームのリソースファイルとは別に、各言語に対応したリソースファイルが新たに用意されていることが分かります(Fig.5)。

Fig.5 自動的に用意された、各言語のリソースファイル

 このモードをVC#では「ローカリゼーションモード」と呼び、通常のフォームをデザインしているときのモードとは区別しているようです。従って、ローカリゼーションモードでは、フォーム上にコンポーネントを追加する等の操作はできません。

 このリソースファイルのファイル名は特徴的で、[Formの名称].[言語名].[国名].resxという命名規則に従ってつけられています。これは、デフォルトのリソースファイルにも言えることで、デフォルトのリソースファイルでは、言語名と国名が省略された形でファイル名がつけられています。また、今回例に挙げたリソースファイルであれば、国名が省略された形でファイル名がつけられていることが分かるでしょう。

言語情報に国名を含めるか?

 Languageプロパティを設定するときに、言語情報に国名を含めるかどうかが問題になることがあります。 これは、リソースファイルのファイル名にも関連してくる問題です。 例えば日本語ならば、国名を含めなければ、リソースファイルのファイル名は国名を省略した形のjaとなりますが、国名を含めるとja.JPとなります。 本稿で取り上げる例では国名を含めないで作成していきますが、読者の係るプロジェクトで、言語情報に国名を必要とする場合には、言語名の後ろに国名が書かれたものを、Languageプロパティの値として設定する必要があるので、注意が必要です。

 こうして、多言語化の対象となる言語でフォーム上に配置されたコンポーネントの該当するプロパティを設定し、多言語化されたフォームを組み上げたら、最後にLanguageプロパティを(既定値)に戻します。これによって、ローカリゼーションモードから抜けることができます。

 Languageプロパティを(既定値)に戻すと、フォームは既定の言語で作成された状態に戻りますが、多言語化を行った部分の情報が失われたわけではないので安心してください。

 Languageプロパティを(既定値)に戻したら、通常通りビルドを行います。すると、実行ファイルが吐き出されたフォルダと同じフォルダに、新しく言語情報(実体はDLLファイル)を格納しているフォルダができ上がっているはずです(Fig.6)。

Fig.6 生成された、言語情報を格納しているフォルダ

 最初に述べた通り、配布の際にはこの言語情報を含んだフォルダを、実行ファイルと共に配布すれば、このプログラムの必要な項目は実行時に多言語化されます。

次のページ
4.Windows Form Application の管理下にない文字列の多言語化

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

太田 晃(オオタ アキラ)

 ブログ(http://repse.blogspot.com/)では、coLinux上にMinGWを用いてクロスコンパイル環境を構築し、そのうえでSDLやOpenGLを使ってWindows向けのプログラムを書くとか、海外のソフトウェアを(勝手に)日本語化するとか、Windowsのインデックスサービ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3288 2008/12/19 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー