it-swarm-eu.dev

Ottenere la lingua corrente in Joomla 3 in uno script esterno sembra difficile .. ma funziona bene in J2.5

Sono consapevole che qui viene richiesta una domanda simile: Ottieni la lingua corrente in uno script esterno (Joomla 3.3)

ma sembra che nessuno abbia capito correttamente il problema. Sto avendo lo stesso identico problema, quindi ecco il mio esempio, forse è più facile da capire:

Sui precedenti siti di Joomla ho usato questo script per ottenere la lingua corrente in script esterni, e funziona perfettamente nel framework Joomla 2.5, ma per qualche ragione non lo fa in Joomla 3.xx. In Joomla 3 $ CurrentlangString si risolve sempre in "en-GB" anche se è attiva un'altra lingua:

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();

Si prega di avvisare cosa c'è di sbagliato qui ..

Ecco alcune informazioni bonus che potrebbero essere di aiuto. Quando si carica il codice sopra in un file esterno in Joomla 3, sembra che effettivamente carica il framework, perché non ho problemi ad accedere all'oggetto utente e ottenere le informazioni dell'utente corrente, ma per qualche strano motivo non riesco a ottenere la corrente linguaggio..

4
GeniusDesign

Sfortunatamente Joomla 3 non sembra supportare l'inizializzazione del linguaggio negli script esterni.

Ho quindi dovuto costruire una soluzione alternativa, che potrebbe essere di aiuto ad altri che desiderano codificare script esterni come APP e API per Joomla 3 con supporto multilingue usando i file di lingua di sostituzione di Joomla.

Ecco cosa ho fatto.

  1. Ho trasferito il tag della lingua degli utenti correnti allo script esterno come parametro URL (nel mio caso lo script esterno viene caricato tramite Ajax). per esempio. "/scriptfolder/externalfile.php?lang=da-DK".

  2. Nello script esterno ho incluso la seguente classe necessaria per analizzare il file lang ini override trovato in /language/overrides/ (ovviamente puoi usare qualsiasi file ini lingua che ti piace, forse il tuo file lang personalizzato dalla cartella 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. Quindi ho eseguito la classe per analizzare il file in questo modo:

    $finallangparams = $_GET['userlang'];
    $iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
    
  4. E ora posso fare eco a tutte le stringhe di lingua che voglio come in questo esempio:

    echo $iniLang("PHP_CHAT_CUSTOM_NEED_HELP_FRONT");
    

E questo è tutto!

1
GeniusDesign

Sto facendo un'ipotesi qui, dato che non posso davvero provarlo in questo momento e non sono del tutto sicuro di aver capito cosa vuoi correttamente, ma questo dovrebbe essere nella direzione generale corretta.

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>";

Fondamentalmente, Hkais aveva ragione. In Joomla! 3 il sito ha una lingua predefinita, ma in realtà non è una lingua corrente, poiché potrebbero esserci diversi utenti attuali. E se desideri la lingua corrente dell'utente corrente, devi richiederla all'utente corrente. O l'utente a cui sei interessato. Come ho detto, non ho fiducia di aver capito cosa volevi.

4
Ville Niemi

Uso la gestione multilingue predefinita di Joomla, nessun falang, nessun plugin di terze parti.

Stesso problema e ho impiegato 1 ora per trovare la soluzione.

La chiave è, non provare a usare JFactory::getLanguage(). Invece, usa JFactory::getSession() e recupera il risultato in questo modo:

$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

Si prega di controllare questo post sul forum, sembra essere il problema identico al problema.

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

afaik, il https://docs.joomla.org/JFactory/getLanguage getLanguage () ha bisogno di un oggetto linguaggio globale esistente, altrimenti ne verrà creato uno nuovo. E suppongo che en-GB sia la tua lingua predefinita. Quindi integra lo script nella sessione esistente o assicurati che la sessione venga inizializzata correttamente.

0
hkais