1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| <?php
namespace I18n\Translation;
class Translator
{
/**
* @var string
*/
private static $default_lang = '';
/**
* @var string
*/
private static $current_lang = '';
/**
* Fichiers de traduction
* Chaque fichier doit renvoyer un tableau [mot clé => traduction]
* @var array [lang => chemin complet vers le fichier]
*/
private static $path = [];
/**
* Liste des fichiers de traduction chargés
* @var array [lang => [keyword => translation]]
*/
private static $parsed = [];
/**
* @param string $lang
* @param string $full_path php file that MUST return an array
* @param bool $is_default
*/
public static function addPath(string $lang, string $full_path, bool $is_default = false): void
{
self::$path[$lang] = $full_path;
if ($is_default) {
self::$default_lang = $lang;
}
}
/**
* @param string $lang
*/
public static function setCurrentLang(string $lang): void
{
self::$current_lang = $lang;
}
/**
* @param string $lang
*/
public static function setDefaultLang(string $lang): void
{
self::$default_lang = $lang;
}
/**
* Traduction
* Renvoie un tableau de valeurs traduites échappées, compatibles HTML
* Si traduction mansuante : renvoie les mots clés tels quels
*
* @param array [keywords]
* @return array [keyword => escaped translation]
*/
public static function tr(array $keywords): array
{
$hsc = function(string $p): string { return htmlspecialchars($p, ENT_QUOTES, 'utf-8'); };
$data = []; // résultats
$is_available = function(string $lang): bool {
if (($lang === '') || ( ! isset(self::$path[$lang])) || ( ! is_file(self::$path[$lang]))) {
return false;
}
// chargement du fichier de traduction si nécessaire
if ( ! isset(self::$parsed[$lang])) {
self::$parsed[$lang] = include self::$path[$lang];
}
return true;
};
foreach ($keywords as $keyword) {
// si tout est ok alors on stock immédiatement la traduction échappée
if (isset(self::$parsed[self::$current_lang][$keyword])) {
$data[$keyword] = $hsc(self::$parsed[self::$current_lang][$keyword]);
} else {
$current = self::$current_lang;
$default = self::$default_lang;
// si la langue courante est disponible et que le mot clé est défini
if ($is_available($current) && isset(self::$parsed[$current][$keyword])) {
$translation = self::$parsed[$current][$keyword];
$data[$keyword] = $hsc();
} elseif ($is_available($default) && isset(self::$parsed[$default][$keyword])) {
// sinon on se rabat sur la langue par défaut
$translation = self::$parsed[$default][$keyword];
} else {
// dernière possibilité : rien n'est disponible, on renvoie le mot clé
$translation = $keyword;
}
$data[$keyword] = $hsc($translation);
}
}
return $data;
}
} |