Internacionalización de PHP: cómo hacer un sitio web en todos los idiomas del mundo

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

Por qué la internacionalización de PHP no es solo «traducir palabras»

\n\n

Imagina: 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\n

En 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\n

i18n vs l10n: cuál es la diferencia (y por qué es importante)

\n\n

Antes 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\n

Una 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\n

Para 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\n

Pila tecnológica para i18n en PHP

\n\n

En 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.

\n\n

1. Gettext — el abuelo del multilingüismo

\n\n

Gettext 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.

\n\n

2. ICU MessageFormat — para lógica compleja

\n\n

La 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.

\n\n

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
\n\n

Práctica: configurando gettext en PHP desde cero

\n\n

Supongamos que tenemos un script simple index.php que muestra un saludo. Hagámoslo multilingüe.

\n\n

Paso 1. Preparación del código

\n\n

Envuelve todas las cadenas en la función _() (alias de gettext()):

\n\n
<?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\n

Paso 2. Generación del archivo .pot

\n\n

Instala gettext en el servidor o usa xgettext:

\n\n
xgettext -o locales/messages.pot index.php --from-code=UTF-8
\n\n

Paso 3. Creación de la traducción

\n\n

Copia messages.pot en locales/es_ES/LC_MESSAGES/messages.po y edítalo:

\n\n
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

Paso 4. Compilación y po

Blogs

Book Recommendations