从php中的Intl扩展获取CLDR信息

swe*_*web 11 php intl cldr

之前我使用过Zend_Locale,但似乎PHP intl扩展有cldr信息.

我需要获得一些信息,例如获取每种语言的可用国家/地区?例如enUS,UK,GBfa具有IRAF和CLDR项目提供更多的数据.

CLDR xml文件中存在国家/地区名称,每种语言的时区列表以及更多数据.

它嵌入在php intl上,或者我可以下载并将它们绑定到类或方法上吗?

哪个对象或方法可以为我提供有关PHP intl扩展的信息

CLDR信息

Ugu*_*gur 5

我提出了一个解决方案,起点是区域设置.

您可以使用getLocales方法获取所有语言环境的列表.$locales = ResourceBundle::getLocales('');见这里:http://php.net/manual/en/resourcebundle.locales.php

然后,您可以获取每个区域设置的国家/地区名称,$countryName = Locale::getDisplayRegion($locale, 'en');或者您可以使用Locale::getDisplayLanguage ( $locale )等等获取语​​言名称.见这里:http://php.net/manual/en/class.locale.php

例如,我设法使用以下代码匹配许多时区名称;

<?php
/* fill the array with values from 
https://gist.github.com/vxnick/380904#gistcomment-1433576
Unfortunately I couldn't manage to find a proper
way to convert countrynames to short codes
*/
$countries = [];
$locales = ResourceBundle::getLocales('');

foreach ($locales as $l => $locale) {
    $countryName = Locale::getDisplayRegion($locale, 'en');
    $countryCode = array_search($countryName, $countries);
    if($countryCode !== false) {
        $timezone_identifiers = DateTimeZone::listIdentifiers( DateTimeZone::PER_COUNTRY, $countryCode);
        echo "----------------".PHP_EOL;
        echo $countryName.PHP_EOL;
        echo Locale::getDisplayLanguage ( $locale ).PHP_EOL;
        var_dump($timezone_identifiers);

    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这不是最好的答案,但至少这可能会给你一个启动.

更新

要获取每个区域的国家/地区名称,您可以尝试这个;

<?php
$locales = ResourceBundle::getLocales('');
foreach ($locales as $l => $locale) {
    $countryName = Locale::getDisplayRegion($locale, 'en');
    echo $locale."===>".$countryName.PHP_EOL;
} 
Run Code Online (Sandbox Code Playgroud)

更新2

收集日期名称,月份名称,每个区域的货币

$locales = ResourceBundle::getLocales('');

foreach ($locales as $l => $locale) {
    echo "============= ".PHP_EOL;
    echo "Locale:". $locale. PHP_EOL;
    echo "Language: ".Locale::getDisplayLanguage($locale, 'en');
    echo PHP_EOL;
    $formatter = new NumberFormatter($locale, NumberFormatter::CURRENCY); 
    echo "Currency: ".$formatter->getTextAttribute(NumberFormatter::CURRENCY_CODE); 
    echo PHP_EOL;       

    echo PHP_EOL."Days :".PHP_EOL;
    $dt = new DateTime('this sunday');
    for($i = 0; $i<=6; $i++) {
        echo IntlDateFormatter::formatObject($dt, "eeee", $locale);
        $dt->add(new DateInterval('P1D'));
        echo PHP_EOL;
    }

    echo PHP_EOL."Months :".PHP_EOL;
    $dt = new DateTime('01/01/2015');
    for($i = 0; $i<12; $i++) {
        echo IntlDateFormatter::formatObject($dt, "MMMM", $locale);
        $dt->add(new DateInterval('P1M'));
        echo PHP_EOL;
    }
}
Run Code Online (Sandbox Code Playgroud)

就我在文档中阅读而言,用户必须使用上述方法收集每个语言环境信息.有一个图书馆可以有益于这个目的.https://github.com/ICanBoogie/CLDR