2011年11月7日月曜日

.NET 4 における LocBAML を利用した多言語対応

アプリケーションの多言語化対応というのは、人によっては必要な作業だと思います。MSDN でもローカライズ関係の資料が色々と掲載されており、その中の一つの方法として LocBaml ツールを利用したローカライズがあります。

LocBaml というのは WPF のサンプル集に含まれているツールの一つで、簡単に言うと
x:UID 属性が付与された要素を抜き出す
ツールとなっています。

抜き出した要素を CSV ファイルに出力し、それを各国語に翻訳、そして locBaml を再度利用して新たに別の国用リソースを作成するというものです。しかしなかなかうまいこといかない、そのまま書かれている通りに行うと項目数が膨大すぎる、などクセのあるものとなっていますので、今回自作ツールにて作業してみて思ったところも含めて書いていきます。

1:LocBaml ツールの入手

まず .NET4 用 LocBaml ツールを入手する必要があります。.NET 3.x 用 WPF サンプルに含まれている LocBaml では .NET 4 のアプリに対して実行するとエラーになります。何故か MS 公式では発見できなかったのですが、Michael Sync さんの Blog にて配布されていますのでこれを入手しておきます。ひょっとすると .NET 4 用の WPF サンプル集には含まれているのかも知れませんが、確認していません。

2:UID の付与

そして LocBaml を利用して要素を抽出するのですが、MSDN 等では MSBuild を利用して UID を割り振ってください、的な事を書いているかと思いますが、素直にこれを行うとプロジェクトに存在する全要素に UID が付与されてしまい、抽出される数が非常に膨大になってしまいます。ですので、あらかじめ外部リソースに抽出できるようにしたい要素をピックアップし、手作業で x:UID 要素を割り振っていくのがいいと思います。

また画像等のリソースですが、そのまま作業を続行すると各国用リソースに含まれてしまいます。もしどの言語においても、同じ画像等を利用するのであればメインモジュールに含ませるような指定を行う事ができます。手元には Express Edition しかないのでわからないのですが、恐らくは proj ファイルの Resource 要素を手作業で書き換えてあげる必要があるようです。

   1: <Resource Include="Images\Activity\zippedfile.png">
   2:   <Localizable>False</Localizable>
   3: </Resource>

Proj ファイルには Resource 要素を用いて画像などを取り込むように記述されていますが、通常の状態では Localizable 属性がない状態になっています。上記のように Localizable 属性を追加し False を指定すると、メインモジュールに取り込まれるようになります。

個人的にはこの段階でアプリケーションリソース等にまとめておき、GUI 等の要素には UID を割り振らないのが後々楽でいいと考えています。

3:言語設定を追加

もう一つ、 proj ファイルに追記する内容があります。

   1: <PropertyGroup>
   2:   <UICulture>en-US</UICulture>

含まれているデフォルトの PropertyGroup 要素に UICulture 属性を追記します。en-US やら ja-JP やら色々 Culture はありますので、そのあたりは調べてみてください。

また、AssemblyInfo ファイルには対象となるリソースが存在しない場合に利用する、デフォルトのカルチャを指定する部分がコメントアウトされています。

   1: <Assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)> 

上記の箇所でデフォルトカルチャを指定していますのでコメントを解除後、適したカルチャ名を記述してください。

4:要素の抽出

準備が整ったら一度ビルドします。ビルドすると Bin フォルダの直下に en-US 等の名前が付けられたフォルダも作成され、その直下にリソース用 dll が作成されていると思います。メインモジュール(Exe)が存在するフォルダに LocBaml ツールをコピーし、コマンドプロンプトより以下のようなコマンドを実行します。

LocBaml /parse (カルチャ名)/(リソース Dll) /out:[出力するCSV名]
サンプル)LocBaml /parse en-US/Sample.resources.dll /out:sample.en-us.csv

コマンドを実行すると指定した CSV ファイルに UID 要素の中身が出力されています。ここでエラーが出る場合、LocBaml ツールと実行するのに必要な Exe、Dll が同じフォルダに勢揃いしているかを確認してください。

5:翻訳

CSV を元に要素の内容を翻訳していきます。この際に MSDN 等では Excel で~と書いてありますが、文字コードが Shift-JIS になるとその後文字化けしてしまいますので、UTF-8 で保存するよう気を付けてください。

6:マージ

翻訳ができたらリソース用 Dll にマージします。コマンドプロンプトより以下のコマンドを実行します。もしここで新しいリソースを作成する場合、前もって ja-JP フォルダ等を用意しておくと少しだけ楽です。

LocBaml /generate (カルチャ名)/(リソース Dll) /trans:[取り込む CSV 名] /out:[Dll を出力するフォルダ名] /cul:[カルチャ]
サンプル)LocBaml /generate ja-JP/Sample.resources.dll /trans:sample.ja-JP.csv /out:d:ja-Jp /cul:ja-JP

少しだけ楽になる、というのは /out パラメータで指定する dll の出力先指定です。相対指定で書けるほうが楽ですね。

7:実行確認

これでローカライズした Dll が作成されました。実行するとこのような感じで動作します。

UI_ja-jp

通常で起動すると、先ほど作成した ja-JP リソースが利用されて表示されています。ためしに ja-JP フォルダにあるリソース Dll のファイル名を書き換え再起動してみると・・・。

UI_en-us

このように英語表記に変わります。このように最初は面倒な点が多いですが、一度コツをつかめばあとはそれほどの手間ではなくなります。CSV ファイルに出力した内容を取り込むだけですので、翻訳作業も分担化できるのではないでしょうか。

0 件のコメント:

コメントを投稿