Site Multilingue avec PHP, SimpleXML gestion des Cookies


Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /homepages/31/d249765410/htdocs/vlasic2/wp-content/plugins/wp-code-highlight/wp-code-highlight.php on line 68

Merci au site PHP.NET pour la documentation concernant l’extension PHP SimpleXML et XPath qui m’ont permis de construire ce tuto. Pour le reste c’est O’Reilly

Préalable

Tout d’abord l’utilisation d’XML plutôt qu’une base de données Mysql pour certaines choses peut-être intéressante. Sur de gros fichiers il est sain d’éviter de multiplier les requêtes sur la base pour l’ affichage d’une seule page. Stocker certaines informations en XML peut alléger un site. Bien sûr avec Ajax nous pouvons nous passer de requêtes, mais chaque choses en son temps, cela fera l’objet d’un prochain article…

Je précise bien-sûr que ceci est une façon de faire et qu’il y en a plusieurs, à chacun de trouver celle qui convient le mieux à son projet.

Donc le contexte:

2 pages web et sur chacune d’elle 2 drapeaux français et anglais. le but est de changer de langue en restant sur la même page et non en allant chercher une page clonée mais en anglais…

La solution est que tous les contenus soient dans des variables et donc interchangeables en fonction du contexte choisi.

Cette solution peut paraitre fastidieuse au départ mais quand le site prend de l’ampleur et que le contenu augmente cela devient vital. De plus il est facile après d’ajouter d’autres langues en modifiant quelques paramètres…

Stockage des labels (étiquettes) en XML

Par labels j’entends un objet auquel correspond plusieurs contenus.

Voici donc un exemple de formalisation d’un fichier XML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
 <labels>
 <label name="hello_world">Bonjour le monde!!</label>
 <label name="blabla_welcome">Je suis vraiment heureux de vous
 montrer ce truc XML et patati et patata</label>
 <label name="lien_1>Lien N°1</label>
 <label name="lien_2>Lien N°2</label>
 ...
 </labels>

L’encodage ISO-8859-1 est délibérément choisi pour le contenu ci-dessous sachant que je vais rester sur des langues européennes et qu’il y a l’accentuation française… La version XML est toujours la même : 1.0.

voici ensuite la version anglaise:

<?xml version="1.0" encoding="ISO-8859-1" ?>
 <labels>
 <label name="hello_world">Hello world!!</label>
 <label name="blabla_welcome">I 'm very happy to show you that XML
  stuff</label>
 <label name="lien_1">Link N°1</label>
 <label name="lien_2">Link N°2</label>
 ...
 </labels>

Désolé pour mon anglais…

Pourquoi 2 fichiers distincts?

Tout simplement pour diviser par 2 la taille du fichier appelé par la suite…

Choix du XML à charger:

Le choix du XML à charger ce fera dans un script PHP que j’appellerai check_labels.php. Pour le moment voici ce qu’il va faire:

<?php
 if($lang == fr){
 $xmlstr = <<<XML
 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <labels>
 <label name="hello_world">Bonjour le monde!!</label>
 <label name="blabla_welcome">Je suis vraiment heureux de vous
 montrer ce truc XML et patati et patata</label>
 <label name="lien_1">Lien N°1</label>
 <label name="lien_2">Lien N°2</label>
 <label name="now_we_are_friends">On est amis maintenant!!</label>
 <label name="friends_blabla">On va pouvoir échanger pleins de trucs
 et faire de nouvelles expériences passionnantes...</label>
 </labels>
 XML;
 }
 if($lang == en){
 $xmlstr = <<<XML
 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <labels>
 <label name="hello_world">Hello world!!</label>
 <label name="blabla_welcome">I 'm very happy to show you that XML
 stuff</label>
 <label name="lien_1">Link N°1</label>
 <label name="lien_2">Link N°2</label>
 <label name="now_we_are_friends">Now we're friends!!</label>
 <label name="friends_blabla">We're gonna do everything we want
 and spend all our time in excinting web adventures...
 (sorry for my english!!)</label>
 </labels>
 XML;
 }
 ?><strong></strong>

Choix de la langue

j’ai créé un petit bout d’html dans un check_flags.php à inclure dans les pages avec de jolies images de drapeaux. Remarquez les liens utilisés, en effet on va stocker dans des $_GET le choix de la langue: fr ou en:

<div id="flags">
 <p>
 <a href="?lang=fr"><img src="chemin/flag-FR.gif"/></a>
 <a href="?lang=en"><img src="chemin/flag-GB.gif"/></a>
 </p>
 </div>

Enregistrement du choix et création du cookie

Retournons à notre script check_labels.php dans lequel nous allons ajouter quelques lignes au début pour interpréter le $_GET:

<?php
 if ($_GET['lang']){
 $lang = $_GET['lang'];<span style="color: #008000;">//$lang devient ce qui a été choisi</span>
 SetCookie("lang",$_GET["lang"]);<span style="color: #008000;">//création du cookie</span>
 }
 elseif ($_COOKIE['lang']){ <span style="color: #008000;">// s'il n'y a pas de variable $_GET on regarde le cookie</span>
 $lang = $_COOKIE['lang'];
 }else {
<span style="color: #008000;">//Si il n'y a ni $_GET ni $_COOKIE on va chercher la langue </span>
<span style="color: #008000;">//du navigateur grâce à une variable globale </span>
$lang = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
 }
 ...

A ce stade on a défini quoiqu’il arrive le contenu de $lang qui permet plus bas de choisir le XML à charger.

UNE BONNE CHOSE DE FAITE!!!!

Convertir XML en objet:

L’extension SimpleXML permet de convertir un XML en objet et fournit toutes les fonctions nécessaires à sa manipulation. L’extension SimpleXML requiert PHP 5 et est activée par défaut.

Les quelques lignes suivantes vont aller chercher dans mon script PHP le XML désiré, le transformer en objet et retourner un tableau de toutes les valeurs qui m’intéressent grâce à une requête XPATH:

include 'check_labels.php';
$xml = new SimpleXMLElement($xmlstr);
$result = $xml->xpath("//labels/label");

Création des variables contenant les valeurs voulues.

Ce que je veux faire ici ce sont des variables ayant pour dénomination la valeur de chaque attributs du XML et pour contenu, et bien, le contenu de chaque branche du XML concernée.

Pour ça au préalable il faut avoir un soupçon de culture XML pour comprendre les termes utilisés:

Dans mon XML, les attributs sont les conteneurs name et leur valeur est ce qu’il y a après le signe = exemple: hello_world. Le contenu de la branche est Hello World!!

<label <span style="color: #008000;">name</span>="<span style="color: #ff6600;">hello_world</span>"><span style="color: #0000ff;">Hello World!!</span></label>

Notez que les attributs sont les mêmes pour les 2 XML. Par analogie avec une Base de donnée Mysql on pourrait appeler ça la clé.

Pour simplifier l’utilisation ensuite je veux pouvoir disposer de la variable: $hello_world qui va stocker la version voulue.

Pour ça je vais exploiter le tableau créé par la requête Xpath et stocker dans une variable $atrs le contenu des attributs de chaque branche:

foreach ($result as $row){
 $atrs = $row->attributes();

ensuite je vais créer des variables ayant le nom des attributs et pour valeur le contenu des branches ($row),

$$atrs = $row

Ce qui donne enfin:

<?php
 include 'check_labels.php';
 $xml = new SimpleXMLElement($xmlstr);
 $result = $xml->xpath("//labels/label");
 foreach ($result as $row){
 $atrs = $row->attributes();
 $$atrs = $row;
 }
 ?>

Voilà donc avec ceci je dispose des variables suivantes:

$hello_world,

$blabla_welcome,

$lien_1,

$lien_2…

Il n’y a plus qu’à construire nos pages web tout simplement.

Voici la première que j’appelerai page1xml.php:

<?php
include 'check_labels.php';
 $xml = new SimpleXMLElement($xmlstr);
 $result = $xml->xpath("//labels/label");
foreach ($result as $row){
 $atrs = $row->attributes();
 $$atrs = $row;
 }
 ?>
<html>
 <head>
 <title>Page 1</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 </head>
 <body>
 <p>
 <a href="page1xml.php"><?php echo "$lien_1"; ?></a> |
 <a href="page2xml.php"><?php echo "$lien_2"; ?></a>
 </p>
 <p><?php include 'check_flags.php'; ?></p>
 <h1><?php echo "$hello_world"; ?></h1>
 <p><?php echo "$blabla_welcome"; ?></p>
 </body>
 </html>

et la deuxième que j’appelerai page2xml.php:

<?php
include 'check_labels.php';
$xml = new SimpleXMLElement($xmlstr);
$result = $xml->xpath("//labels/label");
foreach ($result as $row){
$atrs = $row->attributes();
$$atrs = $row;
}
?>
<html>
 <head>
 <title>Page 2</title>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
 </head>
 <body>
 <p><a href="page1xml.php"><?php echo "$lien_1"; ?></a> |
 <a href="page2xml.php"><?php echo "$lien_2"; ?></a>
 </p>
 <p><?php include 'check_flags.php'; ?></p>
 <h1><?php echo "$hello_world"; ?></h1>
 <p><?php echo "$blabla_welcome"; ?></p>
 </body>
 </html>

Je ne m’attarde pas sur l’explication de ces 2 fichiers leur contenu est assez simple à comprendre, évidemment plutôt que répéter sur chaque page les appels XML ainsi que le head on peut tout rassembler dans un header.php dans lequel le title est dynamique… je n’irai pas plus loin… tout est possible bien-sûr, ce qui importe ici est l’exploitation d’XML pour la gestion des langue dans un site et ça marche!!!

VOIR ICI LA DEMO

Conclusion

On peut constater que quand on clique sur le drapeau anglais, toutes les variables dans la page passent en anglais grâce à $_GET qu’on peut voir dans l’URL alors généré.

Ce qui est intéressant, c’est quand on clique sur une autre page, la langue reste la même alors qu’il n’y a plus $_GET. Ceci est possible grâce au Cookie que nous avons créé.

Voilà j’espère que ce tuto aidera quelqu’un, n’hésitez pas à me solliciter pour des questions ou tout simplement me faire des remarques sur des choses que je n’aurais pas vu…

A plus.

Ce contenu a été publié dans conception web, xml, avec comme mot(s)-clé(s) , , , , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Site Multilingue avec PHP, SimpleXML gestion des Cookies

  1. Tara dit :

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /homepages/31/d249765410/htdocs/vlasic2/wp-content/plugins/wp-code-highlight/wp-code-highlight.php on line 68

    The blog is cool

    • jfvlasic dit :

      Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /homepages/31/d249765410/htdocs/vlasic2/wp-content/plugins/wp-code-highlight/wp-code-highlight.php on line 68

      thanx!!!

Laisser un commentaire