Polylang: pll_e() y pll__() en functions.php no funcionan

13 feb 2013, 12:34:42
Vistas: 16K
Votos: 2

Tengo en functions.php algunas funciones que imprimen bloques de HTML. El problema viene con el plugin Polylang, que usa las funciones personalizadas pll_e() y pll__().

Estas funcionan correctamente en index.php en cualquier tema, pero no funcionan bien en functions.php, que básicamente siempre me devuelve las cadenas en el idioma por defecto, aunque estén registradas en el área de administración.

Así que esos bloques impresos en index.php usando las funciones pll_ funcionan bien. Pero los mismos bloques impresos en functions.php siempre aparecen en inglés.

He publicado esto en el foro de soporte oficial del plugin. Todavía no hay respuestas.

¿Alguien aquí tiene una idea de qué puede ser?

¡Muchas gracias!

1
Comentarios

Usé pll__ en functions.php sin ningún problema. ¿Estás seguro de que proporcionaste la traducción requerida usando pll_register_string o a través del panel de control?

RRikesh RRikesh
29 abr 2013 09:31:13
Todas las respuestas a la pregunta 1
3

No tengo experiencia con el plugin Polylang, pero creo que es seguro asumir que esto tiene que ver con el orden de carga del plugin Polylang y el archivo functions.php de tu tema. Cuando llamas a una función en el ámbito global (es decir, no desde dentro de otra función) de index.php o cualquier otro archivo de plantilla, se ejecutará en una etapa tardía del proceso de carga de la página, después de que WordPress se haya inicializado por completo e incluso después de que el servidor haya comenzado a enviar la respuesta al cliente.

Sin embargo, una función llamada desde el ámbito global del archivo functions.php se ejecutará en un momento mucho más temprano. Durante una carga típica de página, esencialmente lo que sucede es que primero WordPress se configura, luego carga los plugins y por último el tema. Sin embargo, este proceso no es tan lineal como podrías pensar, ya que algunos plugins podrían depender de funcionalidades que no estarán disponibles hasta que WordPress esté completamente inicializado, el tema esté cargado o haya comenzado la respuesta del servidor de la página. WordPress resuelve esto mediante el uso de hooks, que permiten que un plugin o tema ejecute código en ciertas etapas durante el proceso de carga.

Para hacer una larga respuesta corta aún más larga, lo que necesitas hacer es asegurarte de no llamar a pll_e() o pll__() hasta que estés seguro de que el plugin Polylang está listo. Esto se puede determinar mirando su código fuente (o quizás su documentación), pero supongo que engancharte al hook init será suficiente. Las funciones llamadas en el ámbito global de functions.php se ejecutarán antes del hook init, pero al agregar un hook init puedes hacer que una función se ejecute en una etapa posterior. Así es cómo:

function my_setup() {
    global $some_var;
    $some_var = pll__('Una cadena que necesita localización', 'localization_domain'); // Esto asume que esta función se comporta de manera análoga a __()

    pll_e("Simplemente mostraremos esto, en algún lugar", 'localization_domain');
}
add_action('init', 'my_setup');
13 feb 2013 13:11:10
Comentarios

No... no funciona... :( ¡No sé qué hacer!

Lightworker Lightworker
14 feb 2013 11:25:11

¿Qué has probado? ¿Usar otros hooks además de init? También, espero que no hayas simplemente copiado/pegado mi código ya que había un error en él. :)

Simon Simon
14 feb 2013 12:52:25

He revisado Polylang y pll__($string) es simplemente un wrapper alrededor de __($string, 'pll_string') que está integrado en WordPress. Sin embargo, el plugin añade filtros a override_load_textdomain, gettext y gettext_with_context. También carga su propio textdomain en los hooks wp, login_init, admin_init por lo que probablemente las funciones estarán disponibles después de cualquiera de estos. Además, una vez que la configuración está completa, se dispara el hook pll_language_defined que también podría valer la pena revisar. En general, mi mejor consejo es echar un vistazo al código fuente de Polylang para entender cómo funciona.

Simon Simon
14 feb 2013 13:02:36