web-dev-qa-db-ja.com

Joomla 3の現在の言語を外部スクリプトで取得するのは難しいようですが、J2.5では正常に機能します

同様の質問がここで尋ねられることを知っています: 現在の言語を外部スクリプトで取得(Joomla 3.3)

しかし、誰も問題を正しく理解していないようです。私はまったく同じ問題を抱えているので、ここに私の例を示します。理解しやすいかもしれません。

以前のJoomlaサイトでは、このスクリプトを使用して外部スクリプトで現在の言語を取得しましたが、Joomla 2.5フレームワークでは完全に機能しますが、何らかの理由でJoomla 3.xxでは機能しません。 Joomla 3では、別の言語がアクティブであっても、$ CurrentlangStringは常に「en-GB」に解決されます。

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

ここで何が悪いのかアドバイスしてください。

ここに少し役立つかもしれない小さなボーナス情報があります。上記のコードをJoomla 3の外部ファイルにロードすると、ユーザーオブジェクトにアクセスして現在のユーザーの情報を取得するのに問題はないため、実際にフレームワークをロードしているように見えますが、何らかの奇妙な理由で現在の情報を取得できません言語..

4
GeniusDesign

残念ながら、Joomla 3は外部スクリプトでの言語初期化をサポートしていないようです。

したがって、Joomlaのオーバーライド言語ファイルを使用して多言語サポートを備えたJoomla 3用のAPPやAPIなどの外部スクリプトをコーディングしたい人にとって役立つかもしれない代替ソリューションを構築する必要がありました。

これが私がしたことです。

  1. 現在のユーザーの言語タグをURLスクリプトとして外部スクリプトに転送しました(私の場合、外部スクリプトはAjax経由で読み込まれます)。例えば"/scriptfolder/externalfile.php?lang=da-DK"

  2. 外部スクリプトに、/language/overrides/にあるオーバーライドlang iniファイルを解析するために必要な次のクラスを含めました(もちろん、好きなini言語ファイルを使用できます。スクリプトフォルダーから独自のカスタムlangファイルを使用できます)。

    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. 次に、クラスを実行して次のようにファイルを解析しました。

    $finallangparams = $_GET['userlang'];
    $iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
    
  4. これで、この例のように、必要なすべての言語文字列をエコーできます。

    echo $iniLang("PHP_CHAT_CUSTOM_NEED_HELP_FRONT");
    

以上です!

1
GeniusDesign

現時点では実際にテストすることはできず、あなたが何を望んでいるかを完全に理解しているとは思えないので、私はここで推測を行っていますが、これは正しい一般的な方向にあるはずです。

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

基本的に、hkaisは正しかった。 Joomlaで! 3サイトにはデフォルトの言語がありますが、現在のユーザーは数人いる可能性があるため、実際には現在の言語ではありません。また、現在のユーザーの現在の言語が必要な場合は、現在のユーザーに尋ねる必要があります。または、あなたがたまたま興味を持っているユーザー。私が言ったように、私はあなたが何を望んでいるのか理解できなかった自信がありません。

4
Ville Niemi

デフォルトのJoomla多言語管理、falang、サードパーティのプラグインは使用していません。

同じ問題で、1時間かけて解決策を見つけました。

重要なのは、JFactory::getLanguage()を使用しないでください。その代わりに、JFactory::getSession()を使用して、次のように結果を取得します。

$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

このフォーラムの投稿を確認してください。あなたの問題と同じ問題のようです。

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

afaik、 https://docs.joomla.org/JFactory/getLanguage getLanguage()には既存のグローバル言語オブジェクトが必要です。それ以外の場合は、新しいオブジェクトが作成されます。そして、en-GBがデフォルトの言語だと思います。そのため、スクリプトを既存のセッションに統合するか、セッションが適切に初期化されていることを確認してください。

0
hkais