Internacionalización (i18n) en Java: Guía completa
\n\nLa internacionalización (abreviada i18n — de la palabra internationalization, donde entre la primera letra 'i' y la última 'n' hay 18 letras) es el proceso de diseñar software de manera que pueda adaptarse a diferentes idiomas y regiones sin realizar cambios en el código fuente. Java proporciona un potente conjunto de herramientas integradas para la internacionalización, que permite a los desarrolladores crear fácilmente aplicaciones multilingües.
\n\nEn este artículo, analizaremos en detalle los componentes principales de i18n en Java: Locale, ResourceBundle, archivos de propiedades y MessageFormat. Aprenderá a estructurar correctamente los recursos localizados y a manejar excepciones relacionadas con la falta de traducción.
1. Componentes principales de i18n en Java
\n\nLa internacionalización en Java se basa en tres elementos clave:
\n\n- \n
- Locale — un objeto que representa un área geográfica, política o cultural específica. Contiene información sobre el idioma, el país (opcional) y la variante (opcional). \n
- ResourceBundle — una clase que carga recursos localizados (cadenas, formatos) desde archivos de propiedades (
.properties) u otras fuentes. \n - Archivos de propiedades — archivos de texto con extensión
.properties, donde se almacenan paresclave=valor. El nombre del archivo se construye según las reglas:NombreBase_idioma_PAIS.properties. \n
Ejemplo de estructura de archivos para los idiomas ruso e inglés:
\n\nMessages.properties // Archivo predeterminado\nMessages_en.properties // Inglés (general)\nMessages_en_US.properties // Inglés (EE. UU.)\nMessages_ru_RU.properties // Ruso (Rusia)\n\n\n2. Creación de archivos de propiedades
\n\nCreemos el archivo base Messages.properties (valores predeterminados en inglés):
greeting=Hello\nfarewell=Goodbye\napp.name=My Application\n\n\nAhora creemos la localización en ruso Messages_ru_RU.properties:
greeting=Здравствуйте\nfarewell=До свидания\napp.name=Моё приложение\n\n\nPara inglés (EE. UU.) — Messages_en_US.properties:
greeting=Hello\nfarewell=Goodbye\napp.name=My Application\n\n\n3. Uso de Locale y ResourceBundle
\n\nPara cargar cadenas localizadas se utiliza el siguiente código:
\n\nimport java.util.Locale;\nimport java.util.ResourceBundle;\n\npublic class I18nExample {\n public static void main(String[] args) {\n // Establecemos la configuración regional (por ejemplo, ruso, Rusia)\n Locale ruLocale = new Locale("ru", "RU");\n ResourceBundle bundle = ResourceBundle.getBundle("Messages", ruLocale);\n \n // Obtenemos las cadenas localizadas\n String greeting = bundle.getString("greeting");\n String farewell = bundle.getString("farewell");\n String appName = bundle.getString("app.name");\n \n System.out.println(greeting + " " + farewell); // Здравствуйте До свидания\n System.out.println(appName); // Моё приложение\n }\n}\n\n\nSi no se encuentra la configuración regional, Java utiliza automáticamente una cadena de búsqueda:
\n- \n
- Primero busca un archivo con coincidencia exacta (
Messages_ru_RU.properties). \n - Luego — sin país (
Messages_ru.properties). \n - Después — el archivo base (
Messages.properties). \n - Si no se encuentra nada — se lanza la excepción
MissingResourceException. \n
4. Formateo de mensajes con MessageFormat
\n\nA menudo las cadenas contienen partes variables. Para esto se utiliza MessageFormat. Ejemplo con datos dinámicos:
También en la biblioteca
Gson para Java: guía completa con ejemplos
Framework CLI para JavaScript (Node.js): Commander.js – creación de aplicaciones de consola
Generación de PDF en Java con iText
Marten para C# (.NET): guía completa con ejemplos prácticos