Vous avez décidé de faire un site multi-langue ? Voici quelques méthodes simples pour y arriver selon le type de site sur lequel vous allez travailler.
Pour un petit site de quelques pages dans deux ou trois langues, qui n'est pas appelé à être mis à jour fréquemment (comprendre jamais), on peut envisager de dupliquer les pages pour chaque langue.
Utiliser des variables
Dupliquer les pages c'est mignon pour un site de 4 pages, mais au-delà c'est fastidieux. L'idée pour avoir un site plus facile à maintenir est de mettre en place une carcasse dans laquelle vont s'insérer les différents textes traduits. Facile a mettre en place puisqu'une variable globale qui contient les textes et des simples include en php feront l'affaire.
Imaginons un site en 3 langues dont la structure serait la suivante :
J'utilise un fichier index.php unique qui va servir à définir la langue, charger le contenu dans la langue souhaitée et affiche le code html.
Le dossier lang contient un sous-dossier par langue. Chaque sous-dossier de langue contient les mêmes fichiers PHP. Pour rajouter une langue il suffit de dupliquer le dossier fr et traduire les textes.
Pour afficher les textes, on définit un tableau PHP (array) qui contiendra tous les couples clé / valeur nécessaires
// définit les textes
$text = array();
$text['titre'] = 'Bienvenue';
$text['intro'] = 'Bienvenue sur ce site de vente de marinières !';
// affiche les textes
echo '<h1>'.$text['titre'].'</h1>';
echo '<p>'.$text['intro'].'</p>';
Le fichier index.php du site
// on définit la langue
if($_GET['lang']=='en'){
$lang = 'en';
}else if($_GET['lang']=='de'){
$lang = 'en';
}else{
$lang = 'fr';
}
// fichier de contenu de la page
$contenu = $_GET['contenu'];
// la variable $text contient tous les textes à afficher
$text = array();
// - - - - - - - - - - - - - - - - - - - - - - - - -
// charge les textes communs de la langue
include 'lang/'.$lang.'/commun.php';
// affiche le contenu HTML
echo '
<!DOCTYPE html>
<html lang="'.$lang.'">
<head>
<title>'.$text['pageTitle'].'</title>
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<ul>
<li><a href="'.$text['menuLang1Link'].'" title="'.$text['menuLang1Title'].'">'.$text['menuLang1'].'</a></li>
<li><a href="'.$text['menuLang2Link'].'" title="'.$text['menuLang2Title'].'">'.$text['menuLang2'].'</a></li>
<li><a href="'.$text['menuLang3Link'].'" title="'.$text['menuLang3Title'].'">'.$text['menuLang3'].'</a></li>
</ul>
<hr />
<ul>
<li><a href="'.$text['menuHomeLink'].'" title="'.$text['menuHomeTitle'].'">'.$text['menuHome'].'</a></li>
<li><a href="'.$text['menuContactLink'].'" title="'.$text['menuContactTitle'].'">'.$text['menuContact'].'</a></li>
</ul>
';
// charge le contenu de la page actuelle
include 'lang/'.$lang.'/'.$contenu.'.php';
// pied de page html
echo '
<hr />
<ul>
<li>'.$text['menuDroitReserve'].'</li>
<li><a href="'.$text['menuMentionLink'].'" title="'.$text['menuMentionTitle'].'">'.$text['menuMention'].'</a></li>
</ul>
';
Les fichiers de langue
Voici le fichier commun de la version française (lang/fr/commun.php). Ce fichier contient des textes qui sont affichés quelle que soit la page visitée.
$text['menuLang1Link'] = 'bienvenue.html';
$text['menuLang1Title'] = '';
$text['menuLang1'] = 'Fançais';
$text['menuLang1Link'] = 'welcome.html';
$text['menuLang1Title'] = '';
$text['menuLang1'] = 'English';
$text['menuLang1Link'] = 'wilkommen.html';
$text['menuLang1Title'] = '';
$text['menuLang1'] = 'Deutsch';
$text['menuHomeLink'] = 'accueil.html';
$text['menuHomeTitle'] = 'Retour à la page d\'accueil';
$text['menuHome'] = 'Accueil';
$text['menuContactLink'] = 'contactez-nous.html';
$text['menuContactTitle'] = 'Contactez-nous';
$text['menuContact'] = 'Contact';
$text['menuDroitReserve'] = 'Tous droit réservés';
$text['menuMentionLink'] = 'mentions-legales.html';
$text['menuMentionTitle'] = 'Mentions légales du site www.monSite.fr';
$text['menuMention'] = 'Mentions légales';
Les fichiers lang/de/commun.php et lang/en/commun.php contiennent simplement les textes traduits.
Le fichier .htaccess
Les liens du site sont définis dans les fichiers de langue et sont gérés dans le fichier .htaccess. Cette solution, parmi d'autres, vous permet facilement modifier votre système de lien pour profiter de l'avantage des liens dans le référencement de votre site.
# active la reécriture d'url
RewriteEngine On
# lien des choix de langues
RewriteRule ^bienvenue.html$ index.php?lang=fr&contenu=index [L]
RewriteRule ^welcome.html$ index.php?lang=en&contenu=index [L]
RewriteRule ^wilkommen.html$ index.php?lang=de&contenu=index [L]
# liens du menu français
RewriteRule ^accueil.html$ index.php?lang=fr&contenu=index [L]
RewriteRule ^contactez-nous.html$ index.php?lang=fr&contenu=contact [L]
RewriteRule ^mentions-legales.html$ index.php?lang=fr&contenu=mentions [L]
# liens du menu anglais
[...]
# liens du menu allemand
[...]
Variante du fichier .htaccess
Dans ce premier exemple j'ai défini les URL dans les fichiers de texte et dans le fichier .htaccess. Cette méthode est pratique pour avoir des belles url bien référencées, mais fastidieuse puisque chaque nouvelle url (chaque page du site donc) devra être ajoutée dans les fichiers textes et dans le fichier .htaccess.
Heureusement vous pouvez vous faciliter la vie en utilisant une structure simple tel que :
RewriteRule ^([a-zA-Z]{2})/([0-9]+)/([-_a-zA-Z0-9]+)\.html$ index.php?lang=$1&contenu=$2 [L]
Dans cette méthode l'URL est définie par :
- la langue : deux caractères alphabétiques ([a-zA-Z]{2})
- le contenu : un entier ([0-9]+)
- le texte utilisé pour le référencement : un texte alpha numérique ([-_a-zA-Z0-9]+)
Le serveur va passer au fichier index.php deux variables $_GET['lang'] et $_GET['contenu']. La première est déjà gérée dans l'exemple, mais pas la seconde.
// définit un tableau qui contient la liste des fichiers de texte
$pageList = array(1=>'index', 2=>'contact', 3=>'mentions');
// initialise la variable envoyé par le serveur
$contenu = intval($_GET['contenu'])
// vérifie si la variable est valide
if(empty($pageList[$contenu]) $contenu = 1;
// définit la variable $contenu
$contenu = $pageList[$contenu];
Cette solution a le mérite d'être parfaitement modulable.