Добавление фильтра в qTranslate для изменения отображения выбора языка

2 нояб. 2012 г., 21:43:46
Просмотры: 15K
Голосов: 6

У меня возникла проблема с qTranslate, но решение скорее связано с пониманием работы хуков и фильтров в WordPress.

Вместо использования виджета qTranslate я использую хук:

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

для вызова переключателя языков в шапке сайта и затем изменяю его внешний вид через CSS. Это не проблема. Однако я хочу добавить "стиль" в функцию Language Select Code, чтобы вместо полного названия языка ("Francais" и "English" в моем случае) отображался только код языка (EN и FR). Я нашел решение, изменив (и я понимаю, что это плохая практика) файл qtranslate_widget.php, добавив новый case в функцию 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) .'"';
            // устанавливаем hreflang
            echo 'hreflang="'.$language.'" title="'.$q_config['language_name'][$language].'"';
            echo '>''.$language.'</a>';
         }
break;

Чтобы не делать пост слишком длинным, вот оригинальная функция из плагина qTranslate:

    // Код выбора языка для тех, кто не использует виджеты
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).'"';
                // устанавливаем 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);";
                // создаем выпадающие элементы для каждого языка
                foreach(qtrans_getSortedLanguages() as $language) {
                    echo qtrans_insertDropDownElement($language, qtrans_convertURL($url, $language), $id);
                }
                // скрываем текстовый переключатель языков
                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
Комментарии

Неважно, я нашёл собственное решение. Я был почти у цели. Я использовал add_filter('qtrans_generateLanguageSelectCode','qtrans_SelectCode'); и определил функцию function qtrans_SelectCode($style='', $id='') { ... }. Я застрял на некоторое время, но это было лишь потому, что я вызывал оригинальную функцию в плагине qTranslate вместо отфильтрованной, которую создал. Я также изменил код для моей qtrans_SelectCode по сравнению с тем, что публиковал ранее. Если кому-то это нужно, просто оставьте комментарий, и я добавлю его!

jessica_b jessica_b
5 нояб. 2012 г. 22:24:37

Привет, Джессика, да, пожалуйста, опубликуй своё решение в качестве Ответа, чтобы этот Вопрос не оставался в списке Без ответов.

brasofilo brasofilo
6 апр. 2013 г. 17:02:27
Все ответы на вопрос 1
1

В моем файле header.php, где я хочу разместить переключатель языков qTranslate, я добавил это:

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

Затем я добавил этот код в functions.php. Он немного избыточен, так как повторяет встроенные варианты qTranslate (изображение, текст, выпадающий список), которые я не использую на своей странице — но я хотел сохранить код, поскольку мой фильтр переопределяет функцию qtrans_generateLanguageSelectCode. (Если кто-то сможет придумать, как просто ДОБАВИТЬ стиль, не переопределяя всю функцию, это было бы здорово!)

Стиль, который я использую, называется 'code' (вы увидите его ближе к концу) и просто выводит код языка — например, FR и EN в моем случае. Вы можете создать любой вывод, который захотите, добавив новый стиль:

if( function_exists( 'qtrans_getLanguage' ) )
{
// Фильтр кода выбора языка 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 ) . '"';
                    // установка 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);";
                    // создание элементов выпадающего списка для каждого языка
                    foreach( qtrans_getSortedLanguages() as $language ) {
                        echo qtrans_insertDropDownElement( $language, qtrans_convertURL( $url, $language ), $id );
                    }
                    // скрытие текстового переключателя языков
                    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 не будет работать корректно, и вы не сможете получить доступ к своему сайту!

Извините, что немного задержался с ответом, я не профессиональный веб-разработчик, поэтому не касался этого несколько месяцев. Я полностью самоучка, поэтому моя терминология может быть немного неясной. Но надеюсь, это поможет!

7 апр. 2013 г. 18:18:18
Комментарии

Фантастика, большое спасибо! - Позволил себе автоматическое форматирование кода для лучшей читаемости. Хорошее описание и отличный совет насчёт использования function_exists ;)

brasofilo brasofilo
8 апр. 2013 г. 14:59:57