148 lines
2.4 KiB
PHP
148 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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
?>
|