1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/leed_ynh.git synced 2024-09-03 19:26:32 +02:00
leed_ynh/sources/i18n.php
2014-06-17 17:41:03 -04:00

129 lines
4 KiB
PHP
Executable file

<?php
/*
@nom: i18n
@auteur: Idleman (idleman@idleman.fr)
@description: Fonctions de gestion de la traduction
*/
class Translation {
// Répertoire contenant les traductions
const LOCALE_DIR = 'locale';
/* Langue utilisée si aucune langue n'est demandée ou si les langues
* demandées ne sont pas disponibles. Idem pour les traductions.*/
const DEFAULT_LANGUAGE = 'fr';
// tableau associatif des traductions
var $trans = array();
var $language = ''; // langue courante
var $languages = array(); // langues disponibles
/** @param location L'endroit où se trouve le dossier 'locale'
* @param languages Les langues demandées */
function __construct($location, $languages=array()) {
$this->location = $location;
if (!is_array($languages)) $languages = array($languages);
$this->listLanguages();
$languages[]=self::DEFAULT_LANGUAGE;
foreach ($languages as $language)
if ($this->load($language)) {
$this->language = $language;
break;
}
}
/* Peuple la liste des langues avec une traduction */
protected function listLanguages() {
$this->languages = array();
$files = glob($this->location.'/'.self::LOCALE_DIR.'/*.json');
if (is_array($files)) {
foreach($files as $file){
preg_match('/([a-z]{2})\.json$/', $file, $matches);
assert('!empty($matches)');
$this->languages [] = $matches[1];
}
}
}
/* Charge la traduction
* @param language la langue sélectionnée
* @return TRUE si le chargement s'est bien fait, FALSE sinon */
protected function load($language) {
if (!preg_match('/^[a-z]{2}$/', $language)) {
error_log("Invalid language: '$language'");
return false;
}
$trans = $this->loadFile($language);
if (empty($trans)) return false;
assert('in_array($language, $this->languages)');
if ($language!=self::DEFAULT_LANGUAGE) {
$defaultTrans = $this->loadFile(self::DEFAULT_LANGUAGE);
assert('!empty($defaultTrans)');
$trans = array_merge($defaultTrans, $trans);
}
$this->trans = $trans;
return true;
}
/* 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)) {
$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.
* Note : il faudra appeler getJson() si nécessaire */
function append(Translation $other) {
$this->trans = array_merge($this->trans, $other->trans);
}
/* @return la version Json des traductions */
function getJson() {
return json_encode($this->trans);
}
}
// Initialise le singleton, avec les langues possibles
function i18n_init($languages){
global $i18n,$i18n_js;
if (!isset($i18n)) {
$i18n = new Translation(dirname(__FILE__), $languages);
$i18n_js = $i18n->getJson();
}
return $i18n->language;
}
// Appel rapide de la traduction
function _t($key,$args=array(),$debug=false){
global $i18n;
return $i18n->get($key, $args);
}
?>