# gt: General Translation CLI tool: Метаданные по ключам URL: https://generaltranslation.com/ru/docs/cli/reference/keyed-metadata.mdx --- title: Метаданные по ключам description: Добавляйте инструкции по переводу для отдельных ключей в JSON- и YAML-файлы General Translation. Справочник API по метаданным по ключам. --- Вы предоставляете сопутствующий файл метаданных, который повторяет структуру ключей исходного файла и содержит объект метаданных в каждом конечном узле. Каждый объект содержит инструкции для перевода соответствующего ключа. CLI автоматически обнаруживает сопутствующие файлы метаданных, проверяет их на соответствие структуре исходного файла и отправляет в систему перевода. ## Поля [#fields] | Поле | Описание | Тип | Необязательное | По умолчанию | | ---------------------------- | -------------------------------------------------------------------- | -------- | -------------- | ------------ | | [`context`](#context) | Инструкции по переводу для конкретной строки. | `string` | Да | — | | [`maxChars`](#max-chars) | Максимально допустимое число символов в переведённом тексте. | `number` | Да | — | | [`sourceCode`](#source-code) | Контекст окружающего исходного кода с ключами в виде путей к файлам. | `object` | Да | — | ## Структура файла [#structure] Сопутствующий файл метаданных должен находиться в том же каталоге, что и исходный файл, соответствовать шаблону имени `{name}.metadata.{ext}` и повторять структуру ключей исходного файла, с объектом метаданных в каждом конечном узле. ```text translations.json # исходные строки translations.metadata.json # метаданные для каждого ключа ``` Добавляйте записи только для тех ключей, которым нужны специальные указания по переводу. ```json title="translations.json" { "nav": { "home": "Home", "bank": "Bank", "save": "Save" } } ``` ```json title="translations.metadata.json" { "nav": { "bank": { "context": "Речной берег — сторона реки. НЕ финансовое учреждение." }, "save": { "context": "Спортивный термин — вратарь, отражающий удар. НЕ сохранение данных.", "maxChars": 12 } } } ``` ## `context` [#context] **Тип** `string` · **Необязательно** · **По умолчанию** — Инструкции по переводу для конкретной строки. Используйте это поле, чтобы снять неоднозначность у слов с несколькими значениями, указать терминологию предметной области или уточнить подразумеваемый смысл. ```json { "bank": { "context": "Riverbank. The side of a river where land meets water, NOT a financial institution." } } ``` ## `maxChars` [#max-chars] **Тип** `number` · **Необязательно** · **По умолчанию** — Максимальное ограничение по числу символов в переводе. Механизм будет использовать более короткие синонимы, сокращения или лаконичные формулировки, чтобы уложиться в это ограничение. Это работает по возможности: если уложиться в ограничение для исходного текста невозможно, возвращается полный перевод. ```json { "save": { "maxChars": 10 } } ``` ## `sourceCode` [#source-code] **Тип** `object` · **Необязательно** · **По умолчанию** — Контекст исходного кода вокруг строки. Ключом служит путь к файлу, а каждая запись содержит `before` (строки исходного кода над целевой строкой), `target` (строка, содержащая переводимую строку) и `after` (строки исходного кода под целевой строкой). Если одна и та же строка встречается в разных местах, для одного файла поддерживается несколько записей. ```json { "new_lead": { "sourceCode": { "components/Dashboard.tsx": [ { "before": "function NotificationBanner({ type }) {\n const gt = useGT();", "target": " const msg = gt('You have a new lead!');", "after": " return {msg};\n}" } ] } } } ``` ### Комбинированный пример Все три поля в одном ключе: ```json { "save_button": { "context": "Sports term. A goalkeeper's save — preventing a goal from being scored. NOT saving data.", "maxChars": 12, "sourceCode": { "components/MatchStats.tsx": [ { "before": "const stats = useMatchStats();\nconst gt = useGT();", "target": "const label = gt('Save');", "after": "return }>{label}: {stats.saves};" } ] } } } ``` ## YAML [#yaml] Метаданные работают аналогично с сопутствующими файлами `.metadata.yaml` или `.metadata.yml`. ```yaml title="translations.metadata.yaml" ui: buttons: save: context: "Sports term. A goalkeeper's save, NOT saving data." maxChars: 12 labels: date: context: "The edible fruit of the date palm. NOT a calendar date." ``` ## Проверка [#validation] CLI проверяет файл метаданных на соответствие исходной структуре и завершает работу с ошибкой, если ключ метаданных отсутствует в исходнике, тип значения не соответствует исходнику (примитив или объект, массив или объект), не совпадает корневой тип или файл не удаётся разобрать. ## Схема и сопоставление [#schema] Метаданные по ключам работают со схемами JSON (`include` и `composite`) и YAML (`include`); метаданные преобразуются через тот же pipeline схем, чтобы пути ключей совпадали во время перевода. Сопутствующие файлы сопоставляются со своим исходным файлом и сами по себе не переводятся — файл `.metadata.json` без соответствующего исходного файла рассматривается как обычный файл. Изменение только метаданных не запускает повторный перевод; должно измениться и исходное содержимое.