TN057: Localización de componentes de MFC

Nota:

La nota técnica siguiente no se ha actualizado desde que se incluyó por primera vez en la documentación en línea. Como resultado, algunos procedimientos y temas podrían estar obsoletos o ser incorrectos. Para obtener información más reciente, se recomienda buscar el tema de interés en el índice de la documentación en línea.

En esta nota se describen algunos de los diseños y procedimientos que puede usar para localizar el componente, si es una aplicación o un control OLE o una DLL que usa MFC.

Información general

Hay realmente dos problemas que resolver al localizar un componente que usa MFC. En primer lugar, debe localizar sus propios recursos: cadenas, cuadros de diálogo y otros recursos específicos del componente. La mayoría de los componentes creados con MFC también incluyen y usan una serie de recursos definidos por MFC. También debe proporcionar recursos de MFC localizados. Afortunadamente, MFC ya proporciona varios idiomas por sí mismo.

Además, el componente debe estar preparado para ejecutarse en su entorno de destino (entorno europeo o habilitado para DBCS). En su mayor parte, esto depende de que la aplicación trate correctamente los caracteres con el conjunto de bits más significativo y controle las cadenas con caracteres de doble byte. MFC está habilitado, de forma predeterminada, para ambos entornos, de modo que es posible tener un único binario mundial que se use en todas las plataformas con solo recursos diferentes conectados en el momento de la instalación.

Localización de los recursos del componente

La localización de la aplicación o DLL debe implicar simplemente la sustitución de los recursos por otros que coincidan con el idioma de destino. En el caso de sus propios recursos, esto es relativamente sencillo: edite los recursos en el editor y cree la aplicación. Si el código está escrito correctamente, no habrá cadenas ni texto que quiera localizar codificados de forma rígida en el código fuente de C++, toda la localización se puede realizar simplemente modificando los recursos. De hecho, puede implementar el componente de forma que todo lo que proporcione una versión localizada no implique ni siquiera una compilación del código original. Esto es más complejo, pero vale la pena y es el mecanismo elegido para MFC. También es posible localizar una aplicación mediante la carga del archivo EXE o DLL en el editor de recursos y la edición directa de los recursos. Siempre que sea posible, tendrá que volver a aplicar esos cambios cada vez que cree una nueva versión de la aplicación.

Una manera de evitarlo es colocar todos los recursos en un archivo DLL independiente, denominado, en ocasiones, DLL satélite. A continuación, este archivo DLL se carga dinámicamente en el entorno de ejecución y los recursos se cargan desde ese archivo DLL en lugar de desde el módulo principal con todo el código. MFC admite directamente este enfoque. Considere una aplicación denominada MYAPP.EXE, la cual tiene sus recursos ubicados en un archivo DLL denominado MYRES.DLL. En el valor InitInstance de la aplicación, podría hacer lo siguiente para cargar ese archivo DLL y hacer que MFC cargue recursos desde esa ubicación:

CMyApp::InitInstance()
{
    // one of the first things in the init code
    HINSTANCE hInst = LoadLibrary("myres.dll");

    if (hInst != NULL)
        AfxSetResourceHandle(hInst);

    // other initialization code would follow
    // ...
}

A partir de entonces, MFC cargará recursos desde ese archivo DLL en lugar de desde myapp.exe. No obstante, todos los recursos deben estar presentes en ese archivo DLL; MFC no buscará la instancia de la aplicación en la búsqueda de un recurso determinado. Esta técnica se aplica igualmente de manera correcta a los archivos DLL de MFC normales, así como a los controles OLE. El programa de instalación copiaría la versión adecuada de MYRES.DLL en función de la configuración regional del recurso que desee el usuario.

Es relativamente fácil crear un archivo DLL solo de recursos. Cree un proyecto DLL y agréguele el archivo .RC y los recursos necesarios. Si tiene un proyecto existente que no usa esta técnica, puede copiar los recursos de ese proyecto. Después de agregar el archivo de recursos al proyecto, casi está listo para crear el proyecto. Lo único que debe hacer es establecer las opciones del enlazador para que incluya /NOENTRY. Esto le indica al enlazador que el archivo DLL no tiene ningún punto de entrada ya que no tiene código.

Nota:

El editor de recursos de Visual C++ 4.0 y versiones posteriores admite varios idiomas por cada archivo .RC. Esto puede facilitar la administración de la localización en un solo proyecto. Los recursos de cada idioma se controlan mediante directivas de preprocesador generadas por el editor de recursos.

Uso de los recursos localizados de MFC proporcionados

Cualquier aplicación de MFC que cree reutiliza dos elementos de MFC: código y recursos. Es decir, MFC tiene varios mensajes de error, diálogos integrados y otros recursos que usan las clases de MFC. Para localizar completamente la aplicación, debe localizar no solo los recursos de esta, sino también los recursos que proceden directamente de MFC. MFC proporciona automáticamente varios archivos de recursos de idioma diferentes, de modo que si el idioma que tiene como destino es uno de los idiomas que MFC ya admite, solo tiene que asegurarse de usar esos recursos localizados.

En el momento de escribir este artículo, MFC admite chino, alemán, español, francés, italiano, japonés y coreano. Los archivos que contienen estas versiones localizadas están en los directorios MFC\INCLUDE\L.* ("L" significa localizados). Los archivos alemanes están en MFC\INCLUDE\L.DEU, por ejemplo. Para que la aplicación use estos archivos RC en lugar de los archivos ubicados en MFC\INCLUDE, agregue un elemento /IC:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\MFC\INCLUDE\L.DEU a la línea de comandos del archivo RC (esto es solo un ejemplo; tendría que sustituir la configuración regional de su elección, así como el directorio en el que instaló Visual C++).

Las instrucciones anteriores funcionarán si la aplicación se vincula estáticamente con MFC. La mayoría de las aplicaciones se vinculan dinámicamente (porque ese es el valor predeterminado de AppWizard). En este escenario, no solo el código está vinculado dinámicamente, también lo están los recursos. Como resultado, puede localizar los recursos de la aplicación, pero los recursos de implementación de MFC se seguirán cargando desde el archivo MFC7x.DLL (o una versión posterior) o desde MFC7xLOC.DLL si existe. Esto se puede observar desde dos perspectivas diferentes.

El enfoque más complejo es enviar uno de los archivos MFC7xLOC.DLL localizados (como MFC7xDEU, para alemán, MFC7xESP.DLL para español, etc.), o una versión posterior, e instalar el archivo MFC7xLOC.DLL adecuado en el directorio del sistema cuando el usuario instale la aplicación. Esto puede ser muy complejo para el desarrollador y para el usuario final y, por tanto, no se recomienda. Consulte la nota técnica 56 para más información sobre esta técnica y sus advertencias.

El enfoque más sencillo y seguro es incluir los recursos MFC localizados en la propia aplicación o DLL (o su DLL satélite si usa uno). Esto evita los problemas de una instalación correcta de MFC7xLOC.DLL. Para ello, siga las mismas instrucciones que para el caso estático indicado anteriormente (estableciendo la línea de comandos del archivo RC correctamente para que apunte a los recursos localizados), excepto que también debe quitar la definición de /D_AFXDLL que agregó AppWizard. Cuando /D_AFXDLL se define, AFXRES.H (y los demás archivos RC de MFC) no definen realmente ningún recurso (ya que se extraen de los archivos DLL de MFC en su lugar).

Consulte también

Notas técnicas por número
Notas técnicas por categoría