【问题标题】:Get CLDR information from Intl extension in php从 php 中的 Intl 扩展获取 CLDR 信息
【发布时间】:2015-10-08 00:53:57
【问题描述】:

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

我需要获取一些信息,例如获取每种语言的可用国家/地区? 例如enUSUKGBfaIRAF 以及更多可用于CLDR 项目的数据。

国家名称、每种语言的时区列表以及更多数据存在于 CLDR xml 文件中。

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

哪个对象或方法在PHP intl extension 上向我提供了这些信息?

CLDR information

【问题讨论】:

    标签: 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

    【讨论】:

    • 感谢您的回答。但我需要拥有所有 cldr 信息。就像每种语言的国家名称一样。它在 cldr 数据上。 unicode.org/Public/cldr/27.0.1 .. 下载文件并查看全部信息。
    • @sweb 你能告诉我我应该查看哪个 xml 文件 cldr 数据库吗?它有点大:) 我确信在某些时候可以使用预定义函数映射数据,但如果这还不够,也许我们应该解析和映射 xml 数据。另请查看我的更新,它会为您提供每个地区的国家名称,其中包括语言。
    • 我不是 cldr 数据方面的专家,但似乎在 core.zip [/common/main/*.xml] 上必须是所有语言环境数据,例如周时区名称等等......我不想用 xml 处理它。因为 php intl 有它。日期名称等...我认为某些方法或等可以给我这些数据。这就是我要找的。方法或类
    • 是的 @sweb 解析 xml 是没有意义的。 php.net/manual/en/class.resourcebundle.php 如果您愿意,可以为您执行此操作,但据我所知,默认情况下会安装您的构建附带的默认数据库。我想不出一个完美的解决方案来收集一个地区的所有自定义数据(例如月份名称、日期名称、国家名称等)。它需要在文档中进行大量挖掘,我设法收集了一些数据,再次查看我的更新答案。但是github.com/ICanBoogie/CLDR 使用此存储库可能适合您从 cldr 收集所有信息的需要。
    • Punic 是另一个提供对 CLDR 数据的访问的 PHP 库。要以比 XML 文件更经过处理的格式访问源数据,请查看 CLDR 项目提供的JSON files
    猜你喜欢
    • 2020-10-15
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多