Aggiungere un filtro a qTranslate per modificare la visualizzazione del selettore lingua
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;
}
}

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!
