Make translations multi-leveled

This commit is contained in:
2026-04-29 22:40:54 +02:00
parent 670a014cf8
commit c0c0b21290

View File

@@ -15,8 +15,9 @@ class Translator extends PhpObject
private $asLanguages;
private $asTranslations; // [lang][key_word] = translation
const LANG_FOLDER = '../i18n/';
const LANG_EXT = '.json';
const TRANS_FOLDER = '../i18n/';
const TRANS_FILE_EXT = '.json';
const TRANS_SEP = '.';
const DEFAULT_LANG = 'en';
/**
@@ -106,7 +107,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::TRANS_FILE_EXT));
//Load languages
array_walk($this->asLanguages, array($this, 'loadLanguageFile'));
@@ -119,7 +120,7 @@ class Translator extends PhpObject
$sData = file_get_contents(self::getLangPath($sLang));
$asData = json_decode($sData, true);
if(is_array($asData)) $this->asTranslations[$sLang] = $asData;
if(is_array($asData)) $this->asTranslations[$sLang] = self::flattenTranslations($asData);
else {
$this->asTranslations[$sLang] = array();
$this->addWarning('Invalid JSON translation file for language "'.$sLang.'": '.json_last_error_msg());
@@ -127,8 +128,21 @@ class Translator extends PhpObject
}
}
private static function flattenTranslations($asData, $sParentKey='')
{
$asTranslations = array();
foreach($asData as $sKey=>$oValue) {
$sKey = ($sParentKey==''?'':$sParentKey.self::TRANS_SEP).$sKey;
if(is_array($oValue)) $asTranslations += self::flattenTranslations($oValue, $sKey);
else $asTranslations[$sKey] = $oValue;
}
return $asTranslations;
}
private static function getLangPath($sLang)
{
return self::LANG_FOLDER.$sLang.self::LANG_EXT;
return self::TRANS_FOLDER.$sLang.self::TRANS_FILE_EXT;
}
}
}