Добавление фильтра в qTranslate для изменения отображения средства выбора языка
Это проблема, с которой я сталкиваюсь с qTranslate, но я полагаю, что решение больше похоже на инструкцию о том, как работают крючки и фильтры Wordpress.
Вместо того, чтобы использовать виджет qTranslate, я использую крючок
<?php echo qtrans_generateLanguageSelectCode('text');?>
Чтобы вызвать средство выбора языка в моем заголовке, а затем изменить его внешний вид в моем CSS. Это не проблема. Тем не менее, я хотел бы добавить "стиль" в функцию выбора кода языка, чтобы вместо отображения полного языка текст, который в моем случае будет "французский" и "английский", вместо этого будет отображаться только код языка (EN
и FR
). Я понял это, изменив (и я знаю, что это очень плохо) qtranslate_widget.php
и добавив новый случай в функцию qtrans_generateLanguageSelectCode($style='', $id='')
.
Это сработало отлично, но затем я обновил Wordpress, и мне также пришлось обновить qTranslate, так что, очевидно, моя модификация исчезла. Поэтому вместо того, чтобы повторять эту операцию, мне было интересно, есть ли у кого-нибудь какие-либо предложения о том, как добавить фильтр в функция в моей собственной теме functions.php? Я полагаю, что это будет что-то вроде
add_filter('qtrans_generateLanguageSelectCode', 'qtrans_myLanguageSelectcode',
Но после этого я теряюсь и недостаточно разбираюсь в фильтрах. Я надеюсь, что это достаточно ясно!
Когда я обновился, я, очевидно, потерял свою модификацию, но я думаю, что ниже приведено то, что должно работать (я еще не тестировал это!)
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;
Не хочу делать этот пост слишком длинным, но следующая существующая функция в плагине 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;
}
}
1 answers
В моем header.php
, где я хочу, чтобы жил qTranslate, выбирающий язык, я вставил это:
<?php echo qtrans_SelectCode('code');?>
Затем я добавил этот код в functions.php
. Это немного избыточно, поскольку оно повторяет встроенные параметры qTranslate (изображение, текст, выпадающий список), которые я не использую на своей странице, но я хотел сохранить код, так как мой фильтр перезаписывает функцию qtrans_generateLanguageSelectCode
. (Если кто-нибудь сможет понять, как просто ДОБАВИТЬ стиль и не перезаписывать всю функцию, это было бы потрясающе!)
Стиль то, что я использую, называется "код" (вы увидите его внизу) и просто выводит код языка - т.Е.: FR
и EN
в моем случае. Вы можете написать любой вывод, который захотите, создав новый стиль:
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;
}
}
}
Важно заключать функции в:
if(function_exists('qtrans_getLanguage'))
В случае, если плагин qTranslate сломается или вы его деактивируете, в противном случае ваш functions.php
не будет работать должным образом, и вы не сможете попасть на свой сайт!
Извините, что мне потребовалось некоторое время, чтобы вернуться, я не веб разработчик по профессии, так что я не прикасался к этому материалу уже несколько месяцев. Я полностью самоучка, поэтому моя терминология может быть немного неясной. Но я надеюсь, что это поможет!