Agregar un filtro a qTranslate para modificar el selector de idioma
Este es un problema que tengo con qTranslate, pero supongo que la solución es más una instrucción sobre cómo funcionan los hooks y filtros de WordPress.
En lugar de usar el widget de qTranslate, estoy usando el hook
<?php echo qtrans_generateLanguageSelectCode('text');?>
para llamar al selector de idiomas en mi cabecera y luego modificar su apariencia en mi CSS. Esto no es problema. Sin embargo, me gustaría agregar un "estilo" a la función Language Select Code para que en lugar de mostrar el texto completo del idioma, que sería "Francais" y "English" en mi caso, muestre solo el código del idioma (EN
y FR
). Lo resolví modificando (y sé que es algo muy malo) qtranslate_widget.php
y agregando un nuevo caso a la función qtrans_generateLanguageSelectCode($style='', $id='')
.
Esto funcionó bien, pero luego actualicé WordPress y tuve que actualizar qTranslate también, por lo que obviamente mi modificación desapareció. Así que en lugar de repetir esa operación, me preguntaba si alguien tiene sugerencias sobre cómo agregar un filtro a la función en mi propio functions.php del tema. Supongo que sería algo como
add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',
pero después de eso me pierdo y no sé lo suficiente sobre filtros. ¡Espero que esto sea lo suficientemente claro!
Cuando actualicé, obviamente perdí mi modificación pero creo que lo siguiente debería funcionar (¡aún no lo he probado!)
case 'code':
foreach(qtrans_getSortedLanguages() as $language) {
$classes = array('lang-'.$language);
if($language == $q_config['language'])
$classes[] = 'active';
echo '<a href="'.qtrans_convertURL($url, $language).'" class="'. implode(' ', $classes) .'"';
// establecer hreflang
echo 'hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
echo '>''.$language.'</a>';
}
break;
Para no hacer este post demasiado largo, lo siguiente es la función existente en el plugin qTranslate:
// Código de selección de idioma para usuarios que no usan widgets
function qtrans_generateLanguageSelectCode($style='', $id='') {
global $q_config;
if($style=='') $style='text';
if(is_bool($style)&&$style) $style='image';
if(is_404()) $url = get_option('home'); else $url = '';
if($id=='') $id = 'qtranslate';
$id .= '-chooser';
switch($style) {
case 'image':
case 'text':
case 'dropdown':
echo '<ul class="qtrans_language_chooser" id="'.$id.'">';
foreach(qtrans_getSortedLanguages() as $language) {
$classes = array('lang-'.$language);
if($language == $q_config['language'])
$classes[] = 'active';
echo '<li class="'. implode(' ', $classes) .'"><a href="'.qtrans_convertURL($url, $language).'"';
// establecer hreflang
echo ' hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
if($style=='image')
echo ' class="qtrans_flag qtrans_flag_'.$language.'"';
echo '><span';
if($style=='image')
echo ' style="display:none"';
echo '>'.$q_config['language_name'][$language].'</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
if($style=='dropdown') {
echo "<script type=\"text/javascript\">\n// <![CDATA[\r\n";
echo "var lc = document.getElementById('".$id."');\n";
echo "var s = document.createElement('select');\n";
echo "s.id = 'qtrans_select_".$id."';\n";
echo "lc.parentNode.insertBefore(s,lc);";
// crear campos dropdown para cada idioma
foreach(qtrans_getSortedLanguages() as $language) {
echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
}
// ocultar texto del selector de idiomas html
echo "s.onchange = function() { document.location.href = this.value;}\n";
echo "lc.style.display='none';\n";
echo "// ]]>\n</script>\n";
}
break;
case 'both':
echo '<ul class="qtrans_language_chooser" id="'.$id.'">';
foreach(qtrans_getSortedLanguages() as $language) {
echo '<li';
if($language == $q_config['language'])
echo ' class="active"';
echo '><a href="'.qtrans_convertURL($url, $language).'"';
echo ' class="qtrans_flag_'.$language.' qtrans_flag_and_text" title="'.$q_config['language_name'][$language].'"';
echo '><span>'.$q_config['language_name'][$language].'</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
break;
}
}

En mi archivo header.php
, donde quiero que aparezca el selector de idiomas de qTranslate, coloqué esto:
<?php echo qtrans_SelectCode('code');?>
Luego, agregué este código a functions.php
. Es un poco redundante ya que repite las opciones integradas de qTranslate (imagen, texto, dropdown) que no estoy usando en mi página, pero quería conservar el código ya que mi filtro está sobrescribiendo la función qtrans_generateLanguageSelectCode
. (¡Si alguien puede descubrir cómo simplemente AGREGAR un estilo sin sobrescribir toda la función, sería genial!)
El estilo que uso se llama 'code' (lo verás cerca del final) y simplemente muestra el código del idioma, por ejemplo: FR
y EN
en mi caso. Podrías crear cualquier salida que desees creando un nuevo estilo:
if( function_exists( 'qtrans_getLanguage' ) )
{
// Filtro de código de selección de idioma de qTranslate
add_filter( 'qtrans_generateLanguageSelectCode', 'qtrans_SelectCode' );
function qtrans_SelectCode( $style = '', $id = '' ) {
global $q_config;
if( $style == '' )
$style = 'text';
if( is_bool( $style ) && $style )
$style = 'image';
if( is_404() )
$url = get_option( 'home' );
else
$url = '';
if( $id == '' )
$id = 'qtranslate';
$id .= '-chooser';
switch( $style ) {
case 'image':
case 'text':
case 'dropdown':
echo '<ul class="qtrans_language_chooser" id="' . $id . '">';
foreach( qtrans_getSortedLanguages() as $language ) {
$classes = array( 'lang-' . $language );
if( $language == $q_config['language'] )
$classes[] = 'active';
echo '<li class="' . implode( ' ', $classes ) . '"><a href="' . qtrans_convertURL( $url, $language ) . '"';
// establecer hreflang
echo ' hreflang="' . $language . '" title="' . $q_config['language_name'][$language] . '"';
if( $style == 'image' )
echo ' class="qtrans_flag qtrans_flag_' . $language . '"';
echo '><span';
if( $style == 'image' )
echo ' style="display:none"';
echo '>' . $q_config['language_name'][$language] . '</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
if( $style == 'dropdown' ) {
echo "<script type=\"text/javascript\">\n// <![CDATA[\r\n";
echo "var lc = document.getElementById('" . $id . "');\n";
echo "var s = document.createElement('select');\n";
echo "s.id = 'qtrans_select_" . $id . "';\n";
echo "lc.parentNode.insertBefore(s,lc);";
// crear campos dropdown para cada idioma
foreach( qtrans_getSortedLanguages() as $language ) {
echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
}
// ocultar el texto del selector de idiomas html
echo "s.onchange = function() { document.location.href = this.value;}\n";
echo "lc.style.display='none';\n";
echo "// ]]>\n</script>\n";
}
break;
case 'both':
echo '<ul class="qtrans_language_chooser" id="' . $id . '">';
foreach( qtrans_getSortedLanguages() as $language ) {
echo '<li';
if( $language == $q_config['language'] )
echo ' class="active"';
echo '><a href="' . qtrans_convertURL( $url, $language ) . '"';
echo ' class="qtrans_flag_' . $language . ' qtrans_flag_and_text" title="' . $q_config['language_name'][$language] . '"';
echo '><span>' . $q_config['language_name'][$language] . '</span></a></li>';
}
echo "</ul><div class=\"qtrans_widget_end\"></div>";
break;
case 'code':
$count = 0;
foreach( qtrans_getSortedLanguages() as $language ) {
if( $count > 0 )
print ' ';
$count++;
if( $language == $q_config['language'] ) {
print '<span class="qtrans_language_chooser active" title="' . $q_config['language_name'][$language] . '">';
print $language;
print '</span>';
}
else {
print '<a href="' . qtrans_convertURL( $url, $language ) . '" class="qtrans_language_chooser"';
print ' hreflang="' . $language . '" title="' . $q_config['language_name'][$language] . '">';
print $language;
print '</a>';
}
}
break;
}
}
}
Es importante encerrar las funciones en:
if(function_exists('qtrans_getLanguage'))
en caso de que el plugin qTranslate falle o lo desactives, de lo contrario tu archivo functions.php
no funcionará correctamente y no podrás acceder a tu sitio.
Lamento haber tardado un poco en responder, no soy desarrollador web de profesión, así que no he tocado esto en algunos meses. Soy completamente autodidacta, por lo que mi terminología puede ser un poco confusa. ¡Pero espero que esto ayude!
