# General Translation Platform: Загрузка переводов URL: https://generaltranslation.com/ru/docs/platform/openapi/reference/files/upload-translations.mdx --- title: Загрузка переводов description: Загрузка переведённых файлов в проект General Translation, соответствующих ранее загруженным исходным файлам. Справочник API для загрузки переводов. method: POST --- Загружает уже переведённые файлы для исходных файлов, загруженных ранее. Каждая запись связывает ссылку на исходный файл с одним или несколькими переводами; до 100 записей в одном запросе. ## Обзор [#overview] ```http POST https://api2.gtx.dev/v2/project/files/upload-translations ``` **Разрешение** `project:files:write` · **Лимит запросов** Средний (120/min) Привяжите существующие переводы к проекту, чтобы они хранились вместе с исходными текстами. Чтобы сначала загрузить исходные файлы, используйте [Загрузить исходные файлы](/docs/platform/openapi/reference/files/upload-source). Если вместо этого вы хотите перевести исходные файлы с помощью General Translation, см. [Поставить переводы в очередь](/docs/platform/openapi/reference/translation/queue). ## Как это работает [#how-it-works] * `source` каждой записи указывает на исходный файл, который уже должен существовать. Исходные файлы сопоставляются по `branchId`, `versionId` и `fileId`; если `branchId` отсутствует, используется ветка по умолчанию. Если указанный исходный файл не найден, запрос завершается ошибкой `400`. * Объект `source` проверяется так же, как при загрузке, поэтому `fileId` по умолчанию вычисляется как хеш `fileName`, а `versionId` — как хеш содержимого, если они не указаны. * `content` каждого перевода в кодировке Base64 и декодируется на сервере; некорректный base64 или слишком большой файл отклоняется. * Переводы наследуют `fileId`, `versionId`, `branchId` и `fileName` от своего исходного файла. Установите `transformFormat`, чтобы сохранить перевод в другом выходном формате файла. * Загруженные переводы помечаются как завершённые. Если в проекте включено автоматическое одобрение, они также помечаются как одобренные. Переводы `GTJSON` получают метаданные проверки для каждого компонента на основе объекта `source`. * Список локалей каждого исходного файла обновляется и включает локали загруженных переводов. Файлы публикуются в CDN, если для проекта включён CDN. * Если передан `sourceLocale` и он отличается от текущей локали проекта по умолчанию, локаль проекта по умолчанию обновляется. ## Запрос [#request] ### Заголовки | Заголовок | Описание | Обязательно | | ----------------- | ----------------------------------------------------------- | ----------- | | `x-gt-api-key` | API-ключ проекта или организации. | Да | | `x-gt-project-id` | ID проекта. Обязателен при использовании ключа организации. | Нет | ### Тело запроса **Тип содержимого** `application/json` | Поле | Описание | Тип | Необязательное | По умолчанию | | --------------- | ------------------------------------------------- | ---------- | -------------- | --------------------------- | | [`data`](#data) | Массив записей исходного текста/перевода (1–100). | `object[]` | Нет | — | | `sourceLocale` | Исходная локаль для загруженных файлов. | `string` | Да | Локаль проекта по умолчанию | #### `data` [#data] **Тип** `object[]` · **Обязательно** Каждый элемент имеет вид `{ "source": { ... }, "translations": [ ... ] }`. Объект `source` идентифицирует ранее загруженный исходный файл: | Поле | Описание | Тип | Необязательно | По умолчанию | | ---------------- | ---------------------------------------------------------------------------------------------------- | -------- | ------------- | ------------------ | | `content` | Содержимое исходного файла в кодировке Base64. Применяется ограничение на максимальный размер файла. | `string` | Нет | — | | `fileName` | Имя файла; не может быть пустым. | `string` | Нет | — | | `fileFormat` | Идентификатор формата файла (например, `JSON`, `MDX`). | `string` | Нет | — | | `locale` | Локаль исходного содержимого; не может быть пустой. | `string` | Нет | — | | `dataFormat` | Формат данных для структурированного содержимого. | `string` | Да | — | | `fileId` | Стабильный идентификатор файла. | `string` | Да | Хеш `fileName` | | `versionId` | Идентификатор версии этого содержимого. | `string` | Да | Хеш содержимого | | `branchId` | Ветка, к которой привязан исходный файл. | `string` | Да | Ветка по умолчанию | | `formatMetadata` | Дополнительные метаданные для конкретного формата. | `object` | Да | — | Каждый элемент `translations` представляет один переведённый файл. Для каждой записи требуется как минимум один перевод: | Поле | Описание | Тип | Необязательно | По умолчанию | | ----------------- | -------------------------------------------------------------------------------------------------------- | -------- | ------------- | ---------------------- | | `content` | Содержимое переведённого файла в кодировке Base64. Применяется ограничение на максимальный размер файла. | `string` | Нет | — | | `fileName` | Имя файла; не может быть пустым. | `string` | Нет | — | | `fileFormat` | Идентификатор формата файла. | `string` | Нет | — | | `locale` | Целевая локаль перевода; не может быть пустой. | `string` | Нет | — | | `dataFormat` | Формат данных для структурированного содержимого. | `string` | Да | — | | `transformFormat` | Формат выходного файла, в котором будет сохранён перевод. | `string` | Да | Формат исходного файла | ## Ответ [#response] **Статус** `201 Created` ```json title="Response" { "uploadedFiles": [ { "branchId": "br_...", "fileId": "file_...", "versionId": "ver_...", "fileName": "en/common.json", "locale": "es", "fileFormat": "JSON", "dataFormat": "JSON" } ], "count": 1, "message": "Successfully uploaded 1 translation file(s)" } ``` ## Ошибки [#errors] | Статус | Причина | | ------ | ---------------------------------------------------------------------------------------------------------------------------------------- | | `400` | Недопустимое тело запроса, недопустимая локаль/формат, ошибка декодирования, слишком большой файл или не найден указанный исходный файл. | | `401` | Отсутствует API-ключ или указан недействительный API-ключ. | | `403` | У API-ключа нет разрешения `project:files:write`. | | `429` | Превышен лимит запросов. | | `503` | Сервер занят; повторите попытку с увеличением задержки. | ## Пример [#example] ```bash curl -X POST https://api2.gtx.dev/v2/project/files/upload-translations \ -H "x-gt-api-key: gtx-api-..." \ -H "Content-Type: application/json" \ -d '{ "sourceLocale": "en", "data": [ { "source": { "content": "eyJoZWxsbyI6ICJIZWxsbyJ9", "fileName": "en/common.json", "fileFormat": "JSON", "locale": "en" }, "translations": [ { "content": "eyJoZWxsbyI6ICJIb2xhIn0=", "fileName": "en/common.json", "fileFormat": "JSON", "locale": "es" } ] } ] }' ```