# General Translation Knowledge Base: General Translation или Symfony Translation: что выбрать?
URL: https://generaltranslation.com/ru/kb/general-translation-vs-symfony-translation.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Symfony Translation выполняет рендеринг сообщений в PHP и Twig. General Translation переводит его YAML-каталоги в CI, поддерживает их в актуальном состоянии при изменении исходного текста и даёт рецензентам панель управления для их редактирования. Оставьте рендеринг за Symfony и добавьте автоматический перевод в рабочий процесс релиза.
Category: Интернационализация
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

Компонент Translation в Symfony отвечает за то, чтобы приложение показывало текст на языке читателя: `trans()` в PHP и фильтр `|trans` в Twig ищут ключ в каталоге текущей локали, а формы множественного числа и выбор вариантов обрабатываются через ICU MessageFormat. Компонент упорядочивает переводы и выполняет их рендеринг, но не создаёт их: каталог для каждого языка пишете вы, ваши переводчики или система управления переводами (TMS), с которой синхронизируется Symfony. Именно этот недостающий шаг и закрывает General Translation: его CLI переводит YAML-каталоги Symfony, а Symfony по-прежнему отвечает за их рендеринг.

## Сильные стороны Symfony Translation

* **Единый API для PHP и Twig.** `$translator->trans()`, [фильтр `|trans` и тег `{% trans %}` в шаблонах](https://symfony.com/doc/current/translation.html#translations-in-templates), а также `t()` с `TranslatableMessage` для сообщений, которые создаются сейчас, а переводятся позже, например flash-сообщений.
* **Домены и множество форматов файлов.** Каталоги именуются по схеме `domain.locale.format` (`messages.fr.yaml`, `validators.fr.yaml`), а Symfony умеет загружать YAML, XLIFF, PHP, JSON, PO и MO, CSV, INI, Qt и ресурсные бандлы ICU. [Документация рекомендует YAML для простых проектов](https://symfony.com/doc/current/translation.html#translation-resource-file-names-and-locations), а XLIFF — если переводы готовятся в специализированных инструментах или отдельными командами.
* **ICU MessageFormat.** [Добавьте `+intl-icu` к имени каталога](https://symfony.com/doc/current/reference/formats/message_format.html) (`messages+intl-icu.en.yaml`) — и его сообщения будут использовать синтаксис ICU для форм множественного числа, выбора вариантов, а также форматов чисел и дат. Для этого нужно PHP-расширение `intl`; полифил Symfony поддерживает только английский язык.
* **Извлечение и проверки.** [`translation:extract` находит сообщения в шаблонах Twig, PHP-коде и ограничениях валидации](https://symfony.com/doc/current/translation.html#extracting-translation-contents-and-updating-catalogs-automatically) и добавляет их в ваши каталоги — в формате XLIFF 1.2, если не указан `--format`. `debug:translation` выводит отсутствующие, неиспользуемые и резервные сообщения, а `lint:translations` проверяет содержимое каталогов.
* **Резервные варианты.** Если сообщения для `es_AR` нет, оно [последовательно ищется в `es_419` и `es`, а затем в ваших резервных локалях](https://symfony.com/doc/current/translation.html#fallback-translation-locales), а сам промах записывается в лог.
* **Провайдеры переводов.** [`translation:push` и `translation:pull` синхронизируют каталоги с Crowdin, Loco, Lokalise и Phrase](https://symfony.com/doc/current/translation.html#translation-providers) через официальные пакеты-мосты; можно также написать собственный провайдер.
* **Сообщения фреймворка в комплекте.** Компонент Validator поставляется со встроенными сообщениями ограничений, переведёнными более чем на 50 языков.

Компонент [распространяется по лицензии MIT; версии 8.1 нужен PHP 8.4.1 или новее](https://packagist.org/packages/symfony/translation), а 7.4 — релиз с долгосрочной поддержкой.

## Что Symfony Translation не делает за вас

Вот пример ICU-плюрализации в английском каталоге:

```yaml title="translations/messages+intl-icu.en.yaml"
inbox:
  title: Inbox
  unread: >-
    {count, plural,
      =0 {You have no unread messages.}
      one {You have # unread message.}
      other {You have # unread messages.}
    }
```

Кто-то также вручную написал `messages+intl-icu.es.yaml` с теми же ключами и формой множественного числа, переписанной на испанском. Выполним рендеринг обоих файлов, а также немецкого варианта, с помощью автономного компонента (`symfony/translation` 8.1.5):

```php title="render.php"
<?php
require __DIR__.'/vendor/autoload.php';

use Symfony\Component\Translation\Loader\YamlFileLoader;
use Symfony\Component\Translation\Translator;

$translator = new Translator('en');
$translator->setFallbackLocales(['en']);
$translator->addLoader('yaml', new YamlFileLoader());

// Суффикс +intl-icu включает ICU MessageFormat для домена messages.
foreach (['en', 'es'] as $locale) {
    $file = __DIR__."/translations/messages+intl-icu.$locale.yaml";
    $translator->addResource('yaml', $file, $locale, 'messages+intl-icu');
}

foreach (['en', 'es', 'de'] as $locale) {
    echo $locale, ': ', $translator->trans('inbox.unread', ['count' => 3], 'messages', $locale), "\n";
}
```

```text title="Output"
en: You have 3 unread messages.
es: Tienes 3 mensajes sin leer.
de: You have 3 unread messages.
```

Испанский работает, потому что его перевёл человек. Для немецкого каталога нет, поэтому Symfony молча откатывается на английский: в полноценном приложении пропуск записывается в лог, а `debug:translation de` показывает его в списке, но немецкий перевод так никто и не пишет. С каждым новым ключом этот цикл повторяется для каждого языка. `translation:extract --force` добавляет ключ в каждый каталог с префиксом `__` (или пустым при `--no-fill`), а дальше кто-то его переводит — вручную или в TMS, куда команды провайдера отправляют файлы и откуда их забирают. Провайдер лишь перемещает файлы; сам перевод и тарифный план TMS, на котором он выполняется, — это отдельная история.

## Как General Translation встраивается в приложение на Symfony

Оставьте рендеринг за Symfony, а заполнение каталогов поручите CLI General Translation. Укажите в записи `yaml` путь к директории с переводами, подставив `[locale]` в имя каждого файла на место локали:

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "fr", "de"],
  "files": {
    "yaml": {
      "include": ["translations/*.[locale].yaml"]
    }
  }
}
```

[`npx gt translate`](/docs/cli/reference/commands/translate) находит все подходящие английские каталоги, например `messages+intl-icu.en.yaml` и `validators.en.yaml`, и создаёт `messages+intl-icu.es.yaml`, `validators.es.yaml` и аналогичные файлы для каждой целевой локали, сохраняя ваши ключи и имена доменов. Запускайте команду в CI после того, как `translation:extract` добавит новые ключи в английские каталоги. Для неизменённых записей используются прежние переводы, поэтому при каждом запуске переводится только новый или изменённый текст.

Для Symfony важны несколько моментов:

* **Сообщения ICU.** Сохраняйте `+intl-icu` в именах каталогов, чтобы Symfony форматировал переведённые сообщения с помощью ICU. После генерации запустите `lint:translations` и проверьте, как выглядит сообщение о входящих при значениях 0, 1 и 3.
* **Коды локалей.** Оставьте имена локалей, которые уже используются в приложении. Для `pt_BR` добавьте эту локаль в `locales` и укажите `"customMapping": { "pt_BR": { "code": "pt-BR" } }` в `gt.config.json`. CLI будет переводить на бразильский вариант португальского и сохранит файл под принятым в Symfony именем `messages.pt_BR.yaml`. (См. [`customMapping`](/docs/cli/reference/config#custom-mapping).)
* **Node.js в CI.** CLI — это npm-пакет, поэтому задаче CI нужен Node.js, а в её секретах — `GT_API_KEY` и `GT_PROJECT_ID`. (См. [Настройка CLI](/docs/cli/guides/configuring#credentials).)

General Translation не только заполняет каталоги, но и поддерживает их согласованность: Glossary и пользовательские промпты контекстной группы обеспечивают единые термины и тон во всех проектах, которым она назначена, а ваша команда [проверяет и редактирует переводы в панели управления](/docs/platform/dashboard/guides/reviewing-translations). Назначьте одну контекстную группу приложению на Symfony, документации и маркетинговому сайту, чтобы термины продукта везде звучали одинаково. (См. [Определение контекста для переводов](/docs/platform/dashboard/guides/defining-context-for-translations).)

## Symfony Translation и General Translation: краткое сравнение

| Возможность            | Symfony Translation                                                          | General Translation                                                        |
| ---------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
| Роль                   | Находит сообщения и выполняет их рендеринг в PHP и Twig                      | Создаёт каталоги, которые используются вызовами в вашем коде PHP и Twig    |
| Переводит ваш контент  | Нет; провайдеры синхронизируют каталоги с Crowdin, Loco, Lokalise или Phrase | Да, с помощью [`npx gt translate`](/docs/cli/reference/commands/translate) |
| Форматы каталогов      | YAML, XLIFF, PHP, JSON, PO и MO, CSV, INI, Qt, бандлы ресурсов ICU           | YAML и JSON в этом рабочем процессе с каталогами                           |
| Поиск новых строк      | `translation:extract` сканирует Twig, PHP и ограничения (constraints)        | Переводит всё содержимое английских каталогов                              |
| ICU MessageFormat      | Каталоги `+intl-icu` с расширением `intl`                                    | Переводит значения каталогов для ICU-рендерера Symfony                     |
| Отсутствующие переводы | Цепочка резервных локалей, логи, `debug:translation`                         | При каждом запуске записывает все настроенные локали                       |
| Стоимость              | Бесплатно, лицензия MIT; провайдеры выставляют счета отдельно                | [Оплата по факту использования](https://generaltranslation.com/pricing)    |

## Что и когда использовать

Для рендеринга выбирать между ними не нужно: приложению на Symfony стоит оставить Symfony Translation. Решать нужно другое — как будут заполняться его каталоги. Оставьте провайдера переводов, если переводчики работают с XLIFF в TMS, если вы заказываете профессиональный перевод, выполняемый людьми, или если текущий процесс вас устраивает. (См. [Почему стоит использовать General Translation вместо TMS?](/kb/general-translation-vs-tms)) Выбирайте General Translation, если хотите, чтобы YAML-каталоги всех локалей переводились в CI при каждом изменении, с общей терминологией и проверкой в панели управления — без отправки файлов и ожидания результата.

## Совместное использование

1. Начните с YAML-каталогов Symfony и добавьте `gt.config.json`, как описано выше.
2. Если у вас уже есть переводы, перед генерацией новых загрузите их с помощью [`npx gt upload`](/docs/cli/reference/commands/upload).
3. Запускайте [`npx gt translate`](/docs/cli/reference/commands/translate) в CI после того, как Symfony извлечёт новые сообщения в английские каталоги.
4. Проверяйте переводы в панели управления. Если вы редактируете скачанные YAML-файлы локально, перед следующим запуском генерации синхронизируйте их с помощью [`npx gt save-local`](/docs/cli/reference/commands/save-local).

## Основные выводы

* Symfony Translation выполняет рендеринг сообщений, извлекает ключи и синхронизируется с TMS-провайдерами, но сами переводы по-прежнему нужно получать отдельно.
* General Translation переводит YAML-каталоги Symfony в CI с сохранением ваших ключей и доменов, поэтому PHP и Twig продолжают работать с теми же сообщениями.
* Оставьте TMS-провайдер для работы с XLIFF и профессиональными переводчиками, а General Translation используйте, если хотите, чтобы каталоги переводились при каждом изменении.

## Related questions

- [General Translation против i18next, react-intl и next-intl: какую библиотеку интернационализации выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-i18n-libraries.mdx): Библиотеки с открытым исходным кодом, такие как i18next, react-intl и next-intl, ничего не переводят. Они лишь отображают переводы, которые вы сами помещаете в файл каталога для каждого языка, — их пишете вы, ваши переводчики или сторонний сервис. Библиотеки General Translation тоже имеют открытый исходный код и делают то же самое, но General Translation ещё и выполняет перевод, используя ваш код как контекст.
- [Почему стоит выбрать General Translation вместо TMS (Smartling, Lokalise, Phrase, Crowdin или Transifex)?](https://generaltranslation.com/ru/kb/general-translation-vs-tms.mdx): Система управления переводами (TMS), например Smartling, Lokalise, Phrase, Crowdin или Transifex, координирует работу переводчиков, но инженерам всё равно приходится извлекать строки, отправлять их на перевод, ждать результатов и встраивать переводы обратно в продукт. General Translation переводит контент прямо в вашем коде с учётом контекста, выпускает все языки с каждым релизом и работает на библиотеках с открытым исходным кодом без привязки к поставщику.
- [General Translation и GNU gettext: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-gettext.mdx): Оставьте GNU gettext для извлечения и рендеринга, а General Translation подключите для генерации и сопровождения PO-файлов. General Translation учитывает при генерации заметки для переводчиков и контекст сообщений, применяет общую терминологию и предоставляет рецензентам редактор в панели управления. Существующие вызовы gettext и скомпилированные каталоги остаются на месте.
- [General Translation и Rails I18n: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-rails-i18n.mdx): Rails I18n находит сообщения и форматирует даты и числа. General Translation создаёт переводы, поддерживает их в актуальном состоянии по мере изменения английского текста и предоставляет вашей команде панель управления для проверки. Используйте оба инструмента, чтобы выпускать переведённые каталоги Rails с каждым релизом.
- [General Translation и фреймворк переводов Django: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-django-i18n.mdx): Используйте фреймворк переводов Django вместе с General Translation. Django отвечает за извлечение сообщений, выбор языка и рендеринг. General Translation заполняет его PO-файлы, включая формы множественного числа, с учётом терминологии вашего продукта и проверки в панели управления. Ваши шаблоны и URL-шаблоны остаются прежними, а переводы обновляются вместе с кодом.

## Previous and next questions

- Previous question: [General Translation или Paraglide JS: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-paraglide.mdx)
- Next question: [General Translation или Tolgee: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-tolgee.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/ru/kb/sitemap.md) for every article.
