[poo][php5]un site multilangue via xml

Description

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>&#12371;&#12435;&#12395;&#12385;&#12399;</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 ;)

Codes Sources

A voir également

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.