web-dev-qa-db-fra.com

Obtenir le langage actuel dans Joomla 3 en script externe semble difficile .. mais fonctionne très bien en J2.5

Je sais qu'une question similaire est posée ici: Obtenir le langage courant dans un script externe (Joomla 3.3)

mais il semble que personne n’a bien compris le problème. J'ai exactement le même problème, alors voici mon exemple, il est peut-être plus facile à comprendre:

Sur les sites Joomla précédents, j’ai utilisé ce script pour obtenir le langage actuel en script externe, et cela fonctionne parfaitement dans le framework Joomla 2.5, mais pour une raison quelconque, il n’est pas disponible dans Joomla 3.xx. Dans Joomla 3, $ CurrentlangString se résout toujours en "GB" même si une autre langue est active:

define( '_JEXEC', 1 );
define( '_VALID_MOS', 1 );
define( 'JPATH_BASE', $_SERVER["DOCUMENT_ROOT"]);
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
require_once ( JPATH_BASE .DS.'libraries'.DS.'joomla'.DS.'factory.php' );

$mainframe = JFactory::getApplication('site');
$mainframe->initialise();

$Currentlang = JFactory::getLanguage();
$CurrentlangString = $Currentlang->getTag();

S'il vous plaît aviser ce qui ne va pas ici ..

Voici un petit bonus d'information qui peut aider un peu. Lors du chargement du code ci-dessus dans un fichier externe sous Joomla 3, il semble que cela charge effectivement le framework, car je n'ai aucun problème à accéder à l'objet utilisateur et à obtenir les informations de l'utilisateur actuel, mais pour une raison étrange, je ne parviens pas à obtenir le dernier la langue..

4
GeniusDesign

Malheureusement, Joomla 3 ne semble pas prendre en charge l’initialisation de la langue dans les scripts externes.

J’ai donc dû concevoir une solution alternative, ce qui pourrait aider d’autres personnes à coder des scripts externes tels que les APP et les API de Joomla 3 avec une prise en charge multilingue utilisant les fichiers de langage de remplacement de Joomla.

Voici ce que j'ai fait.

  1. J'ai transféré la balise de langue des utilisateurs actuels vers un script externe en tant que paramètre d'URL (dans mon cas, le script externe est chargé via Ajax). par exemple. "/scriptfolder/externalfile.php?lang=da-DK".

  2. Dans un script externe, j'ai inclus la classe suivante nécessaire pour analyser le fichier de remplacement de lang trouvé dans /language/overrides/ _ (bien sûr, vous pouvez utiliser n’importe quel fichier de langue ini que vous aimez, peut-être votre propre fichier lang personnalisé depuis le dossier de script):

    class ArrayINI implements ArrayAccess, IteratorAggregate {
        private $lang;
    
        public function __construct($ini) {
            $this->lang = parse_ini_file($ini);
        }
    
        function __invoke($offset) {
            return $this->offsetGet($offset);
        }
    
        public function getIterator() {
            return new ArrayIterator($this->lang);
        }
    
        public function offsetSet($offset, $value) {
            if (is_null($offset)) {
                $this->lang[] = $value;
            } else {
                $this->lang[$offset] = $value;
            }
        }
    
        public function offsetExists($offset) {
            return isset($this->lang[$offset]);
        }
    
        public function offsetUnset($offset) {
            unset($this->lang[$offset]);
        }
    
        public function offsetGet($offset) {
            return isset($this->lang[$offset]) ? $this->lang[$offset] : null;
        }
    }
    
  3. Puis j'ai exécuté la classe pour analyser le fichier comme ceci:

    $finallangparams = $_GET['userlang'];
    $iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
    
  4. Et maintenant, je peux faire écho à toutes les chaînes de la langue que je veux comme cet exemple:

    echo $iniLang("PHP_CHAT_CUSTOM_NEED_HELP_FRONT");
    

Et c'est tout!

1
GeniusDesign

Je suis en train de deviner, car je ne peux pas vraiment tester cela pour le moment et je ne suis pas tout à fait sûr de bien comprendre ce que vous voulez, mais cela devrait aller dans la bonne direction.

define( '_JEXEC', 1 );
define( 'JPATH_BASE', $_SERVER["DOCUMENT_ROOT"]);

require_once ( JPATH_BASE '/includes/defines.php' );
require_once ( JPATH_BASE '/includes/framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();

$user = JFactory::getUser();
$language = $user->getParam('language', 'the default');

echo "<p>Your language is set to {$language}.</p>";

Fondamentalement, Hkais avait raison. Dans Joomla! 3 le site a une langue par défaut, mais pas vraiment une langue actuelle, car il peut y avoir plusieurs utilisateurs actuels. Et si vous voulez la langue actuelle de l'utilisateur actuel, vous devez la demander à l'utilisateur actuel. Ou l'utilisateur qui vous intéresse. Comme je l'ai dit, je ne suis pas sûr d'avoir compris ce que vous voulez.

4
Ville Niemi

J'utilise la gestion multilingue par défaut de Joomla, pas de Falang, pas de plug-in tiers.

Même problème, et j'ai passé 1 heure à trouver la solution.

La clé est, n'essayez pas d'utiliser JFactory::getLanguage(). Au lieu de cela, utilisez JFactory::getSession() et récupérez le résultat comme suit:

$session = JFactory::getSession();
$lang_obj = $session->get('plg_system_languagefilter');
$lang_code = $lang_obj->{'language'} //and yes, here use curly brackets
echo $lang_code; //return e.g. en-GB, de-DE, etc.
2
user11516

S'il vous plaît vérifier ce post de forum, semble être la question identique à votre question.

http://forum.joomla.org/viewtopic.php?f=711&t=844514

afaik, https://docs.joomla.org/JFactory/getLanguage getLanguage () a besoin d'un objet de langage global existant, sinon un nouvel objet sera créé. Et je suppose que en-GB est votre langue par défaut. Vous devez donc intégrer votre script dans la session existante ou vous assurer que votre session est correctement initialisée.

0
hkais