Internacionalización (i18n) con PHP

Cuando trabajamos con un sitio que debe estar disponible en  varios idiomas hay múltiples alternativas para traducirlo en PHP pero todas básicamente se basan en incluir un archivo de idioma y sustituir cada frase por su equivalente.

Cuando tenemos que traducir un sitio deberíamos plantearnos seriamente la internacionalización del mismo ¿qué es? Básicamente es no solo traducir el texto sino mostrar fechas y configuraciones regionales según el idioma elegido. La mejor herramienta para esto es la extensión de PHP gettext, herramienta que aún no he probado pero que sospecho tendrá un rendimiento más que aceptable y mucho mejor que el resto de opciones que veremos en este post. Lo único malo de esta librería y precisamente será lo que garantice su rendimiento es el uso de la cache para almacenar los idiomas con lo cual cualquier actualización requeriría un reinicio de apache, cosa que en muchos casos no es viable salvo que tengamos un servidor dedicado.

Os prometo que intentaré implementar esta herramienta en breve y os comento cómo va en rendimiento.

Volvamos a las opciones más manuales. Cuando utilizamos un archivo de idiomas la pregunta es ¿que variables utilizo? Existen 3 tipos de estructuras de almacenamiento que podríamos utilizar, variables globales, un array global o constantes predefinidas. El rendimiento de cada una de ellas es diferente y en el siguiente gráfico para PHP 5.5.9 deja claro cuál sería la mejor opción (menos es mejor)

Utilizar un array puede dar la sensación de ser más organizado, todo queda dentro de una misma variable y es más sencillo de utilizar mientras que variables globales si no las nombramos correctamente o utilizamos un prefijo podrían confundirse con las variables propias de nuestro script. Yo antes de realizar estas pruebas he utilizado arrays y constantes y el rendimiento general de la aplicación no lo he visto muy penalizado, pero claro, luego de ver esto te planteas si realmente no podría ser más rápido nuestro desarrollo.

Estas opciones son válidas pero poco flexibles, sobre todo las constantes y las variables globales pues para cada texto le corresponde un valor, con lo cual  migrar a otro entorno puede ser complicado. Otra opción podría ser crearnos una función intermedia que hiciese de nexo entre los textos y el archivo de idiomas pero habría que sumarle entonces el tiempo de llamada a esta función al tiempo de la opción que seleccionemos (variables, array o constantes).

Utilizar una función sería lo mejor si queremos o tenemos pensado migrar pronto nuestra aplicación a gettext, pero os aviso, la penalización en el rendimiento se dispara. Aquí os dejo un gráfico con el rendimiento (menos es mejor) de las distintas opciones y para distintos entornos PHP.

¿qué os parece? ¿alguno ya ha utilizado gettext?

PD: para el cálculo de las duraciones he modificado el script que hay en este artículo que compara variables globales con constantes. Las modificaciones son 10 veces más repeticiones y el cálculo de una media de 5 pasadas.

Comentarios