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.
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:
So few steps:
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;
}
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 :)
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With