2009-03-02 16 views
6

MFCアプリケーションを日本語にローカライズしていて、リソースが正しく機能しています。どこでMFCメッセージボックスを翻訳しますか

私の現在の問題は、AfxMessageBoxまたはMessageBoxを使用すると、ダイアログタイトルとボタンメッセージが英語で表示され、それを変更する場所が見つかりませんでした。

MSDNやGoogleの検索に役立つものはありませんでした。

したがって、

これは機能しますか? Windowsは日本語、アラビア語、ロシア語の「OK」または「はい/いいえ」ボタンを表示しますか?

そうでない場合は、これらを変更するために何を指定しますか?

編集:私はMessageBoxExに行って、AfxMessageBoxとして使用すると便利なようにラッパークラスを作成しました。 MB_OKは英語と日本語の両方で「OK」と表示されますが、MB_YESNOのような他のボタンオプションは正しい日本語と解釈されます。これは翻訳するのには非常に小さなアプリケーションでしたし、大きなものに対しては自動化されたものを使用したいかもしれません。

答えて

5

MessageBoxExを使用し、WORD wLanguageIdフィールドを指定します。

wLanguageId [In]はメッセージボックス ボタン(複数可)に表示されるテキストの言語を指定します。 (0)の値を指定すると、ボタン のテキストがデフォルトのシステム言語で表示されます。 このパラメータが MAKELANGID(LANG_NEUTRAL、 SUBLANG_NEUTRAL)の場合、呼び出し元スレッドに関連付けられている現在の言語 は です。

現在の言語以外の言語を指定するには、 MAKELANGIDマクロを使用して、この パラメータを作成します。詳細については、 MAKELANGIDを参照してください。

MAKELANGIDの詳細はこちらをご覧ください。


これがうまくいかない場合は、独自のダイアログボックスを作成することもできます。

+0

** MessageBoxEx **は現在、lang argを無視しています。 ** MessageBox **の方が面白くないので、まだローカリゼーションに問題があります。 MSDNから:*ボタンはシステムのユーザーインターフェイスの言語で表示されます。 現在、MessageBoxExとMessageBoxは同じ方法で動作します。* – gavenkoa

2

タイトルは指定した文字列なので、翻訳できるはずです。 AfxMessageBox()のタイトルは、アプリケーション名(AfxGetAppName()IIRC)です。

ボタンに関しては、テキストはOSの一部であり、翻訳することはできません。

MessageBoxEx(Brian氏)は、言語サポートに関してはうまく機能しませんでした。 This MS KB articleからは10年以上前に、言語IDがWindows 2000で正しくサポートされると言われています。

あなたはほとんど幸運から外れています。あなたの唯一の解決策は、優れたXMessageBoxのようなサードパーティの実装を使用し、文字列テーブルを使って翻訳を提供することです。

appTranslatorの用語集には、「はい」、「いいえ」、「キャンセル」、「...」などの言葉が25言語で含まれていて、それらを自動的に翻訳することに注意してください。

+0

FWIW、MessageBoxExは私の場合はうまくやってくれました。 –

+0

こんにちはDavid、私はMessageBoxExを試しましたが、それは私のためには機能しません。それを動作させるには、追加の「言語パック」が必要ですか? –

1

独自のL10Nマクロ/関数を作成し、このコードを使用します。

 
static LRESULT __stdcall ChangeCaptions(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (nCode == HCBT_ACTIVATE) { 
     SetWindowText(GetDlgItem((HWND) wParam, IDOK), L10N(GUI_OK_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDCANCEL), L10N(GUI_CANCEL_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDYES), L10N(GUI_YES_MSG)); 
     SetWindowText(GetDlgItem((HWND) wParam, IDNO), L10N(GUI_NO_MSG)); 
    } 
    return 0; 
} 

int addon_gui_messagebox(HWND parentHWnd, HINSTANCE hInstance, void *text, void *caption, int type) 
{ 
    int ret; 
    hook = SetWindowsHookEx(WH_CBT, ChangeCaptions, hInstance, GetCurrentThreadId()); 
    ret = MessageBox(parentHWnd, text, caption, type); 
    UnhookWindowsHookEx(hook); 
    return ret; 
} 

私は現在、LANG引数を無視し、以前にMessageBoxEx書いたように。

関連する問題