hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

いまさらのWindowsCEプログラミング(7) - 多言語対応

多言語対応の仕方

WindowsCEは内部Unicodeなので、国際化対応しやすいのですが、多言語に対応するためにはメニューやメッセージを言語毎に用意する必要があります。
Windowsではメッセージなどの情報はリソースに分離されているので、リソースの書き換えで多言語化が可能です。WinAmpなどの外国の有名なアプリケーションには大抵リソースを書き換える日本語化パッチが提供されています。もっともアプリケーションのバージョンが上がるたびにパッチを出すのは大変です。
WindowsではリソースだけのDLLを作ることができますので、リソースDLLで多言語対応するという方法があります。EBPocket/EBWinではこの方法(リソースDLL)で英語インタフェースを提供しています。翻訳してくださる方がいれば、他の言語を提供することも基本的には可能でしょう。

リソースDLLの作り方

  • ファイル(F)→新規作成→プロジェクトで"Win32 Dynamic-Link Library"を選択し、空のプロジェクトを作る。(eMbedded Visual Toolsでは、"WCE Dynamic-Link Library")
  • プロジェクト(P)→設定(S)→リンク→プロジェクトオプション(O)の末尾に /NOENTRY を追加する。(ただしVisual C++ 6.0の場合。eMbedded Visual Toolsでは不要)
  • 英語版を作る元のアプリケーションのリソースファイル(*.rc)をコピーし、言語を翻訳する。
  • 翻訳したリソースファイル(*.rc)と、シンボルヘッダーファイル(resource.h)をこのプロジェクトに追加する。

EBPocketの場合、元になる日本語版が開発途中で頻繁に修正されるため、次のようなSEDスクリプトを作って一括で英語リソースを生成しています。特に最初の4行は言語設定を英語に置き換えるために重要です。

SEDスクリプトの例(JtoE.sed):

s/AFX_TARG_JPN/AFX_TARG_ENU/
s/LANGUAGE LANG_JAPANESE,/LANGUAGE 9,/
s/LANGUAGE 17,/LANGUAGE 9,/
s/code_page(932)/code_page(1252)/

s/"ファイル(&F)"/"\&File"/
s/"終了(&X)"/"E\&xit"/
s/"編集(&E)"/"\&Edit"/
s/"コピー(&C)\\tCtrl+C"/"\&Copy\\tCtrl+C"/
s/"貼り付け(&P)\\tCtrl+V"/"\&Paste\\tCtrl+V"/
s/"切り取り(&T)\\tCtrl+X"/"Cu\&t\\tCtrl+X"/
s/"全て選択(&A)\\tCtrl+A"/"Select \&All\\tCtrl+A"/
...

置換の実行:
sed -f "EBWin/JtoE.sed" EBWin/EBWin.rc > EBWin/EBWinE.rc

リソースDLLの読み込み

アプリケーション起動時に、リソースDLLがあれば読み込みます。見つからない場合はアプリケーション内部のリソース(日本語)が使用されます。

InitiInstance()の先頭でリソースDLLをロードする

BOOL CEBWinApp::InitInstance()
{
   // one of the first things in the init code
#if (_WIN32_WCE >= 212)
    HINSTANCE hInst = LoadLibraryEx(_T("EBRes.dll"),NULL,LOAD_LIBRARY_AS_DATAFILE);
#else
    HINSTANCE hInst = LoadLibrary(_T("EBRes.dll"));
#endif
    if (hInst != NULL)
        AfxSetResourceHandle(hInst);