Локализация на автопилоте

Ownlate — платформа управления переводами с ИИ. Память переводов и ИИ делают первый проход, команда проверяет, а утверждённые строки попадают в код или прямо в приложение без деплоя.

Бесплатный тариф: один проект, 10 000 слов, все форматы файлов. Без карты.

~/checkoutzsh
$ ownlate push
project: 7c1e4b2a-9f0d-4c1e-8b2a-3f6d0c9e1a47

  pushing locales/en.json ... 148 segments
  pushing docs/i18n/en/faq.md ... 36 segments

$ ownlate status --min 80

  de  ██████████████████░░  91%
  sr  █████████████████░░░  84%
  hu  ████████████████████ 100%

✓ All languages at 80%+

$ 
Ваша машина или CI
checkout / locales/en.json148 segments
keydesr
checkout.pay.ctaPay nowapprovedneeds_review
checkout.items.count{count} itemsapprovedapproved
checkout.shipping.freeFree shipping over {amount}revieweduntranslated
checkout.promo.invalidThis code isn't validapproveddraft
checkout.address.titleShipping addressapprovedapproved
de 135 approved of 148sr 124 of 148
Ownlate: память, ИИ, люди, проверка
Pull request#212
chore(i18n): update translations via Ownlate
Open1 commit into main from ownlate/translations

Automated translation update generated by Ownlate.

locales/de.json+135 −6
locales/sr.json+124 −6
docs/i18n/de/faq.md+36 −0
Merge pull request
Ваш репозиторий: GitHub или GitLab

Где происходит перевод

Одна строка на ключ, один столбец на язык. Всё, что нужно переводчику для решения, находится рядом со строкой: совпадения из памяти переводов, термины глоссария, замечания QA, ветка комментариев и история строки. Двое на одной строке видят друг друга.

Табличный вид для одного или сразу нескольких языков, редактор Markdown-документов для файлов .md и .mdx, формы множественного числа для каждого языка и горячие клавиши на весь цикл проверки. QA-проверки идут по ходу работы; каждое утверждение попадает в память переводов.

Checkout en
de91%sr84%hu100%
ПредпереводЭкспортMJAKRD
Все 148Не переведено 4Требует проверки 6Утверждено 135Устарело 1Поиск по ключу или тексту
locales/
en.json 148
docs/i18n/en/
faq.md 36
returns.md 22
shipping.md 18
ИсходникПереводСтатус
checkout.pay.ctaPay nowJetzt bezahlenУтверждено
checkout.items.count{count} items{count} ArtikelУтверждено
checkout.shipping.freeFree shipping over {amount}Kostenloser Versand ab {amount}Проверено
checkout.promo.invalidThis code isn't validDieser Code ist ungültigТребует проверки1
checkout.promo.applyApply codeCode einlösenЧерновикAK
checkout.address.titleShipping addressLieferadresseУтверждено
checkout.address.phoneHintWe only call about delivery—Не переведено
checkout.total.labelTotal incl. VATGesamtsummeУстарело
checkout.delivery.etaArrives {date}Kommt am {date}Утверждено
checkout.pay.savedUse the card ending in {last4}Karte mit Endung {last4} verwendenТребует проверки
checkout.stock.lowOnly {count} leftNur noch {count} verfügbarПроверено
checkout.gift.noteAdd a gift noteGeschenknachricht hinzufügenУтверждено
1–12 из 148стр. 1 / 13

Что умеет

Части платформы для переводов, сгруппированные по тому, кто с ними работает.

Строки и файлы

Единица работы — сегмент: ключ, его исходный текст и по одному переводу на язык, у каждого свой статус.

Форматы
JSON, YAML, PO (gettext), Markdown и MDX. Вложенные ключи склеиваются через точку в плоский список, папки остаются такими же, как в репозитории.
Статусы
Каждый перевод проходит через фиксированный набор состояний, поэтому фильтр «требует проверки» означает одно и то же в любом проекте.
  1. untranslated
  2. draft
  3. in_progress
  4. needs_review
  5. reviewed
  6. approved
  7. outdated
Множественное число
Формы zero, one, two, few, many и other редактируются отдельно для каждого языка и попадают в бандлы релизов без потерь.
Контекст
URL скриншота и URL страницы у каждого сегмента, комментарии к строке и полная история правок каждого перевода.

Перевод

Сначала память, потом машина, потом человек. Редактор по умолчанию подставляет самый дешёвый из подходящих вариантов.

Память переводов
Утверждённые переводы сохраняются автоматически. Точные и нечёткие совпадения предлагаются в редакторе, а весь проект можно предварительно перевести из памяти в фоне.
ИИ и машинный перевод
OpenAI, Anthropic Claude, DeepL, Google Translate, Azure Translator и Mistral с вашими ключами или встроенный ИИ без ключа. Предварительно переведите выбранным провайдером и отправьте результат на проверку.
Глоссарий
Термины рабочего пространства с переводами, частью речи и признаком «запрещён». Совпадения подсвечиваются в редакторе, а запрещённые термины не проходят QA.
Редактор
Таблицы для одного и нескольких языков, редактор Markdown-документов, горячие клавиши для сохранения, отправки, утверждения и отклонения, и присутствие коллег на строке в реальном времени.

Качество и люди

Проверки идут прямо в редакторе по ходу работы; роли определяют, кто может утверждать; журнал помнит, кто что сделал.

QA-проверки
Пропущенные или лишние плейсхолдеры ({name}, %d, ${var}, {{var}}), пропущенные или лишние HTML-теги, пробелы в конце, совпадение с исходником, запрещённые термины и ваши собственные regex-правила с уровнем серьёзности.
Задачи и роли
Задачи на перевод и проверку, назначенные людям. Роли рабочего пространства — владелец, администратор, переводчик и наблюдатель — с правами для каждой роли.
Аудит и метрики
Журнал аудита рабочего пространства, метрики по каждому переводчику, тепловая карта активности и прогресс по языкам для каждого файла.

Как устроен процесс

Четыре этапа, у каждого — конкретный результат. Ничто не попадает в репозиторий или в работающее приложение, не пройдя проверку.

  1. подключение
    Подключите файлы, которые уже уходят пользователям. Один ownlate.yml задаёт соответствие исходников и переводов; его читают и CLI, и Git-интеграция, поэтому репозиторий, настроенный для одного, работает и с другим.
    # ownlate.yml
    project_id: 7c1e4b2a-9f0d-4c1e-8b2a-3f6d0c9e1a47
    api_token_env: OWNLATE_API_TOKEN
    
    files:
      - source: locales/en.json
        translation: locales/{lang}.json
  2. перевод
    Память заполняет то, что уже встречала, провайдер — остальное, а люди берут то, что осталось. Предварительный перевод идёт в фоне: точное совпадение из памяти утверждается, нечёткое становится черновиком, машинный перевод уходит на проверку.
    $ ownlate translate --provider tm --score 80
    project:  7c1e4b2a-9f0d-4c1e-8b2a-3f6d0c9e1a47
    provider: tm (score ≥80%)
    
      pre-translating de ... queued
      pre-translating sr ... queued
    
    Translation runs in background.
    Use "ownlate status" to check progress.
  3. проверка
    QA-проверки идут по мере ввода. Тот, у кого есть право утверждать, отмечает перевод проверенным или утверждает его; отклонённая строка возвращается в работу с сохранённым текстом — её дорабатывают, а не набирают заново.
    checkout.items.count  sr
      missing_interpolation  {count}
    checkout.promo.apply  de
      forbidden_term  "Gutschein", use "Code"
    
    148 checked  146 clean  2 flagged
  4. выпуск
    Релиз — это снимок утверждённых переводов. Он возвращается в репозиторий как pull request, попадает в приложения по воздуху как версионированный бандл или сохраняется на диск в исходном формате файлов.
    release 14  de, sr, hu  135 approved
    
    pull request  #212 opened against main
    ota manifest  14  published
    $ ownlate pull --lang de

Рассчитан на автоматизацию

Всё, что умеет приложение, доступно из шелла, пайплайна, вашего кода или ИИ-агента.

ownlate, CLIRust, один бинарник
ownlate loginсохранить API-ключownlate initвыбрать проект для этой папкиownlate push --watchзагрузить исходники и повторять при каждом сохраненииownlate pull --lang deскачать один языкownlate status --min 90код выхода 1, если язык ниже 90%ownlate translate --provider tmзаполнить из памяти переводов
$ ownlate status --min 90

  Project  Checkout  7c1e4b2a-9f0d-4c1e-8b2a-3f6d0c9e1a47

  Lang                              %   Total  Untrans   Draft  Transl  Approved
  ──────────────────────────────────────────────────────────────────────
  de      ██████████████████░░    91%     148        4       3       6       135
  sr      █████████████████░░░    84%     148        9       6       9       124
  hu      ████████████████████   100%     148        0       0       0       148
  ──────────────────────────────────────────────────────────────────────
  3 langs                         92%     444       13       9      15       407

✗ Below 90%: sr

Glob-шаблоны в источниках вроде docs/i18n/en/**/*. В CI укажите в ownlate.yml через api_token_env переменную OWNLATE_API_TOKEN и обойдитесь без ownlate login.

MCP-серверmcp.ownlate.com
$ claude mcp add --transport http ownlate \
    https://mcp.ownlate.com/

› Add checkout.refund.cta "Request a refund",
  translate it into de and sr, approve both
  and publish a release.

  create_segment       checkout.refund.cta
  translate_segment    de  Rückerstattung anfordern
  translate_segment    sr  Zatraži povraćaj
  approve_translation  de, sr
  create_release       15  published

Claude Code, Cursor и любой MCP-клиент получают инструменты для ключей, переводов, утверждений, поиска по памяти переводов, QA-проверок и релизов. Вход — персональный; доступ отзывается как API-ключ.

main.goGo-клиент, по воздуху
client, err := ownlate.New(ownlate.Config{
    Source: ownlate.OTASource{
        Bundles: []ownlate.OTABundle{
            {AccessKey: accessKey},
        },
    },
    Locale: "ru",
})
if err != nil {
    return err
}
defer client.Close()

client.Start(ctx)
<-client.Ready()

client.T("notification.title", "en_US")

Релиз публикует манифест и по одному бандлу на язык за ключом доступа. Клиенты для Go, Rust и NestJS загружают бандл при старте и обновляют его в фоне, так что новый релиз доходит до приложения без деплоя; на неизменившийся ETag эндпоинты отвечают 304, если ваш собственный клиент об этом спросит. Браузерный SDK и расширение для Chrome — другая история: они дают переводчику править строки прямо в работающем продукте.

Публичный APIapi.ownlate.com
$ API=https://api.ownlate.com/public/v1
$ curl $API/ota/$ACCESS_KEY/manifest
{
  "version": 14,
  "languages": ["de", "sr", "hu"],
  "publishedAt": "2026-09-18T09:12:44Z"
}

$ Q="projectId=$PROJECT&targetLanguages=de,sr,hu"
$ curl "$API/segments/progress?$Q"
$ curl $API/plans

Публичные маршруты для прогресса, карт переводов, тарифов и OTA-бандлов не требуют учётных данных. Всё остальное принимает API-ключ с областями действия и необязательным сроком действия; документ OpenAPI отдаётся по адресу /swagger-json.

.github/workflows/i18n.ymlGitHub Action, тот же образ, что у CLI
- name: Push source strings
  run: >
    docker run --rm -v "$PWD:/app" -w /app
    -e OWNLATE_API_TOKEN globalartltd/ownlate-cli push
  env:
    OWNLATE_API_TOKEN: ${{ secrets.OWNLATE_API_TOKEN }}

- name: Fail if a language is behind
  run: >
    docker run --rm -v "$PWD:/app" -w /app
    -e OWNLATE_API_TOKEN globalartltd/ownlate-cli status --min 90
  env:
    OWNLATE_API_TOKEN: ${{ secrets.OWNLATE_API_TOKEN }}

Push при каждом слиянии в основную ветку, pull по расписанию или перед релизом. Источник истины остаётся в Ownlate, а сборка — воспроизводимой из репозитория. То же рабочее пространство доступно и как десктопное приложение; расширение для браузера — для переводчиков, которые правят строки прямо в продукте.

Подключается к тому, что у вас уже работает

Пятнадцать провайдеров в трёх группах. Каждый можно поставить на паузу и прочитать его журнал синхронизации; Git-интеграции можно проверить до сохранения учётных данных.

Репозитории
Синхронизируйте файлы переводов из ветки и открывайте pull request с утверждённым набором.
  • GitHub
  • GitLab
ИИ и машинный перевод
Подключите свой ключ или используйте встроенный ИИ без него.
  • OpenAI
  • Anthropic Claude
  • DeepL
  • Google Translate
  • Azure Translator
  • Mistral
Уведомления
Выберите события; у каждого канала свой формат сообщений, у вебхуков — секрет для подписи.
  • Slack
  • Microsoft Teams
  • Discord
  • Mattermost
  • Matrix
  • Telegram
  • Произвольные вебхуки

Цены

Слова считаются по мере перевода, по всему рабочему пространству. В каждом тарифе есть все форматы файлов, память переводов и редактор.

Free
0 ₽

Один проект, весь рабочий процесс, без карты.

Создать рабочее пространство
Pro
600 ₽в месяц

Продуктовая команда с несколькими проектами и ИИ-переводом.

Начать с Pro
Enterprise

Без ограничений, приоритетная поддержка и индивидуальный SLA.

Начать с Enterprise
Open source
0 ₽

Всё без ограничений для одобренных open-source-проектов.

Подать заявку
ПроектыFree1Pro10EnterpriseOpen sourceБез ограничений
УчастникиFree1Pro10EnterpriseOpen sourceБез ограничений
Переведённые словаFree10 000Pro100 000EnterpriseOpen sourceБез ограничений
Форматы файловFreeВсеProВсеEnterpriseВсеOpen sourceВсе
Память переводовFreeВключеноProВключеноEnterpriseВключеноOpen sourceВключено
ИИ-автопереводFree—ProВключеноEnterpriseВключеноOpen sourceВключено
Приоритетная поддержка, индивидуальный SLAFree—Pro—EnterpriseВключеноOpen source—
Цены в RUB. Рабочее пространство оплачивается в USD, EUR, RUB или HUF — валюта выбирается при его создании.

Начните с одного файла.

Создайте рабочее пространство, отправьте исходный файл и переведите его из памяти или вручную; ИИ и второй участник появятся на платном тарифе.

~/your-appzsh
$ cargo install --git \
    https://github.com/OwnLate/ownlate \
    ownlate-cli
$ ownlate login
$ ownlate init
$ ownlate push
project: …

  pushing locales/en.json ... 148 segments