Задача [0300]: Мультиязычность системы

Формулировка проблемы. В связи с расширением рынков сбыта платформы необходимо реализовать возможность перевода системы на другие языки. Также необходима возможность добавления языковой панели во всех настраиваемых сущностях системы. Например: при создании типа документа вводить название не только на фиксированном количестве языков (казахский, русский, английский), но и на настроенных других.

Связанные задачи: 0164.

Решение.

Общим решением является централизованное переименование элементов системы и создание редактора ресурсов - сообщений системы на всех языках с возможностью вносить свои изменения в сообщения. Редактор ресурсов хранит эти изменения в виде дельты и позволяет отслеживать их на предмет соответствия исходным ключам и имеющимся переводам.

В итоге, задача разбивается на несколько подзадач:

Локаль по умолчанию

Во-первых, каждому переводу в системе необходимо добавить атрибут измененности, который показывает, был ли изменен перевод методологом (true) либо значение перевода совпадает со значением в локали по умолчанию (false).

Во-вторых, необходимо завести локаль по умолчанию (т.н. locale C) - неудаляемая локаль, которая обладает следующими свойствами.

  1. Всегда имеет значение перевода всех полей редактора ресурсов, т.е. не может иметь пустого значения.

  2. Значения всех переводов новой создаваемой локали заполняются значениями соответствующих переводов локали по умолчанию и помечаются атрибутом измененности = false.

  3. В редакторе ресурсов, а также в переводах сущностей отображение значения перевода зависит от его атрибута измененности:

    • атрибут измененности = false: значение перевода является плейсхолдером (серая подпись внутри поля ввода);

    • атрибут измененности = true: значение перевода является значением поля ввода (черным текстом, не плейсхолдером).

  4. При обновлении системы:

    • значениями переводов локали по умолчанию станут все текущие значения переводов русской локали;

    • в списке локалей отображаются 3 локали: RU (русский), KК (казахский), EN (английский);

      Примечание

      Для казахского языка также зарезервирован код KZ (необходимо для обратной совместимости, например, с методами API), поэтому язык с таким кодом создавать нельзя.

    • в случае, если в произвольной локали отсутствует какой-либо перевод, он заполнится соответствующим значением из локали по умолчанию.

Настройка локалей

Во-первых, необходимо изменить порядок следования разделов в Конфигураторе:

  • Документооборот

  • Настройки системы

  • Хранилище

  • Отдел кадров

  • Системные показатели

  • Проекты

  • Процессы

  • Отчеты

Во-вторых, в настройки системы необходимо добавить новую группу настроек «Региональные настройки»:

  • Языки

  • Переводы

Новый подраздел «Языки» должен содержать:

  • таблицу со списком всех текущих настроенных локалей в системе (локаль по умолчанию отсутствует):

    • (не имеет пустого значения) - порядок локалей, используется в редакторе ресурсов, в диалоговых окнах переводов и на странице авторизации;

    • Код (обяз.) - уникальный идентификатор локали;

    • Язык (обяз.) - название языка;

    • Показывать (флажок) - отображать ли данный язык в системе переводов;

    • безымянный столбец для удаления строки (иконка крестика);

  • кнопки таблицы "Переместить выше", "Переместить ниже" и "Добавить язык";

  • контекстное меню строк таблицы с пунктами "Переместить выше", "Переместить ниже" и "Удалить";

  • кнопку "Сохранить".

Если в таблице строк больше, чем высота экрана, тогда в таблице должен появиться вертикальный скролл. Ширина столбцов (кроме столбца с крестиком) изменяемая, но не сохраняемая. Действие «drag-and-drop» отсутствует. Сортировка отсутствует, при этом таблица всегда отсортирована в порядке возрастания номера.

Ячейки таблицы "Код" и "Язык" могут находиться в двух состояних: в режиме просмотра (по умолчанию) и в режиме редактирования. В режиме редактирования одновременно не может находиться более одной ячейки. Если ячейка находится в режиме редактирования, то это означает, что она в данный момент является и выделенной. При наведении мышкой на любую ячейку таблицы в режиме просмотра должен отображаться тултип, отображающий полное значение ячейки.

  • Режим просмотра -> режим редактирования

    Для выделенной ячейки нажатие клавиши «Enter» должно переводить ячейку в режим редактирования, выделяется ее содержимое.

  • Режим редактирования -> режим просмотра

    Для редактируемой ячейки нажатие клавиши «Esc» либо потеря фокуса на ячейке должны переводить ячейку в режим просмотра без сохранения внесенных изменений. Нажатие клавиши «Enter» должно приводить к сохранению внесенных изменений с учетом правил валидации, описанных ниже.

Рисунок 133. Новый раздел Конфигуратора "Региональные настройки"

Новый раздел Конфигуратора "Региональные настройки"

Рисунок 134. Региональные настройки / Языки системы

Региональные настройки / Языки системы

Рисунок 135. Региональные настройки / Языки системы (со скроллом)

Региональные настройки / Языки системы (со скроллом)

Для добавления нового языка нажимается кнопка "Добавить язык": в конец таблицы добавляется новая строка (еще без номера), в которой ячейка с кодом автоматически находится в режиме редактирования.

Примечание: пока не произошло локальное сохранение нового языка, кнопка «Добавить язык» недоступна.

Добавление нового языка можно отменить, нажав на клавишу «Esc». Тогда новая строка должна удалиться.

Валидация для ячейки кода при локальном сохранении (на нажатие клавиши «Enter»): поле не может содержать пустое значение либо одни пробелы. Иначе:

  • Для нового языка пустая строка таблицы автоматически удаляется. В результате же успешного сохранения новой локали задается номер и код, название пустое, флажок "Показать" выключен.

  • Для существующей локали ячейка переходит в режим просмотра, в котором отображается предыдущее сохраненное значение.

В поле "Код" допускается ввод максимум 15 символов, на любом языке. Недоступно сохранение кода, содержащего символы:

; / ? : @ = & " < > # % { } |  ^ ~ [ ] `

иначе необходимо выдать ошибку (ячейка остается в режиме редактирования):

Код содержит недопустимые символы

Кроме того, код должен быть уникальным среди списка языков, иначе необходимо выдать ошибку (ячейка остается в режиме редактирования):

Язык с таким кодом уже существует

Код не должен быть равен KZ, иначе необходимо выдать ошибку (ячейка остается в режиме редактирования):

Язык с кодом KZ зарезервирован системой

Отображение локалей определяется значением флажка "Показать": для включенного - язык отображается, иначе - нет.

На странице авторизации выделенным по умолчанию языком является первый отображаемый (в дефолтной схеме это RU).

Удаление выделенной локали осуществляется нажатием иконки крестика / пункта контекстного меню "Удалить" либо клавиши «Delete» (только если выделенная ячейка находится в режиме просмотра). Удаление локальное. Система при этом выдает браузерное диалоговое окно с сообщением:

Вы действительно хотите удалить данный язык?

Примечание.

Редактирование и удаление первых трех языков (русский, казахский, английский) всегда недоступно. Возможна только настройка их отображения (доступен флажок "Показывать").

Кроме того, удаление локали удаляет ее и из БД, поэтому при добавлении нового языка с аналогичными названием и кодом значения переводов не сохранятся, а по общему правилу заполнятся значениями из локали по умолчанию.

Порядок локалей можно изменять, только перемещая соответствующие строки таблицы выше / ниже с помощью кнопок либо пунктов контекстного меню "Переместить выше" и "Переместить ниже". Для первой строки таблицы действие "Переместить выше" недоступно. Аналогично, для последней строки таблицы действие "Переместить ниже" недоступно.

Первый отображаемый язык ("Показывать" = да) является языком, который будет использоваться в системе по умолчанию. Например, на странице авторизации и в методах API.

Валидация таблицы на кнопку «Сохранить»:

  • таблица содержит хотя бы одну запись, иначе необходимо не выполнять действие и выдавать ошибку:

    Добавьте хотя бы один язык системы

  • флажок "Показывать" включен хотя бы у одного языка, иначе необходимо не выполнять действие и выдавать ошибку:

    Укажите хотя бы один язык для отображения

  • во всех строках таблицы заполнены поля кода и названия, иначе необходимо не выполнять действие, подсвечивать соответствующие поля красным цветом и выдавать ошибку:

    Заполните все поля

Значения таблицы по умолчанию при обновлении системы:

Код Язык Показывать

1

RU

Русский

да

2

Казахский

да

3

EN

Английский

да

Переводы объектов системы

Мультиязычные сущности, реализованные на момент написания данной постановки:

  • Конфигуратор:

    • дела

    • шаблоны номеров

    • журналы

    • типы документов

    • шаблоны документов

    • фильтры потоков работ

    • диалоги создания

    • приоритеты

    • процессы

    • категории нагрузок

    • пункты и группы создания документов

    • категории рисков

    • группы

    • роли

    • свойства

    • классификаторы

    • шаблоны системных показателей

    • пункты создания

    • внешние модули

    • сотрудники

    • справочники

    • встроенные отчеты

    • пользовательские отчеты

  • Подсистема администрирования:

    • должности

    • тип должности

    • подразделения

    • удаленные компании

Во всех вышеперечисленных объектах 3 поля ввода необходимо заменить в одно с кнопкой справа.

Поле ввода должно содержать значение перевода на локали авторизации (с учетом свойства №3). По нажатию на кнопку справа открывается диалоговое окно «Переводы», которое содержит в себе таблицу:

  • Локаль первым в списке всегда содержит "По умолчанию", а далее коды показываемых локалей в порядке возрастания их номера;

  • Перевод содержит значение перевода в соответствующей локали (с учетом свойства №3).

Примечание.

Для диалоговых окон и страниц, содержащих только поля ввода названия (категории рисков и классификаторы), по нажатию на кнопку добавления / редактирования, должно сразу открываться диалоговое окно «Переводы».

Если в таблице строк больше, чем высота окна, тогда в таблице должен появиться вертикальный скролл. Ширина столбцов изменяемая, но не сохраняемая. Сортировка, «drag-and-drop» отсутствуют.

В случае, если наименование той или иной сущности ввели только в поле ввода (т.е. только на локали авторизации), а остальные переводы не заданы, то:

  • во-первых, это значение становится значением перевода локали по умолчанию;

  • во-вторых, этим значением по умолчанию заполняются и остальные переводы локалей и помечаются при этом атрибутом измененности = false.

Т.к. система более не является строго трехязычной, и ввиду наличия ошибок в объектах "группы" и "свойства" соответственно:

  • Введите название группы на трех языках

  • Введите название метаданных на трех языках

необходимо убрать в них концовку "на трех языках". Таким образом, ошибки должны принять вид:

  • Введите название группы

  • Введите название метаданных

Рисунок 136. Мультиязычное поле ввода

Мультиязычное поле ввода

Рисунок 137. Мультиязычное поле ввода в старой таблице

Мультиязычное поле ввода в старой таблице

Рисунок 138. Мультиязычное поле ввода в новой таблице

Мультиязычное поле ввода в новой таблице

Рисунок 139. Переводы

Переводы

Рисунок 140. Переводы (со скроллом)

Переводы (со скроллом)

Дальнейшие доработки в разделе "Языки"

В ближайших доработках раздела "Языки" необходимо реализовать следующее.

Во-первых, в контекстное меню таблицы добавить пункт "Сбросить", по нажатию которого таблица со списком языков должна принять вид по умолчанию.

Во-вторых, в таблицу добавить новый столбец "Код для авторизации", значения которого не обязательны для заполнения. В данное поле допускается ввод максимум 3 символов, на любом языке. Если данный столбец не заполнен, на странице авторизации отображаются максимум первые 3 символа обычного кода языка.

Кроме того, необходимо реализовать оставшиеся мультиязычные сущности системы:

  • формы