¿Cual es la diferencia entre __(), _e(), _x() y _ex() en Wordpress?

Si estás desarrollando plugins y deseas internacionalizar sus cadenas de texto, Wordpress incluye varias funciones que permiten hacerlo de un modo sencillo:
  • __()
  • _e()
  • _x()
  • _ex()
  • _n()
En algunos plugins antiguos, podrias encontrar la funcion _c() que está en deshuso y ha sido reemplazada por _x() a partir de la versión 2.9. 
Si no estas familiarizado con i18n, puedes darle una mirada al Codex (en ingles).
Todas estas funciones traducen cadenas de texto al lenguaje definido en wp-config.php, pero; ¿Cual es la diferencia entre ellas?

__() y _e() son las funciones mas simples,  __() devuelve y _e() imprime la cadena traducida; su uso es bastante simple, se pasa una cadena de texto como parametro, y esta devuelve/imprime su traducción.

Un poco mas complejo es el uso de la función de _x();  imagina que tengas dos cadenas de texto en dos contextos diferentes de tu plugin, pero que son exactamente iguales en tu idioma. ¿Estás seguro de que son iguales en los otros 3000 idiomas hablados en la Tierra? Es poco probable estar seguro de esto. Afortunadamente, los creadores de WordPress tienen una solución a esto: _x () esta función contiene un parámetro adicional:

string _x (string $text, string $context, [string $domain = 'default']) 

Mediante el parámetro $context puedes diferenciar cadenas idénticas en diferentes contextos. Simple, ¿no? El problema que queda es definir dos cadenas diferentes en el archivo .po. Eso no es demasiado difícil tampoco:

msgctxt "prueba1"
msgid "probando"
msgstr "contexto1"

msgctxt "prueba2"
msgid "probando"
msgstr "contexto2"

El token mágico msgctxt se podría traducir a "contexto del mensaje". Veamos como utilizarlo:
echo 'Contexto: prueba1 -> ' . _x('probando', 'prueba1', 'prueba');
echo 'Contexto: prueba2 -> ' . _x('probando', 'prueba2', 'prueba');

Crearía la salida
Contexto: prueba1 -> contexto1
Contexto: prueba2 -> contexto2

La función restante _ex() es una combinación de _e() y _x(): imprime la cadena traducida usando un contexto.

Si estás utilizando un editor visual para los archivos .pot debes tener en cuenta que no todos los editores son capaces de manejar las definiciones de contexto y pueden destruir tus datos.

Por último pero no menos importante _n() para recuperar la forma plural o singular basado en la cantidad.

_n( $single, $plural, $number, $domain = 'default' )

Si el dominio no está configurado en la lista $l10n, se realizará una comparación y se devolverá el parametro $plural o $single.

Un uso simple de _n() podria ser:

$dominio = 'prueba';
$conteo_commentarios = 1;
echo _n('comentario', 'comentarios', $conteo_comentarios, $dominio);
$conteo_comentarios = 2;
echo _n('comentario', 'comentarios', $conteo_comentarios, $dominio);

Las entradas correspondientes al archivo de idioma ingles(en_US) son:

msgid "comentario"
msgid_plural "comentarios"
msgstr[0] "comment"
msgstr[1] "comments"

Y la salida:

Comment
Comments

Que son las traducciones singulares y plurales correctas.

Por supuesto, también hay una combinación de _n () y _x () llamada _nx()
function _nx($single, $plural, $number, $context, $domain = 'default')

Comentarios

Entradas populares de este blog

Instalación y configuración del controlador de video AMD Geode LX en netbook UTECH UX80-WHT en Debian Lenny 5.0.4 y Ubuntu 10.04

Alojar imagenes de Wordpress en subdominio.