2018年4月11日水曜日

MUIによるアプリケーションの国際化

ffftpで使われている技術、第一弾はMUIによるアプリケーションの国際化です。
Windowsではリソースファイルによる国際化が提供されていました。しかし、リソースファイルには単に言語情報が付与されているだけで切り替え機能が提供されていないため、言語切り替えはアプリケーションの責任となっていました。
しかし、Windows VistaからMUI; Multilingual User Interfaceというリソース切り替え機構が導入されました。MUIを適切に構成すると、LoadLibraryでリソースを読み込むだけで適切な言語のリソースを開くことができます。またMUI未対応環境のために互換APIとしてLoadMUILibraryが提供されています。

ffftpでは github:sayurin/ffftp/blob/v3.0/main.cpp#L278-L287 のようにWindows Vista未満を対象とするビルドに対しては、hInstanceをLoadMUILibraryで得られたリソースハンドルに置き換えています。Windows Vista以降を対象とする場合、そもそもWinMainで受け取るhInstanceはリソース切り替え済みのハンドルとなっているためコードは一切必要ありません。
なお、LoadMUILibraryはmuiload.h及びmuiload.libで提供されるため静的リンクしています。ここでmuiload.libはVisual C++ 2013以前を対象にビルドされているためVisaul C++ 2015以降で使用するためにはlegacy_stdio_definitions.libも併せてリンクする必要があります。

リソースは通常RC; Resource Compilerを使用してコンパイルしますし、Visual Studioではビルドの一環として組み込まれています。しかしMUI対応リソースはMUIRCTを使ってコンパイルする必要があり、Visual Studioのビルド手順には組み込まれていません。
そこでffftpではMuiResourceCompile.targetsを用意しました。単にビルド手順に含めるだけでなく次のようにプロパティページも表示することができます。


(まだ改良の余地はありますが、それはそれ…。)
ともあれ、これでビルドを行うと
  • ffftp.exe
  • en-US\ffftp.exe.mui
  • ja-JP\ffftp.exe.mui
が得られます。これらを配置することでMUIによるリソース切り替えが実現できます。

0 件のコメント: