Internacionalización (i18n) en PHP: Guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Internacionalización (i18n) en PHP: cómo hacer un sitio web multilingüe



La internacionalización (i18n) es el proceso de diseñar software de manera que pueda adaptarse fácilmente a diferentes idiomas y regiones sin realizar cambios en el código. En PHP, existen varias herramientas potentes que permiten separar el código y el texto, y luego cargar dinámicamente el idioma necesario.



En este artículo, veremos los enfoques y bibliotecas principales para implementar i18n en PHP, incluyendo las funciones integradas gettext, la extensión intl y bibliotecas populares como Symfony Translation.



1. Conceptos básicos de i18n



Antes de pasar a las herramientas, es importante entender los términos clave:



  • Locale (localización) — combinación de idioma y región (por ejemplo, es_ES, en_US, de_DE).
  • Traducción — reemplazo de una cadena original por su equivalente en otro idioma.
  • Pluralización — declinación correcta de palabras según el número (por ejemplo, "1 archivo", "2 archivos", "10 archivos").
  • Formateo — adaptación de fechas, números, monedas al locale.


2. Biblioteca integrada gettext



gettext es una herramienta clásica para i18n, integrada en PHP. Utiliza archivos .po (Portable Object) y .mo (Machine Object) para almacenar traducciones.



Instalación y configuración



Asegúrese de que la extensión gettext esté habilitada en php.ini:



extension=gettext


Ejemplo de configuración básica:



<?php// Establecemos el localesetlocale(LC_ALL, 'es_ES.UTF-8');// Especificamos el dominio (nombre del archivo .mo)bindtextdomain('messages', './locale');// Codificaciónbind_textdomain_codeset('messages', 'UTF-8');// Seleccionamos el dominiotextdomain('messages');

// Usamos la traducciónecho gettext("Hello, World!"); // mostrará "¡Hola, Mundo!"// o de forma abreviadaecho _("Hello, World!");?>


Estructura de archivos



Sus archivos de traducción deben estar en la carpeta locale:



locale/├── es_ES/│   └── LC_MESSAGES/│       └── messages.po│       └── messages.mo└── en_US/    └── LC_MESSAGES/        └── messages.po        └── messages.mo


Ejemplo de archivo messages.po:



msgid "Hello, World!"msgstr "¡Hola, Mundo!"

msgid "Files: %d"msgstr "Archivos: %d"


Para compilar .po a .mo use la utilidad msgfmt:



msgfmt messages.po -o messages.mo


3. Extensión intl (Internationalization Functions)



La extensión intl proporciona capacidades más modernas para trabajar con locales, incluyendo formateo de números, fechas y mensajes.



Instalación



sudo apt-get install php-intl  # para Ubuntu/Debian


Formateo de mensajes con MessageFormatter



<?php$locale = 'es_ES';$message = '{0} saluda a {1}!';$fmt = new MessageFormatter($locale, $message);echo $fmt->format(['PHP', 'Mundo']);// Mostrará: PHP saluda a Mundo!?>


Pluralización



<?php$locale = 'es_ES';$pattern = '{0, plural, one {# archivo} other {# archivos}}';$fmt = new MessageFormatter($locale, $pattern);echo $fmt->format([1]); // 1 archivoecho $fmt->format([2]); // 2 archivosecho $fmt->format([10]); // 10 archivos?>


Formateo de fechas y números



<?php$locale = 'es_ES';$fmt = new NumberFormatter($locale, NumberFormatter::DECIMAL);echo $fmt->format(1234567.89); // 1.234.567,89

$dateFmt = new IntlDateFormatter($locale, IntlDateFormatter::LONG, IntlDateFormatter::NONE);echo $dateFmt->f

Recommendations