asLanguages = array(); $this->asTranslations = array(); $this->loadLanguages(); $this->setLanguage($sLang, $sDefaultLang); } public function setLanguage($sLang, $sDefaultLang='') { $this->sDefaultLang = ($sDefaultLang=='')?self::DEFAULT_LANG:$sDefaultLang; $this->sLang = ($sLang=='')?ToolBox::getUserLanguage($this->asLanguages, $this->sDefaultLang):$sLang; } public function getLanguage() { return $this->sLang; } public function getTranslation($sTransKey='', $asParams=array(), $sLang='') { $oTransText = false; //Select language & Scope if($sLang=='') $sLang = $this->sLang; $bAllTrans = ($sTransKey==''); //Look up in the selected language dictionary if(in_array($sLang, $this->asLanguages) && ($bAllTrans || array_key_exists($sTransKey, $this->asTranslations[$sLang]))) { if($bAllTrans) $oTransText = array_merge($this->asTranslations[$this->sDefaultLang], $this->asTranslations[$sLang]); else $oTransText = $this->asTranslations[$sLang][$sTransKey]; } //Look up in the default language dictionary elseif(!$bAllTrans && array_key_exists($sTransKey, $this->asTranslations[$this->sDefaultLang])) { $this->addWarning('Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'", falling back to "'.$this->sDefaultLang.'"'); $oTransText = $this->asTranslations[$this->sDefaultLang][$sTransKey]; } else $this->addWarning($bAllTrans?'Missing language "'.$sLang.'"':'Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'"'); if(is_string($asParams)) $asParams = array($asParams); if($oTransText && !$bAllTrans && !empty($asParams)) { foreach($asParams as $iIndex=>$sParam) $oTransText = str_replace('$'.$iIndex, $sParam, $oTransText); } return $oTransText; } public function getTranslations($sLang='') { return $this->getTranslation('', $sLang); } public function getHashToPage($asMenuPages) { $asHashToPage = array(); foreach($asMenuPages as $sHash) { foreach($this->asLanguages as $sLang) { $asHashToPage[$this->getTranslation('menu_'.$sHash.'_key', $sLang)] = $sHash; } } return $asHashToPage; } public function getPageToHash($asMenuPages) { $asPageToHash = array(); foreach($asMenuPages as $sHash) { $asPageToHash[$sHash] = $this->getTranslation('menu_'.$sHash.'_key'); } return $asPageToHash; } public function getTranslationKey($stransText, $sLang='') { if($sLang=='') $sLang = $this->sLang; return array_search($stransText, $this->asTranslations[$sLang]) ?? ''; } private function loadLanguages() { //List all available languages $asLangPaths = glob(self::getLangPath('*')); $this->asLanguages = array_map('basename', $asLangPaths, array_fill(1, count($asLangPaths), self::LANG_EXT)); //Load languages array_walk($this->asLanguages, array($this, 'loadLanguageFile')); } private function loadLanguageFile($sLang) { if(!in_array($sLang, $this->asTranslations)) { $sData = file_get_contents(self::getLangPath($sLang)); $asData = explode("\n", $sData); foreach($asData as $sTranslation) { $iSepPos = mb_stripos($sTranslation, self::LANG_SEP); if($iSepPos !== false) { $sTransKey = trim(mb_substr($sTranslation, 0, $iSepPos)); $sTransText = trim(mb_substr($sTranslation, $iSepPos+1)); $this->asTranslations[$sLang][$sTransKey] = $sTransText; } } } } private static function getLangPath($sLang) { return self::LANG_FOLDER.$sLang.self::LANG_EXT; } }