language : add the languageName support
git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@2228 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
119
language.php
119
language.php
@@ -22,9 +22,9 @@ class language
|
|||||||
/** Choose the best language in the browser list and which is available in
|
/** Choose the best language in the browser list and which is available in
|
||||||
locale path
|
locale path
|
||||||
@param string|null $repLocale Directory where are stored the translations
|
@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) */
|
@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 ();
|
$arrAccept = array ();
|
||||||
if (isset ($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
|
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
|
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
||||||
// il est fourni en_US.UTF8 -> en_US
|
// il est fourni en_US.UTF8 -> en_US
|
||||||
@list ($languagetmp, $codeset) = explode (".", $_SERVER["LC_MESSAGES"]);
|
@list ($languageCodetmp, $codeset) = explode (".",
|
||||||
$arrAccept[] = $languagetmp;
|
$_SERVER["LC_MESSAGES"]);
|
||||||
|
$arrAccept[] = $languageCodetmp;
|
||||||
}
|
}
|
||||||
if (isset ($_SERVER["LANG"]))
|
if (isset ($_SERVER["LANG"]))
|
||||||
{
|
{
|
||||||
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
||||||
// il est fourni en_US.UTF8 -> en_US
|
// il est fourni en_US.UTF8 -> en_US
|
||||||
@list ($languagetmp, $codeset) = explode (".", $_SERVER["LANG"]);
|
@list ($languageCodetmp, $codeset) = explode (".", $_SERVER["LANG"]);
|
||||||
$arrAccept[] = $languagetmp;
|
$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))
|
if (empty ($arrAccept))
|
||||||
$arrAccept[] = $language;
|
$arrAccept[] = $languageCode;
|
||||||
// Le tableau $arrAccept est trié par priorité de language souhaité par
|
// Le tableau $arrAccept est trié par priorité de language souhaité par
|
||||||
// l'utilisateur (0=>le plus important)
|
// l'utilisateur (0=>le plus important)
|
||||||
|
|
||||||
// Recherche des languages disponibles dans le repertoire $repLocale
|
// Recherche des languages disponibles dans le repertoire $repLocale
|
||||||
$arrLanguageAvailable = $this->languageTraductionsList ($repLocale);
|
$arrLanguageAvailable = $this->languageTraductionsList ($repLocale);
|
||||||
$arrLanguageAvailable[] = $language;
|
$arrLanguageAvailable[] = $languageCode;
|
||||||
|
|
||||||
$language = "";
|
$languageCode = "";
|
||||||
// Analyse pour donner la meilleure language possible
|
// Analyse pour donner la meilleure language possible
|
||||||
foreach ($arrAccept as $value)
|
foreach ($arrAccept as $value)
|
||||||
{
|
{
|
||||||
@@ -91,34 +93,34 @@ class language
|
|||||||
$val3 = strtolower ($val);
|
$val3 = strtolower ($val);
|
||||||
if ($val2 === $val3)
|
if ($val2 === $val3)
|
||||||
{
|
{
|
||||||
$language = $val;
|
$languageCode = $val;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Regarde si un repertoire existe avec language en tant que base
|
// Regarde si un repertoire existe avec language en tant que base
|
||||||
// (l'utilisateur demande fr et on a fr_FR.utf-8)
|
// (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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// On a trouvé : on arrête de chercher
|
// On a trouvé : on arrête de chercher
|
||||||
if ($language !== "")
|
if ($languageCode !== "")
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Si on n'a toujours pas trouve de language, c'est que la language par defaut
|
// Si on n'a toujours pas trouve de language, c'est que la language par
|
||||||
// proposee en tete de fichier est inconnue : on met la language "C" et le
|
// defaut proposee en tete de fichier est inconnue : on met la language "C"
|
||||||
// code s'affiche selon la programmation
|
// et le code s'affiche selon la programmation
|
||||||
if ($language === "")
|
if ($languageCode === "")
|
||||||
$language = "C";
|
$languageCode = "C";
|
||||||
|
|
||||||
return ($language);
|
return ($languageCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Return the language recorded in the Cookie. Check if this language is
|
/** 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
|
/** Set the cookie with a TTL of one month
|
||||||
@param string $cookieName The name of the cookie
|
@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 */
|
@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
|
/** 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
|
/** This function manage the cache of $package.mo files as Apache cache them
|
||||||
It return the $moFile to use
|
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
|
@param string|null $package The package name of the soft ($package.mo
|
||||||
file). "messages" by default
|
file). "messages" by default
|
||||||
@param string|null $category The folder name LC_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
|
@param string|null $repLocale The folder where all the locales are stored
|
||||||
*/
|
*/
|
||||||
function languageCache ($language, $package="messages", $category=LC_MESSAGES,
|
function languageCache ($languageCode, $package="messages",
|
||||||
$repLocale = "./locale")
|
$category=LC_MESSAGES, $repLocale = "./locale")
|
||||||
{
|
{
|
||||||
// Apache cache le fichier messages.mo jusqu'au prochain redémarrage. L'idée
|
// 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,
|
// 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
|
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
||||||
// il est fourni en_US.UTF8 -> en_US
|
// il est fourni en_US.UTF8 -> en_US
|
||||||
if (($pos = strpos ($language, ".")) !== FALSE)
|
if (($pos = strpos ($languageCode, ".")) !== FALSE)
|
||||||
list ($language, $codeset) = explode (".", $language);
|
list ($languageCode, $codeset) = explode (".", $languageCode);
|
||||||
$codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!!
|
$codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!!
|
||||||
// -> Le répertoire de données doit être fr_FR.UTF8
|
// -> Le répertoire de données doit être fr_FR.UTF8
|
||||||
$category = $this->languageCategoryText ($category);
|
$category = $this->languageCategoryText ($category);
|
||||||
$temporaries = glob ("$repLocale/$language.$codeset/$category/*-*.mo");
|
$temporaries = glob ("$repLocale/$languageCode.$codeset/$category/*-*.mo");
|
||||||
$moFile = "$repLocale/$language.$codeset/$category/$package.mo";
|
$moFile = "$repLocale/$languageCode.$codeset/$category/$package.mo";
|
||||||
$link = "$repLocale/$language.$codeset/$category/$package-".time().
|
$link = "$repLocale/$languageCode.$codeset/$category/$package-".
|
||||||
".mo";
|
time().".mo";
|
||||||
if (! file_exists ($moFile))
|
if (! file_exists ($moFile))
|
||||||
{
|
{
|
||||||
return "";
|
return "";
|
||||||
@@ -255,7 +257,7 @@ class language
|
|||||||
return $link;*/
|
return $link;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
function languageActivation ($moFile, $language, $category = LC_MESSAGES,
|
function languageActivation ($moFile, $languageCode, $category = LC_MESSAGES,
|
||||||
$repLocale = "./locale")
|
$repLocale = "./locale")
|
||||||
{
|
{
|
||||||
// Active le support Gettext pour le fichier de language .mo caché fourni en
|
// 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
|
// fichier de language (qui peut être récupéré par languageSelection ou
|
||||||
// languageTraductionsList
|
// languageTraductionsList
|
||||||
// Language doit être fourni sans codeset (fr_FR et PAS fr_FR.UTF8)
|
// 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);
|
$package = substr (basename ($moFile) , 0, -3);
|
||||||
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
// La ligne ci-dessous permet de récupérer la language sans le codeset si
|
||||||
// il est fourni en_US.UTF8 -> en_US
|
// il est fourni en_US.UTF8 -> en_US
|
||||||
if (($pos = strpos ($language, ".")) !== FALSE)
|
if (($pos = strpos ($languageCode, ".")) !== FALSE)
|
||||||
list ($language, $codeset) = explode (".", $language);
|
list ($languageCode, $codeset) = explode (".", $languageCode);
|
||||||
$codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!!
|
$codeset = "UTF8"; // SANS TIRET ET EN MAJSUCULES!!!
|
||||||
// -> Le répertoire de données doit être fr_FR.UTF8
|
// -> Le répertoire de données doit être fr_FR.UTF8
|
||||||
putenv ('LANG='.$language.'.'.$codeset);
|
putenv ('LANG='.$languageCode.'.'.$codeset);
|
||||||
putenv ('LANGUAGE='.$language.'.'.$codeset);
|
putenv ('LANGUAGE='.$languageCode.'.'.$codeset);
|
||||||
$GLOBALS["domframework"]["lang"] = $language;
|
$GLOBALS["domframework"]["lang"] = $languageCode;
|
||||||
|
|
||||||
bind_textdomain_codeset ($package, "utf-8");
|
bind_textdomain_codeset ($package, "utf-8");
|
||||||
bindtextdomain ($package, $repLocale);
|
bindtextdomain ($package, $repLocale);
|
||||||
textdomain ($package);
|
textdomain ($package);
|
||||||
|
|
||||||
$rc = setlocale (LC_MESSAGES, $language.'.'.$codeset);
|
$rc = setlocale (LC_MESSAGES, $languageCode.'.'.$codeset);
|
||||||
if ($rc === FALSE)
|
if ($rc === FALSE)
|
||||||
{
|
{
|
||||||
// Language non disponible sur le système
|
// Language non disponible sur le système
|
||||||
// La liste des languages est affichée par 'locale -a'
|
// La liste des languages est affichée par 'locale -a'
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
$rc = setlocale (LC_TIME, $language.'.'.$codeset);
|
$rc = setlocale (LC_TIME, $languageCode.'.'.$codeset);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -307,18 +309,35 @@ class language
|
|||||||
// Language defined in the cookie
|
// Language defined in the cookie
|
||||||
$langCookie = $this->languageCookie ($languageCookie);
|
$langCookie = $this->languageCookie ($languageCookie);
|
||||||
if ($langCookie !== FALSE)
|
if ($langCookie !== FALSE)
|
||||||
$language = $langCookie;
|
$languageCode = $langCookie;
|
||||||
else
|
else
|
||||||
$language = $langNav;
|
$languageCode = $langNav;
|
||||||
$this->languageCookieSet ($languageCookie, $language, "/");
|
$this->languageCookieSet ($languageCookie, $languageCode, "/");
|
||||||
// Cache the domframework's .mo file too
|
// Cache the domframework's .mo file too
|
||||||
$dfFile = $this->languageCache ($language, "domframework", LC_MESSAGES,
|
$dfFile = $this->languageCache ($languageCode, "domframework", LC_MESSAGES,
|
||||||
dirname (__FILE__)."/locale");
|
dirname (__FILE__)."/locale");
|
||||||
$this->languageActivation ($dfFile, $language, LC_MESSAGES,
|
$this->languageActivation ($dfFile, $languageCode, LC_MESSAGES,
|
||||||
dirname (__FILE__)."/locale");
|
dirname (__FILE__)."/locale");
|
||||||
$languageFichier = $this->languageCache ($language, $package);
|
$languageCodeFichier = $this->languageCache ($languageCode, $package);
|
||||||
$this->languageActivation ($languageFichier, $language);
|
$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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user