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=gettextEjemplo 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.moEjemplo 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.mo3. 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/DebianFormateo 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 También en la biblioteca
CORS para JavaScript (Node.js): guía completa con ejemplos
Validación de datos en Go: bibliotecas, ejemplos y mejores prácticas