1: <?php
2:
3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
19:
20: class I18n {
21:
22: const FORMAT_INI = '.ini';
23:
24:
25: private static $instance = null;
26:
27:
28: private static $traductions = array();
29:
30:
31: private static $langue = null;
32:
33: private function __construct() {
34: self::verifierParametresConfig();
35: self::trouverLangue();
36: }
37:
38: 39: 40: 41: 42:
43: public static function get($identifiant, $langue = null) {
44: self::verifierCreationInstance();
45: $texte = '';
46:
47:
48: $langue_a_charger = self::$langue;
49: if (!is_null($langue)) {
50: $langue_a_charger = $langue;
51: }
52:
53: if (!isset(self::$traductions[$langue_a_charger])) {
54:
55: $chargement = self::charger($langue_a_charger);
56: if ($chargement === false) {
57: $m = "Le fichier d'i18n pour la langue '$langue_a_charger' demandée n'a pas été trouvé.";
58: self::ajouterErreur($m);
59: }
60: }
61:
62:
63: if (isset(self::$traductions[$langue_a_charger]) && self::$traductions[$langue_a_charger] !== false) {
64:
65: $valeur = self::getValeur($identifiant, self::$traductions[$langue_a_charger]);
66: if ($valeur !== false) {
67: $texte = $valeur;
68: } else {
69: $m = "Le traduction n'existe pas pour l'identifiant '$identifiant' demandé.";
70: self::ajouterErreur($m);
71: }
72: }
73:
74: return $texte;
75: }
76:
77: 78: 79: 80: 81:
82: public static function charger($langue, $fichier = null, $format = self::FORMAT_INI) {
83: self::verifierCreationInstance();
84: $ok = false;
85:
86:
87: if (is_null($fichier)) {
88: $fichier = Config::get('chemin_i18n').$langue.$format;
89: }
90:
91:
92: if ($format == self::FORMAT_INI) {
93: $ok = self::chargerFichierIni($fichier, $langue);
94: } else {
95: $m = "Le format '$format' de fichier de traduction n'est pas pris en compte par le Framework.";
96: self::ajouterErreur($m);
97: }
98:
99: return $ok;
100: }
101:
102: 103: 104: 105: 106:
107: public static function setLangue($langue) {
108: self::verifierCreationInstance();
109: self::$langue = $langue;
110: }
111:
112: 113: 114: 115: 116: 117:
118: private static function getValeur($param, $i18n) {
119: if ($param === null) {
120: return false;
121: } else {
122: if (isset($i18n[$param])) {
123: return $i18n[$param];
124: } else if (strpos($param, '.') !== false) {
125: $pieces = explode('.', $param, 2);
126: if (strlen($pieces[0]) && strlen($pieces[1])) {
127: if (isset($i18n[$pieces[0]])) {
128: if (is_array($i18n[$pieces[0]])) {
129: return self::getValeur($pieces[1], $i18n[$pieces[0]]);
130: }
131: }
132: }
133: } else {
134: return false;
135: }
136: }
137: }
138:
139: 140: 141: 142: 143: 144:
145: private static function chargerFichierIni($fichier_ini, $langue) {
146: self::$traductions[$langue] = false;
147: if (file_exists($fichier_ini)) {
148: $ini = parse_ini_file($fichier_ini, true);
149: Debug::printr($ini, 'Avant :');
150: $ini = self::analyserTableauIni($ini);
151: Debug::printr($ini, 'Aprés :');
152: self::$traductions[$langue] = $ini;
153: }
154: return (self::$traductions[$langue] === false) ? false : true;
155: }
156:
157: 158: 159: 160: 161:
162: private static function analyserTableauIni($i18n = array()) {
163:
164: foreach ($i18n as $cle => &$valeur) {
165: if (is_array($valeur)) {
166: $i18n[$cle] = self::analyserTableauIni($valeur);
167: } else {
168: $i18n = self::evaluerCle($i18n, $cle, $valeur);
169: }
170: }
171: return $i18n;
172: }
173:
174: 175: 176: 177: 178: 179: 180:
181: private static function evaluerCle($i18n, $cle, $valeur) {
182: if (strpos($cle, '.') !== false) {
183: unset($i18n[$cle]);
184: $pieces = explode('.', $cle, 2);
185: if (strlen($pieces[0]) && strlen($pieces[1])) {
186: if (isset($i18n[$pieces[0]]) && !is_array($i18n[$pieces[0]])) {
187: $m = "Ne peut pas créer de sous-clé pour '{$pieces[0]}' car la clé existe déjà";
188: trigger_error($m, E_USER_WARNING);
189: } else {
190: $i18n[$pieces[0]][$pieces[1]] = $valeur;
191: $i18n[$pieces[0]] = self::evaluerCle($i18n[$pieces[0]], $pieces[1], $valeur);
192: }
193: } else {
194: $m = "Clé invalide '$cle'";
195: trigger_error($m, E_USER_WARNING);
196: }
197: } else {
198: $i18n[$cle] = $valeur;
199: }
200: return $i18n;
201: }
202:
203: 204: 205:
206: private static function trouverLangue() {
207: if (isset($_GET[Config::get('i18n_url_parametre')])) {
208: self::$langue = $_GET[Config::get('i18n_url_parametre')];
209: } else {
210: self::$langue = Config::get('i18n_langue_defaut');
211: }
212: }
213:
214: 215: 216:
217: private static function verifierCreationInstance() {
218: if (empty(self::$instance)) {
219: self::$instance = new I18n();
220: }
221: }
222:
223: 224: 225: 226:
227: private static function verifierParametresConfig() {
228: $ok = true;
229: $parametres = array('chemin_i18n', 'i18n_url_parametre', 'i18n_langue_defaut');
230: foreach ($parametres as $param) {
231: if (is_null(Config::get($param))) {
232: $m = "L'utilisation de la classe I18n nécessite de définir '$param' dans un fichier de configuration.";
233: self::ajouterErreur($m);
234: $ok = false;
235: }
236: }
237: return $ok;
238: }
239:
240: 241: 242:
243: private static function ajouterErreur($m, $e = E_USER_WARNING) {
244: if (Config::get('fw_debogage') === true) {
245: trigger_error($m, $e);
246: }
247: }
248: }