qTranslate для Wordpress автоматически не дает мне правильный язык

Я использую qTranslate для Wordpress, чтобы писать сообщения в блоге на английском, шведском и немецком языках. Я активировал «Определить язык браузера», чтобы посетитель был перенаправлен на правильный URL-адрес для языка, указанного в его браузере.

Так что, если я захожу на blog.domain.com, я попадаю на blog.domain.com/sv/, а мои сообщения в блоге на шведском языке, это здорово! Но теперь к проблеме: если я снова захожу на blog.domain.com во второй раз с того же компьютера, меня не переводят, а сообщение в блоге по умолчанию на английском языке.

Что-то я здесь делаю не так? Кажется странным, что мне всегда нужно указывать язык, мне нужно, чтобы он был автоматическим в зависимости от браузера.


person Martin    schedule 16.05.2012    source источник
comment
Вы имели в виду, что он перенаправлял вас раньше, но теперь перестал работать?   -  person Anand    schedule 24.05.2012
comment
Проблема в том, что в первый раз, когда я захожу на blog.domain.com из браузера, я перенаправляюсь на правильный язык, но во второй раз, когда я захожу на blog.domain.com, я не перенаправляюсь и вижу только английский блог.   -  person Martin    schedule 25.05.2012
comment
Вы во второй раз авторизуетесь? Кажется, что qtranslate по-другому обрабатывает определение языка, если вы вошли в систему как администратор. Возможно, вам также будет полезно проверить, какие файлы cookie установлены после перенаправления.   -  person Karl Adler    schedule 30.05.2012


Ответы (3)


У меня была та же проблема, и я изменил qTranslate, чтобы добавить эту функцию. Я сохранил файл cookie с информацией о языке, этот файл cookie сохраняется, когда пользователь щелкает флаг языка в виджете.

Моя логика следующая:

  • В виджете, отображающем все языки, добавьте следующий параметр к каждому URL-адресу:? Save_lang
  • Если этот параметр существует, сохраните файл cookie с именем save_lang и значением = $ lang.
  • Немедленное перенаправление на ту же страницу, но без этого параметра save_lang
  • При вызове любой страницы прямо сейчас qTranslate установит default_language на тот, который указан в настройках. Если cookie 'save_lang' существует, я заменю default_language тем, что сохранен в cookie.

Итак, несколько шагов:

  1. Измените файл qtranslate_core.php:

            //Save the cookie if param ?save_lang is set, and then redirect to the same page without the param
    add_action('qtranslate_loadConfig', 'custom_qtranslate_loadConfig');
    function custom_qtranslate_loadConfig() {
    
        global $q_config, $_COOKIE;
    
        // By default, if the save_lang cookie is set, use that one instead
        if(isset($_COOKIE['save_lang'])) {
    
            $q_config['default_language'] = $_COOKIE['save_lang'];
        }
    }
    
    
    // Priority 3: load after function qtrans_init (it has priority 2)
    add_action('plugins_loaded', 'custom_after_qtrans_init', 3);    
    function custom_after_qtrans_init() {
    
        global $q_config, $_COOKIE;
    
        if (isset($_GET["save_lang"])) {
    
            // cookie will last 30 days     
            setcookie('save_lang', $q_config['language'], time()+86400*30, $q_config['url_info']['home'], $q_config['url_info']['host']);       
            wp_redirect(remove_url_param("save_lang", $q_config['url_info']['url']));
            exit();
        }
    }
    
    function remove_url_param($param_rm, $url) {
    
        $new_url = str_replace("?$param_rm", '', $url);
        $new_url = str_replace("&$param_rm", '', $new_url);
    
        return $new_url;
    }
    
  2. Измените файл qtranslate_widget.php (чтобы добавить параметр save_lang в URL каждого языка):

Каждый раз, когда вы видите эту строку:

qtrans_convertURL($url, $language)

замените его на:

add_url_param(qtrans_convertURL($url, $language), "save_lang")

А затем добавьте эту функцию:

// Function to add a parameter to a URL
function add_url_param($url, $name, $value = '') {

    // Pick the correct separator to use
    $separator = "?";
    if (strpos($url,"?")!==false)
      $separator = "&";

    // Find the location for the new parameter
    $insertPosition = strlen($url); 
    if (strpos($url,"#")!==false)
      $insertPosition = strpos($url,"#");

    $withValue = ($value == '' ? '' : "=$value");


    // Build the new url
    $newUrl = substr_replace($url,"$separator$name$withValue",$insertPosition,0);

    return $newUrl;

}

Надеюсь, это поможет :)

person Leo    schedule 15.08.2012
comment
То же самое и здесь, применили коды без какого-либо результата. :( qTranslate Версия 3.4.6.4 | WordPress 4.4.2 - person eapo; 12.03.2016

Я нашел хорошее правило .htaccess, которое может установить здесь файл cookie lang: http://tips.naivist.net/2012/11/09/remembering-the-user-language-choice/

Вроде проще и отлично работает:

Просто измените свой основной .htaccess на это:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# Language Cookie redirect
RewriteCond %{REQUEST_URI} ^/$ [NC]
RewriteCond %{HTTP_COOKIE} lang=(lang1|lang2) [NC] 
RewriteRule ^(.*)$ /%1/ [R=302,L]

RewriteCond %{REQUEST_URI} ^/(lang1|lang2)/.*$ [NC] 
RewriteCond %{HTTP_COOKIE} !lang=%1 [NC] 
RewriteRule . - [cookie=lang:%1:.%{HTTP_HOST}:144000:/]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

В lang1 и lang2 вы можете вставить языки, на которых есть перевод на вашем сайте.

person Eduardo Russo    schedule 18.01.2013

Трудно указать, что может быть не так в приведенном выше описании

Возможная ошибка может заключаться в том, что при первом входе в систему вы принимаете входные данные из «Определить язык браузера». И в следующий раз получить его из cookie. Возможно, с этим процессом что-то пошло не так. Или вы можете вообще не использовать файлы cookie.

Вы можете сохранить предустановку языка пользователя, если у вас есть база данных для входа в систему. Затем измените URL-адрес в соответствии с желаемым языком, как только они войдут в систему.

person Katti    schedule 30.05.2012