Si desea conocer la forma de registrar textos para traducción que estén embebidos en Temas y plugines, puede consultar el artículo Localización de Temas y plugines. Por el contrario, si desea conocer cómo registrar opciones de traducción, puede utilizar un archivo de configuración de idioma.



El texto siguiente está referido a todos los otros textos de entrada que son almacenados en la base de datos por Temas y plugines. Nota: si su Tema o plugin crea elementos que son apropiados para ser traducidos en grupo (como, por ejemplo, los existentes en un formulario), consulte el Paquete de traducción de cadenas.



Comenzaremos con un ejemplo.



Usted ha creado un widget personalizado que contiene un campo de ingreso en el título y otras opciones más. Puede registrar el título del widget para ser traducido por medio de ‘apply_filters’, pero también puede querer registrar los textos de entrada que se puedan guardar provenientes de todos los otros campos de opciones.



Si todos los textos están embebidos en el código de widget y plugines, pueden ser localizados por medio de la llamada gettext (el archivo .mo de plugin). La pregunta es: ¿cómo se administran los textos ingresados por los usuarios?

Traducción de cadenas en WPML


WPML incluye un módulo de traducción de cadenas que permite la traducción de este tipo de textos. Por defecto, ayuda a los usuarios a traducir el título del blog, la línea de texto, los textos de widgets y otros textos generados por WordPress. Otros plugines y Temas pueden aprovechar también este mecanismo para proporcionar la traducción de los textos que sea necesario mostrar.

1. Registrar las cadenas que deben ser traducidas


Cada vez que el usuario genera cadenas nuevas o actualiza las existentes, estas necesitan ser registradas en la tabla de cadenas de WPML. Para realizar esto debe utilizarse la llamada:

icl_register_string ( string $context, string $name, string $value );



  • $context


    • (cadena) (obligatorio) El nombre del plugin en un formato legible para el ser humano.



  • $name


    • (cadena) (obligatorio) El nombre de la cadena que ayuda al traductor a comprender lo que está traduciendo.



  • $value


    • (cadena) (obligatoria) La cadena que debe ser traducida.




En nuestro ejemplo de widget personalizado, debemos hacer una llamada a ‘icl_register_string()‘ cada vez que las opciones del widget sean guardadas o actualizadas. Esto se realiza desde dentro de la función de “actualización de nuestro widget personalizado.



Este es un ejemplo de cómo lucirá. Nuestro widget personalizado tiene un título, un campo de entrada para una línea única y un área de texto.

function update($new_instance, $old_instance){

$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['custom_input'] = strip_tags($new_instance['custom_input']);
$instance['custom_textarea'] = $new_instance['custom_textarea'];

//WMPL
/**
* register strings for translation
*/
if (function_exists ( 'icl_register_string' )){
icl_register_string('Widgets', 'Custom Widget - input field', $instance['custom_input']);
icl_register_string('Widgets', 'Custom Widget - textarea field', $instance['custom_textarea']);
}
//WMPL


return $instance;
}


Esto le indica a WPML que tanto el texto del usuario para el campo de entrada como el área de texto deben ser traducidos. Dichas cadenas serán registradas en el contexto “Widgets”, con los nombres “Custom Widget – input field” y “Custom Widget – textarea field” respectivamente.



Importante: si ya no es necesaria la traducción de ciertos textos del plugin (por ejemplo: si el usuario ha borrado el plugin), la cadena puede ser eliminada de la tabla de traducción por medio de la llamada siguiente:

icl_unregister_string ( string $context, string $name );


2. Utilizar la traducción al mostrar el texto


Cuando el widget es presentado en pantalla, necesita utilizar las traducciones. Para obtenerlas, aprovecha la función icl_translate:

icl_translate ( string $context, string $name, string $value );


WPML busca la cadena que corresponda a $context y $name. Si la encuentra, busca la traducción para el idioma actual (el idioma que muestra el sitio). Si la traducción existe, la retraerá. Si no existe, entregará la cadena original.



El argumento $value es enviado en la llamada ‘icl_translate()‘ de forma tal que, en caso que WPML no hubiere estado activo al momento de la creación de la cadena y, por tanto, no estuviere registrada, devuelva la cadena normal.



Una vez más, en nuestro ejemplo de widget personalizado, deberemos hacer una llamada a ‘icl_translate()‘ en la función de salida.



Este es un ejemplo de cómo lucirá. Adviértase que el título del widget se procesa a través de apply_filters.

function widget($args, $instance){

        extract($args);
        $title               = apply_filters('widget_title', $instance['title'] );
        $custom_input        = $instance['custom_input'];
        $custom_textarea     = $instance['custom_textarea'];
        
        # Before the widget
        echo $before_widget;

        # The title
        if ( $title )
        echo $before_title . $title . $after_title;

        # Output
        //WMPL
        /**
         * retreive translations
         */
        if (function_exists ( 'icl_translate' )){
            $custom_input    = icl_translate('Widgets', 'Custom Widget - input field', $instance['custom_input']);
            $custom_textarea = icl_translate('Widgets', 'Custom Widget - textarea field', $instance['custom_textarea']);
        }
        //WMPL
        
        
        ?>
        <ul class="a_custom_widget clearfix">
            <li>
                <span><?php echo $custom_input;?></span>
                <p>
                    <?php echo $custom_textarea;?>
                </p>
            </li>
        </ul>
    
        <?php
        # After the widget
        echo $after_widget;
    }


La forma en que WPML maneja internamente la traducción de cadenas


WPML incluye una interfaz de traducción que muestra las cadenas y permite la administración de su traducción.



Interfaz de traducción de cadenas de WPML
Interfaz de traducción de cadenas de WPML




Cuando el usuario hace “clic” en traducciones de una cadena, se despliega un panel de traducción multilingüe el cual permite editar las traducciones por idioma. Cada traducción incluye una indicación completa. Si las traducciones de todos los idiomas están completas, la cadena misma se muestra como completa.



Cuando la cadena es modificada, todas sus traducciones son marcadas como incompletas para que el usuario sea advertido de revisar todas las traducciones.



Toda la edición de cadenas es realizada con la misma interfaz de administración de WordPress y no necesita de ninguna llamada adicional a servicios externos.

Cómo integrar la traducción de cadenas de WPML con plugines y Temas


Al integrar la traducción de cadenas al plugin o al Tema, es importante asegurarse que la llamada exista.



Las llamadas a las funciones de traducción de cadenas de WPML deben ser hechas por medio de la función if_function_exists(). De esta forma, si se activa WPML, la llamada se ejecutará. En caso contrario, se mantendrá la operativa normal.



Adicionalmente, los desarrolladores del plugin deberán considerar la posibilidad que WPML sea activado mucho después que el usuario comience a utilizar su plugin, en cuyo caso la llamada icl_register_string no se efectuó cuando se crearon las cadenas nuevas, por lo que nunca serán traducidas. Para solucionar este problema, es una buena medida registrar todas las cadenas del usuario cada vez que la pantalla de administración del plugin sea cargada.



Esto adicionará un tiempo de ejecución despreciable pero garantizará que todas las cadenas estén siendo enviadas a traducción siempre y se mantengan actualizadas. El código puede verificar una vez que la función icl_register_string exista y llamarla para registrar todas las cadenas que el usuario ingrese.



Si la función es llamada con valores en blanco o NULL, WPML la ignora. Si la cadena ya existe y no ha sido modificada, la llamada también se ignora. Solo se ejecuta ante cadenas nuevas o modificadas ya registradas.



La tabla de traducción completa se mantiene en la memoria caché, por lo que las llamadas repetidas no hacen perder capacidad al procesador.

Qué necesita ser enviado a traducción


Comencemos por lo que no necesita ser registrado por medio de icl_register().



WPML utiliza diferentes entradas, páginas, etiquetas y categorías para distintos idiomas. Ello implica que si el sitio contiene estas dos páginas “example.com/about/” y “example.com/es/sobre/“, deberían ser páginas diferentes de WordPress.



Cada texto que sea agregado por página debería aparecer en múltiples idiomas; el usuario solo debería ingresar el texto correcto para el idioma en que está escrita la página.



Lo que debe ser traducido utilizando la función de traducción de cadenas de WPML son textos que no están relacionados a ninguna entrada, página, etiqueta o categoría Por ejemplo, los plugines SEO permiten el ingreso de textos para el título de la página principal, palabras clave y descripción. Estos textos necesitan ser traducidos utilizando la función de traducción de textos de WPML. De esta manera, los textos se mostrarán traducidos para páginas principales diferentes.

4 respuestas para “Traducción de textos de entrada de plugines y Temas”

  1. Estoy realizando unas pruebas en WP con el plugin de ustedes y funciona bien, solo que tengo una pregunta, En mi sitio esta la pagina Home, pero al seleccionar el idioma Español, me muestra Home (Titulo) con el contenido de español pero los titulos se mantienen en Ingles y las demas paginas en Español.

    Que necesito hacer para que dependiendo del idioma seleccionado me muestre el home traducido? o a caso el plugin solo se puede utilizar en Paginas y Entradas?

    De antemano muchas gracias por su apoyo.

    Saludos,