web-dev-qa-db-pt.com

Obter linguagem atual no Joomla 3 em script externo parece difícil .. mas funciona bem no J2.5

Estou ciente de que uma pergunta semelhante é solicitada aqui: Obtenha o idioma atual no script externo (Joomla 3.3)

mas parece que ninguém entendeu o problema corretamente. Estou tendo exatamente o mesmo problema, então aqui está o meu exemplo, talvez seja mais fácil entender:

Nos sites anteriores do Joomla, eu usei esse script para obter o idioma atual em scripts externos, e ele funciona perfeitamente no framework Joomla 2.5, mas por alguma razão não funciona no Joomla 3.xx. No Joomla 3, o $ CurrentlangString sempre resolve "en-GB", mesmo que outro idioma esteja ativo:

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

Por favor, aconselhe o que está errado aqui ..

Aqui estão algumas informações sobre bônus que podem ajudar um pouco. Ao carregar o código acima em um arquivo externo no Joomla 3, parece que ele realmente carrega a estrutura, porque não tenho nenhum problema em acessar o objeto de usuário e obter as informações do usuário atual, mas por algum motivo estranho não consigo obter a atualização atual. língua..

4
GeniusDesign

Infelizmente, o Joomla 3 parece não suportar a inicialização de idiomas em scripts externos.

Portanto, eu tive que construir uma solução alternativa, que pode ser útil para outros que desejam codificar scripts externos, como APPs e APIs para o Joomla 3, com suporte a vários idiomas, usando os arquivos de linguagem de substituição do Joomla.

Aqui está o que eu fiz.

  1. Transferi a tag de idioma do usuário atual para o script externo como parâmetro de URL (no meu caso, o script externo é carregado via Ajax). por exemplo. "/scriptfolder/externalfile.php?lang=da-DK".

  2. No script externo, incluí a seguinte classe necessária para analisar o arquivo de substituição lang ini encontrado em /language/overrides/ (é claro que você pode usar qualquer arquivo de idioma ini que desejar, talvez seu próprio arquivo lang personalizado da pasta de scripts):

    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. Então eu executei a classe para analisar o arquivo assim:

    $finallangparams = $_GET['userlang'];
    $iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
    
  4. E agora eu posso ecoar todas as sequências de idiomas que eu quero como este exemplo:

    echo $iniLang("PHP_CHAT_CUSTOM_NEED_HELP_FRONT");
    

E é isso!

1
GeniusDesign

Estou fazendo um palpite aqui, já que não posso testar isso agora e não tenho muita certeza de ter entendido o que você deseja corretamente, mas isso deve estar na direção geral correta.

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

Fundamentalmente, hkais estava correto. No Joomla! 3 o site tem um idioma padrão, mas não é realmente um idioma atual, pois pode haver vários usuários atuais. E se você quiser o idioma atual do usuário atual, precisará solicitá-lo ao usuário atual. Ou o usuário no qual você está interessado. Como eu disse, não tenho confiança de que entendi o que você deseja.

4
Ville Niemi

Eu uso o gerenciamento multilíngue padrão do Joomla, sem falang, sem plug-in de terceiros.

Mesmo problema, e passei 1 hora para encontrar a solução.

A chave é: não tente usar JFactory::getLanguage(). Em vez disso, use JFactory::getSession() e recupere o resultado assim:

$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

Verifique esta postagem do fórum, parece ser o mesmo problema que o seu.

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

afaik, o https://docs.joomla.org/JFactory/getLanguage getLanguage () precisa de um objeto de idioma global existente, caso contrário, um novo será criado. E suponho que en-GB seja seu idioma padrão. Portanto, integre seu script à sessão existente ou garanta que sua sessão seja inicializada corretamente.

0
hkais