Même si j'ai 'Redirection vers la langue du navigateur' activé à l'écran de configuration de WMPL, les utilisateurs ne sont pas redirigés correctement en fonction de la langue du navigateur.
J'ai actuellement trois langues sélectionnées: en (par défaut) , es et pt-br . Seuls les utilisateurs es sont automatiquement redirigés vers la page espagnole. pt-br les utilisateurs ne le sont pas, quel que soit le navigateur que j'utilise.
J'ai trouvé ce qui se passait et je vais donc y répondre pour référence future, car il s'agit d'un problème courant sans solution claire.
TL; DR: Si le langage WPML qui ne redirige pas a un code de pays (par exemple. en-US au lieu de en ), alors vous avez probablement le même bogue. Aller à la section "Comment résoudre ce problème" .
Le problème se pose lors de la redirection javascript fournie par WPML (browser-redirect.js) :
[...]
1 // Get page language and browser language
2 var pageLanguage = wpml_browser_redirect_params.pageLanguage;
3 var browserLanguage = navigator.language? navigator.language : navigator.userLanguage;
4 browserLanguage = browserLanguage.substr(0,2); // browser language may have double code (i.e. en-us)
[...]
5 // Compare page language and browser language
6 if (pageLanguage != browserLanguage) {
7 var redirectUrl;
8 // First try to find the redirect url from parameters passed to javascript
9 var languageUrls = wpml_browser_redirect_params.languageUrls;
10 if (languageUrls[browserLanguage] != undefined) {
11 redirectUrl = languageUrls[browserLanguage];
12 }
13 // Finally do the redirect
14 if (redirectUrl != undefined) {
15 window.location = redirectUrl;
16 }
17 }
Comme vous pouvez le voir à la ligne 4, browserLanguage est coupé, de manière que pt-br devient pt , en-us devient en , et ainsi de suite. sur. C'est probablement là que les utilisateurs de différents endroits mais avec la même langue seraient tous deux redirigés.
Le problème actuel est à la ligne 10. languageUrls est un tableau qui contient tous les codes de langues avec leurs URL respectives, mais les codes ne sont pas supprimés!
languageUrls[]
en: "http://sitehere.com"
es: "http://sitehere.com?lang=es"
pt-br: "http://sitehere.com?lang=pt-br"
Donc, si browserLanguage a été coupé, la condition if de la ligne 10 renvoie false, et vous ne serez alors pas redirigé:
if (languageUrls[pt] != undefined ) {
// this part doesn't runs
}
De plus, même si browserLanguage n'était pas coupé du tout, cela ne fonctionnerait toujours pas complètement, car certains navigateurs passaient browserLanguage en lettres majuscules, comme pt_BR , et cela ne voulait tout simplement pas rencontre.
Ma solution consiste à utiliser deux browserLanguage variables, une ajustée et une en minuscule. Ensuite, vous comparez pageLanguage contre les deux, de sorte que le comportement des utilisateurs d'un "emplacement différent, d'une même langue" restera probablement le même et que vous corrigez le bogue.
Remplacez le contenu de /wp-content/plugins/sitepress-multilingual-cms/res/js/browser-redirect.js par ceci:
jQuery(document).ready(function(){
if(jQuery.cookie != undefined) {
// Check if cookie are enabled
jQuery.cookie('wpml_browser_redirect_test', '1');
var cookie_enabled = jQuery.cookie('wpml_browser_redirect_test') == 1;
jQuery.removeCookie('wpml_browser_redirect_test');
if (cookie_enabled) {
var cookie_params = wpml_browser_redirect_params.cookie
var cookie_name = cookie_params.name;
// Check if we already did a redirect
if (!jQuery.cookie(cookie_name)) {
// Get page language and browser language
var pageLanguage = wpml_browser_redirect_params.pageLanguage;
var browserLanguage = navigator.language? navigator.language : navigator.userLanguage;
browserLanguage = browserLanguage.toLowerCase()
browserLanguageTrim = browserLanguage.substr(0,2); // browser language may have double code (i.e. en-us)
// Build cookie options
var cookie_options = {
expires: cookie_params.expiration / 24,
path: cookie_params.path? cookie_params.path : '/',
domain: cookie_params.domain? cookie_params.domain : ''
};
// Set the cookie so that the check is made only on the first visit
jQuery.cookie(cookie_name, browserLanguage, cookie_options);
// Compare page language and browser language
if ((pageLanguage != browserLanguage) && (pageLanguage != browserLanguageTrim)) {
var redirectUrl;
// First try to find the redirect url from parameters passed to javascript
var languageUrls = wpml_browser_redirect_params.languageUrls;
if (languageUrls[browserLanguage] != undefined) {
redirectUrl = languageUrls[browserLanguage];
} else if (languageUrls[browserLanguageTrim] != undefined) {
redirectUrl = languageUrls[browserLanguageTrim];
}
// Finally do the redirect
if (redirectUrl != undefined) {
window.location = redirectUrl;
}
}
}
}
}
});
Les utilisateurs ne seront redirigés qu'une seule fois. C'est un comportement proposit (et horrible). Si cela ne vous satisfait pas, vous pouvez essayer une autre alternative. N'oubliez pas qu'il s'agit d'un hack qui redirige tous les utilisateurs en fonction de la langue de leur navigateur, quelle que soit la langue choisie, de sorte que vousDEVEZfaire traduire toutes les pages et éviter d'afficher un commutateur de langue. travail.
jQuery(document).ready(function(){
if(jQuery.cookie != undefined) {
// Check if cookies are enabled
jQuery.cookie('wpml_browser_redirect_test', '1');
var cookie_enabled = jQuery.cookie('wpml_browser_redirect_test') == 1;
jQuery.removeCookie('wpml_browser_redirect_test');
if (cookie_enabled) {
var cookie_params = wpml_browser_redirect_params.cookie
var cookie_name = cookie_params.name;
var pageLanguage = wpml_browser_redirect_params.pageLanguage;
var browserLanguage = navigator.language? navigator.language : navigator.userLanguage;
var languageUrls = wpml_browser_redirect_params.languageUrls;
browserLanguage = browserLanguage.toLowerCase()
browserLanguageTrim = browserLanguage.substr(0,2);
// First time cookie gets set
if (!jQuery.cookie(cookie_name)) {
// Build cookie options
var cookie_options = {
expires: cookie_params.expiration / 24,
path: cookie_params.path? cookie_params.path : '/',
domain: cookie_params.domain? cookie_params.domain : ''
};
// Sets the cookie in a way that matches avaible languageUrls
if (languageUrls[browserLanguage] != undefined) {
jQuery.cookie(cookie_name, browserLanguage, cookie_options);
} else if (languageUrls[browserLanguageTrim] != undefined) {
jQuery.cookie(cookie_name, browserLanguageTrim, cookie_options);
}
}
/* If cookie language != page language then redirect
!! WARNING: THIS DOESN'T ALLOWS LANGUAGE SWITCHING,
!! BUT GUARANTEES ALL USERS ALWAYS GET REDIRECTED,
!! ASSUMING BROWSERLANGUAGE IS THE RIGHT LANGUAGE.
For better behaviour you should make the language switcher
update the cookie. Bad, bad hack, but I like it better. */
if (jQuery.cookie(cookie_name) != pageLanguage) {
var redirectUrl;
// Sets the url for redirection
if (languageUrls[jQuery.cookie(cookie_name)] != undefined) {
redirectUrl = languageUrls[jQuery.cookie(cookie_name)];
}
// Finally do the redirect
if (redirectUrl != undefined) {
window.location = redirectUrl;
}
}
}
}
});