# General Translation Knowledge Base: General Translation или Babel и Flask-Babel: что выбрать?
URL: https://generaltranslation.com/ru/kb/general-translation-vs-flask-babel.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Babel форматирует даты, числа и валюты для любой локали и управляет каталогами gettext, а Flask-Babel интегрирует его с Flask, но ни один из них не переводит ваши строки. CLI General Translation заполняет PO-файлы Babel для всех языков, включая формы множественного числа, поэтому вы можете и дальше использовать Flask-Babel, но больше не переводить каталоги вручную.
Category: Интернационализация
Last updated: 2026-10-16
Authors: Kevin Wu, Jackie Chen
Published: 2026-10-16

Babel форматирует даты, числа и валюты на основе данных Unicode CLDR, а его команда `pybabel` извлекает, обновляет и компилирует каталоги сообщений gettext. Flask-Babel интегрирует эти инструменты с обработкой запросов во Flask и шаблонами Jinja. General Translation заполняет каталоги на этапе между извлечением и компиляцией: приложение получает автоматический перевод, а существующая настройка Flask-Babel остаётся без изменений.

## Сильные стороны Babel и Flask-Babel

* **Форматирование по локали на основе CLDR.** [Babel 2.18.0 включает данные CLDR 47](https://babel.pocoo.org/en/latest/changelog.html#version-2-18-0) для более чем тысячи идентификаторов локалей. `format_currency(1234.5, "EUR")` возвращает «1.234,50 €» для испанского, а `format_date` — «16 października 2026» для польского.
* **Инструменты для работы с каталогами.** [`pybabel extract`](https://babel.pocoo.org/en/latest/cmdline.html) считывает файлы Python и шаблоны Jinja согласно сопоставлению в `babel.cfg`, `pybabel init` создаёт PO-файл с нужным правилом множественного числа и слотами (для польского их три), `pybabel update` добавляет новые строки и помечает изменённые как fuzzy, а `pybabel compile` собирает файлы `.mo`.
* **Интеграция с Flask.** `locale_selector` и `timezone_selector` [определяют локаль и часовой пояс для каждого запроса](https://python-babel.github.io/flask-babel/#configuration), `lazy_gettext` обрабатывает строки, определённые во время импорта, в шаблонах Jinja доступны `_()`, `{% trans %}` и фильтры форматирования, а `force_locale` временно переключает локаль — например, чтобы отправить письмо на другом языке.
* **Стабильность и бесплатность.** Обе библиотеки распространяются по лицензии BSD (см. [лицензию Babel](https://babel.pocoo.org/en/latest/license.html)). Babel работает в любой программе на Python; [текущий релиз Flask-Babel — 4.0.0](https://github.com/python-babel/flask-babel/releases/tag/v4.0.0).

## Что Babel и Flask-Babel оставляют на вас

Вот небольшое приложение на Flask-Babel:

```python title="app.py"
from datetime import date
from flask import Flask, request
from flask_babel import Babel, gettext, ngettext, format_currency, format_date


def select_locale():
    return request.accept_languages.best_match(["en", "es", "pl"])


app = Flask(__name__)
babel = Babel(app, locale_selector=select_locale)


@app.route("/inbox/<int:count>")
def inbox(count):
    return {
        "title": gettext("Inbox"),
        "unread": ngettext("You have %(num)d unread message.", "You have %(num)d unread messages.", count),
        "price": format_currency(1234.5, "EUR"),
        "date": format_date(date(2026, 10, 16), format="long"),
    }
```

Команды `pybabel extract`, `pybabel init -l pl` и `pybabel compile` создают польский каталог, в котором все `msgstr` пусты. В Flask-Babel 4.0.0 запрос с заголовком `Accept-Language: pl` в этом случае вернул:

```json title="Output"
{
  "date": "16 października 2026",
  "price": "1 234,50 €",
  "title": "Inbox",
  "unread": "You have 5 unread messages."
}
```

Babel форматирует дату и цену для польского языка, но все строки остаются на английском — причём без каких-либо предупреждений. Каждая строка ждёт, пока кто-нибудь заполнит её запись в PO-файле (включая все три польские формы множественного числа), затем — запуска `pybabel compile` и повторного развёртывания. И так для каждой новой или изменённой строки на каждом языке.

## Перевод каталогов Babel с помощью General Translation

Если Flask-Babel вас устраивает, оставьте его, а запись каталогов поручите CLI General Translation. Один раз создайте английский каталог и обновляйте его после каждого извлечения строк — так исходные строки будут находиться в том же дереве, что и переводы:

```bash
pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
pybabel init -i messages.pot -d translations -l en     # один раз
pybabel update -i messages.pot -d translations -l en   # после каждого извлечения
```

Затем укажите его в `gt.config.json`. Эта конфигурация проверена на `gt` версии 2.26.5:

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["es", "pl", "pt_BR"],
  "customMapping": { "pt_BR": { "code": "pt-BR" } },
  "files": {
    "pot": {
      "include": ["translations/[locale]/LC_MESSAGES/messages.po"],
      "transformationFormat": "PO"
    }
  }
}
```

Ключ `pot` читает файлы PO и POT, а `"transformationFormat": "PO"` записывает переведённые файлы `.po` (см. [справочник по формату PO / POT](/docs/cli/reference/formats/po-pot-files)). [`customMapping`](/docs/cli/reference/config#custom-mapping) сопоставляет каталог Babel `pt_BR` со стандартным кодом локали `pt-BR`. Настройте [CLI](/docs/cli/quickstart). Если у вас уже есть переводы, импортируйте их с помощью [`npx gt upload`](/docs/cli/reference/commands/upload), прежде чем генерировать новые. Затем выполните [`npx gt translate`](/docs/cli/reference/commands/translate), а после — `pybabel compile -d translations`.

General Translation передаёт каждую запись вместе с её `msgctxt`, комментариями переводчика, ссылками на исходный код и флагами в качестве контекста. Для записей с множественными формами GT записывает заголовок `Plural-Forms` языка перевода и заполняет все слоты `msgstr[n]` (так, для польского будут заполнены все три формы), а также проверяет, что заполнители вроде `%(num)d` сохраняются без изменений. При следующем запуске для неизменённых записей повторно используются прежние переводы. Glossary и пользовательские промпты в [контекстной группе](/docs/platform/dashboard/guides/defining-context-for-translations) обеспечивают единообразие терминологии в ваших каталогах и во всём остальном продукте, а рецензенты могут [редактировать любую запись](/docs/platform/dashboard/guides/reviewing-translations) в панели управления. Запускайте CLI в CI, чтобы при каждом развёртывании каталоги были актуальными. Если позже вы внесёте локальные изменения, сохраните их с помощью [`npx gt save-local`](/docs/cli/reference/commands/save-local) перед повторной генерацией.

## Babel и Flask-Babel и General Translation: краткое сравнение

| Возможность                                   | Babel и Flask-Babel                                                 | General Translation                                                              |
| --------------------------------------------- | ------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Как пишутся строки                            | Вызовы `gettext` и Jinja `{% trans %}`, извлекаемые в PO-файлы      | Вызовы и шаблоны остаются прежними; переводятся извлечённые каталоги             |
| Переводит ваш контент                         | Нет                                                                 | Да, с помощью [`npx gt translate`](/docs/cli/reference/commands/translate)       |
| Формы множественного числа                    | `pybabel init` создаёт слоты, а заполнять каждый приходится вручную | Генерирует все слоты PO для языка перевода                                       |
| Форматирование дат, чисел и денежных значений | Да, на основе CLDR                                                  | Сохраняет форматирование Babel                                                   |
| Шаблоны Jinja                                 | Да                                                                  | Переводит сообщения, извлечённые из ваших существующих шаблонов                  |
| Фреймворки                                    | Babel — где угодно; Flask-Babel — для Flask                         | CLI для PO-каталогов из Flask и других приложений на gettext                     |
| Лицензия                                      | BSD                                                                 | CLI под лицензией MIT                                                            |
| Стоимость                                     | Бесплатно                                                           | [Оплата перевода по факту использования](https://generaltranslation.com/pricing) |

## Когда что использовать

Оставьте текущий процесс перевода, если переводчики или TMS уже предоставляют нужные вам каталоги. Подключите General Translation, если хотите, чтобы новые и изменённые сообщения переводились прямо в ходе разработки — с общей терминологией и инструментами проверки, которыми ваша команда пользуется во всех проектах. Flask-Babel по-прежнему отвечает за Jinja, локали запросов, даты и валюты, а код вашего приложения остаётся без изменений.

## Ключевые выводы

* Babel форматирует даты, числа и валюты для любой локали и управляет каталогами gettext, а Flask-Babel интегрирует его во Flask, однако ни тот, ни другой не переводит ваши строки.
* CLI General Translation переводит PO-файлы Babel с помощью ключа `pot`, параметра `"transformationFormat": "PO"` и `customMapping` для каталогов вроде `pt_BR`, заполняя все формы множественного числа для каждого языка.
* Оставьте рендеринг и форматирование на Flask-Babel, импортируйте существующие переводы и встройте General Translation между извлечением и компиляцией.

## Related questions

- [General Translation и GNU gettext: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-gettext.mdx): Оставьте GNU gettext для извлечения и рендеринга, а General Translation подключите для генерации и сопровождения PO-файлов. General Translation учитывает при генерации заметки для переводчиков и контекст сообщений, применяет общую терминологию и предоставляет рецензентам редактор в панели управления. Существующие вызовы gettext и скомпилированные каталоги остаются на месте.
- [General Translation и фреймворк переводов Django: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-django-i18n.mdx): Используйте фреймворк переводов Django вместе с General Translation. Django отвечает за извлечение сообщений, выбор языка и рендеринг. General Translation заполняет его PO-файлы, включая формы множественного числа, с учётом терминологии вашего продукта и проверки в панели управления. Ваши шаблоны и URL-шаблоны остаются прежними, а переводы обновляются вместе с кодом.
- [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 переводит контент прямо в вашем коде с учётом контекста, выпускает все языки с каждым релизом и работает на библиотеках с открытым исходным кодом без привязки к поставщику.
- [Можно ли реализовать i18n без файлов перевода?](https://generaltranslation.com/ru/kb/i18n-without-translation-files.mdx): Да. С gt-react или gt-next контент остаётся встроенным прямо в ваши компоненты внутри компонента `<T>`, а переводы генерируются во время сборки, поэтому не нужно писать ключи и JSON-файлы для каждой локали и следить за их синхронизацией.

## Previous and next questions

- Previous question: [General Translation и фреймворк переводов Django: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-django-i18n.mdx)
- Next question: [General Translation или i18n-tasks: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-i18n-tasks.mdx)

## Sitemap

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