New file |
0,0 → 1,199 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* I18n permet de traduire une application à partir de données stockées dans des fichiers ini. |
* Si vous souhaitez utiliser le fonctionnement par défaut vous devrez : |
* - déposer les fichiers ini dans le dossier définit par la variable de config "chemin_i18n". |
* - nommer les fichiers selon la forme "locale.ini" (Ex.: fr.ini ou fr_CH.ini ). |
* |
* Elle offre l'accès en lecture seule aux paramètres de des fichiers ini. |
* C'est une Singleton. Une seule classe de traduction peut être instanciée par Application. |
* |
* @category PHP 5.2 |
* @package Framework |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license GPL-v3 et CECILL-v2 |
* @version $Id$ |
* @link /doc/framework/ |
*/ |
|
class I18n { |
/** Format de traduction utilisant les fichier .ini */ |
const FORMAT_INI = '.ini'; |
|
/** Instance de la classe pointant sur elle même (pour le pattern singleton) */ |
private static $instance = null; |
|
/** Fichiers de traduction disponibles. */ |
private static $traductions = array(); |
|
/** Langue courrante utilisée par l'application. */ |
private static $langue = null; |
|
private function __construct() { |
self::verifierParametresConfig(); |
self::trouverLangue(); |
} |
|
/** |
* Accesseur pour la valeur d'une traduction |
* @param string $param le nom du paramètre |
* @return string la valeur du paramètre |
*/ |
public static function get($identifiant, $langue = null) { |
self::verifierCreationInstance(); |
$texte = ''; |
|
// Récupération de la langue actuellement demandée |
$langue_a_charger = self::$langue; |
if (!is_null($langue)) { |
$langue_a_charger = $langue; |
} |
|
if (!isset(self::$traductions[$langue_a_charger])) { |
// Tentative de chargement du fichier de traduction |
$chargement = self::charger($langue_a_charger); |
if ($chargement === false) { |
$m = "Le fichier d'i18n pour la langue '$langue_a_charger' demandée n'a pas été trouvé."; |
self::ajouterErreur($m); |
} |
} |
|
// Recherche de la langue dans le tableau des traductions |
if (isset(self::$traductions[$langue_a_charger]) && self::$traductions[$langue_a_charger] !== false) { |
// Recherche de la traduction demandée |
$valeur = self::getValeur($identifiant, self::$traductions[$langue_a_charger]); |
if ($valeur !== false) { |
$texte = $valeur; |
} else { |
$m = "Le traduction n'existe pas pour l'identifiant '$identifiant' demandé."; |
self::ajouterErreur($m); |
} |
} |
|
return $texte; |
} |
|
/** |
* Charge un fichier ini dans le tableau des paramètres de l'appli |
* @param string $fichier_ini le nom du fichier à charger |
* @return boolean true, si le fichier a été trouvé et correctement chargé, sinon false. |
*/ |
public static function charger($langue, $fichier = null, $format = self::FORMAT_INI) { |
self::verifierCreationInstance(); |
$ok = false; |
|
// Création du chemin vers le fichier de traduction par défaut |
if (is_null($fichier)) { |
$fichier = Config::get('chemin_i18n').$langue.$format; |
} |
|
// Chargement |
if ($format == self::FORMAT_INI) { |
$ok = self::chargerFichierIni($fichier, $langue); |
} else { |
$m = "Le format '$format' de fichier de traduction n'est pas pris en compte par le Framework."; |
self::ajouterErreur($m); |
} |
|
return $ok; |
} |
|
/** |
* Définit la langue utiliser pour rechercher une traduction. |
* @param string $fichier_ini le nom du fichier à charger |
* @return array le fichier ini parsé |
*/ |
public static function setLangue($langue) { |
self::verifierCreationInstance(); |
self::$langue = $langue; |
} |
|
/** |
* Renvoie la valeur demandé grâce une chaine de paramètres |
* @param string $param la chaine identifiante |
* @param array $i18n le tableau de traductions |
* @return mixed la valeur correspondante à la chaine identifiante si elle est trouvée, sinon false. |
*/ |
private static function getValeur($param, $i18n) { |
if ($param === null) { |
return false; |
} else { |
if (isset($i18n[$param])) { |
return $i18n[$param]; |
} else if (strpos($param, '.') !== false) { |
$pieces = explode('.', $param, 2); |
if (strlen($pieces[0]) && strlen($pieces[1])) { |
if (isset($i18n[$pieces[0]])) { |
if (is_array($i18n[$pieces[0]])) { |
return self::getValeur($pieces[1], $i18n[$pieces[0]]); |
} |
} |
} |
} else { |
return false; |
} |
} |
} |
|
/** |
* Parse le fichier ini donné en paramètre |
* @param string $fichier_ini nom du fichier ini à parser |
* @param string $langue la langue correspondant au fichier |
* @return boolean true si le chargement c'est bien passé, sinon false. |
*/ |
private static function chargerFichierIni($fichier_ini, $langue) { |
self::$traductions[$langue] = false; |
if (file_exists($fichier_ini)) { |
self::$traductions[$langue] = parse_ini_file($fichier_ini, true); |
} |
return (self::$traductions[$langue] === false) ? false : true; |
} |
|
/** |
* Cherche l'information sur la langue demandée par l'application |
*/ |
private static function trouverLangue() { |
if (isset($_GET[Config::get('i18n_url_parametre')])) { |
self::$langue = $_GET[Config::get('i18n_url_parametre')]; |
} else { |
self::$langue = Config::get('i18n_langue_defaut'); |
} |
} |
|
/** |
* Vérifie si l'instance de classe à été crée, si non la crée |
*/ |
private static function verifierCreationInstance() { |
if (empty(self::$instance)) { |
self::$instance = new I18n(); |
} |
} |
|
/** |
* Vérifie que tous les paramêtres de config nécessaires au fonctionnement de cette classe existe dans les fichiers |
* de configurations. |
*/ |
private static function verifierParametresConfig() { |
$ok = true; |
$parametres = array('chemin_i18n', 'i18n_url_parametre', 'i18n_langue_defaut'); |
foreach ($parametres as $param) { |
if (is_null(Config::get($param))) { |
$m = "L'utilisation de la classe I18n nécessite de définir '$param' dans un fichier de configuration."; |
self::ajouterErreur($m); |
$ok = false; |
} |
} |
return $ok; |
} |
|
/** |
* Ajouter une message d'erreur |
*/ |
private static function ajouterErreur($m, $e = E_USER_WARNING) { |
if (Config::get('fw_debogage') === true) { |
trigger_error($m, $e); |
} |
} |
} |