Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

qTranslate for Wordpress doesn't automatic give me the correct language

I use qTranslate for Wordpress to have my blog posts in English, Swedish and German. I have activated the "Detect Browser Language" so that the visitor will be forwarded to the correct URL for the language specified by his browser.

So if I visit blog.domain.com I get transfered to blog.domain.com/sv/ and my blog posts is in Swedish, that is great! But now to the problem, if I visit blog.domain.com again a second time from the same computer I don't get transfered and the blog post is in default language English.

Is there something I'm doing wrong here? Seems strange that I always need to specify the language, I need it to be automatic based on the browser.

like image 502
Martin Avatar asked May 16 '12 12:05

Martin


2 Answers

I had the same problem and I have modified the qTranslate to add this functionality. What I did was to save a cookie with the language info, this cookie is saved when the user clicks on the language's flag in the widget.

My logic is the following:

  • In the widget displaying all the languages, add the following param to each URL: ?save_lang
  • When this param exists, save a cookie with name 'save_lang' and value = $lang
  • Immediately redirect to the same page, but without that param 'save_lang'
  • When calling any page, right now qTranslate will set the default_language to the one in the settings. If the cookie 'save_lang' exists, then I will override the default_language with the one saved in the cookie

So few steps:

  1. Modify qtranslate_core.php file:

            //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. Modify file qtranslate_widget.php (to add the 'save_lang' param to each's language URL):

Every time you see this line:

qtrans_convertURL($url, $language)

replace it with:

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

And then add that function:

// 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;

}

I hope this helps :)

like image 193
Leo Avatar answered Sep 22 '22 21:09

Leo


I found a nice .htaccess rule that can set the lang cookie here: http://tips.naivist.net/2012/11/09/remembering-the-user-language-choice/

It seems easier and works just fine:

Just alter your main .htaccess to this:

# 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

In lang1 and lang2, you can insert the languages you have translation in your site.

like image 41
Eduardo Russo Avatar answered Sep 22 '22 21:09

Eduardo Russo