Vous êtes ici : Accueil > Propositions

Proposition:Internationalisation : un changement de langue amène sur la page équivalente


Libellé


Lors d'un changement de langue sur un site multilingue, l'utilisateur se retrouve toujours sur la page équivalente dans l'autre langue lorsque celle-ci existe.

Objectifs


Permettre aux utilisateurs de changer de langue sans désorientation.

Solutions techniques

Pour respecter les préférences de l'utilisateur et imposer le moins de contraintes possibles, il y a plusieurs variables à prendre en compte, du plus important au moins important :

  1. un choix explicite fait par l'utilisateur (il a cliqué sur un lien 'english version' par exemple) ;
  2. la langue par défaut du navigateur de l'utilisateur (si cette langue est disponible pour le site, bien-entendu) ;
  3. la langue par défaut du site, définie par le créateur du site, en fonction de la langue utilisée par la majorité du public concerné.

Voici un exemple d'implémentation en PHP :

<?php
function negociateLanguage() {
	// Determine which language to use.
	// Order of precedence : explicitly requested lang, session saved lang, browser preset lang.
	
	// Configuration.
	$available_langs = array('fr', 'en');
	$default_lang = 'fr';
	
	// User requested language.
	if (strlen($_REQUEST['lang'])) {
		if (in_array($_REQUEST['lang'], $available_langs)) {
			$_SESSION['lang'] = $_REQUEST['lang'];
			return $_REQUEST['lang'];
		}
	}
	// Session saved language.
	if (strlen($_SESSION['lang'])) {
		return $_SESSION['lang'];
	}
	// Browser preset language.
	$lang = getUserAgentPreferedLang();
	if ($lang && in_array($lang, $available_langs)) {
		$_SESSION['lang'] = $lang;
		return $lang;
	} else {
		return $default_lang;
	}
}

function getUserAgentPreferedLang() {
	// Returns the prefered language of the User Agent.
	// Defaults to english.
	$languages = preg_split(';[\s,]+;', 
			substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, strpos($_SERVER['HTTP_ACCEPT_LANGUAGE'] . ';', ';')),
								 -1, PREG_SPLIT_NO_EMPTY);
	if (empty($languages)) {
		return false;
	} else {
		return substr($languages[0], 0, 2); // We don't want extended ISO names like en-US, fr-FR, etc.
	}
}
?>

Il suffit ensuite d'ajouter en tête de page PHP :

<?php
session_start();
$lang = negociateLanguage(); // Management of the current language (both getting and setting).
?>

Idéalement, configurer php.ini pour conserver les sessions pour plus le plus de temps possible.

Moyens de contrôle


Attention: Les moyens de contrôle de cette bonne pratique n'ont pas encore été rédigés. N'hésitez pas à éditer cette section pour y remédier.


Menu

Article

Votre compte

Contrat Creative Commons