FC2ブログ
 

Technology へようこそ
ここは技術者の「経験」と「ノウハウ」のブログです


--年--月--日

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


2010年02月06日

VBアプリの多言語対応

VB 2005で作成したWindowsフォームアプリの多言語対応化の作業をしています。
その昔、英語版業務パッケージの日本語ローカライズにちょっぴり関わったことはあるものの、当時はVB6の時代。しかも、その逆パターンはやったことがない上、今回のメインターゲットは中国語という代物なだけにプチハマり中。

まず最初に調べたのは、少し前にこのブログでも書いたことがある、中国語版WinXPでフォームやコントロールのサイズが変わってしまうという今回最大の懸念事項。
が、これが「フォームのAutoScaleModeプロパティをNone設定にする」という簡単な対策であっさり回避できることが判明して一安心。

次に多言語対応化のメイン作業となる、各種リテラル(固定文字列)の動的設定の方法。
リテラルというのは、いわゆるフォームやコントロールに設定されたキャプション群や、コード内にハードコーディングされているメッセージやログなどに使われる文字列群のことです。
元々日本語で記述されているこれらの文言をターゲット環境の言語に応じて切り替えてやる必要があるわけですが、.NET Frameworkには元々多言語対応の仕組みが用意されているので、その方法に従うというポリシーで調査開始。

結果的に重要キーワードとして浮かび上がってきたのは「カルチャ」と「リソース」。
普段から聞いたことはあるものの、あまりきちんと押さえていなかったりしがち、と思われる領域です。
あまりダラダラ書いても長くなってしまうので、これらのキーワードをベースに、具体的な操作を以下に挙げておきます。
ちなみに前述のコントロールキャプションなどは「UIリソース」と呼び、その他は「テキストリソース」と呼ぶことにします。

・UIリソースの多言語対応

まず、「フォームのLocalizableプロパティをTrue」にして、ローカライズ可能なフォームとします。次にLanguageプロパティでカルチャを変更することによって、UIリソースを各国語ごとに保存することが出来るようになります。普段フォームごとに自動生成される「*.resx」ファイルというのが実際にUIリソースが納められているファイルで、ローカライズした言語(カルチャ)の分だけresxファイルが作られることとなります。ローカライズの作業自体はVSのデザイナが使えるので特に難しいことはありません。(実際に各国語を翻訳できるかどうかは別問題w) また、こうして作られたリソースファイルはプロジェクトをビルドするとbinフォルダ配下にカルチャごとのサブフォルダに「*.resources.dll」という名前のファイルとなって配置されることになります。(サテライトアセンブリ)

・テキストリソースの多言語対応

前述のリソースファイルにはテキストリソースも含めることができます。リソースファイルに含まれたテキストはResourceManagerクラスを介して参照することが可能となります。ちなみにテキストリソースの元ネタは「Key=Value」の形式で記述されたプレーンなテキストファイルです。テキストリソースはVS上からプロジェクトに追加することも可能だと思いますが、今回は誰でも簡単にテキストリソースの変更が可能となるように、リソースビルド用のバッチファイルを用意しました。内容は.NETランタイムに付属するリソースファイルジェネレータ(Resgen.exe)というツールを使って、テキストファイルから*.resourcesファイルを作成、その後アセンブリリンカ(Al.exe・SDKに付属)でサテライトアセンブリ(*.resources.dll)を作成する、といった感じです。サテライトアセンブリはカルチャごとに存在しますので、これをカルチャごとに行なう必要があります。(本当はUIカルチャとテキストカルチャを別々のアセンブリに分離したかったのですが、どうにもうまくいかないようなので、UIリソースとテキストリソースをひとまとめにリンクしてビルドするようにしました) 前準備としてはこれだけですが、当然ソースコード内のリテラルを扱っている箇所はリソースから文字列を取得するような作りに変更しなければならないのは言うまでもありません。

と、まぁ、とりあえずこれだけやれば同一のバイナリが各言語版のWindowsでローカライズされた状態で動作するようになるはずです。
肝の部分は思っていたよりも簡単にできて若干拍子抜けな感はありますが、一緒に使っているCrystal Reportの文字列リソースなどはここまで賢い形にはなっておらず、かなり泥臭いことをする必要があったりするようなので、モノによっては枝葉の部分でハマることはあるかもしれません。

[ posted by ken ]

この記事に対するコメント


この記事に対するコメントの投稿














管理者にだけ表示を許可する



この記事に対するトラックバック
トラックバックURL
http://comfair2.blog24.fc2.com/tb.php/454-cd2247fe
この記事にトラックバックする(FC2ブログユーザー)











上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。