SPIP - Contrib

[ar] [en] [es] [fr] [it]



Accueil du site > Multilinguisme > Archives Multilinguisme

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

jeudi 1er janvier 2004, par dani. Dernier ajout mardi 5 décembre 2006

Toutes les versions de cet article :


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.

SPIP 1.7.2 Attention : Pour faire marcher la contrib de Laurent avec SPIP 1.7.2, il faut ajouter dans mes_fonctions.php3 :

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 :

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

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... ;-)

P.-S.

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.

Notes

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

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

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


Répondre à cet article

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

    13 octobre 2005 16:47, par Philippe G.

    J’ai un problème bête de chez bête (je suis en 1.8.2d)... Tout marche, évidement, mais quand j’affiche la page sommaire et que je change de langue, je souhaite que la rubrique change aussi. Je m’explique avec un exemple :
    La rubrique "fr" est la rubrique 1 et la rubrique "en"est la 2. Quand je suis sur le site français (rubrique 1) et que je clique sur le menu de langues (pour afficher en anglais), je change bien de langue mais reste sur la rubrique 1 alors que je voudrais basculer sur la rubrique 2 (les articles ne sont pas forcément les mêmes).
    Merci de votre aide, je sèche !

    Répondre à ce message

    Retour au début des forums

  • « split() est une de ces fonctions puissantes que propose PHP pour transformer une chaîne de caractères en tableau (array) ; »

    Dans le manuel dont vous donnez la page, il est écrit qu’il vaut mieux préférer explode.

    Répondre à ce message

    • split ou explode 7 janvier 2004 14:06, par dani

      En effet, merci pour la remarque !

      Dès que j’ai l’occasion de le tester, je modifie la contrib.

      Répondre à ce message

      • > mixe des deux solutions 13 janvier 2004 12:52, par Laurent Laville

        Pour toutes celles et ceux qui revaient d’un mixe des deux solutions.

        Venez lire mon article sur la page d’accueil multi-langues

        J’espère que dani ne m’en voudra pas d’avoir repris une grande partie de son article ;-) Mais comme je le dis, il faudrait être fou pour réinventer ce que d’autres avant nous ont très bien fait !

        Voir en ligne : Page d’accueil multi langues

        Répondre à ce message

        • > mixe des deux solutions 11 février 2004 10:36, par Noel

          Salut,

          J’utilise SPIP 1.7. Merci pour vos articles ! Suite à la version de Laurent, je suis presque arrivé à mes fins.

          Sauriez vous pourquoi gerer_menu_langues() ne fonctionne pas ? je met bien une valeur dans $var_lang avant de l’appeler.

          j’ai toujours #LANG positionné à l’ancienne valeur, et du coup, mes boucles de menu ne changent jamais.

          Noel

          PS : Y a-t’il un moyen d’acceder à la langue de la rubrique courante ?

          Répondre à ce message

          • > mixe des deux solutions 11 février 2004 19:19, par dani

            Sauriez vous pourquoi gerer_menu_langues() ne fonctionne pas ? je met bien une valeur dans $var_lang avant de l’appeler.

            Je pense que cette fonction n’attribue que les langues qui sont effectivement configurées dans le site (espace privé : Admin-> gestion langues->multilingüisme). Ton pb ne vient-il pas de là ?

            Y a-t’il un moyen d’acceder à la langue de la rubrique courante ?

            Oui, la balise #LANG dans une boucle RUBRIQUES. (mais est-ce la question ? ;-)

            Répondre à ce message

    Retour au début des forums

  • Une autre solution

    3 janvier 2004 15:02, par dani

    Nicolas Hoizey a fait une contrib qui propose une autre solution à la même problématique, déjà valable pour des sites multilingues sous 1.6. Les fonctionnalités ne sont pas exactement les mêmes :
    - elle utilise phpLang, un script qui ajoute un avantage fonctionnel indéniable : l’utilisateur peut choisir une autre langue et le navigateur en garde la « mémoire » avec des cookies,
    - ceci dit, elle requiert d’avoir accès aux Rewrite rules d’Apache soit directement dans httpd.onf, soit autorisées dans le .htaccess)
    - elle est un peu moins générale, car il faut ajouter des ’rewrite rules’ pour chaque langue ajoutée.

    Ce serait bien de réfléchir à un mix des deux.

    Voir en ligne : Une page d’accueil dans la bonne langue pour chaque visiteur

    Répondre à ce message

    Retour au début des forums



Suivre la vie du site RSS 2.0 | Plan du site | Espace privé | Charte et vie SPIP-Contrib | SPIP | L'autre.net