rosavox/lib/alveolata/localization/functions.php
2025-05-23 07:33:29 +00:00

147 lines
2.4 KiB
PHP

<?php
namespace alveolata\localization;
require_once(DIR_ALVEOLATA . '/string/functions.php');
require_once(DIR_ALVEOLATA . '/log/functions.php');
/**
* @author Christian Fraß <frass@greenscale.de>
*/
class _state {
/**
* @var list<string>
* @author Christian Fraß <frass@greenscale.de>
*/
public static $order = [];
/**
* @var map<string,map<string,string>
* @author Christian Fraß <frass@greenscale.de>
*/
public static $data = [];
/**
* @var boolean
* @author Christian Fraß <frass@greenscale.de>
*/
public static $suppress_messages = false;
}
/**
* @author Christian Fraß <frass@greenscale.de>
*/
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ß <frass@greenscale.de>
*/
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ß <frass@greenscale.de>
*/
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ß <frass@greenscale.de>
*/
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;
}
}
?>