获取PHP中语言的默认语言环境

时间:2011-12-19 23:06:22

标签: php locale

我有一个PHP后端,几种类型的设备通过公共API进行通信。请求通常包含响应所需的语言(例如'en'或'fr'或'ru'等) - 但不是完整的语言环境。这对我过去几年所需要的一切都很好。但是现在我需要在响应中包含日期信息 - 并且需要一个区域设置来格式化日期。

如何从语言中获取区域设置?我确实理解语言不足以唯一地识别语言环境,但我至少需要一些东西。如果我可以获得至少一个区域设置,例如'en'的en_GB或'ru'的'ru_RU'等 - 这就足够了。

3 个答案:

答案 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以允许用户明确设置其区域设置,只需确保它将优雅地回退到您选择立即实施的任何系统。