Por Andrés González
Introducción
En los últimos años me he enfrentado a proyectos en los cuales se necesitaban que las aplicaciones fueran multi idioma, lo cual hacía fundamental realizar un buen tratamiento de los datos que los usuarios introducían.
Por eso, voy hablar sobre algo del core de Java, como es la clase Locale. Contaré cómo influye en la manipulación de cadenas de texto y por qué ignorar ésto puede llevar a resultados inesperados cuando las aplicaciones son multilingüe.
¿Qué es Locale y por qué es relevante?
Locale en Java representa una configuración regional que afecta al formato de fechas, números, y también a la forma en que se manejan las cadenas de texto. Cada región o idioma puede tener reglas particulares para la conversión de mayúsculas y minúsculas, lo que hace que su uso sea crítico para asegurar que estas operaciones se realizan según las convenciones locales.
Si no se especifica un Locale, se utilizará el lenguaje del sistema donde se instale la aplicación de manera predeterminada, el cual podemos desconocer. Esto puede llevar a resultados inesperados si el sistema utiliza un idioma o configuración regional diferente a la esperada.
Conversión de cadenas a mayúsculas/minúsculas
Al convertir texto entre mayúsculas y minúsculas, el Locale juega un papel fundamental para garantizar resultados precisos según el idioma.
Por ejemplo, en turco, la letra «i» minúscula tiene una versión mayúscula que es «?» (i con punto). Sin embargo, en el caso del inglés o del español, la letra «i» minúscula se convierte a «I» mayúscula. Si no se especifica un Locale adecuado, la conversión podría producir resultados incorrectos.
Al ejecutar el código anterior, podemos observar que el resultado es distinto dependiendo del Locale utilizado.
Manipulación de cadenas con fechas
También, el Locale afecta en el tratamiento de fechas. En Estados Unidos, el formato es mes,día,año (MM/dd/yyyy); En Europa es día, mes, año (dd/MM/yyyy).
En el siguiente ejemplo, el sistema está utilizando por defecto el juego de caracteres de España
En la salida del programa, podemos apreciar como la interpretación de la fecha puede cambiar si utilizamos un Locale u otro.
También puede ocurrir que, al no informar qué Locale utilizar podría haber una excepción en el formateo de fechas.
Veámoslo con un ejemplo:
Cuando ejecutemos esto, aparecerá lo siguiente:
Esto ocurre por lo mencionado anteriormente, el formato de fechas de Estados Unidos es MM/dd/yyyy, y por lo tanto, al querer parsearla dará error.
Transformación de cadenas con números
Ésto también afecta a las cadenas con números ya que en diferentes idiomas y regiones se usan diferentes separadores de decimales y de miles.
En Reino Unido, se utiliza la coma (,) como separador de miles y el punto (.) como separador de decimales.
Pero en Suiza, se utiliza el apóstrofe (‘) como separador de miles y el punto como separador de decimales.
Al correr el código nos dará el siguiente resultado:
Con esto vemos que dependiendo del Locale, el formato va a cambiar.
Al igual que en el tratamiento de las fechas, podría lanzarse en una excepción al intentar transformar un número con un formato que no es compatible con el del Locale que tiene el sistema.
Lo ilustro con el siguiente ejemplo:
Cuando corremos esto, aparecerá lo siguiente:
¿Qué ventajas tiene usar Locale?
Los beneficios que nos aporta usarlo es que realizando esto nos aseguramos que en las conversiones se respeten las reglas de cada idioma y región.
Además nos ayuda a evitar errores que puedan afectar a datos que se utilicen a nivel de negocio, tal como documentación para contratación, o en la visualización de los mismos en pantalla.
Buenas Prácticas
Como buenas prácticas una recomendación que puedo dar es la de especificar el Locale que se va a utilizar. Éste se podría jerarquizar de la siguiente manera para poder ser lo más preciso posible.
- Locale del usuario
- Locale de la compañía
- Locale de la aplicación
- Locale del sistema
También, recomiendo si queremos independizar la aplicación de cualquier idioma, utilizar la constante Locale.ROOT.
Conclusión
El uso de Locale en la manipulación de cadenas nos garantiza que nuestras aplicaciones funcionen correctamente en entornos multilingües o internacionales. Al no especificarlo, nos arriesgamos a depender del predeterminado del sistema, lo que puede darnos errores o inconsistencia en el tratamiento de los datos.