META
Руководства
Интернационализация (i18n)

Интернационализация (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": "Пароль"
  }
]