Add language detection (guessing)
This commit is contained in:
@@ -8,52 +8,59 @@
|
||||
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 = '=';
|
||||
const DEFAULT_LANG = 'FR';
|
||||
|
||||
public function __construct($sLang='')
|
||||
/**
|
||||
* 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);
|
||||
$this->setLanguage($sLang, $sDefaultLang);
|
||||
}
|
||||
|
||||
public function setLanguage($sLang)
|
||||
{
|
||||
$this->sLang = in_array($sLang, $this->asLanguages)?$sLang:self::DEFAULT_LANG;
|
||||
public function setLanguage($sLang, $sDefaultLang) {
|
||||
$this->sDefaultLang = $sDefaultLang;
|
||||
$this->sLang = ($sLang=='')?ToolBox::getUserLanguage($this->asLanguages, $this->sDefaultLang):$sLang;
|
||||
}
|
||||
|
||||
public function getTranslation($sTransKey, $sLang='')
|
||||
public function getTranslation($sTransKey='', $sLang='')
|
||||
{
|
||||
$sTransText = false;
|
||||
$oTransText = false;
|
||||
|
||||
//Select language
|
||||
if($sLang=='')
|
||||
{
|
||||
$sLang = $this->sLang;
|
||||
}
|
||||
//Select language & Scope
|
||||
if($sLang=='') $sLang = $this->sLang;
|
||||
$bAllTrans = ($sTransKey=='');
|
||||
|
||||
//Look up in the selected language dictionary
|
||||
if(in_array($sLang, $this->asLanguages) && array_key_exists($sTransKey, $this->asTranslations[$sLang]))
|
||||
if(in_array($sLang, $this->asLanguages) && ($bAllTrans || array_key_exists($sTransKey, $this->asTranslations[$sLang])))
|
||||
{
|
||||
$sTransText = $this->asTranslations[$sLang][$sTransKey];
|
||||
$oTransText = $bAllTrans?$this->asTranslations[$sLang]:$this->asTranslations[$sLang][$sTransKey];
|
||||
}
|
||||
//Look up in the default language dictionary
|
||||
elseif(array_key_exists($sTransKey, $this->asTranslations[self::DEFAULT_LANG]))
|
||||
elseif(array_key_exists($sTransKey, $this->asTranslations[$this->sDefaultLang]))
|
||||
{
|
||||
$this->addWarning('Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'", falling back to "'.self::DEFAULT_LANG.'"');
|
||||
$sTransText = $this->asTranslations[self::DEFAULT_LANG][$sTransKey];
|
||||
$this->addWarning('Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'", falling back to "'.$this->sDefaultLang.'"');
|
||||
$oTransText = $this->asTranslations[$this->sDefaultLang][$sTransKey];
|
||||
}
|
||||
else $this->addWarning('Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'"');
|
||||
else $this->addWarning($bAllTrans?'Missing language "'.$sLang.'"':'Missing translation in "'.$sLang.'" for the key "'.$sTransKey.'"');
|
||||
|
||||
return $sTransText;
|
||||
return $oTransText;
|
||||
}
|
||||
|
||||
public function getTranslations($sLang='') {
|
||||
return $this->getTranslation('', $sLang);
|
||||
}
|
||||
|
||||
public function getHashToPage($asMenuPages)
|
||||
@@ -83,7 +90,7 @@ class Translator extends PhpObject
|
||||
{
|
||||
//List all available languages
|
||||
$asLangPaths = glob(self::getLangPath('*'));
|
||||
$this->asLanguages = array_map('basename', $asLangPaths, array_fill(1, count($asLangPaths), self::LANG_EXT));
|
||||
$this->asLanguages = array_map('basename', $asLangPaths, array_fill(1, count($asLangPaths), self::LANG_EXT));
|
||||
|
||||
//Load languages
|
||||
array_walk($this->asLanguages, array($this, 'loadLanguageFile'));
|
||||
@@ -97,11 +104,11 @@ class Translator extends PhpObject
|
||||
$asData = explode("\n", $sData);
|
||||
foreach($asData as $sTranslation)
|
||||
{
|
||||
$iSepPos = stripos($sTranslation, self::LANG_SEP);
|
||||
if($iSepPos!==false)
|
||||
$iSepPos = mb_stripos($sTranslation, self::LANG_SEP);
|
||||
if($iSepPos !== false)
|
||||
{
|
||||
$sTransKey = trim(substr($sTranslation, 0, $iSepPos));
|
||||
$sTransText = /*htmlspecialchars(*/trim(substr($sTranslation, $iSepPos+1))/*, ENT_QUOTES)*/; //TODO when all entities have been removed
|
||||
$sTransKey = trim(mb_substr($sTranslation, 0, $iSepPos));
|
||||
$sTransText = trim(mb_substr($sTranslation, $iSepPos+1));
|
||||
$this->asTranslations[$sLang][$sTransKey] = $sTransText;
|
||||
}
|
||||
}
|
||||
@@ -112,6 +119,4 @@ class Translator extends PhpObject
|
||||
{
|
||||
return self::LANG_FOLDER.$sLang.self::LANG_EXT;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
}
|
||||
Reference in New Issue
Block a user