From b52ad9e970a2cf4076a7f230cdb6914b45994b8a Mon Sep 17 00:00:00 2001 From: Dominique Fournier Date: Tue, 11 Aug 2015 09:57:56 +0000 Subject: [PATCH] language : add the languageName support git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@2228 bf3deb0d-5f1a-0410-827f-c0cc1f45334c --- language.php | 119 +++++++++++++++++++++++++++++---------------------- 1 file changed, 69 insertions(+), 50 deletions(-) diff --git a/language.php b/language.php index 7b85320..8e1423b 100644 --- a/language.php +++ b/language.php @@ -22,9 +22,9 @@ class language /** Choose the best language in the browser list and which is available in locale path @param string|null $repLocale Directory where are stored the translations - @param string|null $language The coding langugage of the soft + @param string|null $languageCode The coding langugage of the soft @return string The choosed locale whithout charset (like fr_FR) */ - function languageSelection ($repLocale = "./locale", $language = "fr_FR") + function languageSelection ($repLocale = "./locale", $languageCode = "fr_FR") { $arrAccept = array (); if (isset ($_SERVER["HTTP_ACCEPT_LANGUAGE"])) @@ -57,28 +57,30 @@ class language { // La ligne ci-dessous permet de récupérer la language sans le codeset si // il est fourni en_US.UTF8 -> en_US - @list ($languagetmp, $codeset) = explode (".", $_SERVER["LC_MESSAGES"]); - $arrAccept[] = $languagetmp; + @list ($languageCodetmp, $codeset) = explode (".", + $_SERVER["LC_MESSAGES"]); + $arrAccept[] = $languageCodetmp; } if (isset ($_SERVER["LANG"])) { // La ligne ci-dessous permet de récupérer la language sans le codeset si // il est fourni en_US.UTF8 -> en_US - @list ($languagetmp, $codeset) = explode (".", $_SERVER["LANG"]); - $arrAccept[] = $languagetmp; + @list ($languageCodetmp, $codeset) = explode (".", $_SERVER["LANG"]); + $arrAccept[] = $languageCodetmp; } - // Si l'utilisateur n'a defini aucune language, on met la language par defaut + // Si l'utilisateur n'a defini aucune language, on met la language par + // defaut if (empty ($arrAccept)) - $arrAccept[] = $language; + $arrAccept[] = $languageCode; // Le tableau $arrAccept est trié par priorité de language souhaité par // l'utilisateur (0=>le plus important) // Recherche des languages disponibles dans le repertoire $repLocale $arrLanguageAvailable = $this->languageTraductionsList ($repLocale); - $arrLanguageAvailable[] = $language; + $arrLanguageAvailable[] = $languageCode; - $language = ""; + $languageCode = ""; // Analyse pour donner la meilleure language possible foreach ($arrAccept as $value) { @@ -91,34 +93,34 @@ class language $val3 = strtolower ($val); if ($val2 === $val3) { - $language = $val; + $languageCode = $val; break; } } // Regarde si un repertoire existe avec language en tant que base // (l'utilisateur demande fr et on a fr_FR.utf-8) - foreach ($arrLanguageAvailable as $languageAvailable) + foreach ($arrLanguageAvailable as $languageCodeAvailable) { - if ($value === substr ($languageAvailable, 0, strlen ($value))) + if ($value === substr ($languageCodeAvailable, 0, strlen ($value))) { - $language = $languageAvailable; + $languageCode = $languageCodeAvailable; break; } } // On a trouvé : on arrête de chercher - if ($language !== "") + if ($languageCode !== "") break; } - // Si on n'a toujours pas trouve de language, c'est que la language par defaut - // proposee en tete de fichier est inconnue : on met la language "C" et le - // code s'affiche selon la programmation - if ($language === "") - $language = "C"; + // Si on n'a toujours pas trouve de language, c'est que la language par + // defaut proposee en tete de fichier est inconnue : on met la language "C" + // et le code s'affiche selon la programmation + if ($languageCode === "") + $languageCode = "C"; - return ($language); + return ($languageCode); } /** Return the language recorded in the Cookie. Check if this language is @@ -138,11 +140,11 @@ class language /** Set the cookie with a TTL of one month @param string $cookieName The name of the cookie - @param string $language Language to store + @param string $languageCode Language to store @param string $sitepath The site path */ - function languageCookieSet ($cookieName, $language, $sitepath) + function languageCookieSet ($cookieName, $languageCode, $sitepath) { - @setcookie ($cookieName, $language, time()+60*60*24*30, $sitepath); + @setcookie ($cookieName, $languageCode, time()+60*60*24*30, $sitepath); } /** Return an array with all the languages available in the $repLocale dir @@ -184,14 +186,14 @@ class language /** This function manage the cache of $package.mo files as Apache cache them It return the $moFile to use - @param string $language Language with format "fr_FR" + @param string $languageCode Language with format "fr_FR" @param string|null $package The package name of the soft ($package.mo file). "messages" by default @param string|null $category The folder name LC_MESSAGES by default @param string|null $repLocale The folder where all the locales are stored */ - function languageCache ($language, $package="messages", $category=LC_MESSAGES, - $repLocale = "./locale") + function languageCache ($languageCode, $package="messages", + $category=LC_MESSAGES, $repLocale = "./locale") { // Apache cache le fichier messages.mo jusqu'au prochain redémarrage. L'idée // est de créer un fichier temporaire basé sur le fichier normal. Du coup, @@ -201,15 +203,15 @@ class language // La ligne ci-dessous permet de récupérer la language sans le codeset si // il est fourni en_US.UTF8 -> en_US - if (($pos = strpos ($language, ".")) !== FALSE) - list ($language, $codeset) = explode (".", $language); + if (($pos = strpos ($languageCode, ".")) !== FALSE) + list ($languageCode, $codeset) = explode (".", $languageCode); $codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!! // -> Le répertoire de données doit être fr_FR.UTF8 $category = $this->languageCategoryText ($category); - $temporaries = glob ("$repLocale/$language.$codeset/$category/*-*.mo"); - $moFile = "$repLocale/$language.$codeset/$category/$package.mo"; - $link = "$repLocale/$language.$codeset/$category/$package-".time(). - ".mo"; + $temporaries = glob ("$repLocale/$languageCode.$codeset/$category/*-*.mo"); + $moFile = "$repLocale/$languageCode.$codeset/$category/$package.mo"; + $link = "$repLocale/$languageCode.$codeset/$category/$package-". + time().".mo"; if (! file_exists ($moFile)) { return ""; @@ -255,7 +257,7 @@ class language return $link;*/ } - function languageActivation ($moFile, $language, $category = LC_MESSAGES, + function languageActivation ($moFile, $languageCode, $category = LC_MESSAGES, $repLocale = "./locale") { // Active le support Gettext pour le fichier de language .mo caché fourni en @@ -265,31 +267,31 @@ class language // fichier de language (qui peut être récupéré par languageSelection ou // languageTraductionsList // Language doit être fourni sans codeset (fr_FR et PAS fr_FR.UTF8) - if ($language !== "C" && $moFile !== "") + if ($languageCode !== "C" && $moFile !== "") { $package = substr (basename ($moFile) , 0, -3); // La ligne ci-dessous permet de récupérer la language sans le codeset si // il est fourni en_US.UTF8 -> en_US - if (($pos = strpos ($language, ".")) !== FALSE) - list ($language, $codeset) = explode (".", $language); + if (($pos = strpos ($languageCode, ".")) !== FALSE) + list ($languageCode, $codeset) = explode (".", $languageCode); $codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!! // -> Le répertoire de données doit être fr_FR.UTF8 - putenv ('LANG='.$language.'.'.$codeset); - putenv ('LANGUAGE='.$language.'.'.$codeset); - $GLOBALS["domframework"]["lang"] = $language; + putenv ('LANG='.$languageCode.'.'.$codeset); + putenv ('LANGUAGE='.$languageCode.'.'.$codeset); + $GLOBALS["domframework"]["lang"] = $languageCode; bind_textdomain_codeset ($package, "utf-8"); bindtextdomain ($package, $repLocale); textdomain ($package); - $rc = setlocale (LC_MESSAGES, $language.'.'.$codeset); + $rc = setlocale (LC_MESSAGES, $languageCode.'.'.$codeset); if ($rc === FALSE) { // Language non disponible sur le système // La liste des languages est affichée par 'locale -a' return FALSE; } - $rc = setlocale (LC_TIME, $language.'.'.$codeset); + $rc = setlocale (LC_TIME, $languageCode.'.'.$codeset); return TRUE; } @@ -307,18 +309,35 @@ class language // Language defined in the cookie $langCookie = $this->languageCookie ($languageCookie); if ($langCookie !== FALSE) - $language = $langCookie; + $languageCode = $langCookie; else - $language = $langNav; - $this->languageCookieSet ($languageCookie, $language, "/"); + $languageCode = $langNav; + $this->languageCookieSet ($languageCookie, $languageCode, "/"); // Cache the domframework's .mo file too - $dfFile = $this->languageCache ($language, "domframework", LC_MESSAGES, + $dfFile = $this->languageCache ($languageCode, "domframework", LC_MESSAGES, dirname (__FILE__)."/locale"); - $this->languageActivation ($dfFile, $language, LC_MESSAGES, + $this->languageActivation ($dfFile, $languageCode, LC_MESSAGES, dirname (__FILE__)."/locale"); - $languageFichier = $this->languageCache ($language, $package); - $this->languageActivation ($languageFichier, $language); + $languageCodeFichier = $this->languageCache ($languageCode, $package); + $this->languageActivation ($languageCodeFichier, $languageCode); - return $language; + return $languageCode; + } + + /** Return the language name from the language + Ex. : $languageCode=fr_FR, return France + + @param string $languageCode Language with format "fr_FR" + @return string Then language name */ + public function languageName ($languageCode) + { + switch ($languageCode) + { + case "fr_FR": return _("France"); + case "en_US": return _("English (US)"); + case "en_GB": return _("English (GB)"); + default: + throw new Exception ("No language available for '$languageCode'", 500); + } } }