Crois-le ou non, mais c'est beaucoup plus simple avec du xml : tu crées une classe qui gère la localisation, et après, c'est fini. Pour ajouter une langue, il suffit de copier un fichier xml de localisation, et de changer les traductions. C'est nettement plus simple à utiliser qu'une localisation à base de variables. Et quelqu'un ne connaissant rien au php peut le faire.
Mon package de documentation automatique de classes et de fonctions utilise cette classe : (personnalisée, là) :
<?php
class olocale {
private $aMessages = array ();
private $locale = '';
public function __construct ($loc) {
$this -> locale = $loc;
$this -> setaMessages ();
}
private function setaMessages () {
$aFiles = scandir ('locales/'.$this -> locale);
$aForbid = array ('.', '..');
$aFiles = array_diff ($aFiles, $aForbid);
foreach ($aFiles as $file) {
$cat = substr ($file, 0, strlen ($file) -4);
$xml = simplexml_load_file('locales/'.$this -> locale.'/'.$file);
foreach ($xml as $clef => $val) {
$this -> aMessages[$cat][$clef] = $val;
}
}
}
public function getMsg ($cat, $clef) {
return (string)$this -> aMessages[$cat][$clef];
}
public function getLoc () {
return (string)$this -> locale;
}
}
?>
Mes fichiers xml sont placés ainsi :
locales/english/fichiers.xml
locales/french/fichiers.xml
Dans mon cas, j'ai 3 fichiers par langue, chacun étant dédié à un type de message (erreurs, UI, doc).
Un exemple de fichier (error.xml) :
<?xml version='1.0' encoding="ISO-8859-1"?>
<errors>
<doc_optional>Optional</doc_optional>
<doc_mandatory>Mandatory</doc_mandatory>
<doc_yes>Yes</doc_yes>
<doc_no>No</doc_no>
<doc_methods>Methods</doc_methods>
<doc_properties>Properties</doc_properties>
<doc_functions>Functions</doc_functions>
<doc_parameters>Parameters</doc_parameters>
<doc_seecode>See code</doc_seecode>
<doc_filesize>Filesize</doc_filesize>
<doc_filelines>Nb lines</doc_filelines>
<doc_file_def1>defined in</doc_file_def1>
<doc_file_def2>from line</doc_file_def2>
<doc_file_def3>to line</doc_file_def3>
<doc_returns_ref>Returns reference</doc_returns_ref>
<doc_comments>Author's comments</doc_comments>
<doc_owner>Owner</doc_owner>
<doc_modifiers>Modifiers</doc_modifiers>
<doc_default_value>Defauls value</doc_default_value>
<doc_returns>Documented return value</doc_returns>
<doc_params>Documented parameters value</doc_params>
<doc_constants>Constants</doc_constants>
</errors>
Puis j'appelle un message comme ça (j'ai un formulaire présent partout de choix de la langue):
// initalisation de la langue
if (!isset ($_SESSION['locale']) || empty ($_SESSION['locale'])) {
$_SESSION['locale'] = 'francais';
}
// instanciation de ma classe
$oloc = new olocale ($_SESSION['locale']);
// appel d'un message :
$sError = $oloc -> getMsg ('errors', 'failed_upload');
Changer une localisatioon est simple (ou en ajouter une plutôt ) :
on crée le dossier : locales/ouzbeque
On y copie les 3 fichiers xml , et on modifie les valeurs :
<doc_constants>Constants</doc_constants>
=>
<doc_constants>ktabebkgalkl</doc_constants>
(désolé, mon ouzbèque n'est pas terrible...)
Et on ajoute la le choix de l'ouzbeque dans le formulaire. C'est tout. Le package est localisé en ouzbeque.