Información general sobre la localización y globalización de WPF

Cuando se limita la disponibilidad de un producto a un solo idioma, se limita la base de clientes potenciales a una fracción de los 6.500 millones de habitantes de nuestro mundo. Si desea que las aplicaciones alcancen una audiencia global, la localización rentable del producto es una de las formas mejores y más económicas de llegar a más clientes.

Esta información general presenta la globalización y la localización en Windows Presentation Foundation (WPF). La globalización es el diseño y desarrollo de aplicaciones que funcionen en diversas ubicaciones. Por ejemplo, la globalización permite el uso de interfaces de usuario adaptadas y datos regionales a usuarios de diferentes referencias culturales. WPF ofrece características de diseño globalizadas, entre las que se encuentran el diseño automático, los ensamblados satélite, y los atributos y comentarios adaptados.

La localización es la traducción de los recursos de una aplicación en versiones locales para las referencias culturales específicas que admite la aplicación. Cuando cree versiones localizadas en WPF, utilizará las API del espacio de nombres System.Windows.Markup.Localizer. Estas API son la base de la herramienta de línea de comandos LocBaml Tool Sample. Para obtener información sobre cómo generar y utilizar LocBaml, vea Cómo: Localizar una aplicación.

Este tema contiene las secciones siguientes.

  • Procedimientos recomendados para la globalización y localización en WPF
  • Adaptar una aplicación WPF
  • Ejemplos de localización de WPF

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

Puede aprovechar al máximo la funcionalidad de globalización y localización integrada en WPF siguiendo las sugerencias relacionadas con el diseño y localización de interfaces de usuario que proporciona esta sección.

Procedimientos recomendados para el diseño de interfaces de usuario de WPF

Cuando diseñe una UI basada en WPF considere implementar estos procedimientos recomendados:

  • Escriba la XAML en UI; evite crear la UI en código. Cuando cree la UI utilizando XAML, expóngala a través de API de localización integradas.

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

    • Utilice SizeToContent; mantenga los altos y anchos establecidos en Auto.

    • Evite utilizar Canvas para diseñar la UIs.

    • Utilice Grid y su característica del uso compartido del tamaño.

  • Proporcione espacio adicional en los márgenes, porque el texto traducido suele requerir más espacio. El espacio adicional permite que sobresalga algún carácter.

  • Habilite TextWrapping en TextBlock para evitar el recorte.

  • Establezca el atributo xml:lang. Este atributo describe la referencia cultural de un elemento concreto y sus elementos secundarios. El valor de esta propiedad cambia el comportamiento de varias características de WPF. Por ejemplo, cambia el comportamiento de los guiones, la revisión ortográfica, la sustitución de números, la forma de la escritura compleja y la reserva de fuentes. Vea Globalización de WPF para obtener más información sobre la configuración del Control de xml:lang en XAML.

  • Cree una fuente compuesta personalizada para controlar mejor las fuentes que se utilizan para los diferentes idiomas. De forma predeterminada, WPFutiliza la fuente de GlobalUserInterface.composite del directorio Windows\Fonts.

  • Cuando cree aplicaciones de navegación que puedan localizarse en una referencia cultural que presente el texto en formato de derecha a izquierda, establezca explícitamente la propiedad FlowDirection de cada una de las páginas para asegurarse de que no hereda FlowDirection de NavigationWindow.

  • Cuando cree aplicaciones de navegación independientes que se hospeden fuera de un explorador, establezca la propiedad StartupUri de la aplicación inicial en un objeto NavigationWindow en lugar de en una página (por ejemplo, <Application StartupUri="NavigationWindow.xaml">). Este diseño permite cambiar la propiedad FlowDirection de la ventana y la barra de navegación. Para obtener más información y un ejemplo, vea Globalization Homepage Sample.

Procedimientos recomendados para la localización de WPF

Cuando adapte aplicaciones basadas en WPF, considere implementar estos procedimientos recomendados:

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

  • Utilice atributos de localización para controlar la localización, en lugar de omitir selectivamente propiedades de Uid en los elementos. Vea Atributos y comentarios sobre localización para obtener más información.

  • Utilice msbuild /t:updateuid y /t:checkuid para agregar y comprobar las propiedades de Uid en el XAML. Use las propiedades Uid para realizar un seguimiento de los cambios entre el desarrollo y la localización. Las propiedades Uid le ayudan a adaptar los nuevos cambios de desarrollo. Si agrega manualmente propiedades de Uid a la UI, la tarea será habitualmente tediosa y poco precisa.

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

    • No utilice propiedades de Uid duplicadas (recuerde esta sugerencia al utilizar el comando copiar y pegar).

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

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

Adaptar una aplicación WPF

Cuando adapte una aplicación WPF, tiene varias opciones. Por ejemplo, puede enlazar los recursos adaptables de la aplicación a un archivo XML, almacenar el texto adaptable en tablas resx o hacer que el localizador utilice archivos Extensible Application Markup Language (XAML). En esta sección se describe un flujo de trabajo de localización que utiliza el formato BAML de XAML, lo que ofrece varias ventajas:

  • Puede adaptar después de generar.

  • Puede actualizar a una versión más reciente del formato BAML de XAML con localizaciones de una versión anterior del formato BAML de XAML, de modo que pueda localizar al mismo tiempo que desarrolla.

  • Puede validar los elementos y semánticas de origen originales en tiempo de compilación, porque el formato BAML de XAML es el formato compilado de XAML.

Proceso de compilación de la localización

Cuando desarrolle una aplicación WPF, el proceso de compilación para la localización será el siguiente:

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

  • Cuando se compila el archivo, el XAML se convierte al formato BAML de XAML. Los archivos MyDialog.exe culturalmente neutro y MyDialog.resources.dll culturalmente dependiente (inglés) se publican para el cliente angloparlante.

Flujo de trabajo de localización

El proceso de la localización comienza una vez generado el archivo MyDialog.resources.dll sin adaptar. Los elementos y propiedades de la UI del XAML original se extraen del formato BAML de XAML en forma de pares de clave y valor utilizando las APIs bajo System.Windows.Markup.Localizer. Los localizadores utilizan los pares de clave y valor para adaptar la aplicación. Puede generar un nuevo archivo .resource .dll a partir de los nuevos valores, una vez completada la localización.

Las claves de los pares de clave y valor son valores x:Uid que coloca el desarrollador en el código XAML original. Estos valores x:Uid permiten que la API realice un seguimiento de los cambios y combine aquellos que se producen entre el desarrollador y el localizador durante la localización. Por ejemplo, si el programador cambia la UI después de que el localizador empiece a adaptar, puede combinar el cambio de desarrollo con el trabajo de la localización ya completado, de modo que el trabajo de traducción que se pierda sea 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 asume que el programador escribe la aplicación en inglés. El programador 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 idioma, con archivos satélite .resources.dll que contienen todos los recursos adaptables. Como alternativa, puede mantenerse el idioma de origen en el ensamblado principal, porque las API de localización de WPF admiten la extracción desde el ensamblado principal. Después del proceso de compilación, el XAML se genera en BAML. El archivo MyDialog.exe.resources.dll culturalmente neutral se distribuye al cliente angloparlante.

Flujo de trabajo de localizaciónFlujo de trabajo sin localizar

Ejemplos de localización de WPF

Esta sección contiene ejemplos de aplicaciones adaptadas para ayudarle a entender cómo generar y adaptar aplicaciones WPF.

Ejemplo de cuadro de diálogo Ejecutar

Los gráficos siguientes muestran el resultado del ejemplo del cuadro de diálogo Ejecutar.

Inglés:

Cuadro de diálogo Run

Alemán:

Cuadro de diálogo German Run

Diseñar un cuadro de diálogo Ejecutar global

En este ejemplo se genera un cuadro de diálogo Ejecutar utilizando 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 puntos importantes para la creación de cuadros de diálogo globales son los siguientes:

Automatic Layout

En Window1.xaml:

<Window SizeToContent="WidthAndHeight">

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

<Grid x:Uid="Grid_1">

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

La APIs de localización de WPF las usa para realizar un seguimiento de los cambios entre el desarrollo y la localización de la user interface (UI). Las propiedades Uid le permiten combinar una versión más reciente de la UI con una localización anterior de la UI. Para agregar una propiedad Uid, ejecute msbuild /t:updateuid RunDialog.csproj en un shell de comandos. Éste es el método recomendado para agregar propiedades de Uid, porque agregarlas manualmente suele exigir mucho tiempo y es menos preciso. Para comprobar que las propiedades de Uid están correctamente establecidas, ejecute msbuild /t:checkuid RunDialog.csproj.

La UI se estructura utilizando el control Grid, que es un control útil para aprovechar el diseño automático de WPF. Observe que el cuadro de diálogo se divide en tres filas y cinco columnas. Ninguna de las definiciones de columna y fila tiene un tamaño fijo; por lo tanto, los elementos de la UI 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 primeras dos columnas donde se colocan la etiqueta Abrir: y el control ComboBox utilizan el 10 por ciento del ancho total de la UI.

  <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 el ejemplo utiliza la característica de tamaño compartido de Grid. Las últimas tres columnas la aprovechan colocándose en el mismo SharedSizeGroup. Como cabe esperar del nombre de la propiedad, esto permite que las columnas compartan el mismo tamaño. Así, cuando se adapta "Browse..." a la cadena "Durchsuchen...", más larga, todos los botones crecen en ancho en lugar de obtenerse un botón "OK" pequeño y un botón "Durchsuchen" desproporcionadamente grande.

Xml:lang

Xml:lang="en-US"

Observe el Control de xml:lang en XAML colocado en el elemento raíz de la UI. Esta propiedad describe la referencia cultural de un elemento determinado y de sus elementos secundarios. Este valor lo utilizan varias características de WPF y debe cambiarse en consecuencia durante la localización. Este valor cambia qué diccionario de idioma se utiliza para separar las palabras con guiones y para la revisión ortográfica. También afecta a la presentación de dígitos y a cómo selecciona el sistema de reserva de fuentes qué fuente utilizar. Finalmente, la propiedad afecta a la manera en que se muestran los números y la manera en que se da forma a los textos escritos de escritura compleja. El valor predeterminado es "en-US".

Building a Satellite Resource Assembly

En .csproj:

<UICulture>en-US</UICulture>

Observe la adición de un valor UICulture. Cuando se establece en un valor CultureInfo válido tal como en-Us, al generar el proyecto se genera un ensamblado satélite que contiene todos los recursos adaptables.

<Resource Include="RunIcon.JPG">

<Localizable>False</Localizable>

</Resource>

No es necesario adaptar RunIcon.JPG, porque debe aparecer igual para todas las referencias culturales. Localizable se establece en false, para que permanezca en el ensamblado principal neutral respecto al idioma en lugar de en el ensamblado satélite. El valor predeterminado de todos los recursos no compilables es Localizable establecido en true.

Adaptar el cuadro de diálogo Ejecutar

Parse

Después de generar la aplicación, el primer paso para adaptarla es analizar los recursos adaptables del ensamblado satélite. Para los propósitos de este tema, utilice la herramienta de ejemplo LocBaml, que encontrará en LocBaml Tool Sample. Tenga en cuenta que LocBaml es solamente una herramienta de ejemplo, cuyo propósito es ayudarle a iniciarse en la compilación de una herramienta de localización adecuada para el proceso de localización. Con LocBaml, ejecute lo siguiente para analizar: LocBaml /parse RunDialog.resources.dll /out: y generar un archivo "RunDialog.resources.dll.CSV".

Localize

Utilice su editor favorito de archivos .CSV compatible con Unicode para modificar este archivo. Filtre para ocultar todas las entradas que tengan la categoría de localización "None". Debería ver las entradas siguientes:

Resource key

Localization Category

Valor

Button_1:System.Windows.Controls.Button.$Content

Button

OK

Button_2:System.Windows.Controls.Button.$Content

Button

Cancelar

Button_3:System.Windows.Controls.Button.$Content

Button

Browse...

ComboBox_1:System.Windows.Controls.ComboBox.$Content

ComboBox

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Text

Type the name of a program, folder, document, or Internet resource, and Windows will open it for you.

TextBlock_2:System.Windows.Controls.TextBlock.$Content

Text

Open:

Window_1:System.Windows.Window.Title

Título

Run

Adaptar la aplicación a alemán requerirá las traducciones siguientes:

Resource key

Localization Category

Valor

Button_1:System.Windows.Controls.Button.$Content

Button

OK

Button_2:System.Windows.Controls.Button.$Content

Button

Abbrechen

Button_3:System.Windows.Controls.Button.$Content

Button

Durchsuchen…

ComboBox_1:System.Windows.Controls.ComboBox.$Content

ComboBox

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Text

Geben Sie den Namen eines Programms, Ordners, Dokuments oder einer Internetresource an.

TextBlock_2:System.Windows.Controls.TextBlock.$Content

Text

Öffnen:

Window_1:System.Windows.Window.Title

Título

Run

Generate

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

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

En la versión alemana de Windows, si se coloca 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 probarlo, establezca la referencia cultural en la referencia cultural de Windows que esté utilizando (por ejemplo, en-US) y reemplace el archivo resources.dll original.

Satellite Resource Loading

MyDialog.exe

en-US\MyDialog.resources.dll

de-DE\MyDialog.resources.dll

Código

BAML en inglés original

BAML adaptado

Recursos culturalmente neutrales

Otros recursos en inglés

Otros recursos adaptados al alemán

.NET Framework elige automáticamente el ensamblado de recursos satélite que debe cargar en función de la propiedad Thread.CurrentThread.CurrentUICulture de la aplicación. Esto tiene como valor predeterminado la referencia cultural de su SO Windows. Por lo tanto, si está usando la versión alemana de Windows, se cargará de-DE\MyDialog.resources.dll, si está utilizando la versión en inglés de Windows, se cargará en US\MyDialog.resources.dll. Puede establecer el recurso de reserva último para la aplicación especificando NeutralResourcesLanguage en AssemblyInfo.* del proyecto. Por ejemplo, si especifica:

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

se utilizará en-US\MyDialog.resources.dll con la versión alemana de Windows si no están disponibles de-DE\MyDialog.resources.dll ni de\MyDialog.resources.dll.

Página principal de Microsoft Arabia Saudí

Los gráficos siguientes muestran una página principal en inglés y en árabe. Para ver el ejemplo completo que genera estos gráficos, vea Globalization Homepage Sample.

Inglés:

Página en inglés

Árabe:

Página árabe

Diseñar una página principal de Microsoft global

Este ejemplo de sitio web de Microsoft Arabia Saudí muestra las características de globalización que se proporcionan para los idiomas RightToLeft. Los idiomas como el hebreo y el árabe se leen de derecha a izquierda, así que el diseño de la UI suele ser muy diferente del que sería en idiomas de izquierda a derecha como el inglés. Adaptar de un idioma de izquierda a derecha a uno de derecha a izquierda, o viceversa, puede ser todo un reto. WPF se ha diseñado de modo que tales adaptaciones resulten mucho más fáciles.

FlowDirection

Homepage.xaml:

<Page x:Uid="Page_1" x:Class="MicrosoftSaudiArabiaHomepage.Homepage"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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 propiedad FlowDirection en el control Page. Al cambiar esta propiedad a RightToLeft, se cambiará la propiedad FlowDirection del control Page y de sus elementos secundarios, de modo que el diseño de la UI se invierte para que se lea de derecha a izquierda, como esperaría un usuario árabe. Se puede invalidar el comportamiento de herencia especificando un valor explícito para la propiedad FlowDirection de cualquier elemento. La propiedad FlowDirection está disponible en cualquier objeto FrameworkElement o elemento relacionado con documentos y tiene un valor implícito de LeftToRight.

Observe que incluso los pinceles de degradado de fondo se invierten correctamente al cambiar la propiedad FlowDirection raíz:

FlowDirection="LeftToRight"

Flujo de izquierda a derecha

FlowDirection="RightToLeft"

Flujo de derecha a izquierda

Evite utilizar dimensiones fijas para paneles y controles

Eche una mirada a Homepage.xaml; observe que, aparte del ancho y el alto fijos especificados para toda la UI completa en el control DockPanel superior, no hay ninguna otra dimensión fija. Evite utilizar dimensiones fijas, para impedir que se recorte el texto adaptado que sea más largo que el texto de origen. Los paneles y controles de WPF ajustarán automáticamente su tamaño en función de su contenido. La mayoría de los controles tienen también dimensiones máximas y mínimas que puede establecer para mejorar el control (por ejemplo, MinWidth= "20"). Con Grid, puede establecer también anchos y altos relativos utilizando '*' (por ejemplo, Width= "0,25*") o utilizar la característica de uso compartido del tamaño de celda.

Comentarios de localización

En muchos casos, el contenido puede ser ambiguo y difícil de traducir. El programador o el diseñador tiene la capacidad de proporcionar contexto y comentarios adicionales a los localizadores mediante comentarios de localización. El ejemplo de Localization.Comments que aparece a continuación clarifica 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 Cómo: Localizar una aplicación) se puede ver en la sexta columna de la fila de TextBlock_1 en el archivo .csv resultante:

Resource key

Categoría

Readable

Modifiable

Comment

Valor

TextBlock_1:System.Windows.Controls.TextBlock.$Content

Text

TRUE

TRUE

Este carácter se utiliza como una regla decorativa.

|

Se puede colocar comentarios en el contenido o en las propiedades de cualquier elemento utilizando 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 programador o el administrador de la localización necesita controlar lo que pueden leer y modificar los localizadores. Por ejemplo, quizá no desee que el localizador traduzca el nombre de su compañía o la redacción legal. WPF proporciona atributos que permiten establecer la legibilidad, modificabilidad y categoría del contenido o las propiedades de un elemento; la herramienta de localización puede utilizar estos atributos para bloquear, ocultar u ordenar elementos. Para obtener más información, vea Attributes. Para este ejemplo, la herramienta LocBaml genera solamente los valores de estos atributos. Todos los controles de WPF tienen valores predeterminados para estos atributos, pero es posible 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 que facilitan la lectura y las modificaciones, WPF proporciona una enumeración de categorías comunes de la 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 WPF proporciona también se pueden invalidar mediante código, de modo que se puedan establecer correctamente los valores predeterminados de los controles personalizados. Por ejemplo:

[Localizability(Readability = Readability.Readable, Modifiability=Modifiability.Unmodifiable, LocalizationCategory.None)]

public class CorporateLogo: TextBlock

{

..

.

}

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

Reserva de fuente y fuentes compuestas

Si especifica una fuente que no admita un intervalo de punto de codificación determinado, WPF recurrirá automáticamente a una que lo haga utilizando Global User Interface.compositefont, que se encuentra en el directorio Windows\Fonts. Las fuentes compuestas funcionan como cualquier otra fuente y se pueden utilizar explícitamente estableciendo la propiedad FontFamily de un elemento (por ejemplo, FontFamily= "Global User Interface"). Puede especificar sus propias preferencia de reserva de fuentes creando fuentes compuestas propias y especificando qué fuente desea utilizar para intervalos de punto de codificación e idiomas concretos.

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

Adaptar la página principal de Microsoft

Puede seguir los mismos pasos que en el ejemplo del cuadro de diálogo Ejecutar para adaptar esta aplicación. El archivo .csv adaptado para árabe está a su disposición en Globalization Homepage Sample.