¿Cómo traducir programas libres? Uso en PHP (Parte III)

Si ya hemos hablado en líneas generales del tema y hemos comentado cómo hacer uso de los ficheros .po, .mo y .pot, ahora nos toca el turno de llevar a la práctica todo esto. Suponemos que tenemos ya nuestros ficheros .PO y .MO creados. Si queréis practicar, podéis usar los paquetes de lenguaje de cualquier aplicación libre, por ejemplo, los de la versión española de WordPress. Empecemos paso a paso.

Marcar las cadenas a traducir

En lugar de usar directamente:

print “<p>Cadena a traducir</p>n”;

Deberemos hacer uso de la función gettext:

print “<p>”.gettext(“Cadena a traducir”).”</p>n”;

O de su alias (mucho más funcional):

print “<p>”._(“Cadena a traducir”).”</p>n”;

Códigos de idioma – Relación con el fichero .MO

Con las cadenas ya marcadas, sólo nos queda indicarle a PHP dos cosas:

  • Qué idioma es el que el usuario está visualizando
  • Dónde están los ficheros de dichos idiomas

Haremos uso de las siguientes funciones:

  • putenv: para introducir una variable de entorno
  • selocale: para establecer la configuración regional
  • binddomain: para hacer la referencia a la ruta del dominio (dónde está el fichero .MO)
  • textdomain: establece el dominio

Supongamos que tenemos un fichero de inglés británico (código en_GB, si queréis saber más sobre códigos de idioma y códigos de país leed los enlaces que os dejo, ambos se establecen por la norma ISO 639), un fichero “mensajes.po” con las traducciones situado en la ruta “locale/en_GB/LC_MESSAGES”, podremos hacer directamente:

$idioma=”en_GB”;

putenv(“LC_ALL=$idioma”);

setlocale(LC_ALL, $idioma);

bindtextdomain(“mensajes”, “./locale”);

textdomain(“mensajes”);

Las cadenas marcadas, se traducirán automáticamente al inglés si existe una traducción para ellas definida en el fichero .MO. Sólo nos quedaría establecer un mecanismo para posibilitar la traducción a los diferentes idiomas en función de la variable $idioma.

Entregas anteriores:

Entradas relacionadas:

  1. ¿Cómo traducir programas libres? Fichero .po, .mo y .pot (Parte II)
  2. ¿Cómo traducir programas libres? Introducción (Parte I)
  3. Traducir BuddyPress al español
  4. Cómo instalar programas en Linux
  5. Cómo ejecutar programas implementados en .NET en Linux con Mono

Acerca de F. Javier Carazo Gil

Casi Ingeniero Informático, co-fundador y administrador de Linux Hispano, co-fundador de Red de Autores y Geometrio, puedes saber más sobre mí, mi vida laboral, mis libros, mis artículos y mi día a día en @fjcarazo y en mi perfil público de LinkedIn.
  • Pingback: Bitacoras.com

  • Pingback: ¿Cómo traducir programas libres?

  • http://www.shakaran.net shakaran

    Esos print duelen… en PHP se usa echo (print pasara a estar deprecated posiblemente en PHP 6).

    Como aportación, un ejemplo funcional y completo (con gestión de errores) en uno de los software que desarrollo:
    http://bazaar.launchpad.net/~shakaran/qpanel/trunk/view/head:/httpdocs/l18n/l18n.php

  • http://www.jcarazo.com carazo

    @shakaran: una duda, sólo uso print cuando le paso parámetros en plan, print(“%d comentarios”, $comnetarios). ¿Se puede hacer eso mismo con echo? Creo que no, que tienes que concatenar cadenas.

  • Pingback: ¿Cómo traducir programas libres? | Noticias - d2.com.es

  • http://www.shakaran.net shakaran

    Precisamente esa es la riqueza de echo, que puede mostrar una o mas cadenas a través de concatenación, cosa que printf, solo puede mostrar una cadena y poner todos los argumentos. Además printf te añade implícitamente un \n cosa que en scripts de shell puedes o no querer y con echo puedes controlar si imprimes con comillas simples o dobles. Ejemplo echo “\n”; imprime salto de linea y echo ‘\n’; te muestra \n pero no un salto de línea. Pero si haces echo ”; o echo “”; no te pone un salto de linea, en cambio printff(“”); o printf(”); si que te lo pondrá.

    Aparte echo es un constructor nativo del lenguaje, luego es mucho más rápido que una función invocada derivada como es printf.

    Desde php3 y los antiguos usos de perl se usaba más, pero su uso ya no es muy recomendado, también es sinónimo de ver códigos antiguos y viejos, y programadores con experiencia lo califican enseguida como malas prácticas.

    Pero bueno, es tu código, es tu decisión, yo solo te recomiendo que no es muy práctico.

  • http://www.jcarazo.com carazo

    @shakaran: Mil gracias por tu comentario, es verdaderamente enriquecedor. Hay veces como ésta en la que el comentario aporta más información que el contenido de la entrada.

    Yo es por comodidad, a veces prefiero poner %d al estilo C a concatenar, pero tras leer tu comentario creo que me decantaré de forma permanente por echo.