Компонент Intl

Дата обновления перевода 2024-07-05

Компонент Intl

Этот компонент предоставляет доступ к данным локализации библиотеки ICU.

See also

Эта статья объясняет, как использовать функции Intl как независимого компонента в любом приложении PHP. Прочитайте статью Переводы для понимания как делать интернационализацию и управлять пользовательскими локалями в приложениях Symfony.

Установка

1
$ composer require symfony/intl

Note

Если вы устанавливаете этот компонент вне приложения Symfony, вам нужно подключить файл 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 (например, HANS в zh_HANS для упрощенного китайского, иHANT в zh_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
// Индийская рупия определяет одинаковое значение для обоих
$fractionDigits = Currencies::getFractionDigits('INR');         // returns: 2
$cashFractionDigits = Currencies::getCashFractionDigits('INR'); // returns: 2

// Шведская крона определяет разные значения
$fractionDigits = Currencies::getFractionDigits('SEK');         // returns: 2
$cashFractionDigits = Currencies::getCashFractionDigits('SEK'); // returns: 0

Некоторые валюты требуют округленных до ближайшего числа значений (например, 5 центов). Это округление может оазличаться, если числа форматированы для наличных транзакций или других сценариев (например, бухгалтерии):

1
2
3
4
5
6
7
8
9
// Индийская рупия определяет одинаковое значение для обоих
$roundingIncrement = Currencies::getRoundingIncrement('INR');         // returns: 0
$cashRoundingIncrement = Currencies::getCashRoundingIncrement('INR'); // returns: 0

// Канадский доллар определяет разные значения, так как они избавились от
// мелких монет (в 1 и 2 цента), и цены в наличных должны округляться до
// 5 центов (к примеру, если цена - 7.42, вы платите 7.40; если 7.48 - то 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(), показанного ранее:

1
2
3
// в отличие от кодов языков, коды стран всегда используют верхний регистр (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). По умолчанию эти методы используют PHP-функцию time(), чтобы получить текущее значение смещения времени часового пояса, но вы можете передать временную метку в качестве вторых аргументов, чтобы получить смещение времени в любой заданный момент времени:

1
2
3
4
5
// В 2019, период летнего времени в Мадриде (Испания) проходил с 31 марта до 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. В дополнение к обнаружению исключения, вы также можете проверить, является ли заданный код часового пояса валидным:

1
$isValidTimezone = Timezones::exists($timezoneId);

Транслитерация эмоджи

Symfony предоставляет утилиты для перевода эмодзи в их текстовое представление во всех языках. Прочитайте документацию по работе с эмодзи в строках , чтобы узнать больше об этой возможности.

Место на диске

Если вам нужно сэкономить место на диске (например, из-за развертывания на каком-либо сервисе с жесткими ограничениями по размеру), выполните эту команду (например, как автоматический скрипт после composer install), чтобы сжать внутренние файлы данных Symfony Intl с помощью расширения PHP zlib:

1
2
# настройте путь к бинарности 'compress', основываясь на устанвке вашего приложения
$ php ./vendor/symfony/intl/Resources/bin/compress