Компонент Translation
Дата оновлення перекладу 2023-06-22
Компонент Translation
Компонент Translation надаэ інструменти для інтернаціоналізації вашого додатка.
Установка
1
$ composer require symfony/translation
Також ви можете клонувати репозиторій https://github.com/symfony/translation.
Note
Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити
файл vendor/autoload.phpу вашому коді для включення механізму автозавантаження
класів, наданих Composer. Детальніше можна прочитати у цій статті.
See also
Ця стаття пояснює як використовувати функції Translation як незалежного компонента в будь-якому додатку PHP. Прочитайте статтю Переклади для розуміння як інтернаціоналізувати та керувати локалями користувача в додатках Symfony.
Побудова перекладача
Головна точка доступу компонента Translation - Translator. До того, як ви зможете його використовувати, вам потрібно його сконфігурувати і завантажити повідомлення для перекладу (звані каталогами повідомлень).
Конфігурація
Конструктор класу Translator вимагає одного аргументу: локалі:
1 2 3 4
use Symfony\Component\Translation\Translator;
use Symfony\Component\Translation\MessageSelector;
$translator = new Translator('fr_FR');
Note
Локаль, встановлена тут, це локаль для використання за замовчуванням. Ви можете перевизначити цю локаль під час перекладу рядків.
Note
Термін локаль, грубо кажучи, відноситься до мови і країни користувача. Це
може бути будь-який рядок, який використовує ваш додаток для роботи з
перекладами та іншими відмінностями форматів (наприклад, формат валюти). Рекомендується
використовувати код мови ISO 639-1, потім нижнє підкреслення (_), потім
код країни (наприклад, fr_FR для французької / Франції).
Завантаження каталогів повідомлень
Повідомлення зберігаються у каталогах повідомлень всередині класу Translator. Каталог
повідомлень є чимось на зразок словника перекладів для конкретної локалі.
Компонент Translation використовує класи Завантажувача для завантаження каталогів. Ви можете завантажувати кілька джерел для однієї локалі, які потім можна комбінувати в один каталог.
Компонент постачається з деякими Завантажувачами за замовчуванням і ви можете також створювати ваш власний Завантажувач. Завантажувачі за замовчуванням:
- ArrayLoader - для завантаження каталогів з PHP масивів.
- CsvFileLoader - для завантаження каталогів з CSV файлів.
- IcuDatFileLoader - для завантаження каталогів з пакетів джерел.
- IcuResFileLoader - для завантаження каталогів з пакетів джерел.
- IniFileLoader - для завантаження каталогів з ini файлів.
- MoFileLoader - для завантаження каталогів з gettext файлів.
- PhpFileLoader - для завантаження каталогів з PHP файлів.
- PoFileLoader - для завантаження каталогів з gettext файлів.
- QtFileLoader - для завантаження каталогів з QT XML файлів.
- XliffFileLoader - для завантаження каталогів з Xliff файлів.
- JsonFileLoader - для завантаження каталогів з JSON файлів.
- YamlFileLoader - для зазавантаженнягрузки каталогів з Yaml файлів (вимагає компонент Yaml).
Всі завантажувачі файлів вимагають компонент Config.
Ви можете також створити ваш власний завантажувач, у разі, якщо формат ще не підтримується жодним із завантажувачів за замовчуванням.
Спочатку, вам потрібно додати один або більше завантажувачів в Translator:
1 2
// ...
$translator->addLoader('array', new ArrayLoader());
Перший аргумент - це ім'я, на яке може посилатися завантажувач у перекладачі, а другий аргумент - екземпляр самого завантажувача. Після цього, ви можете додавати ваші джерела, використовуючи правильний завантажувач.
Завантаження повідомлень за допомогою ArrayLoader
Завантаження повідомлень може здійснюватися шляхом виклику
addResource(). Перший аргумент
- ім'я завантажувача (це був перший аргумент методу addLoader()), другий - джерело,
а третій - локаль:
1 2 3 4
// ...
$translator->addResource('array', array(
'Hello World!' => 'Bonjour',
), 'fr_FR');
Завантаження повідомлень за допомогою завантажувачів файлів
Якщо ви використовуєте один із завантажувачів файлів, вам потрібно також використовувати
метод addResource(). Єдина відмінність - вам потрібно використовувати ім'я файлу
як другий аргумент файлу джерела, а не масиву:
1 2 3
// ...
$translator->addLoader('yaml', new YamlFileLoader());
$translator->addResource('yaml', 'path/to/messages.fr.yaml', 'fr_FR');
Процес перекладу
Для того, щоб насправді перекласти повідомлення, Translator використовує простий процес:
- Каталог перекладених повідомлень завантажується з джерела перекладів, визначеного
для
locale(наприклад,fr_FR). Повідомлення з також завантажуються і додаються до каталогу, якщо вони ще не існують. Кінцевий результат - великий "словник" перекладів; - Якщо повідомлення розташоване в каталозі, повертається переклад. Якщо ні - перекладач повертає вихідне повідомлення.
Ви починаєте цей процес, викликаючи trans() або transChoice(). Далі, Translator шукає точно такий самий рядок всередині відповідного каталогу повідомлень і повертає його (якщо він існує).
Резеврні локалі
Якщо повідомлення немає в каталозі певної локалі, перекладач буде шукати
в одному або декількох каталогах резервних локалей. Наприклад, уявіть,
що ви намагаєтеся перекласти на локаль fr_FR:
- Спочатку перекладач шукає переклад у локалі
fr_FR; - Якщо його не було знайдено, перекладач шукає переклад у локалі
fr; - Якщо його все одно не було знайдено, перекладач використовує одну або кілька резервних локалей, ясно встановлених у перекладачеві.
Для (3), резервні локалі можна встановити, викликавши setFallbackLocales():
1 2
// ...
$translator->setFallbackLocales(array('en'));
Використання доменів повідомлень
Як ви бачили, файли повідомлень систематизуються в різні локалі, які вони перекладають. Файли повідомлень також можуть бути організовані більше - у "домени".
Домен вказується у четвертому аргументі методу addResource(). Домен
за замовчуванням - messages. Наприклад, уявіть, що з метою систематизації,
переклади були розділені на три різні домени: messages, admin і navigation.
Французький переклад буде завантажуватися так:
1 2 3 4 5 6 7 8 9 10 11
// ...
$translator->addLoader('xlf', new XliffFileLoader());
$translator->addResource('xlf', 'messages.fr.xlf', 'fr_FR');
$translator->addResource('xlf', 'admin.fr.xlf', 'fr_FR', 'admin');
$translator->addResource(
'xlf',
'navigation.fr.xlf',
'fr_FR',
'navigation'
);
При перекладі рядків, які знаходяться не в домені за замовчуванням (messages),
ви повинні вказати домен як третій аргумент trans():
1
$translator->trans('Symfony is great', array(), 'admin');
Symfony тепер шукатиме повідомлення у домені admin вказаної локалі.
Використання
Щоб дізнатися, як використовувати Translation, див. Використання Перекладача.