Polylang: pll_e() y pll__() en functions.php no funcionan
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!

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');

¿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. :)

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.
