Принцип работы
Ядро умеет автоматически подставлять переводы, а при их отсутствии переводить на лету (с задержкой) и сохранять в базу для последующих запросов.
После сохранения в базу, эти автоматически сделанные переводы можно скорректировать, если они были “криво” переведены, или если вы хотите сохранить оригинальное значение (для всех переводов пподставить оригинал). Чтобы исправить перевод, необходимо в админке зайти в соответсвующий раздел в меню “Translate” и исправить нужный перевод.
Переводы разбиты по категориям, что именно переводиться.
Источники перевода:
- Профайлы - содержит переводы наименований сущностей/классов (таблиц и форм), а также их колонок.
- Данных - содержит переводы запрашиваемых данных, то есть может переводиться содержимое таблиц/форм и других данных взятых из базы.
- Прочее - содержит переводы всех других частей системы, которые могут быть показаны пользователю. Для них есть справочник источников.
- API UserOk, API UserError, API MyError - ответы всех методов классов, всегда возвращают один из трех объектов ответа (ответ успеха или одного из видов ошибки). Эти ответы автоматически переводятся. Это означает, что при написании кода, вам не нужно, в большинстве случаем, оборачивать текст функцией перевода, это уже встроено.
- Любой (бэк) - Прочие текста, формируемые на бэке, могут (и должны) быть обернуты соответвующей функцией перевода. Тогда этот текст будет переведен и размещен в базе с указанным типом.
- Любой (фронт) - Текста интерфейсов на фронте, формируемых javascript (это могут быть различные элементы интерфейса) могут, и должны, быть обернуты соответсвующей функцией перевода. См. отдельный раздел.
- ClassicTable - Это тоже что и Любой (фронт) только с пометкой “FRONT_CLASSIC_TABLE”, что означает что этот перевод из компонента таблиц (базовые интерфейсы таблиц).
- Неизвестный - Как понятно из названия, это те переводы, для которых не было особой пометки о том, откуда он пришел.
Источники будут дополнены в будущем, но принцип тот же.
Как пользоваться функциями перевода (руководство для разработчика), см. в отдельных разделах.
Особенности работы механизма
Если перевод уже сохранен в базе, то он формируется еще на уровне запроса в базу, что делает его “нативным”, то есть как будто в самих таблицах с данными уже хранятся переведенные на нужный язык значения. Из этого также следует, что по таким полям будет корректно работать поиск и фильтры.
Если первод в базе не обнаружен, то об этом вернуться соответствующие метаданные, по которым ядро поймет, что нужно перевести. Применяется функция перевода (ограниченными порциями, если данных для перевода слишком много). При этом запрос ждет некоторое, фиксированное время, пока перевод будет сделан. Поэтому для новых данных, первый запрос может работать дольше обычного.
Если перевод не будет завершен в отведенное для этого время, то запрос вернет непереведенные данные (лучше вернуть данные без перевода в гарантированнное время, чем подвиснуть на неопределенный срок), но перевод продолжается и в случае успеха, следующий запрос уже будет с переведенными данными взятыми из базы.
Отдельная фоновая задача следит, за тем, чтобы переводы, которые по каким либо причинам не были успешно завершены (например сервис переводов недоступен или истрачен лимит) и периодически пытается закончить перевод.
Перевод осуществляется с помощью сервисов настроенных в конфиге.