Adăugarea unui filtru în qTranslate pentru a modifica afișarea selectorului de limbă
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;
}
}

Î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!
