Локализация на автопилоте
Ownlate — платформа управления переводами с ИИ. Память переводов и ИИ делают первый проход, команда проверяет, а утверждённые строки попадают в код или прямо в приложение без деплоя.
Бесплатный тариф: один проект, 10 000 слов, все форматы файлов. Без карты.
$ 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%+ $
checkout.pay.ctaPay nowapprovedneeds_reviewcheckout.items.count{count} itemsapprovedapprovedcheckout.shipping.freeFree shipping over {amount}revieweduntranslatedcheckout.promo.invalidThis code isn't validapproveddraftcheckout.address.titleShipping addressapprovedapprovedAutomated translation update generated by Ownlate.
locales/de.json+135 −6locales/sr.json+124 −6docs/i18n/de/faq.md+36 −0Где происходит перевод
Одна строка на ключ, один столбец на язык. Всё, что нужно переводчику для решения, находится рядом со строкой: совпадения из памяти переводов, термины глоссария, замечания QA, ветка комментариев и история строки. Двое на одной строке видят друг друга.
Табличный вид для одного или сразу нескольких языков, редактор Markdown-документов для файлов .md и .mdx, формы множественного числа для каждого языка и горячие клавиши на весь цикл проверки. QA-проверки идут по ходу работы; каждое утверждение попадает в память переводов.
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Требует проверки1checkout.promo.applyApply codeCode einlösenЧерновикAKcheckout.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УтвержденоЧто умеет
Части платформы для переводов, сгруппированные по тому, кто с ними работает.
Строки и файлы
Единица работы — сегмент: ключ, его исходный текст и по одному переводу на язык, у каждого свой статус.
- Форматы
- JSON, YAML, PO (gettext), Markdown и MDX. Вложенные ключи склеиваются через точку в плоский список, папки остаются такими же, как в репозитории.
- Статусы
- Каждый перевод проходит через фиксированный набор состояний, поэтому фильтр «требует проверки» означает одно и то же в любом проекте.
- untranslated
- draft
- in_progress
- needs_review
- reviewed
- approved
- 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-правила с уровнем серьёзности. - Задачи и роли
- Задачи на перевод и проверку, назначенные людям. Роли рабочего пространства — владелец, администратор, переводчик и наблюдатель — с правами для каждой роли.
- Аудит и метрики
- Журнал аудита рабочего пространства, метрики по каждому переводчику, тепловая карта активности и прогресс по языкам для каждого файла.
Как устроен процесс
Четыре этапа, у каждого — конкретный результат. Ничто не попадает в репозиторий или в работающее приложение, не пройдя проверку.
- подключениеПодключите файлы, которые уже уходят пользователям. Один
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
- переводПамять заполняет то, что уже встречала, провайдер — остальное, а люди берут то, что осталось. Предварительный перевод идёт в фоне: точное совпадение из памяти утверждается, нечёткое становится черновиком, машинный перевод уходит на проверку.
$ 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.
- проверкаQA-проверки идут по мере ввода. Тот, у кого есть право утверждать, отмечает перевод проверенным или утверждает его; отклонённая строка возвращается в работу с сохранённым текстом — её дорабатывают, а не набирают заново.
checkout.items.count sr missing_interpolation {count} checkout.promo.apply de forbidden_term "Gutschein", use "Code" 148 checked 146 clean 2 flagged
- выпускРелиз — это снимок утверждённых переводов. Он возвращается в репозиторий как pull request, попадает в приложения по воздуху как версионированный бандл или сохраняется на диск в исходном формате файлов.
release 14 de, sr, hu 135 approved pull request #212 opened against main ota manifest 14 published $ ownlate pull --lang de
Рассчитан на автоматизацию
Всё, что умеет приложение, доступно из шелла, пайплайна, вашего кода или ИИ-агента.
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.
$ 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-ключ.
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 — другая история: они дают переводчику править строки прямо в работающем продукте.
$ 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.
- 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-проектов. Подать заявку | |
|---|---|---|---|---|
| Проекты | Free1 | Pro10 | Enterprise | Open sourceБез ограничений |
| Участники | Free1 | Pro10 | Enterprise | Open sourceБез ограничений |
| Переведённые слова | Free10 000 | Pro100 000 | Enterprise | Open sourceБез ограничений |
| Форматы файлов | FreeВсе | ProВсе | EnterpriseВсе | Open sourceВсе |
| Память переводов | FreeВключено | ProВключено | EnterpriseВключено | Open sourceВключено |
| ИИ-автоперевод | Free— | ProВключено | EnterpriseВключено | Open sourceВключено |
| Приоритетная поддержка, индивидуальный SLA | Free— | Pro— | EnterpriseВключено | Open source— |
| Цены в RUB. Рабочее пространство оплачивается в USD, EUR, RUB или HUF — валюта выбирается при его создании. | ||||
Начните с одного файла.
Создайте рабочее пространство, отправьте исходный файл и переведите его из памяти или вручную; ИИ и второй участник появятся на платном тарифе.
$ cargo install --git \ https://github.com/OwnLate/ownlate \ ownlate-cli $ ownlate login $ ownlate init $ ownlate push project: … pushing locales/en.json ... 148 segments