it-swarm.com.de

Das Abrufen der aktuellen Sprache in Joomla 3 in einem externen Skript scheint schwierig zu sein. In J2.5 funktioniert dies jedoch einwandfrei

Mir ist bekannt, dass hier eine ähnliche Frage gestellt wird: Aktuelle Sprache in externem Skript abrufen (Joomla 3.3)

aber es scheint, dass niemand das Problem richtig verstanden hat. Ich habe genau das gleiche Problem, also hier ist mein Beispiel, vielleicht ist es einfacher zu verstehen:

Auf früheren Joomla-Sites habe ich dieses Skript verwendet, um die aktuelle Sprache in einem externen Skript abzurufen, und es funktioniert perfekt in Joomla 2.5-Framework, aber aus irgendeinem Grund nicht in Joomla 3.xx. In Joomla 3 wird CurrentlangString immer in "en-GB" aufgelöst, obwohl eine andere Sprache aktiv ist:

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

Bitte raten Sie, was hier falsch ist ..

Hier ist eine kleine Bonusinfo, die vielleicht ein bisschen helfen kann. Wenn ich den obigen Code in eine externe Datei unter Joomla 3 lade, scheint es, dass das Framework tatsächlich geladen wird, da ich kein Problem habe, auf das Benutzerobjekt zuzugreifen und die Informationen des aktuellen Benutzers abzurufen, aber aus irgendeinem seltsamen Grund kann ich nicht die aktuellen Informationen abrufen Sprache..

4
GeniusDesign

Leider scheint Joomla 3 die Sprachinitialisierung in externen Skripten nicht zu unterstützen.

Ich musste daher eine alternative Lösung entwickeln, die anderen helfen könnte, externe Skripte wie APPs und APIs für Joomla 3 mit mehrsprachiger Unterstützung unter Verwendung der Joomla-Überschreibungs-Sprachdateien zu codieren.

Hier ist was ich getan habe.

  1. Ich habe das Sprachkennzeichen des aktuellen Benutzers als URL-Parameter an ein externes Skript übergeben (in meinem Fall wird das externe Skript über Ajax geladen). z.B. "/scriptfolder/externalfile.php?lang=da-DK".

  2. In ein externes Skript habe ich die folgende Klasse eingefügt, die benötigt wird, um die in /language/overrides/ (Sie können natürlich jede beliebige Ini-Sprachdatei verwenden, möglicherweise Ihre eigene benutzerdefinierte Sprachdatei aus dem Skriptordner):

    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. Dann habe ich die Klasse ausgeführt, um die Datei wie folgt zu analysieren:

    $finallangparams = $_GET['userlang'];
    $iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
    
  4. Und jetzt kann ich alle Sprachstrings, die ich möchte, wie in diesem Beispiel wiedergeben:

    echo $iniLang("PHP_CHAT_CUSTOM_NEED_HELP_FRONT");
    

Und das ist es!

1
GeniusDesign

Ich mache hier eine Vermutung, da ich dies im Moment nicht wirklich testen kann und nicht ganz sicher bin, ob ich verstanden habe, was Sie richtig wollen, aber dies sollte in die richtige allgemeine Richtung gehen.

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

Grundsätzlich war hkais richtig. In Joomla! 3 Die Site hat eine Standardsprache, jedoch keine aktuelle Sprache, da es möglicherweise mehrere aktuelle Benutzer gibt. Und wenn Sie die aktuelle Sprache des aktuellen Benutzers wünschen, müssen Sie sie vom aktuellen Benutzer erfragen. Oder der Benutzer, an dem Sie interessiert sind. Wie gesagt, ich habe kein Vertrauen, dass ich verstanden habe, was Sie wollen.

4
Ville Niemi

Ich verwende das standardmäßige mehrsprachige Joomla-Management, kein Falang, kein Plugin von Drittanbietern.

Dasselbe Problem, und ich habe 1 Stunde gebraucht, um die Lösung zu finden.

Der Schlüssel ist, versuchen Sie nicht, JFactory::getLanguage() zu verwenden. Verwenden Sie stattdessen JFactory::getSession() und rufen Sie das Ergebnis folgendermaßen ab:

$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

Bitte überprüfen Sie diesen Forumsbeitrag, er scheint mit Ihrem Problem identisch zu sein.

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

afaik, das https://docs.joomla.org/JFactory/getLanguage getLanguage () benötigt ein vorhandenes globales Sprachobjekt, ansonsten wird ein neues erstellt. Und ich gehe davon aus, dass en-GB Ihre Standardsprache ist. Integrieren Sie Ihr Skript entweder in die vorhandene Sitzung oder stellen Sie sicher, dass Ihre Sitzung ordnungsgemäß initialisiert wird.

0
hkais