我有一个PHP后端,几种类型的设备通过公共API进行通信。请求通常包含响应所需的语言(例如'en'或'fr'或'ru'等) - 但不是完整的语言环境。这对我过去几年所需要的一切都很好。但是现在我需要在响应中包含日期信息 - 并且需要一个区域设置来格式化日期。
如何从语言中获取区域设置?我确实理解语言不足以唯一地识别语言环境,但我至少需要一些东西。如果我可以获得至少一个区域设置,例如'en'的en_GB或'ru'的'ru_RU'等 - 这就足够了。
答案 0 :(得分:6)
在考虑了问题和我所拥有的特定设置之后,我想出了这个解决方案,这似乎有效。请注意,我无法控制需要支持的语言:将转换文件放入预定义的位置,并由其他人安装系统区域设置。在运行时,如果存在相应的转换文件并且安装了系统区域设置,我需要支持特定语言。这让我得到了这个解决方案:
function getLocale($lang)
{
$locs = array();
exec('locale -a', $locs);
$locale = 'en_GB';
foreach($locs as $l)
{
$regex = "/$lang\_[A-Z]{2}$/";
if(preg_match($regex, $l) && file_exists(TRANSROOT . "/$lang.php"))
{
$locale = $l;
break;
}
}
return $locale;
}
如果我无法解析语言环境,我将默认为en_GB,因为我确定安装了en_GB(我们的服务器位于英国)。
答案 1 :(得分:1)
我是否理解您只需要从语言(如en
)到地区(如en_GB
)的地图?如果是这样,您可以为您使用的语言编译一个:
$localeMap = array(
'en' => 'en_GB',
'fr' => 'fr_FR',
# ...
);
# Usage:
$locale = $localeMap[$lang];
但这太微不足道了,我不确定我是否理解你的问题。
如果您不确定语言的语言环境是什么,只需使用本身应该是有效语言环境的语言,只需要没有国家/地区:
l =>升升
只要语言是双字母格式对我来说很好(ISO标准639,“代表语言名称的代码”),请参阅Tags for the Identification of Languages (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);
答案 2 :(得分:1)
也许您可以使用$_SERVER['HTTP_ACCEPT_LANGUAGE'];
而不是提供的语言来获取区域设置。通常,这将包含带有连字符而不是下划线的实际区域设置。
示例$_SERVER['HTTP_ACCEPT_LANGUAGE']
:
en-ca,en;q=0.8,fr-ca;q=0.5,fr;q=0.3
只需在第一个,
之前获取所有内容,然后就可以了。这也比填充一组语言环境更好,因为它让浏览器告诉服务器它更喜欢哪种语言,而不是相反,但是hakre的答案中的数组应该用作备份系统,以防无效/空/提供了遗漏$_SERVER['HTTP_ACCEPT_LANGUAGE']
。
您可能想要查看的其他内容包括locale类和locale::acceptFromHttp方法
此外,您可能需要考虑修改API以允许用户明确设置其区域设置,只需确保它将优雅地回退到您选择立即实施的任何系统。