¿Por qué su aplicación Java debería empezar a hablar como un humano?
\n\n¿Alguna vez se ha preguntado por qué las aplicaciones que usamos a diario, desde Spotify hasta Notion, «entienden» de inmediato en qué idioma hablarle? No leen la mente, no adivinan por la dirección IP. Utilizan la internacionalización (i18n).
\n\nPara un desarrollador Java, saber hacer aplicaciones multilingües no es solo una «característica adicional», sino una habilidad obligatoria si apunta al mercado global. Imagine: creó un excelente servicio de gestión de tareas. En Rusia fue un éxito. Pero en cuanto quiera venderlo en Alemania o Japón, los usuarios verán el botón «Crear tarea» en ruso. Y cerrarán la pestaña. Triste, ¿verdad?
\n\nEn este artículo no solo hablaremos de teoría. Tomaremos una aplicación Java (la más común, de consola o web) y, paso a paso, agregaremos soporte para ruso, inglés y alemán. Verá que la internacionalización en Java no da miedo, sino que es muy elegante. ¡Allá vamos!
\n\n¿Qué es internacionalización y localización? ¡No las confunda!
\n\nA menudo estos conceptos se mezclan. Aclaremos las cosas.
\n\n- \n
- Internacionalización (i18n) es el proceso de diseñar una aplicación para que pueda adaptarse a diferentes idiomas y regiones sin modificar el código. Usted crea «ganchos» para la traducción. \n
- Localización (l10n) es el llenado de esos «ganchos» con traducciones específicas, formatos de fecha, monedas y reglas de ordenación para un país concreto. \n
En Java, las clases del paquete java.util se encargan de la internacionalización: Locale y ResourceBundle. Recuérdelos: son sus mejores amigos.
Paso 1. Conociendo Locale: el corazón de la internacionalización
\n\nLa clase Locale representa una región concreta (idioma + país). Por ejemplo:
- \n
Locale.US— inglés (EE. UU.) \n Locale.GERMANY— alemán (Alemania) \n new Locale("ru", "RU")— ruso (Rusia) \n
Locale se utiliza para seleccionar la traducción correcta de cadenas, el formato de números, fechas y monedas. Sin él, la internacionalización es imposible.
\n\n¿Cómo obtener la configuración regional actual?
\n\nimport java.util.Locale;\n\npublic class Main {\n public static void main(String[] args) {\n // Configuración regional predeterminada (generalmente coincide con la del sistema)\n Locale defaultLocale = Locale.getDefault();\n System.out.println("Configuración regional actual: " + defaultLocale);\n\n // Configuraciones regionales disponibles en la JVM\n Locale[] available = Locale.getAvailableLocales();\n System.out.println("Total disponibles: " + available.length);\n }\n}\n\nLa salida podría ser, por ejemplo: Configuración regional actual: ru_RU. Pero no nos basaremos en la configuración regional del sistema; en una aplicación web, normalmente la envía el navegador del usuario.
Paso 2. ResourceBundle: su traductor
\n\nAhora lo más interesante: ¿cómo almacenar las traducciones? En Java se utilizan archivos de propiedades (.properties). Cada archivo es un conjunto de pares clave=valor.
Creación de archivos de traducción
\n\nCree en el directorio src/main/resources (o simplemente en la carpeta con los archivos fuente) tres archivos:
1. Messages.properties (idioma predeterminado: inglés)
\ngreeting=Hello, {0}!\nfarewell=Goodbye!\napp.title=Task Manager\n\n2. Messages_ru_RU.properties (ruso)
\ngreeting=Привет, {0}!\nfarewell=До свидания!\napp.title=Менеджер задач\n\n3. Messages_de_DE.properties (alemán)
\ngreeting=Hallo, {0}!\nfarewell=Auf Wiedersehen!\napp.title=Aufgabenverwaltung\n\nObserve los sufijos: _ru_RU, _de_DE. Java busca el archivo siguiendo el patrón: Base