Aggiungere un filtro a qTranslate per modificare la visualizzazione del selettore lingua

2 nov 2012, 21:43:46
Visualizzazioni: 15K
Voti: 6

Sto riscontrando un problema con qTranslate, ma credo che la soluzione sia più una questione di comprensione degli hook e dei filtri di WordPress.

Invece di usare il widget di qTranslate, sto usando l'hook

<?php echo qtrans_generateLanguageSelectCode('text');?>

per richiamare il selettore lingua nell'header e poi modifico il suo aspetto tramite CSS. Questo non è un problema. Tuttavia, vorrei aggiungere uno "style" alla funzione Language Select Code in modo che invece di visualizzare il testo completo della lingua (nel mio caso "Francais" e "English"), mostri solo il codice lingua (EN e FR). Avevo risolto modificando (so che è una pessima pratica) qtranslate_widget.php aggiungendo un nuovo case alla funzione qtrans_generateLanguageSelectCode($style='', $id='').

Funzionava perfettamente, ma poi ho aggiornato WordPress e di conseguenza anche qTranslate, perdendo così la mia modifica. Invece di ripetere l'operazione, mi chiedevo se qualcuno avesse suggerimenti su come aggiungere un filtro alla funzione nel mio functions.php del tema. Immagino sarebbe qualcosa tipo:

add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',

ma da qui mi perdo perché non conosco abbastanza i filtri. Spero sia chiaro!

Dopo l'aggiornamento ho perso la modifica, ma credo che quanto segue dovrebbe funzionare (non l'ho ancora testato!):

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) .'"';
            // imposta hreflang
            echo 'hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
            echo '>''.$language.'</a>';
         }
break;

Per non rendere questo post troppo lungo, ecco la funzione esistente nel plugin qTranslate:

    // Codice selezione lingua per chi non usa widget
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).'"';
                // imposta 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);";
                // crea campi dropdown per ogni lingua
                foreach(qtrans_getSortedLanguages() as $language) {
                    echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
                }
                // nasconde il testo del selettore lingua 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
Commenti

Non importa, ho trovato la mia soluzione. Ci ero quasi. Ho usato add_filter('qtrans_generateLanguageSelectCode','qtrans_SelectCode'); e ho definito la funzione function qtrans_SelectCode($style='', $id='') { ... }. Sono rimasto bloccato per un po', ma solo perché stavo chiamando la funzione originale nel plugin qTranslate invece di quella filtrata che ho creato. Ho anche modificato il codice per il mio qtrans_SelectCode rispetto a quello che avevo postato prima. Se qualcuno lo vuole, basta commentare e lo aggiungerò!

jessica_b jessica_b
5 nov 2012 22:24:37

Ciao Jessica, sì, per favore, posta la tua soluzione come Risposta, così questa Domanda non rimarrà nella lista Senza risposta.

brasofilo brasofilo
6 apr 2013 17:02:27
Tutte le risposte alla domanda 1
1

Nel mio header.php, dove voglio che risieda il selettore della lingua qTranslate, ho inserito questo:

<?php echo qtrans_SelectCode('code');?>

Poi, ho aggiunto questo codice a functions.php. È un po' ridondante in quanto ripete le opzioni integrate di qTranslate (immagine, testo, dropdown) che non sto utilizzando nella mia pagina - ma ho voluto mantenere il codice poiché il mio filtro sta sovrascrivendo la funzione qtrans_generateLanguageSelectCode. (Se qualcuno riesce a capire come aggiungere semplicemente uno stile senza sovrascrivere l'intera funzione, sarebbe fantastico!)

Lo stile che utilizzo si chiama 'code' (lo vedrai in fondo) e restituisce semplicemente il codice della lingua - ad esempio: FR e EN nel mio caso. Puoi creare qualsiasi output desideri definendo un nuovo stile:

if( function_exists( 'qtrans_getLanguage' ) )
{
// Filtro per il codice di selezione della lingua 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 ) . '"';
                    // imposta 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);";
                    // crea campi dropdown per ogni lingua
                    foreach( qtrans_getSortedLanguages() as $language ) {
                        echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
                    }
                    // nasconde il testo del selettore lingua 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;
        }
    }      
}

È importante racchiudere le funzioni in:

if(function_exists('qtrans_getLanguage'))

nel caso in cui il plugin qTranslate si rompa o venga disattivato, altrimenti il tuo functions.php non funzionerà correttamente e non potrai accedere al tuo sito!

Scusa se ho impiegato un po' a rispondere, non sono uno sviluppatore web di professione quindi non ho toccato questa roba da alcuni mesi. Sono completamente autodidatta, ecco perché la mia terminologia potrebbe essere un po' confusa. Ma spero che questo aiuti!

7 apr 2013 18:18:18
Commenti

Fantastico, grazie mille! - Mi sono permesso di indentare automaticamente il codice per una migliore leggibilità. Buona spiegazione e bel tocco nel consigliare l'uso di function_exists ;)

brasofilo brasofilo
8 apr 2013 14:59:57