Traducir cadenas de texto en polylang

Polylang, cómo introducir tus propias cadenas de texto

Polylang es un plugin de WordPress para páginas multilingües que reporta beneficios de cara al SEO de tu web gracias a que su forma de funcionar es replicando las páginas y las entradas una vez para cada idioma consiguiendo así que éstas posean una url propia cada una.

Además si es necesario modificar algo en el contenido será menos farragoso ir directamente a la página o entrada concreta a editar y no tener que bucear hasta dar con el fragmento de texto o la etiqueta que identifica el idioma como sucedía en otros plugins.

Pero a veces no necesitamos crear una página entera sino simplemente una cadena de texto para maquetar nuestro tema. Esto será muy fácil con estas dos funciones propias de Polylang:

Función de polylang: pll_register_string()

Primero en el archivo functions.php de nuestro tema wordpress añadimos la función

pll_register_string( $name, $string, $group, $multiline);

Tendremos que añadir esta función una vez por cada cadena que queramos traducir y funciona tal que así:
$name      => (parametro obligatorio) el nombre que le damos a la cadena
$string      => (parametro obligatorio) la cadena que queremos traducir (no ha de ser completa, puede ser una referencia pero ¡cuidado! porque en ese caso habrá que vigilar no repetirla)
$group      => (parámetro opcional) el grupo en el que registramos la cadena, por defecto ‘polylang’
$multiline => (parámetro opcional) si ponemos el valor true, el campo para el texto será más grande, por defecto su valor es false

Un ejemplo de uso:
/***** Cadenas a traducir con polylang *****/
pll_register_string("Contacta", "Contacta con nosotros", "Footer");

Cuando guardemos el archivo functions.php podemos ir a Ajustes > Idioma > Traducción de cadenas y nos encontraremos con una tabla como la siguiente donde podemos modificar las traducciones de nuestras cadenas.
Cadenas de texto en polylang

Función de polylang: pll__()

Para después llamar a las traducciones de estas cadenas en nuestra maquetación es tan sencillo como  pasar la cadena a la función pll__($string);


<?php echo pll__("Contacta con nosotros"); ?>

 

45 thoughts on “Polylang, cómo introducir tus propias cadenas de texto


  1. James

    Hola

    Soy un tanto nuevo con wordpress y no conozco mucho el lenguaje Php me podría mostrar como queda la función entera en el archivo functions.php y donde se ubica

    De antemano muchas gracias

    • soleguia

      Hola, James

      es bastante sencillo, tienes que acceder a tu archivo functions.php y una vez ahí bajas hasta el final del archivo.

      Metes un par de saltos de línea y pegas lo siguiente:

      /***** Cadenas a traducir con polylang *****/
      pll_register_string("Texto que quieres traducir", "Texto que quieres traducir");

      Obligatorios sólo son esos dos primeros parámetros y para ahorrarte complicación simplemente pones los mismo dos veces.

      Después en el archivo donde quieras mostrar esa cadena de texto (p.e.: single.php, home.php, page.php, …) pegas lo siguiente:

      Hechos estos dos pasos vas a la administración de tu wordpress y entras en Ajustes > Idioma > Traducción de cadenas

      Ahí tienes todas las cadenas a traducir, entre ellas estará Texto que quieres traducir con un recuadro para la traducción en cada idioma. Después de rellenar las traducciones, guardas los cambios.

      Y listo. Cuando cambies de idioma aparecerá la cadena traducida.

      Espero haberte ayudado.

      Un saludo.

  2. James

    Muchas Gracias n_n tengo otra duda, sabe como podría encontrar una cadena de texto generada por un widget o por la pagina, o todas las cadenas en general.

    Por que con el archivo po no las encuentro

    Es que el sitio en el que trabajo es de una sola pagina y hay muchas cadenas de texto que polylang no detecta ¿con este proceso se podrían editar esas cadenas?

    Este es el link de la pagina en la que estoy trabajando : http://www.legacysupplementsllc.com

    Muchas gracias y disculpe lo intenso jaja 😀

    • soleguia

      Hola de nuevo, James

      si no las encuentras en el archivo .po ni tampoco en Ajustes > Idioma > Traducción de cadenas es posible que estén metidas directamente en los archivos, en cuyo caso sólo tienes que crear tus propias frases para traducir con polylang y reemplazarlas en los archivos por la función pll__(«string») correspondiente.

      Un saludo.

  3. Javier

    ¡Muy buenas!

    Tengo un pequeño problemilla con el polylang a ver si me puedes echar un cable, en este caso es con la traducción de cadenas, me aparecen las cadenas a traducir con su campo correspondiente en inglés. Introduzco el valor en inglés y guardo los cambios.

    Pero al realizar el cambio de idioma, es un «header_number» y otro «footer_text» no me realiza el cambio de string.

    Por cierto, este código ¿Dónde tendría que ponerlo?

    Un saludo, Javi
    ¿Alguna idea?

  4. soleguia

    ¡Hola, Javier!

    ¿Puedes decirme una url donde pueda ver el problema?

    Este código es para utilizarlo en el código php de wordpress.

    Un saludo.

  5. Javier Diaz

    Muy buenos dias! Una duda por si me puedes aconsejar.
    En una web usamos polylang. Me va perfecto para tener las urls separadas para español e inglés, pero el template usa «testimonios», y esos testimonios no se pueden duplicar para el inglés, por ejemplo.
    Solo aparecen en un único idioma, y no deja duplicarse para el inglés.
    ¿Como podría hacer para que se pueda poner el texto en cada idioma? Ten en cuenta que el cliente final no suele acceder al php como para cada vez que quiera poner un testimonio, hacerlo via programacion.
    Se que con wpml por ejemplo, podia poner [wmpl-string] y se creaba la cadena, pero..
    ¿Puedo hacer algo similar con polylang? Actualmente solo me detecta los widgets, y algunos elementos del wordpress en general, pero no los testimonials

    Muchas gracias por tu tiempo!

    • soleguia

      Buenos días, Javier

      me imagino que ese «testimonios» será un Custom post type, entonces si mirás en los ajustes del plugin

      Ajustes > Idiomas > Ajustes

      Ahí tienes un apartado que es «Tipos de entradas personalizados y taxonomías«.

      Dentro deberías poder activar que el polylang también funcione con «testimonios».

      Un saludo.

  6. Javier Diaz

    Hola de nuevo. Pues cierto, no lo tenia puesto.
    Ya me va como quien dice, canela.
    Muchas gracias!

    • soleguia

      ¡De nada!
      Yo también tuve que preguntar en su día, ¡jeje!
      Me alegro de haberte ayudado 😉

  7. Leo

    Saludos Autor.

    Me interesa saber cómo puedo insertar cadenas de texto personalizado a mis archivos del Theme. Entiendo lo que .MO y .PO, pero hay texto personalizado que no trae el Theme, por ejemplo, los Campos de BuddyPress no son traducibles por PolyLang por defecto, así que supongo que añadiendo las String sería posible. Pero No se como hacerlo.

    • soleguia

      ¡Hola, Leo!

      Siendo sincero no he utilizado aún Buddypress en ningún proyecto, aunque sí quiero probar qué se puede hacer con él.

      Por eso no sé responder a tu duda, como mucho decirte que mires este enlace por si te sirve de algo:
      https://github.com/awsmug/multilanguage-buddyPress-with-polylang

      Si más adelante hago pruebas con Buddypress y Polylang ya comentaré por aquí.

      Un saludo 😉

  8. javier diaz

    Hola Josu.
    Abusando de tu amabilidad, te expongo una duda.
    Tengo una traduccion con polylang que no estoy solucionando.

    he incluido en functions: pll_register_string(«Todos los Derechos Reservados», «Todos los Derechos Reservados», «Footer»);
    Al hacerlo, el admin ciertamente me reconoce en Idiomas / traduccion de cadenas, esa traducción, y me da la opcion de poner su version en castellano.

    pero ahora tengo que ubicarlo en el sitio que quiero que traduzca, pero es parte de las opciones del theme, o sea, se controla en la parte del administrador donde se pone el tipico ttexto para el footer, por lo que no se ponerle que sustituya el texto a pelo que viene «Todos los Derechos Reservados» por la cadena que se use para que se traduzca.
    o sea, se que con php puedo usando pero en esa caja no coge php.
    Creo que html si. Como seria para poner esa cadena pero con html? factible?

    muchas gracias!

    • soleguia

      Buenas, Javier!

      Pues me temo que no es factible. Las opciones del tema que se pueden rellenar no siempre aceptan html y de todas formas no te serviría.
      Tendrías que modificar el código de footer.php y antes de meterte en eso te recomiendo que hagas un tema hijo.

      No es muy complicado, con este tutorial de ayudawordpress deberías poder hacerlo fácilmente: Como crear un tema hijo en WordPress.

      Una vez tengas tu tema hijo, copias y pegas el archivo footer.php del tema padre.
      Ahí ya modificas donde esté la llamada a ese texto que quieres cambiar por
      echo pll__(«Todos los Derechos Reservados»);

      Y listo.

      Un saludo.

  9. javier diaz

    Muchas gracias! si, me olía que iban a ir por ahí los tiros…
    lo hago, si veo que me da quebraderos, lo dejo en blanco y tiro de widget.
    me he empecinado en usar el theme traduciendo todo, pero a veces no se puede todo.

    Oye, que muchas gracias. Un abrazo!

  10. Eugeni Fernandez

    Buenas tardes soleguia,
    No quisiera abusar de tu amabilidad, pero quizás podrías darme pistas sobre un problema. Estoy haciendo una web en dos idiomas, catalán y castellano. En la ficha de traducción de cadenas, me aparece una cadena html que he introducido en el footer, la traduzco y guardo los cambios pero en la página sigue apareciendo solo en el primer idioma, es como si no se guardaran las modificaciones. ¿Alguna idéa de dónde mirar?

    Muchas gracias

    • soleguia

      ¿Te has asegurado si esa cadena de texto aparece en algún sitio más?

      Podría ser que la estés traduciendo correctamente pero se vea en otro sitio y por eso no cambia.

      Siempre puedes ir a Apariencia > Editor y buscar el archivo footer.php para comprobar si está llamando a la función pll__(‘cadena-a-traducir’)

      Un saludo.

      • Eugeni Fernandez

        Hola de nuevo Soleguia.

        En primer lugar, muchas gracias por tu rápida respuesta.

        No, no aparece esta función en el archivo footer.php y tampoco aparece en ningún otro sitio que yo haya visto. Entiendo que debe aparecer tal cual y que debo substituir ‘cadena-a-traducir’ ¿por el nombre de la cadena o por la cadena en alguno de los idiomas?

        Gracias de nuevo

        • soleguia

          Efectivamente, en «Traducciones de cadenas» de Polylang, hay una columna Nombre.

          El nombre de la frase que quieres es lo que tienes que poner en la función pll__( ‘nombre’ )

          Después insertar en el archivo footer.php

          Donde quieras la cadena texto que se tiene que traducir.

          Un saludo.

  11. Eugeni Fernandez

    Hola de nuevo Soleguia

    Nada, que no hay manera he introducido el código pero sigue sin funcionar. Me traduce todas las cadenas excepto esta. ¿Sabes en que tabla de la base de datos almacena las cadenas traducidas?

    Gracias una vez más.

    • soleguia

      Buenas,

      pues es bastante extraño.

      ¿Puedes tener algún plugin de caché que pueda estar interfiriendo?

      ¿O has probado a crear esa cadena específica como explico en el post?

      Un saludo.

  12. Eugeni Fernandez

    Hola de nuevo Soleguia,

    Toda la mañana con ello y sin hallar solución. A ver si el fin de semana me ilumina.

    Gracias Josu.

  13. wilder

    Woow!! que facil y sobre a la primera. Muchas gracias bro!!. La verdad me ayudo mucho de tanto de buscar, logré encontrar solución en este entrada.

  14. Marc

    Buenos días, muchas gracias por tu fantástica aportación xk tenía una frase del theme que no se traducía «¡¡QUIERO COMENZAR A MINAR AHORA !!!» en la web https:// qpax-cloudmining_com/

    He realizado el cambio según tus indicaciones «Función de polylang: pll_register_string()» y efectivamente se ha añadido un texto en la cadena de traducciones.
    Sin embargo los cambios no se han hecho visibles en la web (ya he borrado cache web y navegador). No sé si el segundo apartado «Función de polylang: pll__()» también se tiene que realizar. Y de ser así me lo puedes detallar un poco más xk no acabo de comprenderlo o xk no se visualizan las traducciones.
    Muchas gracias de nuevo

    • JSoleguia

      Buenos días, Marc

      te explico, con pll_register_string() lo que haces es crear la opción en la administración de WordPress para introducir una traducción de ese texto.

      Por ejemplo:
      pll_register_string("Contacta", "Contacta con nosotros", "Footer");
      Con este código me aparecerán la cajas (inputs) para escribir el texto para «Contacta con nosotros» y sus traducciones.

      Pero luego donde quieras que se vea ese texto en cada idioma tienes que poner el pll__() que es la función que llama a la cadena de texto y la carga en el idioma que toque.

      Tendrás que ir a la plantilla de página y donde quieres que se vea el texto o su traducción escribirás, siguiendo el ejemplo anterior:
      <?php echo pll__("Contacta con nosotros"); ?>

      Un saludo.

  15. Marc

    Gracias Josu por tu rápida respuesta

    He introducido «» en el archivo functions.php y me ha dado un error, por lo que he borrado y deduzco que no es su sitio.

    Podrías concretar el camino de «Tendrás que ir a la plantilla de página y donde quieres que se vea el texto» porfavor

    • JSoleguia

      Buenas tardes, Marc

      con eso me refiero a que tendrás que editar el código php de la página concreta donde quieres que se vea el texto.

      Si ya has puesto la cadena para traducir en la administración tendrás que ir al código de la página donde quieres que se vea.

      Si la página en cuestión es una plantilla de página seguramente tengas una carpeta page-templates y dentro el archivo que se llamara page-(nombre).php.

      Si estás utilizando la plantilla predeterminada tendrás que ir a editar el archivo page.php, si es en la página de blog tendrás que ir a home.php, …

      Aquí tienes información al respecto de las plantillas de páginas que usa WP para orientarte: https://developer.wordpress.org/themes/template-files-section/page-template-files/

      Una vez entras al código de ese archivo, busca donde tiene que verse tu texto e insertas ahí el código <?php echo pll__("Contacta con nosotros"); ?> cambiando el «Contacta con nosotros» por el identificador de tu cadena, claro.

      Un saludo.

  16. Federico González Brizzio

    Hola! muy claro el artículo ¿sabes si hay alguna manera de tener las traducciones de Polylang en un fichero en vez de cargarlas en el admin de wordpress? a veces durante el desarrollo es más práctico si hay más de una persona trabajando en el mismo proyecto. Gracias!

    • JSoleguia

      Buenas, Federico

      así es como lo hago yo, en functions tengo varios include() para llamar a recursos que pongo una carpeta inc.
      Entre ellos, cuando trabajo con polylang, tengo un custom-cadenas-pll.php donde voy cargando las cadenas pll_register_string(…) que quiero crear.

      Un saludo.

  17. Alfonso

    Hola Josu, estoy intentando traducir las cookies de mi sitio con Polylang y Cookie EU, pero en las traducciones de cadenas de Polylang solo me aparece la opción de Español y tengo toda la web traducida en inglés y francés… Sabrías decirme porque? Sólo tengo este asunto para resolver y terminar la web.

    Gracias,
    Un saludo

    • JSoleguia

      Buenas, Alfonso

      de primeras se me ocurre que mires en la barra superior de la administración de WordPress.

      Si tienes seleccionado un idioma, Español en este caso, sólo te aparecerán los ajustes para ese idioma.

      Cámbialo a Mostrar todos los idiomas y entonces aparecerán también los demás.

      Un saludo.

  18. Pasqual Prous

    Hola Josu,
    Necesito que se traduzca el texto del footer y también cambiar la url del link que tiene el texto. ¿có,o puedo hacerlo?
    Muchas gracias

    Pasqual

    • JSoleguia

      ¡Hola, Pasqual!

      Sin más información ni ver la página no puedo darte más que suposiciones ya que según el tema o los plugins que utilices puede variar el cómo se inserta ese texto del footer.

      Pero te diré algunas posibilidades que supongo:

      – puede ser en «Apariencia > Widgets» y que tengas algún apartado como «Widget footer» o «Footer» a secas o quizá «Pie de página». Una vez ahí localizar un widget de «Texto» o «Html» y que ahí esté el texto que quieres cambiar.

      – También puede ser que si utilizas Polylang, en el menú de éste, en «Traducción de cadenas» buscando un poco encuentres ese texto del footer para traducir.

      – Otra opción sería que lo tengas en alguna opción del menú propia del tema que utilices, algo como «Theme options» o parecido. Y una vez ahí buscar algún apartado que sea «Footer» o «Pie de página».

      – Una opción más que se me ocurre es que ese pie de página esté puesto directamente en el código, en cuyo caso tendrías que tocar los archivos del tema que estés utilizando. Para esto, si tú no manejas código, te diría que busques alguien que te pueda echar una mano.

      Un saludo.

  19. Diego

    Gracias bro!!! te irás al cielo con todo y pc =)

  20. Sara

    Hola como estas, espero que esto aun siga vivo..encontre tu solucion pero aun no la puedo aplicar, tengo el plugin polylang pero algunas palabras sueltas se quedaron sin traducir, entonces aplique la funcion del registro que diste arriba y cuando voy a insertar la funcion pll_() para mostrar la cadena de texto mi sitio se rompe ya que esta metida dentro de un array y solo admite html:

    ». sprintf( esc_html__( ‘You must be %1$slogged in%2$s to post a comment.’, ‘oceanwp’ ), ‘‘, ‘‘ ) .»,
    ‘logged_in_as’ => ». esc_html__( ‘Logged in as’, ‘oceanwp’ ) .’ ‘. $user_identity .’. ‘. esc_html__( ‘Log out »’, ‘oceanwp’ ) .’‘,
    ‘comment_notes_before’ => false,
    ‘comment_notes_after’ => false,
    ‘comment_field’ => »,
    ‘id_submit’ => ‘comment-submit’,
    ‘label_submit’ => esc_html__( ‘Post Comment’, ‘oceanwp’ ),
    )
    ); ?>

    como puedo cambiarle el valor al label_submit en este caso para poder traducir la cadena post comment?

    Gracias de antemano

    • JSoleguia

      ¡Hola, Sara!

      en primer lugar te diría que mires el apartado de «Traducción de cadenas» de Polylang en tu web por si ha reconocido ese literal (‘Post Comment’) y te deja traducirlo directamente.

      Después creo que debiera ser tan sencillo como reemplazar

      ‘label_submit’ => esc_html__( ‘Post Comment’, ‘oceanwp’ ),

      por

      ‘label_submit’ => pll__( ‘Post Comment’ ), // o como hayas llamado a tu literal para traducir

      Atención al doble guión bajo después de pll__ que a mi me ha dado muchos errores por despistado y poner sólo 1 guión bajo _.

      Un saludo.

  21. Ana Laura

    Hola, yo tengo una duda, he puesto el polylang y he tenido complicaciones se me han cruzado los idiomas lo que era en español. Bueno para no contar todo, lo he quitado, y la url se a quedado en .com/ca y el ca no lo puedo sacar y lo que había al abrir con .com no sale… sabrías decirme cual seria la solucion? muchas gracias

    • JSoleguia

      ¡Hola, Ana!

      ¿has revisado la configuración de polylang?

      No lo tengo delante ahora mismo pero si no me equivoco hay una opción para que no se muestre el código de idioma (/es/, /ca/, …) en el idioma principal.
      Si tu idioma principal es español, al cargar tuweb.com/ca te estaría cargando la versión en catalán de la página de inicio.

      Revisa bien que tengas las páginas con sus traducciones creadas, más de una vez me he vuelto loco por no darme cuenta que no había creado una página de traducción.

      Un saludo.

  22. Angels

    Hola Josu!

    A mi Polylang tampoco me ha traducido algunas cadenas, así que apliqué lo que comentas en el post y conseguí introducirlas en functions.php y front-page.php, que es donde se debían ver. Lo que pasa es que entonces entraba a la web y la página de inicio me salía en blanco y tuve que volver a quitar todo lo introducido.

    Sabes cuál puede ser el motivo y alguna solución?

    Muchas gracias!

    • JSoleguia

      Buenos días, Angels

      posiblemente se te colaría algún pequeño error en el código, un punto y coma (;) que faltaba, que el código php no estuviese dentro de las etiquetas y ?>, sin verlo no te puedo decir mucho más.

      En casos así, puedes entrar en el archivo wp-config.php, en la raíz de tu web y asegurarte que el debug está activado (en valor «true»).

      define('WP_DEBUG', true);

      Con eso en lugar de una página en blanco que no te dice nada, te debería salir algún mensaje de error que te ayude a encontrar el fallo.

      Y recuerda después volver a poner el debug a valor «false».

      Un saludo.

  23. José

    Hola!

    Quería saber si estos mismos códigos me servirían para traducir una serie de cadenas de texto de un plugin que muestra mensajes en páginas de WooCommerce, específicamente, en la de productos, cart y checkout.

    Incluí el código en functions.php del tema hijo y aparecen perfectamente para su traducción en Polylang pero no sé si el segundo código funcione para las páginas que te comentaba.

    En caso de que no sea posible, sabrías orientarme con algún código que sí lo permita.

    Agradecido de antemano por tu ayuda.

    • JSoleguia

      Buenas, José

      no te hablo con absoluta certeza, porque hace un tiempo que no trabajo con Polylang ya.

      Pero diría que si en tu tema hijo haces una copia de los archivos correspondientes de la carpeta templates de Woocommerce deberías poder editar lo que quieras incluidas las cadenas a traducir.

      Ahora bien, para el tema de las cadenas de plugins ¿has probado a través de los archivos .po?

      Con algún plugin tipo Loco translate o similar, si se trata de cadenas propias de los plugins deberían estar disponibles para traducir.

      Un saludo.

Comments are closed.