Mask i18n

This commit is contained in:
2020-04-13 18:13:27 +02:00
parent 55741fd898
commit a6fa2fe627
2 changed files with 63 additions and 35 deletions

View File

@@ -3,7 +3,7 @@
/** /**
* Mask Reader * Mask Reader
* @author franzz * @author franzz
* @version 1.0 * @version 1.1
*/ */
class Mask extends PhpObject class Mask extends PhpObject
{ {
@@ -11,6 +11,7 @@ class Mask extends PhpObject
public $sFilePath; public $sFilePath;
private $sMask; private $sMask;
private $asTags; private $asTags;
private $asTagsParams;
private $asPartsSource; private $asPartsSource;
private $aoInstances; private $aoInstances;
@@ -31,14 +32,40 @@ class Mask extends PhpObject
$this->sFilePath = ''; $this->sFilePath = '';
$this->sMask = ''; $this->sMask = '';
$this->asTags = array(); $this->asTags = array();
$this->asTagsParams = array();
$this->asPartsSource = array(); $this->asPartsSource = array();
$this->aoInstances = array(); $this->aoInstances = array();
$this->sFilePath = ''; $this->sFilePath = '';
$this->oLang = $oLang; $this->setTranslator($oLang);
//load file //load file
if($sFileName!='') $this->initFile($sFileName); if($sFileName!='') $this->initFile($sFileName);
} }
public function setLanguage($sLang, $sDefaultLang='') {
if(is_null($this->oLang)) $this->setTranslator(new Translator($sLang, $sDefaultLang));
else {
$this->oLang->setLanguage($sLang, $sDefaultLang);
foreach($this->aoInstances as &$aoPartInstance) {
foreach($aoPartInstance as $oInstance) $oInstance->setLanguage($sLang, $sDefaultLang);
}
}
}
private function setTranslator($oLang) {
$this->oLang = $oLang;
foreach($this->aoInstances as &$aoPartInstance) {
foreach($aoPartInstance as $oInstance) $oInstance->setTranslator($this->oLang);
}
}
/**
* Get Mask Translator
* @return Translator
*/
public function getTranslator() {
return $this->oLang;
}
public static function getMaskFile($sFileName) public static function getMaskFile($sFileName)
{ {
@@ -70,7 +97,7 @@ class Mask extends PhpObject
$this->sMaskName = $sMaskName; $this->sMaskName = $sMaskName;
$this->sMask = $sSource; $this->sMask = $sSource;
$this->setParts(); $this->setParts();
$this->setLangTags(); $this->setDefaultTagValues();
} }
private function setParts() private function setParts()
@@ -141,12 +168,12 @@ class Mask extends PhpObject
$oMask->aoInstances[$sPartName][] = $oInstance; $oMask->aoInstances[$sPartName][] = $oInstance;
} }
public function setInstanceTag($sPartName, $sTagName, $sTagValue) public function setInstanceTag($sPartName, $sTagName, $sTagValue, $asLangParams=array())
{ {
$oMask = $this->findPart($this, $sPartName); $oMask = $this->findPart($this, $sPartName);
if(!$oMask) $this->addError('No part found : '.$sPartName); if(!$oMask) $this->addError('No part found : '.$sPartName);
$oMask->getCurrentInstance($sPartName)->setTag($sTagName, $sTagValue); $oMask->getCurrentInstance($sPartName)->setTag($sTagName, $sTagValue, $asLangParams);
} }
private function findPart($oMask, $sPartName) private function findPart($oMask, $sPartName)
@@ -181,8 +208,17 @@ class Mask extends PhpObject
return false; return false;
} }
} }
private function setDefaultTagValues() {
$asTagNames = $this->getTags();
//Default translations
foreach($asTagNames as $sTagName) {
if(self::isLangTag($sTagName)) $this->setTag($sTagName, $sTagName);
}
}
public function getTags($bLang=false) public function getTags()
{ {
$sSafeTagMark = preg_quote(self::TAG_MARK); $sSafeTagMark = preg_quote(self::TAG_MARK);
$sSafeLangMark = preg_quote(self::LANG_PREFIX); $sSafeLangMark = preg_quote(self::LANG_PREFIX);
@@ -191,14 +227,10 @@ class Mask extends PhpObject
return array_unique(array_filter($asMatches['tag'])); return array_unique(array_filter($asMatches['tag']));
} }
public function setTag($sTagName, $sTagValue) public function setTag($sTagName, $sTagValue, $asLangParams=array())
{ {
//Check if tagged should be translated
if(self::isLangTag($sTagValue)) {
if(is_null($this->oLang)) $this->addError('Missing Lang Class. Please provide in constructor');
else $sTagValue = $this->oLang->getTranslation(mb_substr($sTagValue, 5));
}
$this->asTags[$sTagName] = $sTagValue; $this->asTags[$sTagName] = $sTagValue;
$this->asTagsParams[$sTagName] = $asLangParams;
} }
public function setTags($asTags) public function setTags($asTags)
@@ -206,18 +238,6 @@ class Mask extends PhpObject
foreach($asTags as $sTagName=>$sTagValue) $this->setTag($sTagName, $sTagValue); foreach($asTags as $sTagName=>$sTagValue) $this->setTag($sTagName, $sTagValue);
} }
/**
* Default value for tags tagged as translation: Starting with lang/
*/
private function setLangTags() {
if($this->oLang != null) {
$asTags = $this->getTags();
foreach($asTags as $sTagName) {
if(self::isLangTag($sTagName)) $this->setTag($sTagName, $this->oLang->getTranslation(mb_substr($sTagName, 5)));
}
}
}
private static function isLangTag($sTag) { private static function isLangTag($sTag) {
return (mb_substr($sTag, 0, 5) == self::LANG_PREFIX); return (mb_substr($sTag, 0, 5) == self::LANG_PREFIX);
} }
@@ -226,7 +246,7 @@ class Mask extends PhpObject
{ {
$sCompletedMask = $this->sMask; $sCompletedMask = $this->sMask;
//build parts //Build Parts
foreach($this->aoInstances as $sPart=>$aoParts) foreach($this->aoInstances as $sPart=>$aoParts)
{ {
$sTagValue = ''; $sTagValue = '';
@@ -236,12 +256,19 @@ class Mask extends PhpObject
} }
$this->setTag($this->getPartTagPattern($sPart, false), $sTagValue); $this->setTag($this->getPartTagPattern($sPart, false), $sTagValue);
} }
//replace tags //Translate Tags
if(!empty($this->asTags)) $asTags = $this->asTags;
{ if(!is_null($this->oLang)) {
$asTags = $this->addTagMark(array_keys($this->asTags)); foreach($asTags as $sTagName=>&$sTagValue) {
$sCompletedMask = str_replace($asTags, $this->asTags, $sCompletedMask); if(self::isLangTag($sTagValue)) $sTagValue = $this->oLang->getTranslation(mb_substr($sTagValue, 5), $this->asTagsParams[$sTagName]);
}
}
//Replace Tags
if(!empty($asTags)) {
$asMarkedTags = $this->addTagMark(array_keys($asTags));
$sCompletedMask = str_replace($asMarkedTags, $asTags, $sCompletedMask);
} }
return $sCompletedMask; return $sCompletedMask;
} }

View File

@@ -3,7 +3,7 @@
/** /**
* Translator Class * Translator Class
* @author franzz * @author franzz
* @version 1.0 * @version 1.1
*/ */
class Translator extends PhpObject class Translator extends PhpObject
{ {
@@ -15,13 +15,14 @@ class Translator extends PhpObject
const LANG_FOLDER = 'languages/'; const LANG_FOLDER = 'languages/';
const LANG_EXT = '.lang'; const LANG_EXT = '.lang';
const LANG_SEP = '='; const LANG_SEP = '=';
const DEFAULT_LANG = 'en';
/** /**
* Constructor * Constructor
* @param string $sLang leave empty for auto selection based on $_SERVER['HTTP_ACCEPT_LANGUAGE'] * @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 * @param string $sDefaultLang Fallback language if no fitting language is available
*/ */
public function __construct($sLang='', $sDefaultLang='en') public function __construct($sLang='', $sDefaultLang='')
{ {
parent::__construct(__FILE__, Settings::DEBUG); parent::__construct(__FILE__, Settings::DEBUG);
$this->asLanguages = array(); $this->asLanguages = array();
@@ -30,8 +31,8 @@ class Translator extends PhpObject
$this->setLanguage($sLang, $sDefaultLang); $this->setLanguage($sLang, $sDefaultLang);
} }
public function setLanguage($sLang, $sDefaultLang) { public function setLanguage($sLang, $sDefaultLang='') {
$this->sDefaultLang = $sDefaultLang; $this->sDefaultLang = ($sDefaultLang=='')?self::DEFAULT_LANG:$sDefaultLang;
$this->sLang = ($sLang=='')?ToolBox::getUserLanguage($this->asLanguages, $this->sDefaultLang):$sLang; $this->sLang = ($sLang=='')?ToolBox::getUserLanguage($this->asLanguages, $this->sDefaultLang):$sLang;
} }