From a6fa2fe6277786102a72bf46433ad62ad2194081 Mon Sep 17 00:00:00 2001 From: Franzz Date: Mon, 13 Apr 2020 18:13:27 +0200 Subject: [PATCH] Mask i18n --- inc/mask.php | 89 ++++++++++++++++++++++++++++++---------------- inc/translator.php | 9 ++--- 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/inc/mask.php b/inc/mask.php index f5ee98d..3b01433 100755 --- a/inc/mask.php +++ b/inc/mask.php @@ -3,7 +3,7 @@ /** * Mask Reader * @author franzz - * @version 1.0 + * @version 1.1 */ class Mask extends PhpObject { @@ -11,6 +11,7 @@ class Mask extends PhpObject public $sFilePath; private $sMask; private $asTags; + private $asTagsParams; private $asPartsSource; private $aoInstances; @@ -31,14 +32,40 @@ class Mask extends PhpObject $this->sFilePath = ''; $this->sMask = ''; $this->asTags = array(); + $this->asTagsParams = array(); $this->asPartsSource = array(); $this->aoInstances = array(); $this->sFilePath = ''; - $this->oLang = $oLang; + $this->setTranslator($oLang); //load file 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) { @@ -70,7 +97,7 @@ class Mask extends PhpObject $this->sMaskName = $sMaskName; $this->sMask = $sSource; $this->setParts(); - $this->setLangTags(); + $this->setDefaultTagValues(); } private function setParts() @@ -141,12 +168,12 @@ class Mask extends PhpObject $oMask->aoInstances[$sPartName][] = $oInstance; } - public function setInstanceTag($sPartName, $sTagName, $sTagValue) + public function setInstanceTag($sPartName, $sTagName, $sTagValue, $asLangParams=array()) { $oMask = $this->findPart($this, $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) @@ -181,8 +208,17 @@ class Mask extends PhpObject 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); $sSafeLangMark = preg_quote(self::LANG_PREFIX); @@ -191,14 +227,10 @@ class Mask extends PhpObject 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->asTagsParams[$sTagName] = $asLangParams; } public function setTags($asTags) @@ -206,18 +238,6 @@ class Mask extends PhpObject 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) { return (mb_substr($sTag, 0, 5) == self::LANG_PREFIX); } @@ -226,7 +246,7 @@ class Mask extends PhpObject { $sCompletedMask = $this->sMask; - //build parts + //Build Parts foreach($this->aoInstances as $sPart=>$aoParts) { $sTagValue = ''; @@ -236,12 +256,19 @@ class Mask extends PhpObject } $this->setTag($this->getPartTagPattern($sPart, false), $sTagValue); } - - //replace tags - if(!empty($this->asTags)) - { - $asTags = $this->addTagMark(array_keys($this->asTags)); - $sCompletedMask = str_replace($asTags, $this->asTags, $sCompletedMask); + + //Translate Tags + $asTags = $this->asTags; + if(!is_null($this->oLang)) { + foreach($asTags as $sTagName=>&$sTagValue) { + 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; } diff --git a/inc/translator.php b/inc/translator.php index eff937f..1689541 100755 --- a/inc/translator.php +++ b/inc/translator.php @@ -3,7 +3,7 @@ /** * Translator Class * @author franzz - * @version 1.0 + * @version 1.1 */ class Translator extends PhpObject { @@ -15,13 +15,14 @@ class Translator extends PhpObject const LANG_FOLDER = 'languages/'; const LANG_EXT = '.lang'; const LANG_SEP = '='; + const DEFAULT_LANG = 'en'; /** * 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') + public function __construct($sLang='', $sDefaultLang='') { parent::__construct(__FILE__, Settings::DEBUG); $this->asLanguages = array(); @@ -30,8 +31,8 @@ class Translator extends PhpObject $this->setLanguage($sLang, $sDefaultLang); } - public function setLanguage($sLang, $sDefaultLang) { - $this->sDefaultLang = $sDefaultLang; + public function setLanguage($sLang, $sDefaultLang='') { + $this->sDefaultLang = ($sDefaultLang=='')?self::DEFAULT_LANG:$sDefaultLang; $this->sLang = ($sLang=='')?ToolBox::getUserLanguage($this->asLanguages, $this->sDefaultLang):$sLang; }