Globalización de WPF

En este tema se presentan cuestiones que deben tenerse en cuenta al escribir aplicaciones de Windows Presentation Foundation (WPF) para el mercado global. Los elementos de programación de globalización se definen en .NET en el espacio de nombres System.Globalization.

Globalización XAML

El lenguaje de marcado de aplicaciones extensible (XAML) se basa en XML y aprovecha la compatibilidad de globalización definida en la especificación XML. En las secciones siguientes se describen algunas características de XAML que deben tenerse en cuenta.

Referencias de caracteres

Una referencia de carácter proporciona la unidad de código UTF16 del carácter Unicode concreto que representa, en decimal o hexadecimal. En el ejemplo siguiente se muestra una referencia de caracteres decimales para la LETRA MAYÚSCULA COPTIC HORI o "Ϩ":

Ϩ

En el ejemplo siguiente se muestra una referencia de carácter en formato hexadecimal. Tenga en cuenta que tiene una x delante del número hexadecimal.

Ϩ

Encoding

La codificación compatible con XAML es ASCII, Unicode UTF-16 y UTF-8. La declaración de codificación está al principio del documento XAML. Si no existe ningún atributo de codificación y no hay ningún orden de bytes, el analizador utiliza el valor predeterminado UTF-8. UTF-8 y UTF-16 son las codificaciones preferentes. No se admite UTF-7. En el ejemplo siguiente se muestra cómo especificar una codificación UTF-8 en un archivo XAML.

?xml encoding="UTF-8"?

Atributo de idioma

XAML usa xml:lang para representar el atributo de idioma de un elemento. Para aprovechar la clase CultureInfo, el valor del atributo de idioma debe ser uno de los nombres de referencias culturales predefinidos por CultureInfo. xml:lang es heredable en el árbol de elementos (mediante reglas XML, no necesariamente debido a la herencia de las propiedades de dependencia) y su valor predeterminado es una cadena vacía si no se asigna de manera explícita.

El atributo language es muy útil para especificar idiomas regionales. Por ejemplo, el francés tiene una ortografía, un vocabulario y una pronunciación diferentes en Francia, Quebec, Bélgica y Suiza. También el chino, el japonés y el coreano comparten puntos de código en Unicode, pero las formas ideográficas son diferentes y utilizan fuentes totalmente distintas.

El siguiente ejemplo de Extensible Application Markup Language (XAML) utiliza el atributo de idioma fr-CA para especificar el francés canadiense.

<TextBlock xml:lang="fr-CA">Découvrir la France</TextBlock>

Unicode

XAML admite todas las características Unicode, incluidas las suplentes. Siempre que el juego de caracteres se pueda asignar a Unicode, se admite. Por ejemplo, GB18030 presenta algunos caracteres que se asignan a la extensión A y B de chino, japonés y coreano (CFK) y pares suplentes, por lo tanto, es totalmente compatible. Una aplicación WPF puede usar StringInfo para manipular cadenas sin comprender si tienen pares suplentes o si combinan caracteres.

Diseñar una interfaz de usuario internacional con XAML

Esta sección describe las características de la interfaz de usuario (UI) que debe tener en cuenta al escribir una aplicación.

Texto internacional

WPF incluye procesamiento integrado para todos los sistemas de escritura admitidos por Microsoft .NET Framework.

Actualmente se admiten los siguientes scripts:

  • Árabe

  • Bengalí

  • Devanagari

  • Cirílico

  • Griego

  • Gujarati

  • Gurmukhi

  • Hebreo

  • Scripts ideográficos

  • Canarés

  • Lao

  • Latín

  • Malayalam

  • Mongol

  • Odia

  • Sirio

  • Tamil

  • Telugu

  • Thaana

  • Tailandés*

  • Tibetano

* En esta versión, la visualización y edición de texto tailandés es compatible; no lo es la separación de palabras.

Actualmente no se admiten los siguientes scripts:

  • Jemer

  • Hangul coreano antiguo

  • Myanmar

  • Cingalés

Todos los motores de los sistemas de escritura admiten las fuentes OpenType. Las fuentes OpenType pueden incluir las tablas de diseño OpenType que permiten a los creadores de fuentes diseñar mejores fuentes tipográficas internacionales y avanzadas. Las tablas de diseño de fuentes OpenType contienen información sobre las sustituciones de glifos, el posicionamiento de glifos, la justificación y el posicionamiento de la línea base, lo que permite que las aplicaciones de procesamiento de texto mejoren el diseño de texto.

Las fuentes OpenType permiten el control de grandes conjuntos de glifos mediante codificación Unicode. Esta codificación permite una amplia compatibilidad internacional, así como variantes tipográficas de los glifos.

La representación del texto en WPF es posible gracias a la tecnología de subpíxeles de Microsoft ClearType, compatible con la independencia de la resolución. Esto mejora significativamente la legibilidad y permite la capacidad de admitir documentos de estilo de revista de gran calidad para todos los scripts.

Diseño internacional

WPF proporciona una manera muy cómoda de admitir diseños horizontales, bidireccionales y verticales. En el marco de la presentación se puede utilizar la propiedad FlowDirection para definir el diseño. Los patrones de dirección de flujo son:

  • LeftToRight: diseño horizontal para latín, Este de Asia y demás.

  • RightToLeft: bidireccional para árabe, hebreo y demás.

Desarrollar aplicaciones localizables

Al escribir una aplicación para su consumo global, debe tener en cuenta que la aplicación debe ser localizable. En los temas siguientes se señalan las cosas que deben tenerse en cuenta.

Interfaz de usuario multilingüe

Las interfaces de usuario multilingües (MUI) son un soporte de Microsoft para cambiar las interfaces de usuario de un idioma a otro. Un aplicación WPF utiliza el modelo de ensamblado para admitir la MUI. Una aplicación contiene los ensamblados neutrales respecto al idioma, así como los ensamblados de recursos satélite dependientes del idioma. El punto de entrada es un .EXE administrado en el ensamblado principal. El cargador de recursos de WPF aprovecha el administrador de recursos de .NET Framework para admitir la búsqueda y la reserva de recursos. Varios ensamblados satélite de idioma funcionan con el mismo ensamblado principal. El conjunto de recursos que se carga depende del CurrentUICulture del subproceso actual.

Interfaz de usuario localizable

Las aplicaciones WPF usan XAML para definir su interfaz de usuario. XAML permite a los desarrolladores especificar una jerarquía de objetos con un conjunto de propiedades y lógica. El uso principal de XAML es desarrollar aplicaciones WPF, pero se puede usar para especificar una jerarquía de cualquier objeto de Common Language Runtime (CLR). La mayoría de los desarrolladores usan XAML para especificar la interfaz de usuario de su aplicación y usar un lenguaje de programación como C# para reaccionar a la interacción del usuario.

Desde un punto de vista de recursos, una interfaz de usuario es un elemento de recursos y, por lo tanto, su formato de distribución final debe ser localizable para admitir idiomas internacionales. Debido a que XAML no puede controlar eventos, muchas aplicaciones XAML contienen bloques de código para hacerlo. Para obtener más información, consulte XAML en WPF. El código se secciona y compila en distintos archivos binarios cuando un archivo XAML se convierte al formato BAML de XAML. Los archivos, imágenes y otros tipos de objetos de recursos administrados con formato BAML de XAML se insertan en el ensamblado de recursos satélite, que se puede localizar a otros idiomas, o en el ensamblado principal, cuando no se requiere la localización.

Nota:

Las aplicaciones WPF admiten todos los recursos FrameworkCLR, incluidas tablas de cadenas, imágenes, etc.

Compilar aplicaciones localizables

Localizar significa adaptar una UI a distintas referencias culturales. Para que una aplicación de WPF sea localizable, los desarrolladores deben compilar todos los recursos localizables en un ensamblado de recursos. El ensamblado de recursos se localiza a distintos idiomas y el código subyacente usa la API de administración de recursos para cargarse. Uno de los archivos necesarios para una aplicación de WPF es un archivo de proyecto (.proj). Todos los recursos que se utilizan en la aplicación deben incluirse en el archivo de proyecto. En el ejemplo siguiente de un archivo .csproj se muestra cómo hacerlo.

<Resource Include="data\picture1.jpg"/>
<EmbeddedResource Include="data\stringtable.en-US.restext"/>

Para utilizar un recurso en la aplicación, cree una instancia de ResourceManager y cargue el recurso que desee utilizar. En el ejemplo siguiente se muestra cómo hacerlo:

void OnClick(object sender, RoutedEventArgs e)
{
  ResourceManager rm = new ResourceManager ("MySampleApp.data.stringtable",
       Assembly.GetExecutingAssembly());
  Text1.Text = rm.GetString("Message");
}

Utilizar ClickOnce con aplicaciones localizadas

ClickOnce es una nueva tecnología de implementación de Windows Forms que se suministrará con Visual Studio 2005. Permite la instalación y actualización de aplicaciones web. Cuando se localiza una aplicación que se implementó con ClickOnce, solo puede verse en la referencia cultural localizada. Por ejemplo, si una aplicación implementada se localiza a japonés, solo puede verse en la versión japonesa de Microsoft Windows, no en la versión inglesa de Windows. Esto presenta un problema, porque es un escenario común que los usuarios japoneses ejecuten una versión en inglés de Windows.

La solución a este problema es establecer el atributo neutro de reserva de idioma. Como alternativa, un desarrollador de aplicaciones puede quitar recursos del ensamblado principal y especificar que los recursos puedan encontrarse en un ensamblado satélite correspondiente a una referencia cultural específica. Para controlar este proceso, use NeutralResourcesLanguageAttribute. El constructor de la clase NeutralResourcesLanguageAttribute tiene dos firmas, una que toma un parámetro UltimateResourceFallbackLocation para especificar la ubicación donde el ResourceManager debe extraer los recursos de reserva: ensamblado principal o ensamblado satélite. En el ejemplo siguiente se muestra cómo utilizar el atributo. En la ubicación de reserva definitiva, el código hace que ResourceManager busque los recursos en el subdirectorio "de" del directorio del ensamblado que se está ejecutando actualmente.

[assembly: NeutralResourcesLanguageAttribute(
    "de" , UltimateResourceFallbackLocation.Satellite)]

Vea también