Intercambiador de idiomas personalizable
WPML viene provisto con su propio intercambiador de idiomas, implementado como una lista desplegable de idiomas. Es bastante flexible aunque no siempre sea suficiente.
Puede construir sus propios intercambiadores de idioma personalizados e incluirlos en el Tema. Le mostraremos cómo agregar una lista de idiomas disponibles para entradas y una lista de idiomas para el pie.
Adquirir la lista de (otros) idiomas
Utilice la función icl_get_languages() para obtener la lista de traducciones para una página. Sintaxis:
icl_get_languages('skip_missing=N')
* N=0/1
El parámetro skip_missing le indica a la función cómo tratar a los idiomas para los cuales no hay traducciones. Volveremos sobre ello enseguida.
La función devuelve una colección de entradas por idioma. Por ejemplo, para un sitio WordPress que utiliza inglés, francés e italiano devolverá:
Array ( [0] => Array ( [active] => 1 [native_name] => English [translated_name] => English [language_code] => en [country_flag_url] => http://yourdomain/wpmlpath/res/flags/en.png [url] => http://yourdomain/about ) [1] => Array ( [active] => 0 [native_name] => Français [translated_name] => French [language_code] => fr [country_flag_url] => http://yourdomain/wpmlpath/res/flags/fr.png [url] => http://yourdomain/fr/a-propos ) [2] => Array ( [active] => 0 [native_name] => Italiano [translated_name] => Italian [language_code] => it [country_flag_url] => http://yourdomain/wpmlpath/res/flags/it.png [url] => http://yourdomain/it/circa ) )
Cada idioma tiene su propia colección de parámetros, la cual puede ser utilizada por la función de Tema para construir cualquier selector de idiomas.
- active: hace referencia al idioma activo (solo un idioma por vez está activo).
- native_name: refiere a la designación nativa del idioma (nunca se traduce).
- translated_name: indica el nombre del idioma traducido al idioma activo.
- country_flag_url: es la dirección URL de una imagen PNG que representa la bandera del país.
- url: es el enlace a la traducción en ese idioma.
Administración de traducciones sin equivalencia
Algunas páginas no pueden ser traducidas a todos los idiomas. Puede indicarle a la función icl_get_languages qué devolver ante idiomas sin traducción.
Si ‘skip_missing=1′, esos idiomas no aparecerán en la vista. Si ‘skip_missing=0′, todos los idiomas se mostrarán y aquellos idiomas sin equivalencia serán direccionados a la página de inicio de ese mismo idioma.
Cómo utilizar las funciones del Tema
Puede construir su propio intercambiador de idioma en la forma que considere apropiada. Aquí le mostraremos dos formas populares de hacerlo.
Las funciones PHP de ejemplo que mostramos aquí deberían ir en el archivo functions.php (en la carpeta del Tema) y no agregadas al plugin.
Esta entrada está disponible también en…
Supongamos que deseara agregar una línea, al final o comienzo de cada entrada, indicando los idiomas para los cuales hay traducción. Esta función debería retornar solamente entradas traducidas existentes y, si no hubiere ninguna disponible, no debería mostrar nada.
function icl_post_languages(){
$languages = icl_get_languages('skip_missing=1');
if(1 < count($languages)){
echo __('This post is also available in: ');
foreach($languages as $l){
if(!$l['active']) $langs[] = '<a href="'.$l['url'].'">'.$l['translated_name'].'</a>';
}
echo join(', ', $langs);
}
}
Lo que hace esta función es:
- Obtener la lista de idiomas de WPML – $languages = icl_get_languages(‘skip_missing=1′);
- Verificar que existe más de un idioma para la entrada if(1 < count($languages))
- Generar la salida salteando el idioma actual – if(!$l['active'])
Notas:
- El mensaje pasa por gettext. Esto es muy importante dado que el mensaje, que se agrega a diferentes entradas en diferentes idiomas, aparecerá en el idioma correcto: __(‘Esta entrada está también disponible en: ‘);
- El nombre de idioma utilizado es el traducido. Esto asegura que la oración completa está escrita en el idioma correcto: $l['translated_name']
El resultado es este:
Mensaje referido a la entrada disponible en otros idiomas
Para incluir este mensaje en las entradas, agregue una llamada a la función icl_post_languages() desde el archivo single.php.
Lista de nombres de idioma y sus banderas para el pie
Aún cuando disponga de un selector de idioma el principio de la página, es una buena idea tener una lista de nombres de idiomas y sus banderas al pie. Muchas personas navegan automáticamente al final de la página para tener una noción primaria de lo que hay en ella, por lo que disponer de un selector de idiomas ahí es útil para los visitantes.
function languages_list_footer(){
$languages = icl_get_languages('skip_missing=0');
if(!empty($languages)){
echo '<div id="footer_language_list"><ul>';
foreach($languages as $l){
echo '<li>';
if($l['country_flag_url']){
if(!$l['active']) echo '<a href="'.$l['url'].'">';
echo '<img src="'.$l['country_flag_url'].'" height="12" alt="'.$l['language_code'].'" width="18" />';
if(!$l['active']) echo '</a>';
}
if(!$l['active']) echo '<a href="'.$l['url'].'">';
echo icl_disp_language($l['native_name'], $l['translated_name']);
if(!$l['active']) echo '</a>';
echo '</li>';
}
echo '</ul></div>';
}
}
Esta función realiza lo siguiente:
- Si existe alguna traducción, genera un DIV y comienza una lista sin orden: if(!empty($languages)){ echo ‘<div id="footer_language_list"><ul>’;
- Verifica todos los idiomas y los agrega como opción de la lista.
- Si no es el idioma activo, lo enlaza a la página de ese mismo idioma: if(!$l['active']) echo ‘<a href="’.$l['url'].’">’;
- Agrega la bandera correspondiente: <img src="’.$l['country_flag_url'].’" alt="’.$l['language_code'].’" width="18" height="12" />
- Adiciona ambos nombres de idioma, el nativo y el traducido, si son distintos: echo icl_disp_language($l['native_name'], $l['translated_name']);
WPML genera la función icl_disp_language(). Su objetivo es verificar si los dos argumentos (native_language_name, translated_language_name) son distintos. Si lo son, devuelve ambos. En otro caso, devuelve solamente uno.
Asimismo, deberíamos agregar algún código CSS par dar forma a esta lista de idiomas. Dicho código centrará la lista de idiomas en el pie de página y le dará cierta forma:
#footer_language_list{
margin-bottom: 25px;
text-align: center;
}
#footer_language_list ul{
list-style: none;
margin:0;
padding:0;
}
#footer_language_list ul li img{
margin-right:5px;
}
#footer_language_list ul li{
display:inline;
margin:0 5px 0 5px;
padding:0;
}
#footer_language_list ul li a, #footer_language_list ul li a:visited{
color: #fff;
text-decoration:underline;
}
#footer_language_list ul li a:hover, #footer_language_list ul li a:active{
color: #fff;
}
He aquí el intercambiador de idiomas:
Pie de idiomas
Para agregarlo al Tema, incluya la llamada a languages_list_footer en el archivo footer.php.
* Nota: puede permutar fácilmente entre un intercambiador de idioma horizontal y un intercambiador de idioma vertical. Simplemente elimine la instrucción display: inline de CSS.
Hola. ¿qué idiomas soporta o podría instalar?.
Saludos
Juan
Hola, cuando se utiliza un link de categoría en un menú, no aparecen los links de las traducciones para cada idioma…creo que esto es un bug, hay alguna solución?
Gracias