Compartir a través de


Introducción a la globalización y la localización de WPF

Cuando limita la disponibilidad de su producto a solo un idioma, limita su posible base de clientes a una fracción de la población de 7.500 millones del mundo. Si quieres que tus aplicaciones lleguen a un público global, la localización rentable de tu producto es una de las mejores y más económicas formas de llegar a más clientes.

En esta introducción se presenta la globalización y la localización en Windows Presentation Foundation (WPF). La globalización es el diseño y el desarrollo de aplicaciones que realizan en varias ubicaciones. Por ejemplo, la globalización admite interfaces de usuario localizadas y datos regionales para los usuarios en distintas referencias culturales. WPF proporciona características de diseño globalizadas, como el diseño automático, los ensamblados satélite y los atributos localizados y los comentarios.

La localización es la traducción de recursos de aplicación en versiones localizadas para las referencias culturales específicas que admite la aplicación. Al localizar en WPF, se usan las API en el System.Windows.Markup.Localizer espacio de nombres . Estas API potencian la herramienta de línea de comandos De ejemplo de herramienta LocBaml . Para obtener información sobre cómo compilar y usar LocBaml, consulte Localización de una aplicación.

Advertencia

La herramienta LocBaml solo funciona con WPF para proyectos de .NET Framework, no funciona con WPF para .NET.

Procedimientos recomendados para la globalización y la localización en WPF

Puede aprovechar la mayor parte de la funcionalidad de globalización y localización integrada en WPF siguiendo las sugerencias relacionadas con el diseño de la interfaz de usuario y las sugerencias relacionadas con la localización que proporciona esta sección.

Procedimientos recomendados para el diseño de la interfaz de usuario de WPF

Al diseñar una interfaz de usuario basada en WPF, considere la posibilidad de implementar estos procedimientos recomendados:

  • Escribir la interfaz de usuario en XAML; evite crear la interfaz de usuario en el código. Al crear la interfaz de usuario mediante XAML, se expone a través de las API de localización integradas.

  • Evite usar posiciones absolutas y tamaños fijos para diseñar contenido; en su lugar, use el ajuste de tamaño relativo o automático.

    • Use SizeToContent y mantenga los anchos y los alto establecidos en Auto.

    • Evite usar Canvas para diseñar interfaces de usuario.

    • Use Grid y su característica de uso compartido de tamaño.

  • Proporcione espacio adicional en los márgenes porque el texto localizado a menudo requiere más espacio. Espacio adicional permite posibles caracteres de voladizo.

  • Habilite TextWrapping en TextBlock para evitar el recorte.

  • Establezca el xml:lang atributo . Este atributo describe la cultura de un elemento específico y sus elementos hijos. El valor de esta propiedad cambia el comportamiento de varias características en WPF. Por ejemplo, cambia el comportamiento del silabeo, la revisión ortográfica, la sustitución de números, la configuración de scripts complejos y la fuente alternativa. Consulta Globalización para WPF para obtener más información sobre cómo establecer el control xml:lang en XAML.

  • Cree una fuente compuesta personalizada para obtener un mejor control de las fuentes que se usan para diferentes idiomas. De forma predeterminada, WPF usa la fuente GlobalUserInterface.composite en el directorio Windows\Fonts.

  • Al crear aplicaciones de navegación que se puedan localizar en una cultura que presenta texto en un formato de derecha a izquierda, establezca explícitamente la FlowDirection de cada página para asegurar que la página no herede FlowDirection de NavigationWindow.

  • Al crear aplicaciones de navegación independientes que se hospedan fuera de un navegador, configure el StartupUri de su aplicación inicial como NavigationWindow, en lugar de como una página (por ejemplo, <Application StartupUri="NavigationWindow.xaml">). Este diseño permite cambiar el FlowDirection de la ventana y la barra de navegación. Para obtener más información y un ejemplo, vea Ejemplo de página principal de globalización.

Procedimientos recomendados para la localización de WPF

Al localizar aplicaciones basadas en WPF, considere la posibilidad de implementar estos procedimientos recomendados:

  • Use comentarios de localización para proporcionar contexto adicional para los localizadores.

  • Use atributos de localización para controlar la localización en lugar de omitir Uid de forma selectiva las propiedades de los elementos. Consulte Atributos y comentarios de localización para obtener más información.

  • Usa msbuild -t:updateuid y -t:checkuid para agregar y comprobar Uid propiedades en tu XAML. Use Uid propiedades para realizar un seguimiento de los cambios entre el desarrollo y la localización. Uid las propiedades le ayudan a localizar los nuevos cambios de desarrollo. Si agrega Uid manualmente propiedades a una interfaz de usuario, la tarea suele ser tediosa y menos precisa.

    • No edite ni cambie Uid las propiedades después de comenzar la localización.

    • No use propiedades duplicadas Uid (recuerde esta sugerencia cuando use el comando copy-and-paste).

    • Establezca la ubicación de UltimateResourceFallback en AssemblyInfo.* para especificar el idioma adecuado para el respaldo (por ejemplo, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]).

      Si decide incluir el idioma de origen en el ensamblado principal, omitiendo la etiqueta <UICulture> en el archivo del proyecto, configure la ubicación UltimateResourceFallback como el ensamblado principal en lugar del satélite (por ejemplo, [assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.MainAssembly)]).

Localizar una aplicación WPF

Al localizar una aplicación WPF, tiene varias opciones. Por ejemplo, puedes enlazar los recursos localizables de la aplicación a un archivo XML, almacenar texto localizable en tablas resx o hacer que el localizador use archivos XAML. En esta sección se describe un flujo de trabajo de localización que usa el formato BAML de XAML, que proporciona varias ventajas:

  • Puede localizar después de compilar.

  • Puedes actualizar a una versión más reciente de la forma BAML de XAML con las localizaciones de una versión anterior de la forma BAML de XAML, de manera que puedas localizar al mismo tiempo que desarrollas.

  • Puedes validar la semántica y los elementos de origen originales en tiempo de compilación porque el formato BAML de XAML es la forma compilada de XAML.

Proceso de construcción de localización

Al desarrollar una aplicación WPF, el proceso de compilación para la localización es el siguiente:

  • El desarrollador crea y globaliza la aplicación WPF. En el archivo de proyecto, el desarrollador establece <UICulture>en-US</UICulture> para que, cuando se compile la aplicación, se genere un ensamblado principal independiente del lenguaje. Este ensamblado tiene un archivo satélite .resources.dll que contiene todos los recursos localizables. Opcionalmente, puede mantener el lenguaje de origen en el ensamblado principal porque nuestras API de localización admiten la extracción del ensamblado principal.

  • Cuando el archivo se compila en la compilación, el XAML se convierte en el formato BAML de XAML. Los archivos culturalmente neutros MyDialog.exe y culturalmente dependientes (inglés) MyDialog.resources.dll se entregan al cliente de habla inglesa.

Flujo de trabajo de localización

El proceso de localización comienza después de compilar el archivo no localizado MyDialog.resources.dll . Los elementos y propiedades de la interfaz de usuario en su XAML original se extraen de la forma BAML de XAML en pares clave-valor mediante las API bajo System.Windows.Markup.Localizer. Los localizadores usan los pares clave-valor para localizar la aplicación. Puede generar un nuevo .resource.dll a partir de los nuevos valores una vez completada la localización.

Las claves de los pares clave-valor son x:Uid valores colocados por el desarrollador en el XAML original. Estos x:Uid valores permiten a la API realizar un seguimiento y combinar los cambios que se producen entre el desarrollador y el localizador durante la localización. Por ejemplo, si el desarrollador cambia la interfaz de usuario después de que el localizador comience a localizarse, puede combinar el cambio de desarrollo con el trabajo de localización ya completado para que se pierda el trabajo de traducción mínimo.

En el gráfico siguiente se muestra un flujo de trabajo de localización típico basado en el formato BAML de XAML. En este diagrama se supone que el desarrollador escribe la aplicación en inglés. El desarrollador crea y globaliza la aplicación WPF. En el archivo de proyecto, el desarrollador establece <UICulture>en-US</UICulture> para que, en la compilación, se genere un ensamblado principal independiente del lenguaje con un satélite .resources.dll que contenga todos los recursos localizables. Como alternativa, podría mantener el lenguaje de origen en el ensamblado principal porque las API de localización de WPF admiten la extracción del ensamblado principal. Después del proceso de compilación, el XAML se compila en BAML. El MyDialog.exe.resources.dll culturalmente neutro se envía al cliente de habla inglés.

Diagrama que muestra el flujo de trabajo de localización.

Diagrama que muestra el flujo de trabajo no localizado.

Ejemplos de localización de WPF

Esta sección contiene ejemplos de aplicaciones localizadas que le ayudarán a comprender cómo compilar y localizar aplicaciones WPF.

Ejemplo de cuadro de diálogo Ejecutar

Los gráficos siguientes muestran la salida del ejemplo de cuadro de diálogo Ejecutar .

Inglés:

Captura de pantalla que muestra un cuadro de diálogo Ejecutar en inglés.

Alemán:

Captura de pantalla que muestra un cuadro de diálogo Ejecutar en alemán.

Diseño de un cuadro de diálogo De ejecución global

En este ejemplo se genera un cuadro de diálogo Ejecutar mediante WPF y XAML. Este cuadro de diálogo es equivalente al cuadro de diálogo Ejecutar que está disponible en el menú Inicio de Microsoft Windows.

Algunos aspectos destacados para crear cuadros de diálogo globales son:

Diseño automático

En Window1.xaml:

<Window SizeToContent="WidthAndHeight">

La propiedad Window anterior cambia automáticamente el tamaño de la ventana según el tamaño del contenido. Esta propiedad impide que la ventana corte contenido que aumente de tamaño después de la localización; también quita el espacio innecesario cuando el contenido disminuye en tamaño después de la localización.

<Grid x:Uid="Grid_1">

Uid Se necesitan propiedades para que las API de localización de WPF funcionen correctamente.

Las API de localización de WPF las usan para realizar un seguimiento de los cambios entre el desarrollo y la localización de la interfaz de usuario (UI). Uid las propiedades permiten combinar una versión más reciente de la interfaz de usuario con una localización anterior de la interfaz de usuario. Para agregar una Uid propiedad, ejecute msbuild -t:updateuid RunDialog.csproj en un shell de comandos. Este es el método recomendado para agregar Uid propiedades porque agregarlas manualmente suele llevar mucho tiempo y ser menos precisa. Puede comprobar que las propiedades Uid se establecen correctamente mediante la ejecución de msbuild -t:checkuid RunDialog.csproj.

La interfaz de usuario está estructurada mediante el Grid control , que es un control útil para aprovechar el diseño automático en WPF. Tenga en cuenta que el cuadro de diálogo se divide en tres filas y cinco columnas. No una de las definiciones de fila y columna tiene un tamaño fijo; Por lo tanto, los elementos de la interfaz de usuario que se colocan en cada celda pueden adaptarse a aumentos y reducciones de tamaño durante la localización.

<Grid.ColumnDefinitions>
  <ColumnDefinition x:Uid="ColumnDefinition_1" />
  <ColumnDefinition x:Uid="ColumnDefinition_2" />

Las dos primeras columnas donde la etiqueta Open: y ComboBox se colocan usan el 10 % del ancho total de la interfaz de usuario.

  <ColumnDefinition x:Uid="ColumnDefinition_3" SharedSizeGroup="Buttons" />
  <ColumnDefinition x:Uid="ColumnDefinition_4" SharedSizeGroup="Buttons" />
  <ColumnDefinition x:Uid="ColumnDefinition_5" SharedSizeGroup="Buttons" />
</Grid.ColumnDefinitions>

Tenga en cuenta que en el ejemplo se usa la característica de ajuste de tamaño compartido de Grid. Las tres últimas columnas aprovechan esto al posicionarse en el mismo SharedSizeGroup. Como cabría esperar del nombre de la propiedad, esto permite que las columnas compartan el mismo tamaño. Así que cuando "Examinar..." se localiza en la cadena más larga "Examinar…", todos los botones crecen en ancho en lugar de tener un botón pequeño "OK" y un botón "Examinar..." desproporcionadamente grande.

xml:lang

xml:lang="en-US"

Observe el manejo de xml:lang en XAML colocado en el elemento raíz de la interfaz de usuario. Esta propiedad describe la cultura de un elemento dado y sus elementos secundarios. Este valor lo usan varias características de WPF y se deben cambiar adecuadamente durante la localización. Este valor cambia el diccionario de idioma que se usa para el guionado y la corrección ortográfica de palabras. También afecta a la visualización de dígitos y cómo el sistema de fuentes alternativas escoge la fuente a utilizar. Por último, la propiedad afecta a la forma en que se muestran los números y la forma en que se forman los textos escritos en scripts complejos. El valor predeterminado es "en-US".

Creación de un ensamblado de recursos satélite

En .csproj:

Edite el .csproj archivo y agregue la siguiente etiqueta a un incondicional <PropertyGroup>:

<UICulture>en-US</UICulture>

Observe la adición de un UICulture valor. Cuando se establece en un valor válido CultureInfo como en-US, al construir el proyecto se generará un ensamblado satélite con todos los recursos localizables.

<Resource Include="RunIcon.JPG">

<Localizable>False</Localizable>

</Resource>

RunIcon.JPG no necesita ser localizado porque debería aparecer igual para todas las culturas. Localizable se establece en false para que permanezca en el ensamblaje principal neutral al lenguaje en lugar del ensamblaje satélite. El valor predeterminado de todos los recursos no compilables se Localizable establece en true.

Localizar el cuadro de diálogo de ejecución

analizar

Después de compilar la aplicación, el primer paso para localizarlos es analizar los recursos localizables fuera del ensamblado satélite. Para los fines de este tema, use la herramienta LocBaml de ejemplo que se puede encontrar en LocBaml Tool Sample. Tenga en cuenta que LocBaml es solo una herramienta de ejemplo diseñada para ayudarle a empezar a crear una herramienta de localización que se ajuste al proceso de localización. Con LocBaml, ejecute lo siguiente para analizar: LocBaml /parse RunDialog.resources.dll /out: para generar un "RunDialog.resources.dll.CSV" archivo.

Advertencia

La herramienta LocBaml solo funciona con WPF para proyectos de .NET Framework, no funciona con WPF para .NET.

Localizar

Use su editor CSV favorito que admita Unicode para editar este archivo. Filtre todas las entradas con una categoría de localización "None". Debería ver las siguientes entradas:

Clave de recurso Categoría de localización Importancia
Button_1:System.Windows.Controls.Button.$Content Botón De acuerdo
Button_2:System.Windows.Controls.Button.$Content Botón Cancelar
Button_3:System.Windows.Controls.Button.$Content Botón Navegar...
ComboBox_1:System.Windows.Controls.ComboBox.$Content ComboBox
TextBlock_1:System.Windows.Controls.TextBlock.$Content Mensaje de texto Escriba el nombre de un programa, una carpeta, un documento o un recurso de Internet, y Windows lo abrirá automáticamente.
TextBlock_2:System.Windows.Controls.TextBlock.$Content Mensaje de texto Abrir:
Window_1:System.Windows.Window.Title Título Correr

La localización de la solicitud en alemán requeriría las siguientes traducciones:

Clave de recurso Categoría de localización Importancia
Button_1:System.Windows.Controls.Button.$Content Botón De acuerdo
Button_2:System.Windows.Controls.Button.$Content Botón Cancelar
Button_3:System.Windows.Controls.Button.$Content Botón Explorar...
ComboBox_1:System.Windows.Controls.ComboBox.$Content ComboBox
TextBlock_1:System.Windows.Controls.TextBlock.$Content Mensaje de texto Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource an.
TextBlock_2:System.Windows.Controls.TextBlock.$Content Mensaje de texto Abrir:
Window_1:System.Windows.Window.Title Título Correr

Generar

El último paso de localización implica la creación del ensamblado satélite recién localizado. Esto se puede lograr con el siguiente comando LocBaml:

LocBaml.exe /generate RunDialog.resources.dll /trans:RunDialog.resources.dll. CSV /out: . /cul:de-DE

En Windows alemán, si este resources.dll se coloca en una carpeta de-DE junto al ensamblado principal, este recurso se cargará automáticamente en lugar del de la carpeta en-US. Si no tiene una versión alemana de Windows para probar esto, establezca la referencia cultural en cualquier referencia cultural de Windows que use (por ejemplo, en-US) y reemplace el archivo DLL de recursos original.

Carga de recursos satélite

MyDialog.exe en-US\MyDialog.resources.dll de-DE\MyDialog.resources.dll
Código BAML inglés original BAML localizado
Recursos culturalmente neutros Otros recursos en inglés Otros recursos localizados en alemán

.NET elige automáticamente qué ensamblado de recursos satélite se va a cargar en función de la aplicación Thread.CurrentUICulture. Este valor predeterminado es la referencia cultural del sistema operativo Windows. Si usa Windows alemán, se carga el archivo de-DE\MyDialog.resources.dll . Si usa Windows en inglés, se carga el archivo en-US\MyDialog.resources.dll . Puede establecer el recurso de reserva final para la aplicación especificando el atributo en el NeutralResourcesLanguage archivo AssemblyInfo del proyecto. Por ejemplo, si especifica:

[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]

A continuación, el archivo en-US\MyDialog.resources.dll se usa con Windows alemán si ninguno de los siguientes archivos está disponible: de-DE\MyDialog.resources.dll o de\MyDialog.resources.dll.

Página principal de Microsoft Saudi Arabia

Los gráficos siguientes muestran una página principal en inglés y árabe. Para obtener el ejemplo completo que genera estos gráficos, consulte El ejemplo de página principal de globalización.

Inglés:

Captura de pantalla que muestra una página principal en inglés.

Árabe:

Captura de pantalla que muestra una página principal árabe.

Diseño de una página principal global de Microsoft

Este simulacro del sitio web de Microsoft Arabia Saudita ilustra las características de globalización proporcionadas para los idiomas RightToLeft. Los idiomas como el hebreo y el árabe tienen un orden de lectura de derecha a izquierda, por lo que el diseño de la interfaz de usuario a menudo debe diseñarse de forma bastante diferente de lo que sería en idiomas de izquierda a derecha, como el inglés. La localización desde un idioma de izquierda a derecha a un idioma de derecha a izquierda o viceversa puede ser bastante difícil. WPF se ha diseñado para facilitar este tipo de localización.

Dirección de flujo

Homepage.xaml:

<Page x:Uid="Page_1" x:Class="MicrosoftSaudiArabiaHomepage.Homepage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    FlowDirection="LeftToRight" 
    Localization.Comments="FlowDirection(This FlowDirection controls the actual content of the homepage)"
    xml:lang="en-US">

Observe la FlowDirection propiedad en Page. Al cambiar esta propiedad a RightToLeft, se cambiará el FlowDirection del Page y de sus elementos secundarios, de modo que el diseño de esta interfaz de usuario se invierta de derecha a izquierda, como esperaría un usuario árabe. Uno puede invalidar el comportamiento de herencia especificando un explícito FlowDirection en cualquier elemento. La FlowDirection propiedad está disponible en cualquier elemento relacionado con el FrameworkElement documento y tiene un valor implícito de LeftToRight.

Observe que incluso los pinceles de degradado de fondo se invierten correctamente cuando se cambia la raíz FlowDirection.

FlowDirection="LeftToRight"

Captura de pantalla que muestra el degradado de izquierda a derecha.

FlowDirection="RightToLeft"

Captura de pantalla que muestra el flujo de degradado de derecha a izquierda.

Evitar el uso de dimensiones fijas para paneles y controles

Eche un vistazo a Homepage.xaml, observe que aparte del ancho fijo y el alto especificados para toda la interfaz de usuario en la parte superior DockPanel, no hay otras dimensiones fijas. Evite usar dimensiones fijas para evitar el recorte de texto localizado que puede ser más largo que el texto de origen. Los paneles y controles de WPF cambiarán automáticamente el tamaño en función del contenido que contienen. La mayoría de los controles también tienen dimensiones mínimas y máximas que puede establecer para más control (por ejemplo, MinWidth="20"). Con Grid, también puede establecer anchos y alturas relativos mediante "*" (por ejemplo, Width="0.25*") o usar su característica de uso compartido de tamaño de celda.

Comentarios de localización

Hay muchos casos en los que el contenido puede ser ambiguo y difícil de traducir. El desarrollador o diseñador tiene la capacidad de proporcionar contexto y comentarios adicionales a los localizadores a través de comentarios de localización. Por ejemplo, localization.Comments a continuación aclara el uso del carácter '|'.

<TextBlock 
  x:Uid="TextBlock_2" 
  DockPanel.Dock="Right" 
  Foreground="White" 
  Margin="5,0,5,0"
  Localization.Comments="$Content(This character is used as a decorative rule.)">
  |
</TextBlock>

Este comentario se asocia con el contenido de TextBlock_1 y, en el caso de la herramienta LocBaml, (vea Localizar una aplicación), se puede ver en la 6ª columna de la fila TextBlock_1 en el archivo de salida .csv:

Clave de recurso Categoría Fácil de leer Modificable Comentario Importancia
TextBlock_1:System.Windows.Controls.TextBlock.$Content Mensaje de texto VERDADERO VERDADERO Este carácter se usa como regla decorativa. |

Los comentarios se pueden colocar en el contenido o la propiedad de cualquier elemento mediante la sintaxis siguiente:

<TextBlock 
  x:Uid="TextBlock_1" 
  DockPanel.Dock="Right" 
  Foreground="White" 
  Margin="5,0,5,0"
  Localization.Comments="$Content(This is a comment on the TextBlock's content.)
     Margin(This is a comment on the TextBlock's Margin property.)">
  |
 </TextBlock>

Atributos de localización

A menudo, el desarrollador o el administrador de localización necesita controlar qué localizadores pueden leer y modificar. Por ejemplo, es posible que no desee que el localizador traduzca el nombre de su empresa o texto legal. WPF proporciona atributos que permiten establecer la legibilidad, la modificabilidad y la categoría del contenido o propiedad de un elemento que la herramienta de localización puede usar para bloquear, ocultar o ordenar elementos. Para obtener más información, consulte Attributes. Para los fines de este ejemplo, la herramienta LocBaml solo genera los valores de estos atributos. Todos los controles de WPF tienen valores predeterminados para estos atributos, pero puede invalidarlos. Por ejemplo, en el ejemplo siguiente se invalidan los atributos de localización predeterminados para TextBlock_1 y se establece que el contenido sea legible, pero no modificable para los localizadores.

<TextBlock
x:Uid="TextBlock_1"
Localization.Attributes=
"$Content(Readable Unmodifiable)">
  Microsoft Corporation
</TextBlock>

Además de los atributos de legibilidad y modificabilidad, WPF proporciona una enumeración de categorías comunes de interfaz de usuario (LocalizationCategory) que se pueden usar para dar más contexto a los localizadores. Las categorías predeterminadas de WPF para los controles de plataforma también se pueden invalidar en XAML:

<TextBlock x:Uid="TextBlock_2">
<TextBlock.ToolTip>
<TextBlock
x:Uid="TextBlock_3"
Localization.Attributes=
"$Content(ToolTip Readable Unmodifiable)">
Microsoft Corporation
</TextBlock>
</TextBlock.ToolTip>
Windows Vista
</TextBlock>

Los atributos de localización predeterminados que proporciona WPF también se pueden invalidar mediante código, por lo que puede establecer correctamente los valores predeterminados correctos para los controles personalizados. Por ejemplo:

[Localizability(Readability = Readability.Readable, Modifiability=Modifiability.Unmodifiable, LocalizationCategory.None)]
public class CorporateLogo : TextBlock
{
    // ...
}

Los atributos por instancia establecidos en XAML tendrán prioridad sobre los valores establecidos en el código en controles personalizados. Para obtener más información sobre los atributos y comentarios, vea Atributos y comentarios de localización.

Sustitución de fuentes y fuentes compuestas

Si especifica una fuente que no admite un intervalo de puntos de código determinado, WPF revertirá automáticamente a una que lo haga mediante la interfaz de usuario global.compositefont que se encuentra en el directorio Windows\Fonts. Las fuentes compuestas funcionan igual que cualquier otra fuente y se pueden usar explícitamente estableciendo los elementos FontFamily (por ejemplo, FontFamily="Global User Interface"). Puede especificar su propia preferencia de fuentes alternativas creando su propia fuente compuesta y especificando la fuente a utilizar para rangos de puntos de código y lenguajes específicos.

Para obtener más información sobre las fuentes compuestas, vea FontFamily.

Localizar la página principal de Microsoft

Puede seguir los mismos pasos que en el ejemplo del cuadro de diálogo Ejecutar para localizar esta aplicación. El archivo .csv localizado para árabe está disponible en el Ejemplo de Página Principal de Globalización.