Получить информацию CLDR из расширения Intl в php

Раньше я использовал Zend_Locale, но, похоже, PHP intl extension имеет информацию cldr.

Мне нужно получить некоторую информацию, как получить доступные страны для каждого языка? например en имеет US, UK, GB и fa имеет IR и AF и больше данных, доступных в проекте CLDR.

Название стран, список часовых поясов по каждому языку и другие данные существуют в файлах CLDR xml.

Он встроен в php intl или я может загрузить и привязать их к классу или методу на нем?

Какой объект или метод дает мне эту информацию в расширении PHP intl?

Информация о CLDR

Ответ 1

Я придумываю решение, отправной точкой является локализация.

Вы можете получить список всех локалей с помощью метода 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);

    }
}

Я знаю, что это не лучший ответ, но, по крайней мере, это может дать вам начало.

Обновление

Чтобы получить название страны для каждого региона, вы можете попробовать это:

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

Обновление 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;
    }
}

Насколько я читал в документах, пользователь должен собрать информацию о локали с помощью методов, описанных выше. Там есть библиотека, которая может быть полезной для этих целей. https://github.com/ICanBoogie/CLDR