Компонент Intl
Дата оновлення перекладу 2025-01-10
Компонент 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