2009-03-02 7 views
6

Je localise une application MFC en japonais et les ressources fonctionnent correctement.Où puis-je traduire les boîtes de message MFC?

Mon problème actuel est que lorsque j'utilise AfxMessageBox ou MessageBox, le titre de la boîte de dialogue et les messages du bouton apparaissent en anglais, et je n'ai trouvé nulle part pour changer cela.

Je n'ai rien trouvé d'utile pour chercher MSDN ou Google.

Donc,

Est-ce que cela fonctionne? Windows propose-t-il des boutons "OK" ou "Oui/Non" en japonais, en arabe et en russe?

Sinon, qu'est-ce que je spécifie pour les changer?

Éditer: Je suis allé avec MessageBoxEx, en écrivant une classe d'emballage pour le rendre aussi pratique à utiliser que AfxMessageBox. Il semble que MB_OK apparaisse comme "OK" en anglais et en japonais, mais d'autres options de boutons comme MB_YESNO sont traduites en quelque chose que je suppose être japonais correct. C'était une application assez petite à traduire, et nous pourrions vouloir utiliser quelque chose d'automatisé pour les plus grands.

Répondre

5

Utilisez MessageBoxEx et spécifiez le champ WLanguageId.

wLanguageID [en] Spécifie la langue du texte affiché dans le bouton boîte de message (s). La spécification d'une valeur de (0) indique d'afficher le texte dans la langue par défaut du système. Si ce paramètre est MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL), la langue en cours associée au thread appelant est utilisée.

Pour spécifier une autre langue que la langue en cours, utilisez la macro MAKELANGID pour créer ce paramètre . Pour plus d'informations, voir MAKELANGID.

Plus d'informations sur MAKELANGID peut être trouvé ici.


Si cela ne fonctionne pas bien pour vous, l'alternative serait de créer votre propre boîte de dialogue.

+0

Donc pas mieux que ** MessageBox ** et vous avez encore un problème de localisation ... De MSDN: * Les boutons sont dans la langue de l'interface utilisateur du système. Actuellement MessageBoxEx et MessageBox fonctionnent de la même manière. * – gavenkoa

2

Le titre est une chaîne que vous spécifiez, vous devriez donc pouvoir la traduire. Dans AfxMessageBox(), le titre est le nom de l'application (AfxGetAppName() IIRC). En ce qui concerne les boutons, le texte fait partie du système d'exploitation et ne peut pas être traduit. MessageBoxEx (mentionné par Brian) n'a jamais bien fonctionné en ce qui concerne le support des langues. This MS KB article d'il y a plus d'une décennie dit l'id de la langue sera correctement pris en charge par Windows 2000. Mais il n'a évidemment jamais réussi à traverser.

Vous n'avez pas vraiment de chance. Votre seule solution serait d'utiliser une implémentation tierce comme l'excellent XMessageBox et de fournir des traductions via votre table de chaînes.

Notez que le glossaire appTranslator contient des mots tels que Oui, Non, Annuler, ... en 25 langues et les traduirait automatiquement.

+0

FWIW, MessageBoxEx a bien fait l'affaire dans mon cas. –

+0

Bonjour David, j'ai essayé MessageBoxEx mais ça ne marche pas pour moi. Ai-je besoin d'un "pack de langue" supplémentaire pour le faire fonctionner? –

1

Créer votre propre L10N macros/fonction et utiliser ce code:

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

Comme je l'ai déjà écrit MessageBoxEx ignorer actuellement lang arg. ** MessageBoxEx ** ignore actuellement l'argument lang.

Questions connexes