Site public dans la langue préférée du navigateur

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Un squelette qui perment de présenter à ceux et celles qui visitent le site un sommaire dans leur langue de préférence, définie dans le navigateur.

Peux mieux faire...

A l’heure de modifier la présente contrib, il convient de mentionner avant tout que depuis, Laurent en a fait une bien mieux !

Non seulement elle englobe fonctionnellement les deux approches proposées sur ce site [1], mais en plus elle utilise très élégamment les fonctions déjà développées dans le code de SPIP.

Je vous suggère vivement d’essayer d’abord sa solution. Les lignes qui suivent n’ont plus qu’un intérêt pédagogique.

<font
color="red">S<font
color="orange">P<font
color="yellow">I<font
color="green">P <font
color="blue">1<font
color="black">.7<font
color="darkviolet">.2
Attention : Pour faire marcher la contrib de Laurent avec SPIP 1.7.2, il faut ajouter dans mes_fonctions.php3 :

function gerer_menu_langues() {
    global $var_lang;
    if ($var_lang) {
        if (changer_langue($var_lang)) {
            spip_setcookie('spip_lang', $var_lang, time() + 24 * 3600);
        }
    }
}

En effet, la fonction gerer_menu_langues, qui était présente dans ecire/inc_lang.php3 dans la version 1.7, a disparu dans la 1.7.2 (sans doute parce qu’elle ne servait à rien pour SPIP lui-même)

La langue préférée dans le navigateur

Dans un navigateur, une personne peut indiquer quelles sont ses langues de prédilection, et les classer par préférence. En fonction de cela ; un serveur web pourra modifier son comportement, et en particulier sélectionner la langue dans laquelle il affiche ses pages.

Dans Mozilla, par exemple, on le fait en éditant les préférences. Dans l’image ci-dessous, je lui indique que je préfère voir un site en espagnol, version uruguayenne si elle est disponible, sinon en français, version hexagonale de préférence, et enfin en anglais.

En fait, un site web n’apparaîtra dans la langue choisie que s’il est conçu pour cela. L’information est disponible et sa mise à disposition fait partie des standards HTTP/HTML, mais encore faut-il que le serveur s’en serve.

Dans cette contrib, nous verrons comment construire un site SPIP multilingue qui utilise cette fonctionnalité : celui ou celle qui visite le site verra s’afficher automatiquement le « sommaire » dans la langue existante sur le site, qui correspond le mieux à ses préférences.

L’idée pour SPIP

Le principe que nous venons de décrire n’est intéressant et faisable que si le site que nous construisons a vocation à présenter la totalité de son information (ou presque) dans chacune des langues qu’il gère. Dans ce cas, la structure la plus courante pour organiser ce type de site multilingue est de réserver un secteur [2] à chacune des langues du site [3].

Bien qu’il existe un squelette pour le sommaire du site (sommaire.html), la manière la plus logique de construire celui-ci pour chacune des langues sera sans doute avec la page de rubrique du secteur correspondant.

L’idée est d’utiliser le squelette sommaire.html pour détecter les langues de prédilection dans le navigateur et d’y effectuer la redirection correspondante.

Les fonctions PHP utilisées

Dans cette boucle nous utiliserons quelques variables et fonctions PHP :
-  $_SERVER['HTTP_ACCEPT_LANGUAGE'] est une variable réservée de PHP, à travers laquelle on accède à la liste ordonnée des langues préférées dans le navigateur client ;
-  split() est une de ces fonctions puissantes que propose PHP pour transformer une chaîne de caractères en tableau (array)... mais en l’occurrence, comme signalé sur le forum ci-dessous, il est plus efficace d’utiliser explode()
-  header() est la fonction PHP qui permet de renvoyer une entête HTTP au navigateur. L’entête envoyée est "Location: [URL]" [RFC2612 14.30, page 134], où [URL] est une adresse HTTP pour redirection.

Le code de la solution

Pour réaliser la redirection, il suffit de créer un squelette sommaire.html qui contienne le code suivant :

<?php
/* 
 * Construire un tableau $langues avec les langues preferees 
 * du navigateur
 */
$langues = split(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach( $langues as $lg ) {
/* 
 * pour chaque langue préférée par le visiteur 
 */
<BOUCLE_secteurs_langue(RUBRIQUES){racine}>
        /* 
         * Une boucle de secteurs, c'està dire des langues 
         * du site
         */

	if (substr($lg,0,2) == "#LANG") {
	/* 
	 * si la langue préférée (sans variante) est identique à  
         * celle du secteur, rediriger ver le secteur
	 */
		header("Location: #URL_RUBRIQUE");
		exit;
	};	
</BOUCLE_secteurs_langue>
}
	/* 
	 * si aucune des langues préférées n'existe dans le site 
	 * rediriger vers la langue principale (la première)      
	 */
<BOUCLE_langue_defaut(RUBRIQUES){racine}{0,1}>
	header("Location: #URL_RUBRIQUE");
</BOUCLE_langue_defaut>
?>

Bien sûr, on peut supprimer les lignes entre /* et */ qui ne sont que des commentaire pour mieux comprendre le squelette.

Pour finir de comprendre le fonctionnement, rappelons que SPIP est une sorte de « pré-processeur PHP » : à partir des squelettes et des données de la base SPIP construit un fichier PHP qu’il stocke dans le cache et qui s’exécute chaque fois que l’on appelle la page.

Supposons que notre site ait trois secteurs : le numéro 1 en espagnol, le numéro 2 en français, et le numéro 15 en arabe. A partir du squelette ci-dessus, SPIP va créer dans le cache un fichier avec le code PHP qui suit (on suppose qu’on a supprimé les commentaires) :

<?php

$langues = split(",", $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach( $langues as $lg ) {

	if (substr($lg,0,2) == "es") {

		header("Location: rubrique.php3?id_rubrique=1");
		exit;
	};	

	if (substr($lg,0,2) == "en") {

		header("Location: rubrique.php3?id_rubrique=2");
		exit;
	};	


	if (substr($lg,0,2) == "ar") {

		header("Location: rubrique.php3?id_rubrique=15");
		exit;
	};	
}
	header("Location: rubrique.php3?id_rubrique=1");
?>

Et chaque fois que cette page est appelée, ce code s’exécute avec, dans $_SERVER['HTTP_ACCEPT_LANGUAGE'], les valeurs appropriées des préférences.

Le squelette du « sommaire »

En utilisant les fonctionnalités des fichiers de langue pour
internationaliser les squelettes, il peut être utile de créer un squelette unique multilingue pour le sommaire dans toutes les langues. Cependant, comme on a déjà utilisé le squelette sommaire.html (qui, de toutes manières, ne nous aurait pas permis de distinguer véritablement la langue préférée), il sera nécessaire, si l’on veut que le sommaire se distingue des autres sous-sections, de prévoir des fichiers squelettes spécifiques pour chaque secteur de langue. Une solution pourra être d’utiliser la « fonction » SPIP INCLURE :

-  créer un squelette spécifique sommaire_lang.html et sommaire_lang.php3,

-  créer, pour chacun des secteurs, un squelette rubrique=N.html (où N est le numéro de secteur : 1, 2 et 15, dans l’exemple précédent) qui ne contiendra que l’inclusion du squelette précédent : <INCLURE(sommaire_lang.php3){id_rubrique}.

Certes, pas très élégante cette dernière proposition, mais je ne vois pas comment faire simple autrement... ;-)

Notes

[1celle de la présente contrib, et celle de Nicolas.

[2rappelons qu’un secteur est une rubrique de premier niveau, située à la racine du site.

[3Pour une discussion plus complète sur la façon d’organiser un site multilingues avec SPIP, voir la documentation « Réaliser un site multilingue ».

Il convient de mentionner que je n’ai pas inventé tout ça tout seul : je me suis, comme toujours, inspiré d’un exemple trouvé sur internet (que je ne retourve plus à l’heure de rédiger la présente contrib...). L’apport est d’adapter à SPIP un exemple PHP.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom