php

Aplicaciones multiidioma en PHP

El soporte para múltiples idiomas o lenguajes es una gran característica a la hora de desarrollar aplicaciones web con PHP, pues así podemos tener sitios traducidos sin mucho esfuerzo.

Múltiples idiomas con PHP

Aunque PHP soporta de manera nativa opciones como gettext para aplicaciones multilenguaje siempre vamos a necesitar una opción más robusta y simple.

Por ello es que hoy vengo a exponer un enfoque de cómo desarrollar aplicaciones multiidoma con PHP utilizando un componente de Symfony (no el framework, solo un componente que se puede integrar a cualquier proyecto) llamado translation.

El módulo translation

Para traducir mensajes podemos instalar el módulo de Symfony que funciona de manera aislada. Para ello utiliza Composer. Si no usas composer mira aquí cómo instalarlo, y aquí cómo adaptarlo.

Una vez que lo tengas, instala con:

composer require symfony/translation

Espera a que se instale y luego, en el archivo en donde vas a usar la app, carga el autoload:

See the gist on github.

Estamos listos.

Primer acercamiento a la traducción

Comenzamos creando un traductor, instanciando un Translator pasándole el locale o idioma en el que se mostrarán los mensajes.

Es decir, aquí es en donde indicamos el idioma del usuario (puedes obtenerlo como se ve en este post o usar tus propios métodos)

See the gist on github.

Ahora a ese traductor le vamos a agregar recursos de traducción usando catálogos. Para comenzar vamos a usar el loader de arreglo, es decir, nuestras traducciones estarán en un arreglo así que lo agregamos así: (más tarde veremos cómo cargar las traducciones desde un fichero)

$traductor->addLoader("array", new ArrayLoader());

Eso agregó el loader, pero no ha agregado catálogos. Para agregarlos usamos:

See the gist on github.

Los argumentos de addResource son(en orden): tipo de loader, datos y locale o idioma. En este caso estoy usando es y en pero podrían ser más específicos como es_US, en_US, es_MX, etcétera.

Solo estoy definiendo el mensaje de saludo, que en inglés es Hello world! y en español es Hola mundo.

Finalmente definimos los idiomas fallback, es decir, los idiomas que se usarán en caso de que el idioma del traductor (el que especificamos al inicio) no encuentre una traducción:

See the gist on github.

Finalmente obtenemos el mensaje traducido accediendo a su clave:

See the gist on github.

Así que el código completo queda así:

See the gist on github.

Lo que realmente cambiará la salida es el idioma que especificamos en $idioma en la línea 5. Si uso es, la salida es:

 

En cambio, cuando uso en, la salida es:

Así que en resumen hay que indicar el idioma al instanciar el traductor, este idioma lo puedes obtener de las preferencia de idioma del usuario, usar algún método de detección, ver la ip, etcétera.

Catálogos de traducción con JSON

Además de los arreglos podemos usar ficheros yaml, csv, json, entre otros. Mostraré un ejemplo para usar JSON. Voy a definir mis catálogos de idiomas.

El de español queda así:

See the gist on github.

El de inglés así:

See the gist on github.

Si te fijas es un objeto o diccionario en donde la clave es el identificador del mensaje y el valor es el mensaje.

Ahora vamos a ver el código que es muy parecido al anterior, aunque un poco más corto. En lugar de cargar un loader de Array, cargamos un JsonFileLoader:

See the gist on github.

Y agregamos los catálogos:

See the gist on github.

Los argumentos son los mismos: el loader, los datos y el locale.

Nota importante: los archivos deben existir en el mismo directorio, y si no, asegúrate de escribir su ruta absoluta. Si la ruta es errónea fallará silenciosamente, es decir, no reportará errores y por lo tanto usará el idioma fallback.

Así que el código completo para tener varios idiomas en PHP usando archivos de JSON es el siguiente:

See the gist on github.

Como ves, todo es igual, excepto la carga de recursos, pero fuera de eso seguimos invocando al método trans.

Formatear mensajes

Si te fijas bien, en los ejemplos he definido un mensaje de bienvenida. En inglés es:

Welcome, {usuario}

Y en español es:

Bienvenido, {usuario}

Al traducir mensajes con este componente podemos especificar variables. He definido la variable en llaves {} porque quiero, pero no es obligatorio (solo que así se entiende mejor la intención del mensaje) ya que se hace un remplazo completo.

Para pasar argumentos se hace lo siguiente:

See the gist on github.

Como ves, en el segundo argumento indicamos un arreglo con los valores que se van a remplazar dentro de la cadena. Ahora sí, en inglés se ve así:

Y en español:

Por cierto, el código completo es el siguiente:

See the gist on github.

Conclusión y notas finales

Aunque lo veas complejo, no lo es tanto; pues podrías encerrar esto en una función o servicio y llamarlo desde otro lugar.

Recuerda: es tu deber identificar el idioma del usuario, puedes leerlo desde una base de datos, un parámetro GET, detectarlo, etcétera.

Esto que te mostré es un panorama general, si quieres ver la documentación oficial aquí la tienes.

Puedes ver el proyecto completo con todos los ejemplos en mi GitHub.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

16 horas hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

1 día hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

1 día hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

2 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

1 semana hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

1 semana hace

Esta web usa cookies.