Browse Source

Utilise la langue du navigateur

En l'absence de connexion utilisateur les langues envoyées par le navigateur
sont utilisées pour l'affichage de l'écran d'accueil.

Si l'utilisateur s'est connecté, la langue indiquée dans la configuration est
choisie.
Christophe HENRY 3 years ago
parent
commit
b1e05ad55a
3 changed files with 27 additions and 14 deletions
  1. 2 2
      Plugin.class.php
  2. 6 11
      common.php
  3. 19 1
      i18n.php

+ 2 - 2
Plugin.class.php

@@ -15,12 +15,12 @@ class Plugin{
     }
 
     public static function includeAll(){
-        global $i18n, $i18n_js, $language, $theme;
+        global $i18n, $i18n_js, $languages, $theme;
         $pluginFiles = Plugin::getFiles(true);
         if(is_array($pluginFiles)) {
             foreach($pluginFiles as $pluginFile) {
                 // Chargement du fichier de Langue du plugin
-                $i18n->append(new Translation(dirname($pluginFile),$language));
+                $i18n->append(new Translation(dirname($pluginFile),$languages));
                 // Inclusion du coeur de plugin
                 include $pluginFile;
                 // Gestion des css du plugin en fonction du thème actif

+ 6 - 11
common.php

@@ -85,19 +85,14 @@ $feedManager = new Feed();
 $eventManager = new Event();
 $folderManager = new Folder();
 
-$language = $configurationManager->get('language');
-//@todo requis pour la MAJ mais pourra être supprimé.
-if (empty($language)) {
-    // On tente de récupérer la valeur issue de 'constant.php'
-    if (defined('LANGUAGE')) $language = LANGUAGE;
-    elseif (defined('LANGAGE')) $language = LANGAGE; // ancien bug de nommage
-    else $language = Translation::DEFAULT_LANGUAGE;
-    $configurationManager->put('language', $language);
+// Sélection de la langue de l'interface utilisateur
+if (!$myUser) {
+    $languages = Translation::getHttpAcceptLanguages();
+} else {
+    $languages = array($configurationManager->get('language'));
 }
-// Faut-il supprimer la variable /langu?age/ de 'constant.php'?
 
-
-i18n_init($language, dirname(__FILE__).'/templates/'.$theme.'/');
+i18n_init($languages, dirname(__FILE__).'/templates/'.$theme.'/');
 if ($resultUpdate) die (_t('LEED_UPDATE_MESSAGE'));
 
 $view = '';

+ 19 - 1
i18n.php

@@ -27,11 +27,13 @@ class Translation {
         if (!is_array($languages)) $languages = array($languages);
         $this->listLanguages();
         $languages[]=self::DEFAULT_LANGUAGE;
-        foreach ($languages as $language)
+        foreach ($languages as $language) {
+            if (empty($language)) continue;
             if ($this->load($language)) {
                 $this->language = $language;
                 break;
             }
+        }
     }
 
     /* Peuple la liste des langues avec une traduction */
@@ -117,6 +119,22 @@ class Translation {
         return json_encode($this->trans);
     }
 
+    /* @return un tableau des langues préférées */
+    static function getHttpAcceptLanguages($httpAcceptLanguage=Null) {
+        /** Exemple de directive :
+         * eo,fr;q=0.8,fr-FR;q=0.6,en-US;q=0.4,en;q=0.2
+         * Les langues sont séparées entre elles par des virgules.
+         * Chaque langue est séparée du coefficient, si présent, par un point-virgule.
+         */
+        // Suppose que les langues préférées sont en premier.
+        if (is_null($httpAcceptLanguage)) $httpAcceptLanguage = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];
+        $languageList = array();
+        foreach (explode(',', $httpAcceptLanguage) as $language) {
+            $languageList[] = substr($language, 0, 2); // fr-FR;q=0.6 --> fr
+        }
+        return array_unique($languageList); // en-US,en-UK --> en, en --> en
+    }
+
 }
 
 // Initialise le singleton, avec les langues possibles