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:
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 :)