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

В Django встроен полноценный фреймворк интернационализации (i18n): вы помечаете строки с помощью `gettext` и `{% translate %}`, `makemessages` извлекает их в PO-файл для каждого языка, `compilemessages` собирает `.mo`-файлы, которые загружает Django, а `LocaleMiddleware` выбирает язык для каждого запроса. General Translation добавляет этап перевода между извлечением и компиляцией: его CLI считывает ваш английский каталог и записывает переведённые PO-файлы, которые затем загружает Django.

## Video

The video is narrated in English, with English captions.

[General Translation vs. Django's translation framework: do you need both?](https://caxecubb9c64cezv.public.blob.vercel-storage.com/films/kb-general-translation-vs-django-i18n.mp4) (46 с)

Use both: Django extracts messages, selects the language, and renders, and General Translation fills its PO files, plural forms included, with your terminology and Dashboard review. To set it up, keep running makemessages, point `gt.config.json` at your locale folders, and run `npx gt translate` before compilemessages in CI. A Glossary keeps terms consistent, and reviewers edit entries in the Dashboard.

## Что фреймворк перевода Django делает хорошо

* **Разметка строк в любом месте.** `gettext` и `ngettext` [покрывают код на Python](https://docs.djangoproject.com/en/5.2/topics/i18n/translation/#internationalization-in-python-code), `gettext_lazy` — строки, определяемые во время импорта, например поля моделей и метки форм, `pgettext` добавляет контекст к неоднозначным словам, а `{% translate %}` и `{% blocktranslate %}` (с `count` для форм множественного числа) покрывают шаблоны.
* **Встроенные извлечение и компиляция.** `makemessages` прогоняет `xgettext` из GNU gettext по вашим файлам Python и шаблонам и [добавляет новые строки в файл `django.po`](https://docs.djangoproject.com/en/5.2/topics/i18n/translation/#message-files) для каждого языка в `locale/<locale>/LC_MESSAGES/`. Комментарий `# Translators:` над строкой попадает в PO-файл, где его увидит переводчик.
* **Выбор языка для каждого запроса.** `LocaleMiddleware` [проверяет префикс URL](https://docs.djangoproject.com/en/5.2/topics/i18n/translation/#how-django-discovers-language-preference), добавленный `i18n_patterns`, затем языковой cookie-файл, затем заголовок `Accept-Language`, затем `LANGUAGE_CODE`. Выбираются только языки из `LANGUAGES`, а при отсутствии `de-at` используется `de`.
* **Не только строки.** Даты и числа [форматируются согласно активной локали](https://docs.djangoproject.com/en/5.2/topics/i18n/formatting/), а `JavaScriptCatalog` отдаёт браузеру отдельный каталог `djangojs`.
* **Сам Django уже переведён.** Админка и встроенные приложения [поставляются с каталогами примерно для сотни языков](https://github.com/django/django/tree/stable/5.2.x/django/contrib/admin/locale), а сам фреймворк распространяется бесплатно по лицензии BSD.

## Что Django оставляет вам

[Документация Django](https://docs.djangoproject.com/en/5.2/topics/i18n/translation/#compiling-message-files) описывает шаг, который фреймворк не берёт на себя: когда переводчики заполнят файл сообщений, его нужно скомпилировать. Вот шаблон с формами множественного числа:

```html title="shop/templates/shop/inbox.html"
{% load i18n %}
<p>{% blocktranslate count counter=count %}{{ counter }} file{% plural %}{{ counter }} files{% endblocktranslate %}</p>
```

В Django 5.2 команда `python manage.py makemessages -l ru` берёт из собственного каталога Django правило множественного числа для русского языка с четырьмя формами и копирует его в заголовок, но для самой записи создаёт лишь два пустых слота:

```text title="locale/ru/LC_MESSAGES/django.po"
"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"

#: shop/templates/shop/inbox.html:2
#, python-format
msgid "%(counter)s file"
msgid_plural "%(counter)s files"
msgstr[0] ""
msgstr[1] ""
```

В тесте после заполнения только этих двух слотов получился каталог, который `compilemessages` собрал без единой ошибки, а страница вывела &quot;1 файл&quot; и &quot;3 файла&quot;, но при количестве пять — &quot;5 files&quot; на английском, потому что слот, который правило выбирает для пяти, так и остался незаполненным. Пустой каталог ломается так же незаметно: когда в `pt_BR` ничего не было, страница `/pt-br/` целиком отображалась на английском. С каждой новой размеченной строкой этот цикл повторяется для каждого языка.

Кроме того, Django работает только со строками в коде. Для контента, хранящегося в базе данных, например названий товаров или страниц, нужен сторонний пакет: django-modeltranslation [добавляет поле для каждого языка](https://django-modeltranslation.readthedocs.io/en/latest/registration.html) в зарегистрированные модели, а django-parler хранит переводы в отдельной таблице. Оба пакета дают место для хранения переводов, но сами переводы не создаёт ни один из них.

## Перевод PO-файлов Django с помощью General Translation

CLI General Translation считывает английский каталог, который Django уже ведёт, переводит каждую запись и создаёт PO-файл для каждого языка перевода там, где Django будет его искать. Поддерживайте английский каталог в актуальном состоянии с помощью `makemessages`:

```bash
python manage.py makemessages -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": ["locale/[locale]/LC_MESSAGES/*.po"],
      "transformationFormat": "PO"
    }
  }
}
```

Здесь важны несколько деталей; все они описаны в [справочнике по форматам PO / POT](/docs/cli/reference/formats/po-pot-files):

* **`pot` — это ключ и для PO-, и для POT-файлов.** Параметр `transformationFormat` должен иметь значение `PO`; без него на выходе останется непереведённый шаблон.
* **Каталоги локалей называются так, как принято в Django.** CLI подставляет вместо `[locale]` каждую локаль ровно в том виде, в каком вы её указали. [`customMapping`](/docs/cli/reference/config#custom-mapping) сопоставляет каталог Django `pt_BR` со стандартным кодом локали `pt-BR`.
* **`*.po` охватывает все домены**, включая `djangojs.po`, если вы также запускаете `makemessages -d djangojs -l en`.

Настроив CLI (см. [Быстрый старт CLI](/docs/cli/quickstart)), выполните [`npx gt translate`](/docs/cli/reference/commands/translate), а затем `python manage.py compilemessages`. General Translation передаёт каждую запись вместе со всем, что известно о ней из PO-файла, в качестве контекста: `msgctxt`, комментарии `# Translators:`, ссылки на исходный код и флаги вроде `python-format`. Для записи с формами множественного числа он прописывает заголовок `Plural-Forms` языка перевода, заполняет все слоты `msgstr[n]`, которых требует этот заголовок, и проверяет, что заполнители вроде `%(counter)s` сохранились без изменений. Для русского языка это стандартное правило gettext с тремя формами; Django читает правило каждого каталога отдельно, поэтому оно не конфликтует с правилом из четырёх форм в собственном русском каталоге Django.

Для неизменённых записей повторно используются прежние переводы, поэтому при следующем запуске переводятся только изменения; `--force` переводит всё заново. Если в ваших PO-файлах уже есть переводы, выполните [`npx gt upload`](/docs/cli/reference/commands/upload), прежде чем генерировать новые. Чтобы не потерять последующие локальные изменения, синхронизируйте их с помощью [`npx gt save-local`](/docs/cli/reference/commands/save-local) перед следующим запуском перевода.

Здесь и проявляются преимущества полного стека. Glossary и пользовательские промпты в [контекстной группе](/docs/platform/dashboard/guides/defining-context-for-translations) обеспечивают единую терминологию и тон во всех каталогах Django и других проектах, назначенных этой группе. Рецензенты могут [редактировать каждую запись PO](/docs/platform/dashboard/guides/reviewing-translations), включая её формы множественного числа, в панели управления. Запускайте `makemessages`, [`gt translate`](/docs/cli/reference/commands/translate) и `compilemessages` в CI, чтобы переводы обновлялись с каждым релизом.

Для содержимого базы данных и другого текста, который появляется только во время выполнения, API General Translation переводит строки по запросу ([`POST /v2/translate`](/docs/platform/openapi/reference/translation/translate-content)); результаты вы сохраняете самостоятельно, например в языковые поля django-modeltranslation.

Установите Node.js на машину, где запускается CLI. Django по-прежнему отдаёт скомпилированные каталоги через существующую среду выполнения Python.

## Фреймворк переводов Django и General Translation: краткое сравнение

| Возможность                                    | Фреймворк переводов Django                                                                                          | General Translation                                                              |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
| Разметка строк в коде и шаблонах               | Да: `gettext`, `{% translate %}` и другие                                                                           | Использует уже имеющиеся в коде вызовы Django для сообщений                      |
| Извлечение строк в PO-файлы                    | Да, `makemessages`                                                                                                  | Читает файлы, которые создаёт `makemessages`                                     |
| Создание переводов                             | Нет                                                                                                                 | Да, с помощью [`npx gt translate`](/docs/cli/reference/commands/translate)       |
| Формы множественного числа                     | Заголовок из каталога Django; каждую форму заполняете вы                                                            | Записывает заголовок для языка перевода и заполняет все формы                    |
| Контекст для перевода                          | Комментарии `# Translators:` и `msgctxt` в PO-файле                                                                 | То же самое, а также Glossary и пользовательские промпты                         |
| Выбор языка для каждого запроса и префиксы URL | Да, `LocaleMiddleware` и `i18n_patterns`                                                                            | Сохраняет маршрутизацию и выбор языка средствами Django                          |
| Содержимое базы данных                         | Сторонние пакеты, например django-modeltranslation                                                                  | Перевод через API во время выполнения; хранение результатов — на вашей стороне   |
| Стоимость                                      | Бесплатно, открытый исходный код ([BSD](https://docs.djangoproject.com/en/5.2/faq/general/#how-is-django-licensed)) | [Оплата перевода по факту использования](https://generaltranslation.com/pricing) |

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

Используйте только встроенные средства Django, если PO-файлы уже заполняют ваши переводчики или система управления переводами, если вы выпускаете продукт на одном-двух языках и можете переводить вручную или если каждый перевод должен быть написан человеком. Подключите General Translation, если хотите, чтобы при каждом изменении все PO-файлы заполнялись для всех языков — с полным набором форм множественного числа и единообразной терминологией — без отдельного этапа перевода между слиянием и релизом.

Выбирать что-то одно не обязательно: Django отвечает за разметку, извлечение, компиляцию и выбор языка, а General Translation — за перевод. Мигрировать ничего не нужно: ваши шаблоны, промежуточное ПО и шаблоны URL остаются прежними.

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

* Фреймворк переводов Django выполняет рендеринг переводов, но не создаёт их. Если в каталоге не хватает формы множественного числа или он пуст, выводится английский текст, причём сборка проходит без ошибок.
* General Translation переводит английский каталог, созданный командой `makemessages`, в отдельный PO-файл для каждого языка. Ваши шаблоны, промежуточное ПО и шаблоны URL остаются на месте.
* Для каждой записи с множественным числом General Translation прописывает заголовок `Plural-Forms` для языка перевода и заполняет все позиции `msgstr[n]`, а `msgctxt` и комментарии для переводчиков передаёт в качестве контекста.

## 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 или Babel и Flask-Babel: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-flask-babel.mdx): Babel форматирует даты, числа и валюты для любой локали и управляет каталогами gettext, а Flask-Babel интегрирует его с Flask, но ни один из них не переводит ваши строки. CLI General Translation заполняет PO-файлы Babel для всех языков, включая формы множественного числа, поэтому вы можете и дальше использовать Flask-Babel, но больше не переводить каталоги вручную.
- [General Translation и Rails I18n: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-rails-i18n.mdx): Rails I18n находит сообщения и форматирует даты и числа. General Translation создаёт переводы, поддерживает их в актуальном состоянии по мере изменения английского текста и предоставляет вашей команде панель управления для проверки. Используйте оба инструмента, чтобы выпускать переведённые каталоги Rails с каждым релизом.
- [General Translation или TMS (Crowdin, Lokalise, Phrase)](https://generaltranslation.com/ru/kb/general-translation-vs-tms.mdx): Выбирайте General Translation, если разработчикам нужны генерация переводов, контекст из кода и проверка, привязанные к релизам продукта. Сохраните существующие каталоги и библиотеку рендеринга или пишите встроенный JSX без ключей перевода. TMS подходит для программ, построенных вокруг языковых поставщиков, CAT-редакторов и обмена XLIFF; её интеграции могут автоматизировать передачу файлов.
- [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 ещё и выполняет перевод, используя ваш код как контекст.

## Previous and next questions

- Previous question: [General Translation и Rails I18n: нужны ли оба?](https://generaltranslation.com/ru/kb/general-translation-vs-rails-i18n.mdx)
- Next question: [General Translation или Babel и Flask-Babel: что выбрать?](https://generaltranslation.com/ru/kb/general-translation-vs-flask-babel.mdx)

## Sitemap

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