跳到内容

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);

Emoji 转写

Symfony 提供了实用程序,可以将 emoji 翻译成所有语言的文本表示形式。阅读有关 emoji 转写 的文档,以了解有关此功能的更多信息。

磁盘空间

如果您需要节省磁盘空间(例如,因为您部署到一些大小限制严格的服务),请运行此命令(例如,在 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
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本