2009-03-02 12 views
6

Estoy localizando una aplicación MFC en japonés y los recursos funcionan correctamente.Dónde se traducen los cuadros de mensaje de MFC

Mi problema actual es que, cuando uso AfxMessageBox o MessageBox, el título del diálogo y los mensajes del botón aparecen en inglés, y no he encontrado ningún lugar para cambiar eso.

No he encontrado nada útil buscando en MSDN o Google.

Entonces,

¿Funciona? ¿Sale Windows con los botones "Aceptar" o "Sí/No" en japonés, árabe y ruso?

Si no, ¿qué especifico para cambiar esto?

Editar: Fui con MessageBoxEx, escribir una clase contenedora que sea lo más conveniente para su uso como AfxMessageBox. Parece que MB_OK aparece como "OK" en inglés y japonés, pero otras opciones de botón como MB_YESNO se traducen en algo que supongo que es correcto en japonés. Esta era una aplicación bastante pequeña para traducir, y es posible que deseemos utilizar algo automatizado para los más grandes.

Respuesta

5

Uso MessageBoxEx y especificar el campo PALABRA wLanguageID.

wLanguageID [en] Especifica el idioma del texto que aparece en el botón (s) cuadro de mensaje . Al especificar un valor de cero (0), se muestra el texto del botón en el idioma predeterminado del sistema. Si este parámetro es MAKELANGID (LANG_NEUTRAL, SUBLANG_NEUTRAL), el idioma actual asociado con el hilo de llamada es utilizado.

Para especificar un idioma que no sea el idioma actual, use la macro MAKELANGID para crear este parámetro . Para obtener más información, consulte MAKELANGID.

Más información sobre MAKELANGID se puede encontrar aquí.


Si esto no funciona bien para usted, la alternativa sería crear su propio cuadro de diálogo.

+0

** MessageBoxEx ** ignora actualmente lang arg. Así que no es mejor que ** MessageBox ** y aún tenga problemas de localización ... Desde MSDN: * Los botones están en el idioma de la interfaz de usuario del sistema. Actualmente MessageBoxEx y MessageBox funcionan de la misma manera. * – gavenkoa

2

El título es una cadena que especifique, por lo que debería ser capaz de traducirlo. En AfxMessageBox(), el título es el nombre de la aplicación (AfxGetAppName() IIRC).

En cuanto a los botones, el texto es parte del sistema operativo y no se puede traducir.

MessageBoxEx (mencionado por Brian) nunca funcionó bien con respecto al soporte de idiomas. This MS KB article de hace más de una década dice que la identificación del idioma será soportada correctamente por Windows 2000. Pero obviamente nunca llegó a su fin.

Así que estás muy de suerte. Su única solución sería utilizar una implementación de terceros como la excelente XMessageBox y proporcionar traducciones a través de su tabla de cadenas.

Tenga en cuenta que el glosario de appTranslator contiene palabras como Sí, no, cancelar, ... en 25 idiomas y las traduciría automáticamente.

+0

FWIW, MessageBoxEx hizo el truco muy bien en mi caso. –

+0

Hola David, probé MessageBoxEx pero no funciona para mí. ¿Necesito algún "paquete de idioma" adicional para que funcione? –

1

Crear su propio L10N macros/función y utilizar este código:

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

Como he escrito anteriormente MessageBoxEx Actualmente ignorar lang arg.

Cuestiones relacionadas