我以前使用过 Zend_Locale,但似乎 PHP 国际扩展有 cldr 信息。
我需要获取一些信息,例如获取每种语言的可用国家/地区?例如,在 CLDR 项目上en
有US
、和has以及更多可用的数据。UK
GB
fa
IR
AF
国家名称、每种语言的时区列表以及更多数据存在于 CLDR xml 文件中。
它嵌入在 php intl 中,或者我可以下载并将它们绑定到上面的类或方法?
哪个对象或方法为我提供了有关PHP 国际扩展的信息?
我想出了一个解决方案,起点是语言环境。
您可以使用方法获取所有语言环境的列表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