web-dev-qa-db-fra.com

Ajout d'un filtre à qTranslate pour changer l'affichage du sélecteur de langue

C'est un problème que j'ai avec qTranslate, mais je suppose que la solution est plus une instruction sur la façon dont fonctionnent les hooks et les filtres Wordpress.

Au lieu d'utiliser le widget qTranslate, j'utilise le hook

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

appeler le sélecteur de langue dans mon en-tête, puis modifier son apparence dans mon CSS. Ce n'est pas un problème. Cependant, je voudrais ajouter un "style" à la fonction de code de sélection de langue afin qu'au lieu d'afficher le texte intégral de la langue, qui serait "français" et "anglais" dans mon cas, le code de langue sera affiché à la place ( EN et FR). Je l'avais compris en changeant (et je sais que c'est une très mauvaise chose à faire) qtranslate_widget.php et en ajoutant un nouveau cas à function qtrans_generateLanguageSelectCode($style='', $id='').

Cela a très bien fonctionné, mais ensuite, j'ai mis à jour Wordpress et je devais également mettre à jour qTranslate. Ma modification a donc disparu. Donc au lieu de refaire cette opération, je me demandais si quelqu'un avait des suggestions sur la manière d'ajouter un filtre à la fonction dans le functions.php de mon propre thème? Je suppose que ce serait quelque chose comme

add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',

mais après cela, je me perds et je ne connais pas suffisamment les filtres. J'espère que c'est assez clair!

Lors de la mise à jour, j’ai évidemment perdu ma modification, mais je pense que la réponse ci-dessous devrait fonctionner (je ne l’ai pas encore testée!)

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

Ne pas faire ce post trop long, mais voici la fonction existante dans le plugin qTranslate:

    // Language Select Code for non-Widget users
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).'"';
                // set 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);";
                // create dropdown fields for each language
                foreach(qtrans_getSortedLanguages() as $language) {
                    echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
                }
                // hide html language chooser text
                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;
    }
}
6
jessica_b

Dans mon header.php, où je veux que le sélecteur de langue qTranslate vive, je mets ceci dans:

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

Ensuite, j'ai ajouté ce code à functions.php. C'est un peu redondant dans la mesure où il répète les options intégrées qTranslate (image, texte, liste déroulante) que je n'utilise pas sur ma page - mais je voulais conserver le code car mon filtre remplace la fonction qtrans_generateLanguageSelectCode. (Si quelqu'un peut trouver comment ajouter simplement un style et ne pas écraser toute la fonction, ce serait génial!)

Le style que j'utilise s'appelle 'code' (vous le verrez près du bas) et ne fournit que le code de langue - c'est-à-dire: FR et EN dans mon cas. Vous pouvez écrire ce que vous voulez en créant un nouveau style:

if( function_exists( 'qtrans_getLanguage' ) )
{
// qTranslate Language Select Code filter

    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 ) . '"';
                    // set 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);";
                    // create dropdown fields for each language
                    foreach( qtrans_getSortedLanguages() as $language ) {
                        echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
                    }
                    // hide html language chooser text
                    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;
        }
    }      
}

Il est important de joindre les fonctions dans:

if(function_exists('qtrans_getLanguage'))

au cas où le plug-in qTranslate s'interrompt ou si vous le désactivez, sinon votre functions.php ne fonctionnera pas correctement et vous ne pourrez pas accéder à votre site!

Désolé d'avoir pris un peu de temps pour revenir, je ne suis pas un développeur web de profession, donc je n'ai pas touché à ça depuis quelques mois. Je suis complètement autodidacte, c'est pourquoi ma terminologie peut être un peu obscure. Mais j'espère que cela aide!

7
jessica_b