Intl 组件
此组件提供对 ICU 库本地化数据的访问。
另请参阅
本文介绍了如何在任何 PHP 应用程序中将 Intl 功能用作独立的组件。阅读 翻译 文章,了解如何在 Symfony 应用程序中进行国际化和管理用户区域设置。
安装
1
$ composer require symfony/intl
注意
如果您在 Symfony 应用程序外部安装此组件,则必须在代码中 require vendor/autoload.php
文件,以启用 Composer 提供的类自动加载机制。阅读 本文 了解更多详情。
访问 ICU 数据
此组件提供以下 ICU 数据
语言和脚本名称
Languages 类提供对所有语言名称的访问,这些名称根据 ISO 639-1 alpha-2 列表和 ISO 639-2 alpha-3 (2T) 列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use Symfony\Component\Intl\Languages;
\Locale::setDefault('en');
$languages = Languages::getNames();
// ('languageCode' => 'languageName')
// => ['ab' => 'Abkhazian', 'ace' => 'Achinese', ...]
$languages = Languages::getAlpha3Names();
// ('languageCode' => 'languageName')
// => ['abk' => 'Abkhazian', 'ace' => 'Achinese', ...]
$language = Languages::getName('fr');
// => 'French'
$language = Languages::getAlpha3Name('fra');
// => 'French'
所有方法都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5 6 7 8 9 10 11
$languages = Languages::getNames('de');
// => ['ab' => 'Abchasisch', 'ace' => 'Aceh', ...]
$languages = Languages::getAlpha3Names('de');
// => ['abk' => 'Abchasisch', 'ace' => 'Aceh', ...]
$language = Languages::getName('fr', 'de');
// => 'Französisch'
$language = Languages::getAlpha3Name('fra', 'de');
// => 'Französisch'
如果给定的区域设置不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的语言代码是否有效
1
$isValidLanguage = Languages::exists($languageCode);
或者,如果您有要检查的 alpha3 语言代码
1
$isValidLanguage = Languages::alpha3CodeExists($alpha3Code);
您可以在双字母 alpha2 和三字母 alpha3 代码之间转换代码
1 2 3
$alpha3Code = Languages::getAlpha3Code($alpha2Code);
$alpha2Code = Languages::getAlpha2Code($alpha3Code);
Scripts 类提供对可选的四字母脚本代码的访问,该代码可以根据 Unicode ISO 15924 注册表 跟随语言代码(例如,简体中文中的 zh_HANS
中的 HANS
和繁体中文中的 zh_HANT
中的 HANT
)
1 2 3 4 5 6 7 8 9 10
use Symfony\Component\Intl\Scripts;
\Locale::setDefault('en');
$scripts = Scripts::getNames();
// ('scriptCode' => 'scriptName')
// => ['Adlm' => 'Adlam', 'Afak' => 'Afaka', ...]
$script = Scripts::getName('Hans');
// => 'Simplified'
所有方法都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5
$scripts = Scripts::getNames('de');
// => ['Adlm' => 'Adlam', 'Afak' => 'Afaka', ...]
$script = Scripts::getName('Hans', 'de');
// => 'Vereinfacht'
如果给定的脚本代码不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的脚本代码是否有效
1
$isValidScript = Scripts::exists($scriptCode);
国家名称
Countries 类提供对所有国家/地区名称的访问,这些名称根据 ISO 3166-1 alpha-2 列表和 ISO 3166-1 alpha-3 官方认可的国家和地区列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
use Symfony\Component\Intl\Countries;
\Locale::setDefault('en');
$countries = Countries::getNames();
// ('alpha2Code' => 'countryName')
// => ['AF' => 'Afghanistan', 'AX' => 'Åland Islands', ...]
$countries = Countries::getAlpha3Names();
// ('alpha3Code' => 'countryName')
// => ['AFG' => 'Afghanistan', 'ALA' => 'Åland Islands', ...]
$country = Countries::getName('GB');
// => 'United Kingdom'
$country = Countries::getAlpha3Name('NOR');
// => 'Norway'
所有方法都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5 6 7 8 9 10 11
$countries = Countries::getNames('de');
// => ['AF' => 'Afghanistan', 'EG' => 'Ägypten', ...]
$countries = Countries::getAlpha3Names('de');
// => ['AFG' => 'Afghanistan', 'EGY' => 'Ägypten', ...]
$country = Countries::getName('GB', 'de');
// => 'Vereinigtes Königreich'
$country = Countries::getAlpha3Name('GBR', 'de');
// => 'Vereinigtes Königreich'
如果给定的国家/地区代码不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的国家/地区代码是否有效
1
$isValidCountry = Countries::exists($alpha2Code);
或者,如果您有要检查的 alpha3 国家/地区代码
1
$isValidCountry = Countries::alpha3CodeExists($alpha3Code);
您可以在双字母 alpha2 和三字母 alpha3 代码之间转换代码
1 2 3
$alpha3Code = Countries::getAlpha3Code($alpha2Code);
$alpha2Code = Countries::getAlpha2Code($alpha3Code);
数字国家代码
ISO 3166-1 数字 标准定义了三位数的国家/地区代码,用于表示国家、属地和具有特殊地理意义的区域。
与 ISO 3166-1 字母代码(alpha-2 和 alpha-3)相比,主要优势在于这些数字代码独立于书写系统。字母代码使用 26 个字母的英文字母,这对于使用非拉丁文字(例如阿拉伯语或日语)的人员和系统来说可能不可用或难以使用。
Countries 类提供对这些数字国家/地区代码的访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
use Symfony\Component\Intl\Countries;
\Locale::setDefault('en');
$numericCodes = Countries::getNumericCodes();
// ('alpha2Code' => 'numericCode')
// => ['AA' => '958', 'AD' => '020', ...]
$numericCode = Countries::getNumericCode('FR');
// => '250'
$alpha2 = Countries::getAlpha2FromNumeric('250');
// => 'FR'
$exists = Countries::numericCodeExists('250');
// => true
区域设置
区域设置是语言、区域和一些参数的组合,这些参数定义了用户的界面偏好。例如,“中文”是语言,而 zh_Hans_MO
是“中文”(语言)+“简体”(脚本)+“中国澳门特别行政区”(区域)的区域设置。Locales 类提供对所有区域设置名称的访问
1 2 3 4 5 6 7 8 9 10
use Symfony\Component\Intl\Locales;
\Locale::setDefault('en');
$locales = Locales::getNames();
// ('localeCode' => 'localeName')
// => ['af' => 'Afrikaans', 'af_NA' => 'Afrikaans (Namibia)', ...]
$locale = Locales::getName('zh_Hans_MO');
// => 'Chinese (Simplified, Macau SAR China)'
所有方法都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5
$locales = Locales::getNames('de');
// => ['af' => 'Afrikaans', 'af_NA' => 'Afrikaans (Namibia)', ...]
$locale = Locales::getName('zh_Hans_MO', 'de');
// => 'Chinesisch (Vereinfacht, Sonderverwaltungsregion Macau)'
如果给定的区域设置代码不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的区域设置代码是否有效
1
$isValidLocale = Locales::exists($localeCode);
货币
Currencies 类提供对所有货币名称以及它们的一些信息(符号、小数位数等)的访问
1 2 3 4 5 6 7 8 9 10 11 12 13
use Symfony\Component\Intl\Currencies;
\Locale::setDefault('en');
$currencies = Currencies::getNames();
// ('currencyCode' => 'currencyName')
// => ['AFN' => 'Afghan Afghani', 'ALL' => 'Albanian Lek', ...]
$currency = Currencies::getName('INR');
// => 'Indian Rupee'
$symbol = Currencies::getSymbol('INR');
// => '₹'
小数位数方法返回使用此货币格式化数字时要显示的小数位数。根据货币的不同,如果该数字用于现金交易或其他场景(例如,会计),则此值可能会更改
1 2 3 4 5 6 7
// Indian rupee defines the same value for both
$fractionDigits = Currencies::getFractionDigits('INR'); // returns: 2
$cashFractionDigits = Currencies::getCashFractionDigits('INR'); // returns: 2
// Swedish krona defines different values
$fractionDigits = Currencies::getFractionDigits('SEK'); // returns: 2
$cashFractionDigits = Currencies::getCashFractionDigits('SEK'); // returns: 0
某些货币要求将数字四舍五入到某个值的最接近增量(例如 5 美分)。如果数字以现金交易或其他场景(例如,会计)格式化,则此增量可能有所不同
1 2 3 4 5 6 7 8 9
// Indian rupee defines the same value for both
$roundingIncrement = Currencies::getRoundingIncrement('INR'); // returns: 0
$cashRoundingIncrement = Currencies::getCashRoundingIncrement('INR'); // returns: 0
// Canadian dollar defines different values because they have eliminated
// the smaller coins (1-cent and 2-cent) and prices in cash must be rounded to
// 5 cents (e.g. if price is 7.42 you pay 7.40; if price is 7.48 you pay 7.50)
$roundingIncrement = Currencies::getRoundingIncrement('CAD'); // returns: 0
$cashRoundingIncrement = Currencies::getCashRoundingIncrement('CAD'); // returns: 5
所有方法(getFractionDigits()
、getCashFractionDigits()
、getRoundingIncrement()
和 getCashRoundingIncrement()
除外)都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5
$currencies = Currencies::getNames('de');
// => ['AFN' => 'Afghanischer Afghani', 'EGP' => 'Ägyptisches Pfund', ...]
$currency = Currencies::getName('INR', 'de');
// => 'Indische Rupie'
如果给定的货币代码不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的货币代码是否有效
1
$isValidCurrency = Currencies::exists($currencyCode);
时区
Timezones 类提供了一些与时区相关的实用程序。首先,您可以获取所有语言中所有时区的名称和值
1 2 3 4 5 6 7 8 9 10
use Symfony\Component\Intl\Timezones;
\Locale::setDefault('en');
$timezones = Timezones::getNames();
// ('timezoneID' => 'timezoneValue')
// => ['America/Eirunepe' => 'Acre Time (Eirunepe)', 'America/Rio_Branco' => 'Acre Time (Rio Branco)', ...]
$timezone = Timezones::getName('Africa/Nairobi');
// => 'East Africa Time (Nairobi)'
所有方法都接受翻译区域设置作为最后一个可选参数,该参数默认为当前默认区域设置
1 2 3 4 5
$timezones = Timezones::getNames('de');
// => ['America/Eirunepe' => 'Acre-Zeit (Eirunepe)', 'America/Rio_Branco' => 'Acre-Zeit (Rio Branco)', ...]
$timezone = Timezones::getName('Africa/Nairobi', 'de');
// => 'Ostafrikanische Zeit (Nairobi)'
您还可以获取给定国家/地区中存在的所有时区。forCountryCode()
方法返回一个或多个时区 ID,您可以使用前面显示的 getName()
方法将这些 ID 翻译成任何区域设置
1 2 3
// unlike language codes, country codes are always uppercase (CL = Chile)
$timezones = Timezones::forCountryCode('CL');
// => ['America/Punta_Arenas', 'America/Santiago', 'Pacific/Easter']
反向查找也是可能的,这要归功于 getCountryCode()
方法,该方法返回给定时区 ID 所属的国家/地区代码
1 2
$countryCode = Timezones::getCountryCode('America/Vancouver');
// => $countryCode = 'CA' (CA = Canada)
所有时区的 UTC/GMT 时差 由 getRawOffset()
(返回表示秒为单位的偏移量的整数)和 getGmtOffset()
(返回偏移量的字符串表示形式以向用户显示)提供
1 2 3 4 5 6 7
$offset = Timezones::getRawOffset('Etc/UTC'); // $offset = 0
$offset = Timezones::getRawOffset('America/Buenos_Aires'); // $offset = -10800
$offset = Timezones::getRawOffset('Asia/Katmandu'); // $offset = 20700
$offset = Timezones::getGmtOffset('Etc/UTC'); // $offset = 'GMT+00:00'
$offset = Timezones::getGmtOffset('America/Buenos_Aires'); // $offset = 'GMT-03:00'
$offset = Timezones::getGmtOffset('Asia/Katmandu'); // $offset = 'GMT+05:45'
由于 夏令时 (DST) 做法,时区偏移量可能会随时间变化。默认情况下,这些方法使用 time()
PHP 函数来获取当前时区偏移量值,但您可以将时间戳作为它们的第二个参数传递,以获取任何给定时间点的偏移量
1 2 3 4 5
// In 2019, the DST period in Madrid (Spain) went from March 31 to October 27
$offset = Timezones::getRawOffset('Europe/Madrid', strtotime('March 31, 2019')); // $offset = 3600
$offset = Timezones::getRawOffset('Europe/Madrid', strtotime('April 1, 2019')); // $offset = 7200
$offset = Timezones::getGmtOffset('Europe/Madrid', strtotime('October 27, 2019')); // $offset = 'GMT+02:00'
$offset = Timezones::getGmtOffset('Europe/Madrid', strtotime('October 28, 2019')); // $offset = 'GMT+01:00'
GMT 偏移量的字符串表示形式可能因区域设置而异,因此您可以将区域设置作为第三个可选参数传递
1 2
$offset = Timezones::getGmtOffset('Europe/Madrid', strtotime('October 28, 2019'), 'ar'); // $offset = 'غرينتش+01:00'
$offset = Timezones::getGmtOffset('Europe/Madrid', strtotime('October 28, 2019'), 'dz'); // $offset = 'ཇི་ཨེམ་ཏི་+01:00'
如果给定的时区 ID 不存在,则这些方法会触发 MissingResourceException。除了捕获异常之外,您还可以检查给定的时区 ID 是否有效
1
$isValidTimezone = Timezones::exists($timezoneId);
磁盘空间
如果您需要节省磁盘空间(例如,因为您部署到一些大小限制严格的服务),请运行此命令(例如,在 composer install
之后作为自动化脚本)以使用 PHP zlib
扩展压缩内部 Symfony Intl 数据文件
1 2
# adjust the path to the 'compress' binary based on your application installation
$ php ./vendor/symfony/intl/Resources/bin/compress