le Journal du Floyd

Faire un site multi...dingue?

l auteur de ce journal

Aujourd'hui, chacun ou presque a un blog...pour prouver que sa vie, c' est de la merde et qu' il écrit mal. Non, je déconne, un site web ou blog peut également servir à promouvoir une activité principale, parallèle ou simplement sa passion pour les timbres, les petites cuillères ou la langue de boeuf sauce piquante. Seulement voilà, dans le but de toucher le plus de monde, beaucoup sont tentés de décliner le contenu en plusieurs langues, une pensée émue pour nos amis Belges ou Suisses aussi (...émue, ouais faut pas éxagérer non plus, hein?) . Pas facile d' habiter des pays où plusieurs langues cohabitent (non, ce n' est pas sexuel). Bon, sérieusement, on se met à la pratique? il est possible de multiplier les pages web par le nombre de langues et avoir une construction du style:

https://monsite/fr/index.html,
https://monsite/en/index.html,
https://monsite/de/index.html.

Personnellement, je n' aime pas. Ce n' est pas dynamique et puis cela prend beaucoup plus de place sur le serveur web. On va faire un mix entre un largage de cookies (pas la peine de mettre son plus joli tablier, cela n' a rien à voir avec la patisserie, pfff...) la reconnaissance de la langue du visiteur (ce n' est toujours pas sexuel) en PHP, et un document JSON (un tableau associatif). Pas de panique, le tutoriel se veut à la portée de tous, on va y aller doucement. Problématique de départ, un site en 3 langues fr, en, de, Français, Anglais, Allemand.

Première étape : confectionner les cookies.

On met son plus joli tablier...non, je déconne. Pour cela, un seul document en PHP, on fera un include sur chaque page Web. Le code :

if (isset($_REQUEST['fr'])) {
setcookie("_d","de",time()-3600*24*30);
setcookie("_e","en",time()-3600*24*30);
setcookie("_f","fr",time()+3600*24*30);
header("Location: https://monsite.com/index.php");
exit;
}
elseif (isset($_REQUEST['en'])) {
setcookie("_f","fr",time()-3600*24*30);
setcookie("_d","de",time()-3600*24*30);
setcookie("_e","en",time()+3600*24*30);
header("Location: https://monsite.com/index.php");
exit;
}
elseif (isset($_REQUEST['de'])) {
setcookie("_f","fr",time()-3600*24*30);
setcookie("_e","en",time()-3600*24*30);
setcookie("_d","de",time()+3600*24*30);
header("Location: https://monsite.com/index.php");
exit;
}

Version simple, si la requête est fr, le fameux isset($_REQUEST['fr']), je nettoie les cookies _e et _d en leur attribuant une durée négative, j' initialise un cookie _f avec une valeur fr et une durée de 1 an, je redirige l'utilisateur sur ma page d'accueil avec le header. Exit parce que là, nous n'avons plus rien à faire là. Le document s' appellera "cookie.php". Pas de panique, je détaille plus loin comment envoyer les requêtes.

Deuxième étape : faire son document JSON.

JSON, c' est du Javascript en gros. Le format est intéressant, puisque simple, rapide. Attention, il faut respecter scrupuleusement la syntaxe, sinon ça va forcément nettement moins bien marcher par la suite. Ah et c' est comment la syntaxe? Un ensemble de parenthèses, doubles guillemets, 2 points et des virgules. On associe une clé avec une valeur, c' est-à-dire, "titre" avec "un dimanche à la campagne" par exemple. Allez, on écrit en JSON : 2 parenthèses:

{}

Dedans, 3 tableaux, 1 par langue :

{
"fr":{},
"en":{},
"de":{}
}

double guillemets, c' est impératif. Pas de virgule après "de":{} puisque c' est le petit dernier dans l' ensemble du document. En cas de langue supplémentaire, on ajoutera la virgule puis "it":{} pour l'Italien par exemple. chaque langue est un tableau, un ensemble de clé/valeurs. Justement, les clés/valeurs :

{
"fr":{
"title":"site web",
"description":"corps du site web"
},
"en":{
"title":"website",
"description":"website deep inside"
},
"de":{
"title":"Webseite",
"description":"Webseite Inhalt"
}
}

Le document s' appellera "langue.js".

Troisième étape : préparer sa page Web

Du HTML5 et rien d'autre. Enfin, si. Y a du PHP dedans, donc on sauvegardera en ".php".

<?php

?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>

J' inclus mes cookies dans la recette.

<?php
include('cookie.php');
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>

Je récupère mon JSON.

<?php
include('cookie.php');
$resultat_json = json_decode(file_get_contents('langue.js'),true);
?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>

le file_get_contents me sert à lire le contenu du document "langue.js", le json_decode me met l'ensemble en tableau sous PHP. Il suffit de faire un var_dump sur $resultat_json pour le voir. Je mets en true, je veux pas de string, même pas dans tes rêves les plus cons, je veux un array (pas d' interprétation douteuse, merci...). Voilà, j' ai mes petits cookies, mon JSON, je touche presque au but.

Quatrième étape : reconnaître la langue de son visiteur.

Est-elle bleue...sa langue? Non, je déconne. Allez, soyons fous, j'ai décidé de te faire réfléchir, bah oui, pourquoi pas. Un même visiteur peut revenir plusieurs fois. Un visiteur peut aussi refuser catégoriquement les cookies ou les supprimer régulièrement. Et oui, certains internautes n' aiment les gateaux. Un visiteur peut être d' une nationalité différente que les langues envisagées ou se trouver dans un pays lointain, une belle ile des mers du sud. Nous allons donc vérifier en premier si un cookie existe et quelle est sa valeur tout en laissant une valeur par défaut!

<?php
include('cookie.php');
$resultat_json = json_decode(file_get_contents('langue.js'),true);
?>
<!DOCTYPE html>
<html>
<head>
<?php
if (isset($_COOKIE['_f'])) {
$monTexte = $resultat_json["fr"];
}
elseif (isset($_COOKIE['_d'])) {
$monTexte = $resultat_json["de"];
}
elseif (isset($_COOKIE['_e'])) {
$monTexte = $resultat_json["en"];
}
else{

}
?>
</head>
<body>
</body>
</html>

Maintenant, on va aller chercher la langue de l'utilisateur, si celle-ci n' est toujours pas reconnue, il faut, et c' est impératif, laisser une valeur par défaut. Bah oui, si ton utilisateur est Russe, il faut quand même afficher quelque chose. En Français par défaut, alors?

<?php
include('cookie.php');
$resultat_json = json_decode(file_get_contents('langue.js'),true);
?>
<!DOCTYPE html>
<html>
<head>
<?php
if (isset($_COOKIE['_f'])) {
$monTexte = $resultat_json["fr"];
}
elseif (isset($_COOKIE['_d'])) {
$monTexte = $resultat_json["de"];
}
elseif (isset($_COOKIE['_e'])) {
$monTexte = $resultat_json["en"];
}
else {
$language_user=substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
if ($language_user=="en") {
$monTexte = $resultat_json["en"];
}
elseif ($language_user=="de") {
$monTexte = $resultat_json["de"];
}
elseif ($language_user=="fr") {
$monTexte = $resultat_json["fr"];
}
else {
$monTexte = $resultat_json["fr"];
}
}
?>
</head>
<body>
</body>
</html>

Cinquième étape : lancer les requêtes.

Un visiteur veux te prendre la langue. Oh, le gros cochon! Bon, il suffit de mettre des liens (oh là, ça tourne carrément SM). En pratique:

<a href="<?php print $_SERVER['PHP_SELF']."?"."fr" ?>" >FR </a>
<a href="<?php print $_SERVER['PHP_SELF']."?"."en" ?>" >EN </a>
<a href="<?php print $_SERVER['PHP_SELF']."?"."de" ?>" >DE </a>

Et donc dans la page :

<?php
include('cookie.php');
$resultat_json = json_decode(file_get_contents('langue.js'),true);
?>
<!DOCTYPE html>
<html>
<head>
<?php
if (isset($_COOKIE['_f'])) {
$monTexte = $resultat_json["fr"];
}
elseif (isset($_COOKIE['_d'])) {
$monTexte = $resultat_json["de"];
}
elseif (isset($_COOKIE['_e'])) {
$monTexte = $resultat_json["en"];
}
else {
$language_user=substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
if ($language_user=="en") {
$monTexte = $resultat_json["en"];
}
elseif ($language_user=="de") {
$monTexte = $resultat_json["de"];
}
elseif ($language_user=="fr") {
$monTexte = $resultat_json["fr"];
}
else {
$monTexte = $resultat_json["fr"];
}
}
?>
</head>
<body>
<a href="<?php print $_SERVER['PHP_SELF']."?"."fr" ?>" >FR </a>
<a href="<?php print $_SERVER['PHP_SELF']."?"."en" ?>" >EN </a>
<a href="<?php print $_SERVER['PHP_SELF']."?"."de" ?>" >DE</a>
<?php
echo $monTexte["title"]."<br/>";
echo $monTexte["description"]."<br/>";
?>
</body>
</html>

Conclusion : un détail qui a son importance.

Nous n' avons pas ici vérifié que le JSON était valide, simplement parce c' est moi tout seul personnellement qui l' ai fait. Si le JSON est pourri, le resultat_json va retourner NULL. A prévoir, une condition du style if($resultat_json!="NULL") {... Penses à la recherche d' erreurs, tu peux savoir tout de suite que ton JSON est pourri. Maintenant, comme d' hab, sois créatif et si tu as des questions, tu peux me contacter.