Problemillas con cambio de idiomas desde DLLs

Kaworu
23 de Mayo del 2005
Hola, tengo un sistema que me permite cambiar de idioma la interficie de mi aplicación al vuelo meidante DLLs de solo recursos, pero tengo dos problemillas:

1.- Me veo obligado a inicializar manualmente todos los strings, lo cual no resulta muy util, puesto que mi aplicación tiene muchos dialogos y me gustaria ahorarrme este codigo para cada dialogo, cargar solo la libreria de recursos y que al redibujar el dialogo cambiara de idioma ¿hago algo mal o siempre será necesario escribirlo?

int CIdiomasDLLDlg::iPonerIdioma (IDIOMA idIdioma)
{
int iErr = ERR_OK;
CString csBuffer = "";
CWnd* pCadena1 = GetDlgItem (IDC_CADENA_1);
CWnd* pCancel = GetDlgItem (IDCANCEL);
HINSTANCE hInst = NULL;

switch (idIdioma)
{
case ESPANOL:
default:
{
if (m_hInstEspanol)
AfxSetResourceHandle (m_hInstEspanol);

hInst = m_hInstEspanol;

break;
}

case ENGLISH:
{
m_hInstEnglish = LoadLibraryEx (ENGLISH_DLL, NULL, LOAD_LIBRARY_AS_DATAFILE);

if (m_hInstEnglish)
AfxSetResourceHandle (m_hInstEnglish);

hInst = m_hInstEnglish;

break;
}
}

csBuffer.LoadString (IDC_CADENA_1);
pCadena1->SetWindowText (csBuffer);

csBuffer.LoadString (IDCANCEL);
pCancel->SetWindowText (csBuffer);

m_hIcon = LoadIcon (hInst, MAKEINTRESOURCE (IDI_ICONO_IDIOMA));
SetIcon (m_hIcon, TRUE);
SetIcon (m_hIcon, FALSE);

Invalidate (TRUE);

return iErr;
}

2.- Ademas, estaria dispuesto a sacrificar el cambio de idioma al vuelo con un reinicio del programa, puesto que lei que si cargaba lo primero de todo la DLL con el idioma, todos los strings etc. se inicializarian solos en toda la aplicación, pero al probrarlo, la libreira se carga bien, y si pruebo de recuperar una cadena de la string table veo que ha cambiado de idioma, pero al hacer CDialog::DoModal (); para el dialogo principal, este me devuelve -1, pq le falta el template de los recursos, o algo asi, ¿alguien sabe como podria hacerlo?

BOOL CIdiomasDLLApp::InitInstance()
{
HINSTANCE m_hInst = NULL;

m_hInst = LoadLibraryEx (ENGLISH_DLL, NULL, LOAD_LIBRARY_AS_DATAFILE);

if (m_hInst)
AfxSetResourceHandle (m_hInst);

AfxEnableControlContainer();

// Standard initialization

#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif

CIdiomasDLLDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();

return FALSE;
}

Gracias.

Kaworu
23 de Mayo del 2005
Solucionados!