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

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

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

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

3 ответа

Я нашел хорошее правило.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 вы можете вставить языки, которые вы переводите на свой сайт.

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

Моя логика заключается в следующем:

  • В виджете, отображающем все языки, добавьте следующий параметр к каждому URL:? Save_lang
  • Когда этот параметр существует, сохраните куки с именем '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;

}

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

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

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

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

Другие вопросы по тегам