Advertisement
  1. Code
  2. Theme Development
Code

Traduciendo Tu Tema

by
Difficulty:BeginnerLength:LongLanguages:

Spanish (Español) translation by Eva Collados Pascual (you can also view the original English article)

Es muy fácil hacer la vista gorda respecto a otros idiomas cuando estás desarrollando un tema para WordPress, pero éste es un mal hábito que además aleja todo un mercado de usuarios de WordPress y con ello la pérdida potencial de miles de dólares en beneficios. De los 10 principales países realizando búsquedas en Google sobre "temas para WordPress", sólo uno es angloparlante de forma nativa (los EEUU) y ocupa el puesto número 9 del anterior ranking. En el momento de escribir este artículo, sólo existen 269 temas en la base de datos de WordPress etiquetados como "preparados para traducción" (translation-ready), del total de 1,500 temas existentes. Esto es sólo un 18% de los temas. Te voy a enseñar cómo hacer que tu tema sea uno de ellos.


Cómo Funciona

Normalmente, cuando construyes un tema, simplemente escribes junto con el código el texto que quieres mostrar en front-end del mismo, como el mensaje de error del archivo 404.php, o etiquetas como "comentarios:" o "autor:" De esta forma, aunque el usuario de WordPress sea por ejemplo alemán, estos fragmentos de texto se mostrarán en inglés. La solución a esto es devolver o repetir estas frases usando una de las cuatro funciones de WordPress diseñadas para referenciar el texto correcto ubicado en el archivo de idioma. Una vez tengas los textos a traducir dentro de estas funciones, podrás crear un archivo conteniendo todas las traducciones referenciadas cada vez que el tema se cargue. Existen tres archivos que vamos a usar para las traducciones:

  • .pot (Portable Object Template) – Éste es el archivo que contiene una referencia a cada cadena de texto que aparece en tu tema y que necesita ser traducida. El archivo no contiene ninguna traducción. Es un archivo de texto plano.
  • .po (Portable Object) – Obtenido a partir del archivo .pot, .po contiene todas las referencias de tus cadenas así como sus traducciones a un idioma específico. También se trata de un archivo de texto plano que puede ser editado.
  • .mo (Machine Object) – Es una versión binaria del archivo .po. A través del uso de código de máquina, el archivo se puede usar mucho más rápido que la versión en texto plano alternativa.

Paso 1 Las Cuatro Funciones

Cada una de las cuatro funciones requiere al menos un argumento, que se corresponde con el texto que debe ser traducido. Las funciones son:

  • __() – (dos guiones bajos) La función básica que usarás la mayoría de las veces. Devuelve el texto en el idioma correcto.
  • _e() – Lo mismo que __() excepto que repite el texto en lugar de devolverlo.
  • _n() – Se usa cuando el texto tiene el potencial de estar en plural, así por ejemplo si fueses a mostrar cuantos comentarios se han hecho, podrías querer imprimir en la salida tanto "X comentarios" como "X comentario", dependiendo del número de comentarios que existan.
  • _x() – Útil cuando la traducción de la palabra depende del contexto. "Post" podría querer significar "a post (nombre)" o "to post (verbo)" Es importante que el traductor sepa a lo que te referías para que la traducción sea correcta. _x() se usa principalmente cuando se usan palabras simples.

__() y _e()

Estas son las funciones de traducción más simples que WordPress ofrece. Veamos un ejemplo con cada una de ellas:

Ambas funciones hacen exactamente lo mismo aquí. La frase "this is a post" (esto es una entrada) se revisa confrontándola con el archivo .mo en caso de que éste exista, y devuelve el resultado.  __() y _e() sólo requieren que se les proporcione un argumento, que no es otra cosa que es el texto que queremos traducir. Un segundo argumento opcional está disponible y lo veremos más tarde. La única diferencia entre las dos es que __() necesita aquí de echo. Veamos un ejemplo en el que __() funciona mejor que _e():

En lugar de pasar una cadena a la función the_content(), hemos usado __() de manera que el texto pueda ser traducido. Si hubiésemos usado aquí _e() en su lugar, habrías obtenido la traducción de "Click here to read more" repetida en el documento en lugar de haber sido enviada a the_content() lo que hubiese ocasionado todo tipo de problemas.

_n()

¿Qué pasaría en una situación en la que el texto que debes mostrar pudiese estar potencialmente plural o singular como el ejemplo de "X comentarios" que vimos? En lugar de darle al traductor dos cadenas de texto diferentes, puedes indicar que tienes una pieza de texto que necesita una traducción al singular y al plural. Los dos ejemplos siguientes imprimen en la salida el mismo resultado para el usuario:

_n() requiere tres argumentos. El primero es la versión singular del texto, el segundo la versión en plural, y el tercero es el número al que está haciendo referencia. En este caso, get_comments_number() está encontrando cuantos comentarios hay en el post y después _n() elige el texto apropiado a usar.

_x() & _ex()

Digamos que estás traduciendo un archivo .pot, y llegas a un texto que dice "scroll". ¿Vas a interpretarlo como "una pieza de papel enrollado" o "desliza la página web hacia arriba o hacia abajo"? Puedes añadir algún contexto para describir cómo necesitas que algo sea traducido. Estas funciones te proporcionan la habilidad, a través del requerimiento de un segundo atributo que solicita una breve descripción para explicar la frase o palabra. Observa el ejemplo de abajo: 

El ejemplo te muestra la diferencia entre _x() y _ex(). Es lo mismo e, que _e, para hacer que la función repita la salida en lugar de devolverla. Para ambas, nuestro primer parámetro es el texto que necesitamos traducir, y el segundo es un comentario o nota sobre la traducción del texto para clarificar su significado.

Técnicas Avanzadas

Digamos que el texto que quieres generar es una cadena compuesta de texto con el resultado de una función o el valor de una variable ubicada en algún lugar dentro de la misma. Podrías estar tentado de hacer directamente esto:

Cuando se trata de crear tu archivo .pot, POEdit ignorará lo anterior ya que no quiere usar variables en medio de la sentencia. La razón reside en que POEdit enviará la cadena You have chosen the $color theme al archivo .po, pero cuando se trata de buscar la traducción en el momento en el que se ejecuta el script, buscará la cadena You have chosen the blue theme, la cual no encontrará. Así que, hacemos lo siguiente en su lugar:

El script ahora será capaz de recuperar las traducciones, pero ahora es muy difícil traducirla porque la sentencia se ha roto. Necesitarás atravesar el problema de explicar que estas dos cadenas de texto individuales son parte de una, y que ese "theme" no debería traducirse por "theme" en absoluto.

La solución es usar una única cadena de texto que contiene una sola frase con una sintaxis amigable. Aquí es dónde las funciones printf() o sprintf() nos son útiles. Echemos un vistazo a cómo necesita verse nuestro código:

Esto no sólo soluciona todos los problemas que hemos tenido anteriormente, pero es más ordenado y sólo usa una línea de código. Los argumentos de las funciones printf() o sprintf() son la cadena que debe ser devuelta en la salida, y que contiene al menos una ubicación, en este caso %s (que significa "cadena"), y cualquier otro argumento, son variables que se deben colocar dentro de la cadena inicial. Existen muchos marcadores diferentes que puedes usar dentro de tu cadena y puedes encontrar una lista completa bajo sprintf en el manual de PHP. Date cuenta de que la diferencia entre printf() y sprintf() es similar la existente entre a _e() y __() respectivamente.


Paso 2 Introducción a POEdit

Ahora que has etiquetado con éxito todo tu texto de salida de tu tema, necesitas recopilar esta información en un archivo .pot. POEdit es un programa fantástico que con el que puedes crear tu propio archivo .pot, y además te proporciona una GUI (Interfaz Gráfica de Usuario) sencilla que puedes emplear para crear tus archivos .po y más importante aún, también tus archivos .mo.

Primero, necesitarás descargar POEdit, el cual puedes encontrar aquí tanto para Windows, como para Mac y Linux:
http://www.poedit.net/download.php

Una vez tengas instalado POEdit, podrás crear tu archivo .pot. Para hacerlo, dirígete a File > New Catalog. Se te presentará una ventana de diálogo en la que tendrás que introducir información básica. Lo esencial en la pestaña "Project Info" es el nombre del proyecto y tu idioma/país. También debes introducir lo siguiente en la caja "Plural Forms":

Formas Plurales: nplurals=2; plural=n != 1;

POEdit project info

En la pestaña "paths", introduce la ruta en la cual se encuentran los archivos relativos al destino para guardar el archivo .pot. Por ejemplo, si estás ubicando el archivo .pot en la carpeta raíz del tema, introduce . (punto). Si quieres colocar el aerchivo .pot en la carpeta "language" de la raíz del tema, introduce .. (dos puntos).

POEdit path

Después, necesitas indicarle a POEdit qué palabras clave buscar cuando escanee tus archivos. Introduce lo siguiente:

  • __
  • _e
  • _n:1,2
  • _x:1,2c
  • _ex:1, 2 c

La extensión :1,2 le indica a POEdit que esas palabras clave tiene dos partes. Por defecto, el segundo argumento es el plural, e menos que incluyas la c que significa que el segundo argumento es un comentario.

POEdit keywords

¡Ya estás preparado para empezar! Pulsa "OK" y elige un lugar en el que guardar tu archivo .pot. Recuerda tiene que estar en relación con la ruta que definiste antes. POEdit ahora escaneará tus archivos y encontrará todas las ocurrencias de tus funciones de traducción y las guardará sin traducir en tu archivo .pot. Si quieres proporcionar la ayuda mínima para las traducciones internacionales puedes enviar tu archivo .pot con tu tema y dejarlo aquí, en cualquier caso, si eres capaz de traducir tu tema a otro idioma por ti mismo, podrías enviar el tema con la traducción ya realizada tal y como describimos en el paso 3.


Paso 3 Traducir y Crear Tu Archivo .po

POEdit translating singular
  1. Un listado de todas las cadenas de texto a traducir
  2. La cadena actual que queremos traducir
  3. Tu traducción de la cadena
POEdit translating plural
  1. El singular y el plural de la actual cadena
  2. Pestañas para alternar entre el singular y el plural de tu traducción.
  3. Tu traducción

Una vez hayas traducido todas las cadenas en el archivo .pot, podrás guardarlo como tu archivo .po. Cualquier cadena para la que no hayas proporcionado una traducción se mostrará con el idioma original cuando alguien vea tu tema.

El nombre de tu archivo .po es clave. Gettext emplea el estándar ISO 639 para las abreviaturas de los idiomas y la ISO 3166 para los locales. Si tu traducción está escrita en inglés americano, por ejemplo, el nombre de tu archivo sería en-US.po. El uso de mayúsculas es muy importante aquí. Para ver la lista completa de idiomas y códigos de país, visita estos dos enlaces:

Una vez hayas guardado, POEdit de forma predeterminada y automática creará una archivo .mo junto con tu archivo .po. Es recomendable que incluyas los tres archivos de tus traducciones con tu tema de forma que la gente pueda crear sus propias traducciones y editar las existentes fácilmente.


Paso 4 Configurar WordPress

Recapitulemos lo que has hecho hasta ahora. Le has indicado a WordPress todo el texto que quieres que sea traducido, después has usado POEdit para recoger cada cadena y colocarla en un archivo .pot, el cual podrá ser traducido a dos archivos, a saber, .po y .mo. Estos archivos se incluyen con los propios del tema. El paso final es comprimir tu tema en formato zip, instalarlo y dejar que WordPress descubra que archivo .mo quieres usar. Este es un procedimiento bastante claro en el que accedes a tu archivo wp-config.php que se encuentra en la carpeta raíz de tu WordPress. 

Tu archivo debería contener ya define('WPLANG', ''); pero si no es así, puedes añadirlo tú mismo. Simplemente necesitas añadir tu idioma y código local en define. Si fueses a traducir tu tema a alemán, tendrías lo siguiente:

¡Tu internacionalización está completa! Recuerda incluir tu archivo .pot con el tema, y si eres capaz de traducirlo a otra lengua, incluye también los archivos .po y .mo.

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.