# General Translation Knowledge Base: Как мигрировать с Phrase на General Translation?
URL: https://generaltranslation.com/ru/kb/migrate-from-phrase.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: Сохраните файлы локалей, библиотеку интернационализации и проверенные переводы. Выгрузите файлы из Phrase Strings без непереведённых ключей и резервных вариантов, отключите Repo Sync и импортируйте файлы командой npx gt upload перед первым запуском npx gt translate. После этого General Translation переводит новые и изменённые строки во время сборки, используя вашу терминологическую базу из контекстной группы и описания ключей в качестве контекста для каждого ключа.
Category: Инструменты для рабочих процессов
Last updated: 2026-11-12
Authors: Kevin Wu
Published: 2026-11-12

Phrase Strings — продукт Phrase для локализации программного обеспечения — хранит ваши строки в виде ключей в проекте, генерирует файлы локалей при скачивании и синхронизирует их с вашим репозиторием. При переходе на General Translation файлы локалей, которые уже использует ваше приложение, остаются на месте: CLI `gt` импортирует их вместе с существующими переводами, а затем переводит новые и изменённые строки во время сборки или в CI. Библиотека интернационализации и ключи остаются прежними; перенос текстов непосредственно в код — отдельный необязательный шаг (см. [миграцию с react-i18next](/kb/migrate-from-react-i18next) или [с next-intl](/kb/migrate-from-next-intl)). Терминологическая база превращается в контекстную группу, которую могут совместно использовать ваше приложение, документация и другие проекты. Это руководство посвящено Phrase Strings; для документов, переводимых в Phrase TMS, используется другой рабочий процесс.

## Что переносится из Phrase Strings?

| В Phrase Strings                                                                             | В General Translation                                                                                                                            |
| -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| Цели pull в `.phrase.yml`                                                                    | `files` в `gt.config.json`, где вместо `<locale_name>` используется `[locale]`                                                                   |
| Переводы                                                                                     | Импортируются с помощью [`npx gt upload`](/docs/cli/reference/commands/upload) и сохраняются, пока не изменится исходный текст                   |
| Терминологическая база                                                                                | Glossary в [контекстной группе](/docs/platform/dashboard/guides/defining-context-for-translations), импортированный из CSV                       |
| Руководства по стилю                                                                         | [Пользовательские промпты](/docs/platform/dashboard/guides/defining-context-for-translations) — глобальные или для отдельных локалей             |
| Описания ключей и ограничения длины                                                          | Файл [метаданных, привязанных к ключам](/docs/cli/reference/keyed-metadata), с полями `context` и `maxChars` для каждого ключа (для JSON и YAML) |
| Память переводов                                                                             | Ваши загруженные переводы: для неизменённых строк они сохраняются, а переводятся только новые и изменённые строки. Файлы TMX не импортируются    |
| Repo Sync                                                                                    | [`npx gt translate`](/docs/cli/reference/commands/translate) в CI или пул-реквесты от [Locadex](/docs/platform/locadex/quickstart)               |
| Верификация и проверка переводов                                                             | Редактирование в [панели управления](/docs/platform/dashboard/guides/reviewing-translations), одобрение — на тарифе Enterprise                   |
| SDK для обновлений по воздуху (OTA) для iOS, Android, React Native, Flutter, i18next и Rails | Переводы поставляются в файлах локалей вместе с каждым релизом приложения                                                                        |

CLI читает JSON, YAML, `.pot` и `.po`, iOS `.strings`, `.stringsdict` и `.xcstrings`, Android `strings.xml`, `.resx`, HTML, Markdown, MDX и другие форматы (см. [поддерживаемые форматы](/docs/cli/reference/config#files)). XLIFF, ARB, Java `.properties`, а также экспорт в CSV и XLSX не поддерживаются, поэтому при выгрузке выбирайте поддерживаемый формат.

## Шаг 1: выгрузите по одному файлу на каждую локаль

Phrase генерирует файлы из ключей при каждой выгрузке. Если в вашем репозитории уже есть файлы, синхронизированные Phrase, выполняйте pull с теми же целями из `.phrase.yml`, чтобы результат совпадал, а перед импортом сравните его с содержимым репозитория.

Цель pull для JSON-приложения выглядит так:

```yaml title=".phrase.yml"
phrase:
  project_id: "YOUR_PROJECT_ID"
  file_format: nested_json
  pull:
    targets:
      - file: ./locales/<locale_name>/app.json
        params:
          file_format: nested_json
          include_empty_translations: false
```

Затем выполните [`phrase pull`](https://developers.phrase.com/en/developer-tools/strings-cli) с токеном доступа, у которого есть область `read`. Не указывайте `--branch`, чтобы загрузить данные из основной ветки. Если ваш аккаунт размещён в американском дата-центре Phrase, добавьте `host: https://api.us.app.phrase.com/v2` в раздел `phrase:` файла `.phrase.yml`.

Чтобы импорт прошёл чисто, важны три настройки:

* **Непереведённые ключи.** `include_empty_translations: false` (значение CLI по умолчанию) исключает непереведённые ключи. Не задавайте `fallback_locale_id` и `use_locale_fallback` и убедитесь, что настройка проекта **Use fallback for unverified translations** отключена. Каждая из них заполняет пропуски текстом другой локали, и этот текст будет импортирован как перевод.
* **Формат файлов.** Используйте формат, который уже читает ваша библиотека: `nested_json` или `simple_json`, `i18next_4` для i18next, `yml` для Rails, `strings` и `stringsdict` для iOS, `strings_catalog` для `.xcstrings` и `xml` для Android. Формат `json` в Phrase — это JSON для расширений Chrome, а не JSON общего назначения. (См. [список поддерживаемых форматов файлов](https://support.phrase.com/hc/en-us/articles/9652464547740) Phrase.)
* **Имена локалей.** Вместо `<locale_name>` подставляется имя, которое вы задали каждой локали в Phrase, например `de-AT`. CLI `gt` сопоставляет имена папок со списком `locales` по точному совпадению, поэтому либо переименуйте локали в Phrase, либо сопоставьте их с помощью `locale_mapping` в разделе `phrase:` файла `.phrase.yml` (Phrase CLI 2.59.0 или новее), либо укажите в `gt.config.json` имена в том виде, в каком они загружаются.

Если вы не используете CLI, откройте вкладку **Languages** проекта и нажмите **Download**, чтобы скачать сразу несколько локалей. Флажок **Include empty translations** при этом должен оставаться снятым.

## Шаг 2: Отключите Repo Sync и OTA

[Repo Sync](https://support.phrase.com/hc/en-us/articles/5784125562012-GitHub-Strings) в Phrase (настраивается в разделе **Automations &gt; Repo Syncs**) может импортировать файлы при push и экспортирует переводы в виде пул-реквестов — по умолчанию из ветки `phrase-translations`. Прежде чем General Translation начнёт записывать файлы, отключите каждую синхронизацию, чтобы она перестала импортировать и экспортировать данные, закройте все открытые пул-реквесты Phrase и удалите шаги `phrase push` и `phrase pull` из CI. Если два инструмента записывают одни и те же файлы, сохранятся изменения того, кто записал их последним.

Если ваши мобильные приложения используют Phrase OTA, уже установленные приложения продолжат получать новые OTA-релизы. Чтобы обновления перестали приходить, прекратите создавать релизы или удалите дистрибуцию, а SDK уберите в одном из следующих релизов приложения.

## Шаг 3: Укажите CLI, где находятся файлы

Установите CLI `gt` и опишите полученные файлы в `gt.config.json`:

```json title="gt.config.json"
{
  "defaultLocale": "en",
  "locales": ["de", "fr", "pt-BR"],
  "files": {
    "json": { "include": ["locales/[locale]/app.json"] }
  }
}
```

Если в вашем `package.json` есть `i18next` или `next-intl`, CLI распознаёт синтаксис сообщений i18next и next-intl в JSON, а остальные значения JSON обрабатывает как обычные строки. (См. [JSON-файлы](/docs/cli/reference/formats/json-files).)

Войдите с помощью [`npx gt login`](/docs/cli/reference/commands/login) и задайте `GT_PROJECT_ID` или укажите `projectId` в конфигурации. В CI используйте `GT_API_KEY` с ключом API проекта, у которого есть разрешения **Файлы &gt; Write**, **Очередь перевода &gt; Включено** и **Контекст &gt; Write**.

## Шаг 4: Перенесите терминологическую базу и контекст ключей

В Phrase Strings откройте **Term bases**, затем **More &gt; Download CSV**, выберите поля и нажмите **Download**. Файл содержит столбцы `term`, `case_sensitive`, `translatable` и `description`, а также по одному столбцу для каждой локали. (См. [Uploading and downloading terms](https://support.phrase.com/hc/en-us/articles/10112307427740).) Переименуйте `description` в `definition`, а каждый столбец локали, например `de`, — в `translation_de`, затем удалите столбцы `case_sensitive` и `translatable`. Импортер General Translation считывает такую структуру напрямую, а файлы с другой структурой интерпретирует с помощью ИИ. В панели управления создайте [контекстную группу](/docs/platform/dashboard/guides/defining-context-for-translations), нажмите **Import**, выберите файл и назначьте группу своему проекту до первого запуска перевода — тогда новые переводы с самого начала будут использовать вашу терминологию.

Описания ключей и ограничения на количество символов подсказывают переводчику, что означает строка и какой длины она может быть. Добавьте вторую цель pull для исходной локали с параметром `file_format: strings_json` и сохраняйте результат вне папок, указанных в `gt.config.json` (например, в `./phrase-export/app.strings.json`). Этот файл содержит `description` и `max_characters_allowed` для каждого ключа; запишите эти данные в файл [метаданных, привязанных к ключам](/docs/cli/reference/keyed-metadata) рядом с исходным файлом:

```json title="locales/en/app.metadata.json"
{
  "checkout": {
    "save": { "context": "Button that saves the shipping address", "maxChars": 12 }
  }
}
```

Перенесите свои руководства по стилю в [пользовательские промпты](/docs/platform/dashboard/guides/defining-context-for-translations). Чтобы сохранить архив памяти переводов, выгрузите каждый язык проекта в формате TMX.

## Шаг 5: Загрузите файлы перед переводом

Сначала выполните [`npx gt upload`](/docs/cli/reference/commands/upload). Эта команда отправляет каждый исходный файл вместе с соответствующими переведёнными файлами для всех локалей и сохраняет эти переводы как завершённые:

```bash
npx gt upload
npx gt translate
```

Затем [`npx gt translate`](/docs/cli/reference/commands/translate) переводит только недостающее, например новую локаль или файл без перевода, и записывает результаты по тем же путям. Если запустить [`npx gt translate`](/docs/cli/reference/commands/translate) до [`npx gt upload`](/docs/cli/reference/commands/upload), будут сгенерированы новые переводы, которые перезапишут выгруженные из Phrase файлы. Ключи, которые не были переведены в Phrase, General Translation переведёт при следующем изменении их исходного файла. Чтобы эти переводы попали в релиз раньше, завершите их в Phrase до выгрузки файлов.

## Шаг 6: Автоматически переводите новые тексты

Теперь достаточно запускать [`npx gt translate`](/docs/cli/reference/commands/translate) при [сборке или в CI](/kb/translations-in-ci) либо поручить [Locadex](/docs/platform/locadex/quickstart) открывать пул-реквесты с переводами. Закоммитьте `gt-lock.json`: в этом файле фиксируются переводы, которые CLI уже записал, чтобы не скачивать их повторно. Если ваша команда редактирует переведённые файлы прямо в репозитории, перед следующим переводом запускайте [`npx gt save-local`](/docs/cli/reference/commands/save-local), чтобы эти правки не потерялись.

## Когда стоит остаться на Phrase?

Оставайтесь на Phrase, если одна платформа должна обслуживать и строки интерфейса приложений, и программу перевода документов в Phrase TMS, если ваши нативные мобильные приложения используют OTA-обновления, если вы заказываете перевод, выполняемый людьми, через Phrase или если ваш конвейер работает с файлами XLIFF или ARB. (См. [General Translation и Phrase: сравнение](/kb/general-translation-vs-phrase).)

## Часто задаваемые вопросы

### Потеряю ли я проверенные переводы?

Нет, если вы получаете переводы без резервных вариантов и запускаете [`npx gt upload`](/docs/cli/reference/commands/upload) до [`npx gt translate`](/docs/cli/reference/commands/translate). Загруженные переводы остаются на месте, пока не изменится их исходный текст, а ваша команда может исправить любой перевод в [панели управления](/docs/platform/dashboard/guides/reviewing-translations).

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

* Выгрузите по одному файлу на каждую локаль с параметром `include_empty_translations: false` и без резервной локали — в том формате, который уже использует ваше приложение.
* Отключите Repo Sync и OTA до того, как General Translation начнёт записывать те же файлы.
* Перед переводом приведите названия локалей в Phrase в соответствие с `locales` в `gt.config.json`, импортируйте терминологическую базу в контекстную группу, а описания ключей и ограничения на длину перенесите в контекст соответствующих ключей.
* Выполните [`npx gt upload`](/docs/cli/reference/commands/upload) перед первым запуском [`npx gt translate`](/docs/cli/reference/commands/translate), а затем переводите новые тексты в процессе сборки или с помощью Locadex.

## Related questions

- [Альтернативы Phrase: General Translation или Phrase](https://generaltranslation.com/ru/kb/general-translation-vs-phrase.mdx): General Translation — сильная альтернатива Phrase Strings, если приложение и документация выходят одновременно. Он генерирует переводы из кода и файлов контента, применяет общую терминологию и встраивается в рабочий процесс релиза. Phrase объединяет локализацию ПО с TMS для работы с документами, управлением поставщиками и широким выбором движков перевода.
- [Как мигрировать с Lokalise на General Translation?](https://generaltranslation.com/ru/kb/migrate-from-lokalise.mdx): Сохраните файлы ресурсов, библиотеку интернационализации и проверенные переводы. Экспортируйте данные из Lokalise без пустых переводов, отключите синхронизацию с GitHub и импортируйте файлы командой npx gt upload перед первым запуском npx gt translate. После этого General Translation будет переводить новые и изменённые строки во время сборки, используя ваш Glossary из контекстной группы и описания ключей в качестве контекста для каждого ключа.
- [Как мигрировать с Crowdin на General Translation?](https://generaltranslation.com/ru/kb/migrate-from-crowdin.mdx): Сохраните файлы ресурсов, библиотеку интернационализации и проверенные переводы. Включите параметр Skip untranslated strings, скачайте переводы, запретите Git-интеграции Crowdin отправлять переводы и импортируйте файлы с помощью npx gt upload перед первым запуском npx gt translate. После этого General Translation будет переводить новые и изменённые строки во время сборки, используя ваш глоссарий из контекстной группы.
- [Как поддерживать переводы в актуальном состоянии при каждом развёртывании?](https://generaltranslation.com/ru/kb/translations-in-ci.mdx): Запускайте перевод как этап конвейера перед каждой сборкой для рабочей среды — тогда новые тексты попадут в то же развёртывание, что и сами изменения, уже переведёнными. В CLI gt от General Translation для этого служит команда npx gt translate, которая использует ключ API проекта и идентификатор проекта, сохранённые как секреты CI.
- [Что такое память переводов и нужна ли она в эпоху ИИ?](https://generaltranslation.com/ru/kb/what-is-translation-memory.mdx): Память переводов (TM) — это база данных пар исходных и целевых сегментов из прошлых переводов, в которой инструмент перевода ищет точные, контекстные и нечёткие совпадения. При работе с ИИ по-прежнему важно повторно использовать утверждённые формулировки и передавать прошлые переводы как контекст. General Translation повторно использует совпадающие переводы из предыдущих версий файлов и сохраняет правки команды, и при этом не нужно поддерживать отдельную TM.

## Previous and next questions

- Previous question: [Как мигрировать с Lokalise на General Translation?](https://generaltranslation.com/ru/kb/migrate-from-lokalise.mdx)
- Next question: [Какой инструмент непрерывной локализации лучше всего подходит командам, выпускающим релизы ежедневно?](https://generaltranslation.com/ru/kb/best-continuous-localization-tools.mdx)

## Sitemap

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