# Rav Translate — рантайм-перевод приложений Clarion ABC на лету

**Проблема, которую решает шаблон**

Если приложению на Clarion (ABC-темплейты) нужна поддержка нескольких языков интерфейса — стандартных средств для этого по сути нет. Либо вручную городить свою систему переводов и обвешивать ей каждое окно, либо сидеть на ExtractText из ABUTIL, который не даёт ни редактора, ни переключения языка на лету, ни точечных переопределений перевода.

`Rav Translate` — самостоятельный ABC-шаблон, который добавляет полноценный рантайм-перевод в приложение практически без участия разработчика: не нужно вручную оборачивать каждый control или переписывать существующие окна.

**Что делает**

- Автоматически переводит все окна приложения — подписи, кнопки, заголовки колонок списков/browse, включая главное MDI Frame-окно (меню) — без единой строчки кода в самих окнах.
- Переключает язык интерфейса "на лету", без перезапуска — уже открытые окна перерисовываются сразу.
- Даёт встроенный редактор переводов: поиск по тексту, фильтр "только это окно", выбор языка (можно добавлять/удалять языки прямо из редактора), кнопка "Переводы..." доступна на любом окне.
- Поддерживает точечные переопределения — для конкретного окна и конкретного контрола можно задать свой перевод, который перекрывает общий (пример: "Наименование" переводится как "Name" везде, но в одной конкретной колонке — как "Nm.").
- Переводит произвольные строки и `MESSAGE()` через явный вызов (`Translator.TranslateString`) — и заголовок, и тело сообщения.
- Экспорт/импорт списка непереведённых строк в TSV (2 колонки: `RecID` + текст, сопоставление строго по `RecID`) — можно отдать переводчику или прогнать через машинный перевод и вернуть обратно.
- В комплекте — три готовых Python-скрипта пакетного автоперевода (Google Cloud Translate, DeepL, Yandex Translate) с одним общим CLI-интерфейсом: экспортировал из приложения → прогнал скриптом → импортировал обратно.
- Горячая клавиша открытия редактора переводов, настраивается один раз глобально на всё приложение.

**Как это устроено внутри**

- Шаблон переопределяет стандартный `TranslatorClass` из ABUTIL (`%TranslatorDataSection`/`%TranslatorCodeSection`) — то есть работает через штатный ABC-механизм перевода, а не в обход него.
- Вся логика (харвест текстов окна, поиск перевода, редактор, экспорт/импорт) — в одном самостоятельном MEMBER-модуле (`Rav_Translate.CLW`), не зависящем от остального кода приложения. Подключается одной глобальной APPLICATION-level Global Extension.
- Хранилище — два файла TOPSPEED: сами переводы (язык + окно + контрол + оригинал + перевод, с точечными переопределениями) и справочник языков. Выбранный язык сохраняется между запусками через INI.
- Харвест текстов окна идёт через `PROP:NextField` (штатный обход полей окна) — работает одинаково и для обычных окон, и для Frame/APPLICATION-окна с меню.

**Язык по умолчанию**

При первом запуске приложения (пока не создан `RAVLANG.INI`) язык интерфейса определяется настройкой шаблона, а не жёстко зашит в коде. Указывается в свойствах глобального расширения `Rav Translate` (Application Tree → Global Extensions → Rav Translate → global part):

- Поле **"Язык по умолчанию при первом запуске (пока нет RAVLANG.INI)"** — впишите код языка (`EN`, `RU` или любой другой), который должен использоваться при самом первом запуске приложения у конечного пользователя.
- По умолчанию (если поле не менять) стоит `EN`.
- После первого запуска выбранный язык записывается в `RAVLANG.INI`, и дальше приложение всегда стартует именно с ним — эта настройка шаблона больше не используется, пока `RAVLANG.INI` не удалят вручную.

**Статус**

Разработан и обкатан на Clarion 10 (проверено с ABC/EXE+DLL-структурой). Полный цикл — от экспорта, через машинный перевод скриптом, до импорта обратно в приложение — подтверждён вживую.

**Автор**: Рыбников А., 2026 г.
