La internacionalización es el proceso por el que tu app se muestra de forma adecuada para un país o región concretos. Por ejemplo, esto puede implicar:
- Mostrar el texto en un idioma distinto
- Formatear los números usando separadores de miles y decimales distintos
- Formatear fechas usando un patrón de fecha diferente
- Formatear moneda usando un símbolo de moneda concreto
A continuación veremos como puedes acometer las tareas de internacionalización (o localización de tus aplicaciones multiplataforma) en Xojo.
Internacionalización de Texto con Constantes Dinámicas
Localizas el texto de tus aplicaciones con el uso de constantes dinámicas, las cuales son una variante concreta de constante que se añade a un elemento del proyecto, como pueda ser un módulo, ventana, página web o clase. Sólo es posible marcar como dinámicas las constantes de tipo String o Text. Cuando es dinámica permite que se pueda utilizar para tareas de localización con más facilidad.
Para designar una constante como dinámica, crea una constante de tipo Text (o String) y selecciona la caja de verificación Dynamic
. Un modo recomendado de afrontar la localización consiste en crear un módulo separado para que contenga todas las constantes que se van a traducir a otros idiomas, aunque también se pueden incluir estas constantes en cualquier otra parte del proyecto en las que sean accesibles de forma pública.
Puedes introducir diferentes valores localizados para la constante dinámica basándote en la plataforma y el lenguaje. Para ello, se utiliza el Editor de Constantes.
Utiliza los botones “+”+ y “-” para añadir o eliminar una ubicación concreta. Puedes elegir la Plataforma y el Idioma para el cual se indica un valor.
Cuando el usuario ejecuta una app, se usa el idioma indicado en su sistema para aplicar la localización equivalente de la constante a usar.
Las constantes creadas de este modo pueden utilizarse como el texto o etiqueta de los controles, de modo que dichos controles muestren el valor localizado correspondiente. Para utilizar una constante dinámica como el texto (propiedad Text) o etiqueta (propiedad Caption), debes utilizar el caracter “#” como prefijo al introducir el nombre de la constante sobre la propiedad correspondiente. Por ejemplo, si tienes un módulo denominado LocalizedStrings
que incluye una constante protegida denominada kWelcomeMessage
, entonces puedes añadirla a la propiedad Text de una Label del siguiente modo:
#LocalizedStrings.kWelcomeMessage
Por supuesto, también puedes referirte a una constante dinámica en tu código tal y como harías con cualquier otra constante.
Sin embargo, con una constante dinámica también has de indicar qué localización quieres emplear. Para ello has de proporcionar el código de idioma (generalmente dos caracteres) y, opcionalmente, el código de región como parámetro de la constante. Por ejemplo, si tuvieses una constante denominada kHello
que estuviese localizada tanto para Francés (“Bonjour”) como en Inglés (“Hello”), podrías forzar que se mostrase la versión en Francés haciendo lo siguiente:
Dim s As String
s = kHello(“fr”) //s = “Bonjour”
s = kHello(“en”) //s = “Hello”
s = kHello(“en_UK”) //s = “Welcome”
Compilar la App Localizada
En la sección Build Settings se encuentra la propiedad Language en la sección Build del Inspector. Esta propiedad determina el idioma que utilizará cualquiera de las constantes que tengan “Default” como idioma.
Es importante que selecciones un idioma concreto en este ajuste de compilación. Si también dejas este ajuste como “Default” entonces podría presentarse alguna confusión si se comparte el archivo de proyecto con otras personas que no tengan el mismo lenguaje del sistema.
Por ejemplo, si dejas tanto la constante de idioma con el lenguaje de compilación como “Default”, entonces “Default” será “Inglés” para los usuarios que compilen con un sistema Inglés, y será “Francés” para los usuarios que compilen con un sistema Francés.
Para evitar esta confusión, elige siempre como mínimo el lenguaje correcto en los ajustes de Build. Otra opción consiste en no utilizar “Default” para las constantes y utilizar siempre el idioma exacto para cada constante.
Lingua
Si tienes una gran cantidad de texto para su traducción, entonces puede resultar un proceso tedioso introducir todos los valores mediante el uso del Editor de Constantes. La aplicación Lingua se utiliza para simplificar el proceso de localización. Con Lingua puedes localizar las cadenas de texto de tu aplicación fuera del proyecto, usando para ello las constantes dinámicas que ya hayas creado.
Cuando todas las cadenas del proyecto se hayan definido como constantes dinámicas, elige File ↠ Export Localizable Values. Aparecerá un cuadro de diálogo pidiendo que se seleccione el idioma que se desea localizar. Selecciona el idioma al que quieres traducir las cadenas y haz clic en Export. (Asegúrate también de que el Idioma en Build Settings está definido como Default o bien cualquier otro idioma que quieras usar como el idioma inicial o de partida en la exportación.)
Cuando hagas clic en Export se creará un archivo que podrá abrirse con Lingua.
Ejecuta Lingua y abre el archivo exportado. Se abrirá la ventana principal de Lingua mostrando un listado con todas las cadenas dinámicas en tu aplicación. Los valores aparecerán en color claro cuando aun no tengan una equivalencia traducida. Si existen diferentes valores específicos para Windows, Linux o macOS habrá un icono a la derecha de la cadena en el listado. Al igual que ocurre en las cadenas, los iconos aparecerán desvanecidos en aquellos casos en los que aun no cuenten aun con el valor traducido.
Para traducir una cadena, selecciónala en el listado. El valor original se mostrará por completo en la parte superior derecha del panel, y podrás escribir el texto traducido en el panel inferior derecho.
Para añadir un valor concreto para una plataforma, expande la cadena en el listado y selecciona la plataforma en concreto para editarla.
Para probar las cadenas, selecciona File ↠ Export to Application. Lingua presentará un cuadro de diálogo de apertura de archivo. Selecciona la aplicación de destino y haz clic en Open. Cuando se complete la importación, vuelve a Xojo y depura la aplicación con normalidad.
Cuando termines la localización puedes guardar el archivo desde Lingua e importar el archivo de cadenas de nuevo en tu proyecto simplemente arrastrándolo en el proyecto o bien eligiendo File ↠ Import.
Internacionalización de Fechas y Números
Puedes localizar el modo en el que se muestran las fechas y los números usando para ello la clase Xojo.Core.Locale
. El método compartido Current
devuelve el código local especificado en los ajustes del Sistema o del dispositivo. Entonces podrás usar dicho código con el método ToText de Xojo.Core.Date
, Double
o Integer
para mostrar los valores formateados correctamente.
Este código (en el manejador del evento Open de una Label) muestra la fecha en curso:
Me.Text = Xojo.Core.Date.Now.ToText(Xojo.Core.Locale.Current, Xojo.Core.Date.FormatStyles.Long, Xojo.Core.Date.FormatStyles.None)
En un sistema en Inglés de EE.UU mostrará:
January 9, 2017
En un sistema Francés mostrará:
9 janvier 2017
Este código (también en el manejador de eento Open de una Label) muestra un número formateado:
Dim num As Double = 1234.56
Me.Text = num.ToText(Xojo.Core.Locale.Current, "#,###.##")
En un sistema Inglés de EE.UU. el número se mostrará como:
1,234.56
En un sistema francés se mostrará así:
1 234,56
Internacionalización de aplicaciones Web
Las apps web también pueden localizar su texto usando constantes dinámicas, pero el idioma mostrado está determinado por los ajustes de idioma del navegsador utilizado para acceder a la app web. Más concretamente se utiliza el valor constante que es más apropiado para el ajuste de idioma de la cabecera HTTP de la sesión en curso.
Son varias las propiedades de WebSession que resultan de utilidad para la localización:
- LanguageCode
- LanguageRightToLeft
Además, también puedes localizar estas constantes dinámicas en WebSession empleadas para los mensajes del sistema:
- ErrorDialogCancel
- ErrorDialogMessage
- ErrorDialogQuestion
- ErrorDialogSubmit
- ErrorThankYou
- ErrorThankYouMessage
- NoJavascriptMessage
- NoJavascriptInstructions
Por último, WebApplication tiene estas propiedades a las cuales puedes proporcionar valores para usar con tus propias constantes dinámicas:
- LaunchMessage
- DisconnectMessage
- HTMLHeader
Fechas y Números
En las apps de escritorio puedes usar Xojo.Core.Locale
para obtener las fechas y números con el formato correcto en función de los ajustes de país del usuario. Sin embargo, en una app web este valor devuelve el código usado por el servidor web en vez del código de país correspondiente a la sesión de usuario en curso.
Para mostrar las fechas con formato del código de país correspondiente a la sesión de usuario necesitas usar LanguageCode
de WebSession
y utilizar dicho valor para crear un código de país que puedas emplear posteriormente para mostrar la fecha. Este código (en el manejador de evento Shown de un WebLabel) se encarga de obtener el código de lenguaje para la sesión de usuario y utilizarlo para mostrar la fecha en curso:
Dim langCode As Text = Session.LanguageCode.DefineEncoding(Encodings.UTF8).ToText
Dim locale As New Xojo.Core.Locale(langCode)
Me.Text = Xojo.Core.Date.Now.ToText(locale, Xojo.Core.Date.FormatStyles.Long, Xojo.Core.Date.FormatStyles.None)
Cuando el navegador está ajustado a Inglés muestra:
January 9, 2017
Y cuando está definido como Francés, este muestra:
9 janvier 2017
Usa la misma técnica con el formateo de números. Este código (en el manejador de evento Shown de un WebLabel obtiene el código de idioma para la sesión de usuario y lo utiliza a continuación para mostrar un número formateado:
Dim langCode As Text = Session.LanguageCode.DefineEncoding(Encodings.UTF8).ToText
Dim locale As New Xojo.Core.Locale(langCode)
Dim num As Double = 1234.56
Me.Text = num.ToText(locale, “#,###.##”)
Cuando el navegador está definido a Inglés, el número mostrado es: 1,234.56
Y cuando está definido como Francés, entonces lo muestra como: 1 234,56
Para obtener la información de código de país más específica que sólo el lenguaje, debes comprobar el valor de la cabecera HTTP “Accept-Language”:
Dim langHeader As String = Session.Header("Accept-Language")
Y que devuelve tanto el idioma como el código de región en un formato como este: en-US
.
Advierte que puede devolverse más de un valor en esta cabecera, de modo que es probable que debas de parsearlo para asegurarte de que obtienes el valor que realmente quieres.
Cambiar el Idioma
Windows
Para utilizar un idioma diferente en Windows, has de cambiar el ajuste Idioma en la pestaña Formato del Panel de Control Region. El cambio del Lenguaje en la pestaña Teclado y Lenguajes no afecta a tus aplicaciones.
Para Windows 10:
- Abre Ajustes
- Haz clic en Hora e Idioma
- En “Ajustes Relacionados”, haz clic en “Ajustes adicionales de fecha, hora y regionales”
- En la sección Región, haz clic en “Cambar Ubicación”
- Haz clic en la pestaña Formatos para acceder al menú desplegable en el que puedes cambiar el idioma
Mac
Para cambiar el idioma en un Mac, abre Preferencias del Sistema y selecciona “Idioma y Región” (fila superior). En el listado de Idiomas Preferidos de la izquierda puedes arrastrar a la parte superior el idioma que quieres como idioma principal.
Linux
El modo concreto de cambiar el idioma y la región varían en función de cuál sea la distribución de Linux de la que se trte. En Linux Mint 18 puedes realizar los cambios dirigiéndote a Preferencias ↠ Idiomas y realizando los cambios apropiados.
iOS
Para cambiar el idioma en iOS, abre la app Ajustes y selecciona General, seguido de “Idioma y Región”. En esta pantalla puedes cambiar el lenguaje preferido así como otros formatos regionales.
Navegadores Web
Para ver una app web en otro idioma, tendrás que cambiar los ajustes del navegador que se está conectando a la app web. Esto varía de un navegador a otro.
Navegador | Ajustes de Idioma |
---|---|
Edge | Usa los ajustes del sistema en Ajustes / Panel Control. |
Internet Explorer | Dirígete a Opciones de Internet. En la pestaña General, haz clic en el botón Idiomas para acceder a la pantalla que permite definir el idioma. |
Safari | Usa los ajustes del sistema en Preferencias del Sistema. |
Chrome | Dirígete a Ajustes y haz clic en ajustes avanzados. Busca la sección de Idiomas. |
Firefox | Dirígete a Preferencias, selecciona Contenido y busca la sección Idiomas. |
*Esta entrada ha sido editada en Snippery utilizando el lenguaje de marcado Markdown, y exportado como HTML para su publicación en este sitio web.