Правильно ли я вас понимаю, что вам нужна только карта от языка (например, en
) до локали (например, en_GB
)? Если это так, вы можете скомпилировать один для языков, которые вы используете:
$localeMap = array(
'en' => 'en_GB',
'fr' => 'fr_FR',
# ...
);
# Usage:
$locale = $localeMap[$lang];
Но это так тривиально, что я не уверен, правильно ли я понял твой вопрос.
Если вы не уверены, какой язык используется для языка, просто возьмите язык, который должен быть действительным языком, только без страны:
l => l l
Пока язык в двухбуквенном формате мне подходит (стандарт ISO 639, «Код для представления названий языков»), смотрите также Теги для идентификации языков (RFC 1766) ) .
$locale = isset($localeMap[$lang]) ? $localeMap[$lang] : $lang;
Однако это может отличаться в зависимости от того, какой формат локали ожидает ожидаемая вами функция.
class System
{
/**
* @return array
*/
public function getLocales()
{
$locales = array();
exec('locale -a', $locales, $retCode);
!$retCode || $locales = array();
return $locales;
}
/**
* @return string something matching
* @note Improve by creating your system aware locale class to move
* away the responsibility to map system locales onto strings
* of certain kinds and to deal with the different locale types.
*/
public function getLocaleByLang($lang)
{
...
}
}
$lang = ...
$system = new System;
$locale = $system->getLocaleByLang($lang);