Компонент 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:

  1. Спочатку перекладач шукає переклад у локалі fr_FR;
  2. Якщо його не було знайдено, перекладач шукає переклад у локалі fr;
  3. Якщо його все одно не було знайдено, перекладач використовує одну або кілька резервних локалей, ясно встановлених у перекладачеві.

Для (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, див. Використання Перекладача.