Adăugarea unui filtru în qTranslate pentru a modifica afișarea selectorului de limbă

2 nov. 2012, 21:43:46
Vizualizări: 15K
Voturi: 6

Aceasta este o problemă pe care o am cu qTranslate, dar presupun că soluția este mai mult o instrucțiune despre cum funcționează hook-urile și filtrele în WordPress.

În loc să folosesc widget-ul qTranslate, utilizez hook-ul

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

pentru a afișa selectorul de limbă în header-ul meu și apoi îi modific aspectul în CSS. Nu este nicio problemă. Totuși, aș dori să adaug un "stil" la funcția Language Select Code, astfel încât în loc să afișeze numele complet al limbii, care în cazul meu ar fi "Francais" și "English", să afișeze doar codul limbii (EN și FR). Am rezolvat asta modificând (și știu că nu este corect) qtranslate_widget.php și adăugând un nou caz în funcția qtrans_generateLanguageSelectCode($style='', $id='').

A funcționat perfect, dar apoi am actualizat WordPress și a trebuit să actualizez și qTranslate, așa că evident modificarea mea a dispărut. Deci, în loc să repet operațiunea, mă întrebam dacă cineva are sugestii pentru cum să adaug un filtru la funcție în functions.php al temei mele? Cred că ar fi ceva de genul

add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',

dar după aceea mă pierd și nu știu suficient despre filtre. Sper că este destul de clar!

Când am actualizat, evident am pierdut modificarea, dar cred că următorul cod ar trebui să funcționeze (nu l-am testat încă!)

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

Ca să nu lungesc postarea, următoarea este funcția existentă în plugin-ul qTranslate:

    // Codul pentru Selectorul de Limbă pentru utilizatorii non-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).'"';
                // setează 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);";
                // creează câmpuri dropdown pentru fiecare limbă
                foreach(qtrans_getSortedLanguages() as $language) {
                    echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
                }
                // ascunde textul selectorului de limbă 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
Comentarii

Nu-i nimic, am găsit singură soluția. Eram aproape acolo. Am folosit add_filter('qtrans_generateLanguageSelectCode','qtrans_SelectCode'); și am definit funcția function qtrans_SelectCode($style='', $id='') { ... }. Am fost blocată pentru o vreme, dar doar pentru că apelam funcția originală din pluginul qTranslate în loc de cea filtrată pe care am creat-o. De asemenea, am modificat codul pentru qtrans_SelectCode față de ceea ce am postat înainte. Dacă cineva dorește asta, doar comentează și voi adăuga!

jessica_b jessica_b
5 nov. 2012 22:24:37

Bună Jessica, da, te rog, postează soluția ta ca Răspuns, astfel încât această Întrebare să nu rămână în lista Fără răspuns.

brasofilo brasofilo
6 apr. 2013 17:02:27
Toate răspunsurile la întrebare 1
1

În fișierul meu header.php, unde doresc să afișez selectorul de limbă qTranslate, am introdus următorul cod:

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

Apoi, am adăugat acest cod în functions.php. Este puțin redundant deoarece repetă opțiunile predefinite ale qTranslate (imagine, text, meniu derulant) pe care nu le folosesc pe pagina mea - dar am vrut să păstrez codul deoarece filtrul meu suprascrie funcția qtrans_generateLanguageSelectCode. (Dacă cineva poate descoperi cum să adauge doar un stil fără a suprascrie întreaga funcție, ar fi minunat!)

Stilul pe care îl folosesc se numește 'code' (îl veți vedea mai jos) și afișează doar codul limbii - de exemplu: FR și EN în cazul meu. Puteți crea orice alt tip de afișaj dorit prin definirea unui nou stil:

if( function_exists( 'qtrans_getLanguage' ) )
{
// Filtru pentru codul de selecție a limbii în 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 ) . '"';
                    // setează 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);";
                    // creează câmpuri derulante pentru fiecare limbă
                    foreach( qtrans_getSortedLanguages() as $language ) {
                        echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
                    }
                    // ascunde textul selectorului de limbă 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;
        }
    }      
}

Este important să încadrați funcțiile în:

if(function_exists('qtrans_getLanguage'))

în cazul în care pluginul qTranslate se defectează sau îl dezactivați, altfel functions.php nu va funcționa corespunzător și nu veți putea accesa site-ul!

Îmi cer scuze că am întârziat să răspund, nu sunt dezvoltator web de profesie, așa că nu am mai lucrat la acest proiect de câteva luni. Sunt complet autodidact, motiv pentru care terminologia mea poate fi puțin neclară. Dar sper că acest lucru vă este de ajutor!

7 apr. 2013 18:18:18
Comentarii

Fantastic, mulțumesc mult! - Mi-am permis să indentez automat codul pentru lizibilitate. Descriere bună și un detaliu frumos de a recomanda folosirea function_exists ;)

brasofilo brasofilo
8 apr. 2013 14:59:57