get('site', 'en-GB');
} else {
VmConfig::$jDefLangTag = 'en-GB';//use default joomla
vmError('JComponentHelper not found');
}
//VmConfig::$jDefLangTag = self::getShopDefaultOrSiteLangTagByJoomla();
VmConfig::$jDefLang = strtolower(strtr(VmConfig::$jDefLangTag,'-','_'));
}
VmConfig::$defaultLangTag = VmConfig::get('vmDefLang',VmConfig::$jDefLangTag);
if(empty(VmConfig::$defaultLangTag)){
VmConfig::$defaultLangTag = VmConfig::$jDefLangTag;
}
VmConfig::$defaultLang = strtolower(strtr(VmConfig::$defaultLangTag,'-','_'));
$l = JFactory::getLanguage();
//$l = JFactory::getApplication()->getLanguage();
//Set the "joomla selected language tag" and the joomla language to vmText
self::$jSelLangTag = $l->getTag();
self::$languages[self::$jSelLangTag] = $l;
vmText::$language = $l;
$siteLang = self::$currLangTag = self::$jSelLangTag;
//if( !VmConfig::isSite()){ //This creates massive trouble because isSite checks for manager, which is not set yet
$siteLang = vRequest::getString('vmlang',$siteLang, $_REQUEST ); //0 overwritten on purpose with $_REQUEST
if (!$siteLang) {
$siteLang = self::$jSelLangTag;
}
//}
self::$langs = (array)VmConfig::get('active_languages',array(VmConfig::$jDefLangTag));
self::$langCount = count(self::$langs);
self::setLanguageByTag($siteLang);
}
static public function getShopDefaultSiteLangTagByJoomla(){
return self::getShopDefaultOrSiteLangTagByJoomla();
}
static public function getShopDefaultOrSiteLangTagByJoomla(){
$l= VmConfig::get('vmDefLang','');
if(empty($l)) {
if (class_exists('JComponentHelper') && (method_exists('JComponentHelper', 'getParams'))) {
$params = JComponentHelper::getParams('com_languages');
VmConfig::$jDefLangTag = $params->get('site', 'en-GB');
$l = VmConfig::$jDefLangTag;
} else {
$l = 'en-GB';//use default joomla
vmError('JComponentHelper not found');
}
}
return $l;
}
static public function setLanguageByTag($siteLang, $alreadyLoaded = true){
if(empty($siteLang)){
$siteLang = self::$currLangTag;
} else {
if($siteLang!=self::$currLangTag){
self::$cgULF = null;
self::$cgULFS = null;
}
}
self::setLanguage($siteLang);
// this code is uses logic derived from language filter plugin in j3 and should work on most 2.5 versions as well
if (class_exists('JLanguageHelper') && (method_exists('JLanguageHelper', 'getLanguages'))) {
$languages = JLanguageHelper::getLanguages('lang_code');
self::$jLangCount = count($languages);
if(isset($languages[$siteLang])){
VmConfig::$vmlangSef = $languages[$siteLang]->sef;
} else {
if(isset($languages[self::$jSelLangTag])){
VmConfig::$vmlangSef = $languages[self::$jSelLangTag]->sef;
}
}
}
VmConfig::$vmlangTag = $siteLang;
VmConfig::$vmlang = strtolower(strtr($siteLang,'-','_'));
//VmConfig::$defaultLangTag = VmConfig::$jDefLangTag;
//VmConfig::$defaultLang = strtolower(strtr(VmConfig::$jDefLangTag,'-','_'));
if(self::$langCount>1){
$lfbs = VmConfig::get('vm_lfbs','');
/* This cannot work this way, because the SQL would need a union with left and right join, much too expensive.
* even worse, the old construction would prefer the secondary language over the first. It can be tested using the customfallback
* for example en-GB~de-DE for en-GB as shop language
* if(count($langs)==2 and VmConfig::$vmlangTag==VmConfig::$defaultLangTag and VmConfig::get('dualFallback',false) ){
foreach($langs as $lang){
if($lang!=VmConfig::$vmlangTag){
VmConfig::$defaultLangTag = $lang;
VmConfig::$defaultLang = strtolower(strtr(VmConfig::$defaultLangTag,'-','_'));
}
}
} else */
if(!empty($lfbs)){
//vmdebug('my lfbs '.$lfbs);
$pairs = explode(';',$lfbs);
if($pairs and count($pairs)>0){
$fbsAssoc = array();
foreach($pairs as $pair){
$kv = explode('~',$pair);
if($kv and count($kv)===2){
$fbsAssoc[$kv[0]] = $kv[1];
}
}
if(isset($fbsAssoc[$siteLang])){
VmConfig::$defaultLangTag = $fbsAssoc[$siteLang];
VmConfig::$defaultLang = strtolower(strtr(VmConfig::$defaultLangTag,'-','_'));
vmdebug('Set lang fallback for '.$siteLang.' to '.VmConfig::$defaultLang,VmConfig::$jDefLang);
}
VmConfig::set('fbsAssoc',$fbsAssoc);
}
}
}
if(!in_array($siteLang, self::$langs)) {
//vmError('Selected siteLang '. $siteLang.' is not in $langs '.implode(', ',$langs));
vmdebug('Selected siteLang '. $siteLang.' is not in $langs '.implode(', ',self::$langs));
$siteLang = VmConfig::$jDefLangTag; //Set to shop language
VmConfig::$vmlang = strtolower(strtr($siteLang,'-','_'));
}
//JLangTag if also activevmlang set as FB, ShopLangTag($jDefLangTag), vmLangTag, vm_lfbs overwrites
if(!empty(self::$_loaded) and $alreadyLoaded){
//vmdebug('Loaded not empty, lets start',self::$_loaded);
self::loadUsedLangFiles();
}
//@deprecated just fallback
defined('VMLANG') or define('VMLANG', VmConfig::$vmlang );
//self::debugLangVars();
}
static public function loadUsedLangFiles(){
//vmSetStartTime('loadUsedLangFiles');
if(!empty(self::$_loaded['com'])){
if(!empty(self::$_loaded['com'][0])){
foreach(self::$_loaded['com'][0] as $name){
self::loadJLang($name,0);
}
}
if(!empty(self::$_loaded['com'][1])){
foreach(self::$_loaded['com'][1] as $name){
self::loadJLang($name,1);
}
}
}
if(!empty(self::$_loaded['mod'])){
foreach(self::$_loaded['mod'] as $name){
self::loadModJLang($name);
}
}
if(!empty(self::$_loaded['plg'])){
foreach(self::$_loaded['plg'] as $cvalue=>$name){
$t = explode(';',$cvalue);
//vmdebug('loadUsedLangFiles',$t[0],$t[1],$name);
vmPlugin::loadJLang($t[0],$t[1],$name);
}
}
//vmTime('loadUsedLangFiles','loadUsedLangFiles');
//vmRam('loadUsedLangFiles');
}
static public function debugLangVars(){
//vmdebug('LangCount: '.self::$langCount.' $siteLang: '.$siteLang.' VmConfig::$vmlangSef: '.VmConfig::$vmlangSef.' self::$_jpConfig->lang '.VmConfig::$vmlang.' DefLang '.VmConfig::$defaultLang);
if(self::$langCount==1){
$l = self::$langCount.' Language, default shoplanguage (VmConfig::$jDefLang): '.VmConfig::$jDefLang.' '.VmConfig::$jDefLangTag;
} else {
$l = self::$langCount.' Languages, default joomla language $jDefLang): '.VmConfig::$jDefLang.' '.VmConfig::$jDefLangTag;
//if(VmConfig::$jDefLang!=VmConfig::$defaultLang){
if(self::getUseLangFallback()){
$l .= '
Fallback language (VmConfig::$defaultLang): '.VmConfig::$defaultLang.' '.VmConfig::$defaultLangTag;
}
$l .= '
Selected VM language (VmConfig::$vmlang): '.VmConfig::$vmlang.' '.VmConfig::$vmlangTag.' SEF: '.VmConfig::$vmlangSef.' $lfbs = '.VmConfig::get('vm_lfbs',''); ;
}
vmdebug($l);
}
static public function setLanguage($tag){
if(!isset(self::$languages[$tag])) {
self::getLanguage($tag);
}
if(!empty(self::$languages[$tag])) {
vmText::$language = self::$languages[$tag];
self::$currLangTag = $tag;
//There are plugins working with languages. They rely often on the standard JLanguage, so einjecting our JLanguage Object
//can create serious side effects. We may set the argument to true for emails, invoices and similar.
$jLObjToApp = VmConfig::get('ReInjectJLanguage', false);
if($jLObjToApp){
$app = JFactory::getApplication();
try{
$app->set('language', $tag);
JFactory::$language =& self::$languages[$tag];
} catch (Exception $e) {
vmError('Could not set language');
return;
}
//@author Yireo (info@yireo.com)
if (method_exists($app, 'loadLanguage')) {
$app->loadLanguage(self::$languages[$tag]);
}
//@author Yireo (info@yireo.com)
if (method_exists($app, 'setLanguageFilter')) {
$app->setLanguageFilter(true);
}
// Falang override @author Yireo (info@yireo.com)
$registry = JFactory::getConfig();
$registry->set('config.defaultlang', self::$jSelLangTag);
// Falang override @author Yireo (info@yireo.com)
JComponentHelper::getParams('com_languages')
->set('site', self::$jSelLangTag);//*/
}
//vmTrace('setLanguage '.$tag, true, 15); //*/
} else {
vmError('Could not set language '.$tag);
}
}
static public function getLanguage($tag = 0){
if(empty($tag)) {
$tag = self::$jSelLangTag; //This is the joomla language, the used tag must not change
}
//We dont need the case for the standard language, because it is set in the initialise function
if(!isset(self::$languages[$tag])) {
self::$languages[$tag] = JLanguage::getInstance($tag, false);
}
return self::$languages[$tag];
}
static public $_loaded = array();
/**
* loads a language file, the trick for us is that always the config option enableEnglish is tested
* and the path are already set and the correct order is used
* We use first the english language, then the default
*
* @author Max Milbers
* @static
* @param $name
* @return bool
*/
static public function loadJLang($name, $site = false, $tag = 0, $cache = true){
static $loaded = array();
if(empty($tag)) {
$tag = self::$currLangTag;
}
$site = (int)$site;
self::$_loaded['com'][$site][$name] = $name;
self::getLanguage($tag);
$h = $site.$tag.$name;
if($cache and isset($loaded[$h])){
vmText::$language = self::$languages[$tag];
return self::$languages[$tag];
} else {
if(!isset(self::$languages[$tag])){
vmdebug('No language loaded '.$tag.' '.$name);
vmEcho::$logDebug = true;
vmTrace('No language loaded '.$tag.' '.$name,true);
return false ;
}
}
if($site){
$path = $basePath = VMPATH_SITE;
} else {
$path = $basePath = VMPATH_ADMIN;
}
if($tag!='en-GB' and VmConfig::get('enableEnglish', true) ){
$testpath = $basePath.'/language/en-GB/en-GB.'.$name.'.ini';
if(!file_exists($testpath)){
if($site){
$epath = VMPATH_ROOT;
} else {
$epath = VMPATH_ADMINISTRATOR;
}
} else {
$epath = $path;
}
self::$languages[$tag]->load($name, $epath, 'en-GB', true, false);
}
$testpath = $basePath.'/language/'.$tag.'/'.$tag.'.'.$name.'.ini';
if(!file_exists($testpath)){
if($site){
$path = VMPATH_ROOT;
} else {
$path = VMPATH_ADMINISTRATOR;
}
}
self::$languages[$tag]->load($name, $path, $tag, true, true);
$loaded[$h] = true;
//vmdebug('loaded '.$h.' '.$path.' '.self::$languages[$tag]->getTag());
vmText::$language = self::$languages[$tag];
//vmText::setLanguage(self::$languages[$tag]);
return self::$languages[$tag];
}
/**
* @static
* @author Max Milbers, Valerie Isaksen
* @param $name
*/
static public function loadModJLang($name){
$tag = self::$currLangTag;
self::$_loaded['mod'][$name] = $name;
self::getLanguage($tag);
$path = $basePath = JPATH_VM_MODULES.'/'.$name;
if(VmConfig::get('enableEnglish', true) and $tag!='en-GB'){
if(!file_exists($basePath.'/language/en-GB/en-GB.'.$name.'.ini')){
$path = JPATH_ADMINISTRATOR;
}
self::$languages[$tag]->load($name, $path, 'en-GB');
$path = $basePath = JPATH_VM_MODULES.'/'.$name;
}
if(!file_exists($basePath.'/language/'.$tag.'/'.$tag.'.'.$name.'.ini')){
$path = JPATH_ADMINISTRATOR;
}
self::$languages[$tag]->load($name, $path,$tag,true);
return self::$languages[$tag];
}
static $cgULF = null;
static public function getUseLangFallback($fresh = false){
if(self::$cgULF===null or $fresh){
if(VmLanguage::$langCount>1 and VmConfig::$defaultLang!=VmConfig::$vmlang and !VmConfig::get('prodOnlyWLang',false) ){
self::$cgULF = true;
} else {
self::$cgULF = false;
}
}
return self::$cgULF;
}
static $cgULFS = null;
static public function getUseLangFallbackSecondary($fresh = false){
if(self::$cgULFS===null or $fresh){
if(self::getUseLangFallback() and VmConfig::$defaultLang!=VmConfig::$jDefLang and VmConfig::$jDefLang!=VmConfig::$vmlang){
self::$cgULFS = true;
} else {
self::$cgULFS = false;
}
}
return self::$cgULFS;
}
}