多言語対応の仕方
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);