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..
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.
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"
.
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;
}
}
Então eu executei a classe para analisar o arquivo assim:
$finallangparams = $_GET['userlang'];
$iniLang = new ArrayINI("../../language/overrides/".$finallangparams.".override.ini");
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!
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.
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.
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.