Bonjour à tous et à toutes !
Dans le but de contribuer comme la plus part des personnes ici, je propose une classe permettant de gérer différentes langues sur son site avec l'utilisation d'XML (SimpleXML dans mon cas). Ce n'est surement pas la meilleur façon de faire ceci, mais bon je propose ma solution, elle marche très bien (pour ma part ^^) et elle n'est pas très dur à comprendre.
Il faut créer un dossier contenant les langues et placer les langues comme ceci : fr/page.xml, de/page.xml, en/page.xml, ja/page.xml etc...
Je précise aussi que pour gérer le japonais etc... j'encode mes fichier en utf-8 sans BOM ! (si ce n'est pas les cas, les accents etc... seront affichés bizarrement). Ici les fichiers sont encodés comme y faut (pour l'archive).
Source / Exemple :
Fichier Langues.class.php :
<?php
error_reporting(E_ALL & ~E_NOTICE);
class Langues {
// Langue par le code ISO 639 (défaut : français)
private $_langue = 'fr';
// Dossier contenant les langues
private $_dirLangue = '';
// Objet SimpleXML
private $_simpleXML = null;
/*
Constructeur
Récupère la langue via le navigateur, sinon charge celle par défaut ou si une langue est spécifiée, on charge celle ci. Permet aussi de spécifier le dossier où ce trouvent les langues
@access public
@param $langue, $dirLangue, $fichier
@return void
public function __construct($dirLangue, $fichier, $langue = false) {
if(is_dir($dirLangue)) {
$this->_dirLangue = $dirLangue;
}
else {
$this->_dirLangue = 'langues';
}
if($langue) {
$this->_langue = strtolower($langue);
}
else {
if($lang = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2))) {
$this->_langue = $lang;
}
else {
$this->_langue = 'fr';
}
}
if(file_exists($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml')) {
// Chargement du fichier langue
$this->loadXmlFile($fichier);
}
else {
die('Fichier XML ('.$this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml) innexistant ! Merci de vérifier que celui ci existe.');
}
}
/*
Charge le fichier XML
@access private
@param $fichier
@return void
private function loadXmlFile($fichier) {
$this->_simpleXML = simplexml_load_file($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.xml');
}
/*
Charge le message à afficher
@access public
@param $texte
@return $texte
public function show_text($texte) {
$resultat = $this->_simpleXML->xpath($texte);
foreach($resultat as $noeud) {
return $noeud;
}
}
}
?>
Fichier fr/index.xml :
<?xml version="1.0" encoding="utf-8"?>
<langue>
<msg_test>Bonjour le monde</msg_test>
</langue>
Fichier en/index.xml :
<?xml version="1.0" encoding="utf-8"?>
<langue>
<msg_test>Hello world</msg_test>
</langue>
Fichier de/index.xml :
<?xml version="1.0" encoding="utf-8"?>
<langue>
<msg_test>Hallo Welt</msg_test>
</langue>
Fichier ja/index.xml :
<?xml version="1.0" encoding="utf-8"?>
<langue>
<msg_test>こんにちは</msg_test>
</langue>
Fichier test.php :
<?php
// Chargement de la classe
include_once('Langues.class.php');
// Création d'un nouvel objet Langue avec comme paramètres le dossier langue et le fichier xml à charger (et en facultatif une session contenant la langue à charger, peut être utilisé dans un système de membre, avec une session contenant la langue du membre).
$langue = new Langues('langues', 'index');
// $langue = new Langues('langues', 'index', 'ja');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test du multilangue</title>
</head>
<body>
<?php
// Et on affiche du texte
echo $langue->show_text('msg_test');
?>
</body>
</html>
Conclusion :
Voilà le code source est donné, je suis désolé pour l'orthographe (ça m'étonnerai qu'il n'y est pas de fautes >.<).
Pour l'utilisation, c'est très simple :
<?php
// Chargement de la classe
include_once('Langues.class.php');
// Création d'un nouvel objet Langue avec comme paramètres le dossier langue et le fichier xml à charger (et en facultatif une session contenant la langue à charger, peut être utilisé dans un système de membre, avec une session contenant la langue du membre).
$langue = new Langues('langues', 'index');
// $langue = new Langues('langues', 'index', 'ja');
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "
http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="
http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test du multilangue</title>
</head>
<body>
<?php
// Et on affiche du texte
echo $langue->show_text('msg_test');
?>
</body>
</html>
Ce code affichera : Hello world en anglais, Bonjour le monde en français, Hallo Welt en allemand, こんにちは en japonais etc...
Voilà merci de commenter cette source et de donner vos avis, remarques etc...
Bonne journée ;)
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.