*/ class _state { /** * @var list * @author Christian Fraß */ public static $order = []; /** * @var map * @author Christian Fraß */ public static $data = []; /** * @var boolean * @author Christian Fraß */ public static $suppress_messages = false; } /** * @author Christian Fraß */ function _add( string $language, string $key, string $value ) : void { _state::$data; if (! array_key_exists($language, _state::$data)) { _state::$data[$language] = []; } _state::$data[$language][$key] = $value; } /** * @author Christian Fraß */ function feed( string $language, array $data ) : void { array_unshift(_state::$order, $language); foreach ($data as $key => $value) { _add($language, $key, $value); } } /** * @param string $language * @param string $key * @return string * @author Christian Fraß */ function _fetch( string $language, string $key ) : string { if (! array_key_exists($language, _state::$data)) { if (! _state::$suppress_messages) { \alveolata\log\notice( 'no localization data for language', [ 'language' => $language, ] ); } return UNSET_STRING; } else { if (! array_key_exists($key, _state::$data[$language])) { if (! _state::$suppress_messages) { \alveolata\log\notice( 'no translation for key', [ 'language' => $language, 'key' => $key, ] ); } return UNSET_STRING; } else { return _state::$data[$language][$key]; } } } /** * @author Christian Fraß */ function get( string $key, string $fallback = UNSET_STRING ) : string { if ($fallback === UNSET_STRING) { $fallback = sprintf('{%s}', $key); } $found = false; foreach (_state::$order as $language) { $value = _fetch($language, $key); if (! ($value === UNSET_STRING)) { $found = true; break; } } if (! $found) { if (! _state::$suppress_messages) { \alveolata\log\warning( 'using fallback translation', [ 'key' => $key, 'languages_tried' => _state::$order, ] ); } return $fallback; } else { return $value; } } ?>