Por qué la internacionalización de PHP no es solo «traducir palabras»
\n\nImagina: has escrito un proyecto PHP genial. Funciona, alegra a los usuarios, genera ganancias. Pero un día notas en las estadísticas que el 30% del tráfico proviene de Alemania, el 15% de Japón y el 10% de los EAU. Tu sitio web solo habla ruso. Los usuarios se van al no encontrar el botón «Comprar» en su idioma.
\n\n¿Te resulta familiar? La internacionalización (i18n) de aplicaciones PHP no es solo reemplazar palabras en una plantilla. Es un enfoque arquitectónico que permite que tu código «entienda» la cultura, la moneda, las fechas e incluso la dirección del texto (de izquierda a derecha o de derecha a izquierda).
\n\nEn este artículo, analizaremos cómo convertir un sitio PHP común en una plataforma multilingüe utilizando herramientas nativas y las mejores prácticas. Aprenderás cómo funciona gettext en PHP, en qué se diferencia la localización de la internacionalización y cómo evitar errores con la pluralización.
\n\ni18n vs l10n: cuál es la diferencia (y por qué es importante)
\n\nAntes de escribir código, acordemos los términos. La internacionalización (i18n) es la preparación del código para la traducción: extraer cadenas, trabajar con formatos de números, fechas, monedas. La localización (l10n) es el proceso de traducción y adaptación a una región específica.
\n\nUna analogía simple: la internacionalización es construir una casa con habitaciones vacías donde se puede colocar cualquier mueble. La localización es colocar los muebles según los gustos de un residente en particular.
\n\nPara un desarrollador PHP, esto significa: ¡no codifiques las cadenas de forma fija! Nunca. Incluso si el sitio web actualmente solo está en ruso. Cada frase debe estar envuelta en una función de traducción.
\n\nPila tecnológica para i18n en PHP
\n\nEn el ecosistema PHP, hay varias herramientas potentes. Veremos dos enfoques principales: el clásico gettext y el moderno ICU MessageFormat a través de la extensión intl.
1. Gettext — el abuelo del multilingüismo
\n\nGettext en PHP es el estándar de facto para muchos CMS (WordPress, Drupal). Utiliza archivos .po y .mo para almacenar traducciones. Ventajas: simplicidad, soporte para formas plurales, integración con Poedit.
2. ICU MessageFormat — para lógica compleja
\n\nLa extensión PHP intl (Internationalization) proporciona las clases MessageFormatter y NumberFormatter. Es la elección para proyectos que necesitan plantillas complejas con selección de caso, género y número.
3. Bibliotecas envolventes
\n- \n
- symfony/translation — componente de Symfony, funciona tanto con YAML/XLIFF como con gettext. \n
- laravel-localization — para Laravel (paquete mcamara/laravel-localization). \n
- zend-i18n — para Laminas (anteriormente Zend Framework). \n
Práctica: configurando gettext en PHP desde cero
\n\nSupongamos que tenemos un script simple index.php que muestra un saludo. Hagámoslo multilingüe.
Paso 1. Preparación del código
\n\nEnvuelve todas las cadenas en la función _() (alias de gettext()):
<?php\n// index.php\necho _("¡Bienvenido a nuestro sitio web!");\n\n$items = 5;\n// Para formas plurales usamos ngettext\necho ngettext("%d artículo", "%d artículos", $items);\n?>\n\nPaso 2. Generación del archivo .pot
\n\nInstala gettext en el servidor o usa xgettext:
xgettext -o locales/messages.pot index.php --from-code=UTF-8\n\nPaso 3. Creación de la traducción
\n\nCopia messages.pot en locales/es_ES/LC_MESSAGES/messages.po y edítalo:
msgid "¡Bienvenido a nuestro sitio web!"\nmsgstr "Welcome to our site!"\n\nmsgid "%d artículo"\nmsgid_plural "%d artículos"\nmsgstr[0] "%d item"\nmsgstr[1] "%d items"\n\n