130 lines
3.8 KiB
PHP
Executable File
130 lines
3.8 KiB
PHP
Executable File
<?php
|
|
|
|
/**
|
|
* Translator Class
|
|
* @author franzz
|
|
* @version 1.0
|
|
*/
|
|
class Translator extends PhpObject
|
|
{
|
|
private $sLang;
|
|
private $sDefaultLang;
|
|
private $asLanguages;
|
|
private $asTranslations; // [lang][key_word] = translation
|
|
|
|
const LANG_FOLDER = 'languages/';
|
|
const LANG_EXT = '.lang';
|
|
const LANG_SEP = '=';
|
|
|
|
/**
|
|
* Constructor
|
|
* @param string $sLang leave empty for auto selection based on $_SERVER['HTTP_ACCEPT_LANGUAGE']
|
|
* @param string $sDefaultLang Fallback language if no fitting language is available
|
|
*/
|
|
public function __construct($sLang='', $sDefaultLang='en')
|
|
{
|
|
parent::__construct(__FILE__, Settings::DEBUG);
|
|
$this->asLanguages = array();
|
|
$this->asTranslations = array();
|
|
$this->loadLanguages();
|
|
$this->setLanguage($sLang, $sDefaultLang);
|
|
}
|
|
|
|
public function setLanguage($sLang, $sDefaultLang) {
|
|
$this->sDefaultLang = $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;
|
|
}
|
|
|
|
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;
|
|
}
|
|
} |