2009-03-02 11 views
6

Sto localizzando un'app MFC in giapponese e le risorse funzionano correttamente.Dove traduco le caselle dei messaggi MFC

Il mio problema attuale è che, quando uso AfxMessageBox o , i messaggi del titolo della finestra e dei pulsanti vengono visualizzati in inglese e non ho trovato da nessuna parte che possa essere modificato.

Non ho trovato nulla di utile per la ricerca su MSDN o Google.

Quindi,

Funziona? Su Windows vengono visualizzati i pulsanti "OK" o "Sì/No" in giapponese, arabo e russo?

In caso contrario, cosa specificare per modificarli?

Modifica: Sono andato con MessageBoxEx, scrivendo una classe wrapper per renderlo più conveniente da utilizzare come AfxMessageBox. Sembra che MB_OK si presenta come "OK" sia in inglese che in giapponese, ma altre opzioni di pulsante come MB_YESNO sono tradotte in qualcosa che presumo sia corretto in giapponese. Questa è stata un'applicazione abbastanza piccola da tradurre e potremmo voler utilizzare qualcosa di automatizzato per quelli più grandi.

risposta

5

Utilizzare MessageBoxEx e specificare il campo WORD wLanguageId.

wLanguageId [in] Specifica la lingua per il testo visualizzato nella finestra di messaggio tasto (s). Specificare un valore pari a zero (0) indica di visualizzare il pulsante testo nella lingua di sistema predefinita. Se questo parametro è MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL), la lingua corrente associata al thread chiamante è utilizzato.

Per specificare una lingua diversa dalla lingua corrente, utilizzare la macro MAKELANGID per creare questo parametro . Per ulteriori informazioni, vedere MAKELANGID.

Ulteriori informazioni su MAKELANGID possono essere trovate qui.


Se ciò non funziona bene, l'alternativa sarebbe creare la propria finestra di dialogo.

+0

** MessageBoxEx ** attualmente ignora lang arg. Quindi non meglio di ** MessageBox ** e hai ancora problemi di localizzazione ... Da MSDN: * I pulsanti sono nella lingua dell'interfaccia utente di sistema. Attualmente MessageBoxEx e MessageBox funzionano allo stesso modo. * – gavenkoa

2

Il titolo è una stringa specificata, quindi dovresti essere in grado di tradurla. In AfxMessageBox(), il titolo è il nome dell'applicazione (AfxGetAppName() IIRC).

Per quanto riguarda i pulsanti, il testo fa parte del sistema operativo e non può essere tradotto.

MessageBoxEx (citato da Brian) non ha mai funzionato bene per quanto riguarda il supporto delle lingue. This MS KB article da oltre un decennio fa afferma che l'ID lingua sarà correttamente supportato da Windows 2000. Ma ovviamente non è mai riuscito a farlo.

Quindi sei praticamente sfortunato. L'unica soluzione sarebbe utilizzare un'implementazione di terze parti come l'eccellente XMessageBox e fornire traduzioni tramite la tabella delle stringhe.

Nota che il glossario appTranslator contiene parole come Sì, no, annulla, ... in 25 lingue e le tradurrebbe automaticamente.

+0

FWIW, MessageBoxEx ha funzionato bene nel mio caso. –

+0

Ciao David, ho provato MessageBoxEx ma non funziona per me. Ho bisogno di un ulteriore "Language Pack" per farlo funzionare? –

1

Crea il tuo L10N macro/funzione e di questo codice:

 
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; 
} 

Come ho scritto in precedenza MessageBoxEx attualmente ignorare Lang arg.

Problemi correlati