Интернационализация (i18n)
Для того, чтобы начать переводить нужно:
- добавить новые компоненты в таблицу meta.component, если текущих вам недостаточно. Не забудьте указать языки для перевода в поле
i18n_langs
- разметить страницы копонентами в настройках старниц
- в app-content запустить i18n-app.py и собрать данные на перевод.
- если есть новые компоненты entity надо поместить в папку entity в компоненте
i18n-app.py отпарсит контент мета-страниц на наличие размерки перевода, а так же обойдет entity в app-content и соберет данные на перевод. Если в разметке entity если i18n_object, то скрипт скачает данные из таблицы этой entity и добавит данные на перевод в поле me_i18n. Так же скрипт пытается автоматически через google api перевести контент на перевод.
Определение текущего языка
В случае с авторизованным пользователем язык берется из его профиля. Для анонимного пользователя (например, на форме авторизации) берется язык браузера, передаваемый в заголовке Accept-Language
.
Технически это реализовано через Aspects
. Все запросы к API (что определено правилами в /resources/context/mvc-dispatcher-servlet.xml
) перехватываются классом RequestEnvAspect
, который наполняет объект Env
необходимыми значениями окружения, в том числе языком, получая его из объекта пользователя или из httpServletRequest.getLocale().getLanguage()
Функции backend шаблонизации
Для шаблонизации используется freemarker.org.
- ${i18n(String placeholder)} - Простой перевод
- ${i18n(String placeholder, String defaultText)} - Простой перевод с текстом по умолчанию
- ${i18n(String placeholder, List args, String? defaultText)} - Перевод с заменой плейсхолдеров в тексте. Плейсхолдеры выглядят как {0}, {1} и соответствуют индексу значения из списка args
- ${i18n_ename(String entityId)} - Получение имени Сущности
- ${i18n_efield(String entityId, String fieldName)} - Получение имени поля Сущности
- ${i18n_sql_ofield(String key)} - Получение перевода поля
- ${i18n_sql_ofield(String tableAlias, String key)} - Получение перевода поля в случае, если у вас больше одной таблицы в запросе и вам нужно указать альяс таблицы
Разметка entity
id: '2701'
name: Тикет
i18n: true <---------- Указываем, что имя entity будет подвергаться переводу
db_alias: meta
schema: meta
table: issue
search_order: 100
object_list_base_page_id: '4176'
fields:
- alias: application_id
db_type: text
name: application_id
- alias: assignee_user_id
db_type: int8
name: assignee_user_id
display_name: Исполнитель
i18n: true
- alias: creation_time
db_type: timestamp
display_name: Создано <---------- Указываем на базовом языке компонента
i18n: true <---------- Указываем, для сбора на перевод указанного display_name
is_disabled: true
name: creation_time
id: '45'
name: Продукт
i18n: true <---------- Указываем, что имя entity будет подвергаться переводу
i18n_object: <---------- Указываем для сбора записей из БД на перевод
sql_where_clause: allowed_roles && ARRAY['meta.role.auth', 'adhands.role.can_view_all_clients_yes'] <---------- Условие WHERE по которому будут отсекаться строки для перевода
fields:
- name: name <---------- Указываем для сбора записей из БД на перевод
- name: description <---------- Указываем для сбора записей из БД на перевод
db_alias: billing
schema: public
table: product
search_order: 100
fields:
- db_type: integer
is_primary: true
is_disabled: true
name: id
- db_type: text
name: key
- db_type: text
is_required: true
is_title: true
name: name
- db_type: description
name: description
Перевод имени сущности
Используется для lego или в label скриптов. Например перевод имени таблицы issue
{
"label": "${i18n_ename('2773')}",
"name": "me-select"
}
Перевод поля сущности
Используется для lego или в label скриптов. Это например перевод имени поля таблицы issue
{
"label": "${i18n_efield("2701", "assignee_user_id")}",
"name": "me-select"
}
Перевод поля объекта сущности
Используется для перевода записей в таблицах, например, если вам нужно перевести список типов тикетов. Данные будут браться из поля me_i18n этой таблицы
<script type="meta/sql" id="issue_status_ids" elem="me-select" label="" db-alias="meta">
SELECT id, ${i18n_sql_ofield('name')} as name FROM meta.issue_status WHERE is_allowed ORDER BY 2
</script>
Перевод страниц компонента на уровне компонента
Парсер соберет данные на уровне компонента. Это нужно использовать когда этот текст не является названием Сущности или Поля сущности
${i18n("#.youCanceledChangeTariff", "Вы отменили переход на тариф")}
Функции frontend шаблонизации
На уровне LEGO элемента, используются параметр i18n.
[
{
"id": "login",
"i18n": {
"label": "#.ex_system.login"
},
"name": "me-input",
"attrs": {
"type": "text",
"required": true
},
"label": "Логин"
},
{
"id": "password",
"i18n": {
"label": "ex_system.password"
},
"name": "me-input",
"attrs": {
"type": "password",
"required": true,
"autocomplete": "new-password"
},
"label": "Пароль"
}
]