Internacionalización (i18n) en Java: haciendo la aplicación multilingüe
La internacionalización (a menudo abreviada como i18n — de la palabra internationalization, donde 18 es el número de letras entre la primera 'i' y la última 'n') — es el proceso de diseñar software de manera que pueda adaptarse a diferentes idiomas y características regionales sin modificar el código fuente. En Java, esta tarea se resuelve de manera elegante y potente mediante las API integradas: java.util.Locale, java.util.ResourceBundle y un conjunto de clases para formato.
En este artículo, analizaremos cómo implementar soporte para múltiples idiomas en una aplicación Java utilizando las herramientas estándar. Aprenderá a crear archivos de localización, cambiar dinámicamente el idioma y formatear correctamente números, fechas y monedas.
Componentes principales de i18n en Java
Java proporciona tres elementos clave para trabajar con la internacionalización:
- Locale — un objeto que representa un idioma y región específicos (por ejemplo, ruso en Rusia —
ru_RU, inglés en EE. UU. —en_US). - ResourceBundle — una clase para cargar recursos localizados (cadenas, mensajes, etiquetas) desde archivos
.propertieso clases. - Formateadores — clases del paquete
java.text(NumberFormat,DateFormat,MessageFormat) para mostrar correctamente números, fechas y mensajes compuestos.
Paso 1: Creación de archivos de recursos
La forma tradicional de almacenar cadenas localizadas son los archivos .properties. Se crean siguiendo esta regla:
Messages.properties # Archivo predeterminado (generalmente inglés)Messages_ru_RU.properties # Para ruso (Rusia)Messages_de_DE.properties # Para alemán (Alemania)Messages_fr.properties # Para francés (sin especificar región)Ejemplo del contenido del archivo Messages.properties (inglés, predeterminado):
welcome.message = Welcome to our application!farewell.message = Goodbye!date.format = dd/MM/yyyyEjemplo del contenido del archivo Messages_ru_RU.properties (ruso):
welcome.message = Добро пожаловать в наше приложение!farewell.message = До свидания!date.format = dd.MM.yyyyImportante: los archivos deben estar en codificación ISO 8859-1 (Latin-1) o usar escape Unicode para caracteres que no pertenezcan a esta codificación. Para letras rusas se requerirá escape, por ejemplo \\u0414\\u043E\\u0431\\u0440\\u043E. Sin embargo, en entornos de desarrollo modernos (IntelliJ IDEA, Eclipse) y al compilar con Maven/Gradle, esto suele estar automatizado.
Paso 2: Carga de recursos en el código
Para usar cadenas localizadas, basta con crear un objeto Locale y obtener el ResourceBundle correspondiente:
import java.util.Locale;import java.util.ResourceBundle;
public class I18nDemo { public static void main(String[] args) { // Creamos una locale para ruso Locale ruLocale = new Locale("ru", "RU"); // Cargamos el bundle (nombre base del archivo - "Messages") ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale);
// Obtenemos las cadenas String welcome = bundle.getString("welcome.message"); String farewell = bundle.getString("farewell.message");
System.out.println(welcome); // Добро пожаловать в наше приложение! System.out.println(farewell); // До свидания! }}Si no se encuentra el archivo para una locale específica, Java utiliza automáticamente el archivo predeterminado (Messages.properties).
Paso 3: Cambio dinámico de idioma
En una aplicación we
También en la biblioteca
kotlinx-datetime en Kotlin: guía completa con ejemplos prácticos
R.swift en Swift: guía completa con ejemplos prácticos
Registro en Rust: revisión de las mejores bibliotecas y soluciones para tu proyecto
Humanizer para C# (.NET): guía completa con ejemplos prácticos