Cómo usar C para admitir múltiples idiomas en un programa
Esta función también se llama en BOOL CPPgGeneral::OnApply() después de que el usuario cambia la selección de idioma en la ventana de opciones.
En la función void CPreferences::SetLanguage(), primero se llama a la función estática void InitLanguages(const CStringamp; rstrLangDir, bool bReInit = false). Esta función inicializa la "tabla de idiomas" estática (_aLanguages) atravesando el directorio "languages" (es decir, el directorio que mencionamos anteriormente y que se usa específicamente para almacenar archivos DLL para varias versiones de idiomas). Esta es una matriz estática donde cada elemento corresponde a un idioma admitido. Siempre que se pueda encontrar el archivo DLL, el idioma se marca como compatible en la tabla.
Luego, llame a static bool LoadLangLib(const CStringamp; rstrLangDir, LANGID lid) para cargar la DLL del idioma correspondiente (si el idioma a cargar es compatible, llame a aLanguages), cargue el archivo DLL correspondiente y copie la DLL El identificador del módulo se guarda en _hLangDLL, que también es una variable estática. Podemos ver que si está en inglés, no es necesario cargarlo y se puede usar directamente la tabla de cadenas de recursos en el módulo EXE.
Si al llamar al archivo LoadLangLib no se puede cargar el idioma especificado, el programa intentará determinar el conjunto de idiomas del sistema local y cargar el idioma correspondiente. Si la carga también falla, se utilizará el inglés.
Después de cargar exitosamente el archivo de idioma, el programa intentará cargar una cadena desde él. Si falla, el archivo DLL puede estar dañado y el programa restablecerá el idioma al inglés nuevamente. Las cadenas en inglés están integradas en el archivo EXE y, por tanto, son las más fiables.
En este punto, la carga se realiza correctamente y el identificador se guarda en la variable estática _hLangDLL.
Finalmente, cuando se requiere una cadena, el programa carga la cadena correspondiente a través de la función CString GetResString(UINT uStringID, WORD wLanguageID) o CString GetResString(UINT uStringID). La función de esta función es muy simple. Carga recursos de cadena desde el módulo especificado por _hLangDLL.
En el código fuente de emule, casi todos los cuadros de diálogo implementan una función Localize(void), que establece el texto de todos los controles en el cuadro de diálogo llamando a GetResString. En la función BOOL CPPgGeneral::OnApply(), podemos ver que después de cambiar el idioma llamando a la función CPreferences::SetLanguage, la función Localize(void) del cuadro de diálogo y la ventana se llamará en secuencia para restablecer el contenido del texto. de la interfaz de usuario.
Por último, si desea que su aplicación admita varios idiomas, establezca la propiedad Idioma del cuadro de diálogo en "Idioma neutral" al diseñar el cuadro de diálogo. Esta opción está disponible seleccionando el nodo de diálogo correspondiente en la vista de recursos y cambiando a la vista de propiedades. Si no se establece, aparecerán caracteres confusos.