[poo][php5]un site multilangue via xml

Soyez le premier à donner votre avis sur cette source.

Vue 10 086 fois - Téléchargée 1 095 fois

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

Ajouter un commentaire

Commentaires

Messages postés
4
Date d'inscription
dimanche 1 mai 2011
Statut
Membre
Dernière intervention
19 novembre 2012

bonjour,
merci pour le code mais si je veux ajouter deux boutton un pour francais et un pour anglais comment je peux l'accédé
Avez vous une idée SVP?
Messages postés
106
Date d'inscription
samedi 19 mai 2007
Statut
Membre
Dernière intervention
13 avril 2009

Bonsoir,

Pour ajouter du html dans le XML (comme vous souhaitez le faire), il me semble que les balises CDATA sont faites pour ça :)

Bonne soirée.
Messages postés
2
Date d'inscription
vendredi 11 janvier 2008
Statut
Membre
Dernière intervention
6 mai 2010

Bonjour, Merci ce script m'a bien aidé. Je suis débutant et je n'arrive pas a formatter mon texte dans le fichier XML. Par exemple, j'aimerai avoir des bullet (<li>ti</li><li>tata</li>) Le faite de mettre ceci, ca ne fonctionne plus.
Avez vous une idée?
Messages postés
106
Date d'inscription
samedi 19 mai 2007
Statut
Membre
Dernière intervention
13 avril 2009

Mise à jour du fichier Langues.class.php : Utilisation de substr au lieu d'explode pour récupérer la langue (j'ai vu qu'avant il y avait un problème pour google chrome). Fonctionnel sous MZ 3.5.2, IE 8 et google chrome 2.0.172.39.
Messages postés
2
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
10 août 2009

Comme dirait Akhnethon : simple et efficace, je cherchais un truc comme ça depuis longtemps :) Très bonne source, si tu en as d'autres à proposer de cette qualité surtout n'hésite pas à les envoyer et fais-le moi savoir.
@+
Afficher les 9 commentaires

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.