Agregar un filtro a qTranslate para modificar el selector de idioma

2 nov 2012, 21:43:46
Vistas: 15K
Votos: 6

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;
    }
}
2
Comentarios

No importa, encontré mi propia solución. Ya casi estaba ahí. Usé add_filter('qtrans_generateLanguageSelectCode','qtrans_SelectCode'); y definí la función function qtrans_SelectCode($style='', $id='') { ... }. Estuve atascado por un tiempo, pero fue solo porque estaba llamando a la función original en el plugin qTranslate en lugar de la función filtrada que creé. También modifiqué el código de mi qtrans_SelectCode de lo que publiqué antes. Si alguien quiere esto, solo comente y lo agregaré!

jessica_b jessica_b
5 nov 2012 22:24:37

Hola Jessica, sí, por favor, publica tu solución como una Respuesta, para que esta Pregunta no permanezca en la lista de Sin responder.

brasofilo brasofilo
6 abr 2013 17:02:27
Todas las respuestas a la pregunta 1
1

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!

7 abr 2013 18:18:18
Comentarios

¡Fantástico, muchas gracias! - Me tomé la libertad de auto-indentar el código para mejor legibilidad. Buen escrito y buen detalle al aconsejar el uso de function_exists ;)

brasofilo brasofilo
8 abr 2013 14:59:57