Browse Source

Crée une classe pour gérer les traductions

Cela est utile pour ne pas réimplémenter la gestion des traductions et
apporte les fonctionnalités suivantes :
- extensibilité de la gestion des traductions,
- possibilité de compléter une traduction par une autre,
- utilise le français comme langue si :
  - Le fichier de traduction choisi n'est pas trouvé.
  - La clé recherchée n'est pas trouvée.
- permet d'y greffer d'autres traductions (les greffons par exemple)
Christophe HENRY 7 years ago
parent
commit
21fea99012
1 changed files with 71 additions and 9 deletions
  1. 71 9
      i18n.php

+ 71 - 9
i18n.php

@@ -6,24 +6,86 @@
  @description:  Fonctions de gestion de la traduction
  */
 
+define('DEFAULT_LANGUAGE', 'fr');
+
+class Translation {
+
+    const LOCALE_DIR='locale';
+
+    // tableau associatif des traductions
+    var $trans = array();
+
+    function __construct($location) {
+        assert('defined("LANGUAGE") && ""!=LANGUAGE');
+        assert('defined("DEFAULT_LANGUAGE") && ""!=DEFAULT_LANGUAGE');
+        $this->language = LANGUAGE;
+        $this->defaultLanguage = DEFAULT_LANGUAGE;
+        $this->location = $location;
+        $this->load();
+    }
+
+    /* Charge la traduction pour la langue sélectionnée.*/
+    protected function load() {
+        $trans = $this->loadFile($this->language);
+        if ($this->language!=$this->defaultLanguage) {
+            $defaultTrans = $this->loadFile($this->defaultLanguage);
+            $trans = array_merge($defaultTrans, $trans);
+        }
+        $this->trans = $trans;
+    }
+
+    /* Charge un fichier
+     * @param $language Le fichier de langue concerné
+     * @return Tableau associatif contenant les traductions */
+    protected function loadFile($language) {
+        $fileName = $this->location.'/'.self::LOCALE_DIR.'/'.$language.'.json';
+        $content = @file_get_contents($fileName);
+        if (empty($content)) {
+            error_log("Translation for $language ($fileName) not found!");
+            $translations = array();
+        } else {
+            $translations = json_decode($content, true);
+        }
+        return $translations;
+    }
+
+    /* Retourne la traduction et substitue les variables.
+     * get('TEST_TRANS', array('4'))
+     * Retournera 'Nombre : 4' si TEST_TRANS == 'Nombre : $1' */
+    function get($key, $args=array()) {
+        if (isset($this->trans[$key])) {
+            $value = $this->trans[$key];
+            for($i=0;$i<count($args);$i++){
+                $value = str_replace('$'.($i+1), $args[$i], $value);
+            }
+        } else {
+            $value = $key;
+        }
+        return $value;
+    }
+
+    /* Ajoute une traduction à la suite de celle-ci. */
+    function append(Translation $other) {
+        $this->trans = array_merge($this->trans, $other->trans);
+    }
+
+    function getJson() {
+        return json_encode($this->trans);
+    }
+
+}
 
 function i18n_init(){
     global $i18n,$i18n_js;
     if(!isset($i18n)){
-        $i18n_js =  file_get_contents(dirname(__FILE__).'/locale/'.LANGUAGE.'.json');
-        $i18n = json_decode($i18n_js,true);
+        $i18n = new Translation(dirname(__FILE__));
+        $i18n_js = $i18n->getJson();
     }
 }
 
 function _t($key,$args=array(),$debug=false){
     global $i18n;
-
-    $value = (isset($i18n[$key])?$i18n[$key]:'');
-    for($i=0;$i<count($args);$i++){
-        $value = str_replace('$'.($i+1), $args[$i], $value);
-    }
-    if($debug) var_dump($key,$args,$i18n[$key],$value);
-    return $value;
+    return $i18n->get($key, $args);
 }