Мультиязычность сервисов
1. Переводы в интерфейсах решателей
Для создания решателей с многоязыковым интерфейсом разработчик агента (и/или интегратор решателя) может описать переводы текстовых частей интерфейса в инфоресурсе агента (и/или решателя), а затем в коде агента извлекать нужный перевод согласно языку сайта платформы.
Наполнение инфоресурса агента для обеспечения возможности переводов выполняется следующим образом.
- Под вершиной language resources создаются вершины (типа нетерминал) с метками, представляющими собой ключи.
- В качестве их потомков создаются текстовые константы на разных языках (согласно именам метапонятий, соответствующих кодам языков из стандарта ISO 639-3).
При этом важно понимать, что ключ не является "переводом". Для всех языков на которых должен отображаться этот ключ, переводы должны быть заданы отдельными терминалами-значениями. Для извлечения созданной языковой константы на выбранном языке необходимо использовать методы API:
- String $$(String key, Locale locale) - получить строку-перевод ключа key на язык locale (если перевод или ключ отсутствует - будет получен null)
- String $$(String key, UiParamsMessage msg) - получить строку-перевод ключа key на язык, полученный с сайта (через сообщение msg типа UiParamsMessage) (если перевод или ключ отсутствует - будет получен null)
Интегратор решателя задач может "переопределить" переводы, выполненные разработчиками агента (если они его не устраивают и он при этом не имеет права модифицировать инфоресурс агента), своими переводами, а также "расширить" перевод на большее число языков. При работе решателя больший приоритет при отображении интерфейсного текстосодержащего элемента имеет перевод, помещённый в решатель. Порядок работы соответствует порядку создания переводов для агента - в инфоресурсе решателя задаются текстовые ключи (точно такие же как были использованы в инфоресурсе агента!), которым в понятиях-потомках присваиваются текстовые фразы на нужных языках.
Пример.
- Разработчик агента помещает в инфоресурс агента (под вершиной language resources) ключ save (нетерминал с данными именем) для которого задаёт переводы на русский и английский языки: терминалы-значения со значениями "Сохранить" и "Save" (и метапонятиями rus и eng соответственно).
- Чтобы начать использовать эти переводы при отображении кнопки в код блока продукций, генерирующего интерфейс согласно языку сайта, помещается вызов метода описания кнопки: button($$("save", msg), ... ). Тогда если конечный пользователь сервиса с таким агентом работает на русскоязычном сайте платформы - он увидит кнопку с надписью "Сохранить", а если на англоязычном - с надписью "Save".
- Разработчик решателя может добавить к этим переводам надписи на кнопке также вариант на китайском языке. Для этого он в инфоресурсе решателя создаёт (под вершиной language resources) ключ "save" (нетерминал с данными именем), для которого задаёт перевод на китайский язык - терминал-значение со значением "保存" (метапонятие zho). Теперь при отображении сервиса с данными решателем на китайском языке сайта кнопка будет отображаться с заданной надписью.
- Разработчик решателя может изменить перевод "Сохранить" на "Записать". Для этого он в инфоресурсе решателя создаёт (или использует созданный ранее) ключ save (нетерминал с данными именем), для которого задаёт перевод на русский язык - терминал-значение со значением "Записать" (метапонятие rus). Теперь при отображении сервиса с данными решателем на русском языке сайта кнопка будет отображаться с заданной надписью, вместо "Сохранить". Модифицировать исходный кода агента не требуется.
Стоит отметить, что применение метода $$(String key, Locale locale), при создании агента позволяет ввести поддержку набора языков, превышающих доступные на сайте платформы. (В настоящее время это корейский и японский языки.) Для этого необходимо в интерфейсе агента дать пользователю возможность выбирать язык отображения, наполнить инфоресурс агента ключами и переводами ключей на требуемые языки и при помощи указанного метода формировать интерфейсные элементы с текстом.
2. Переводы в API
В настоящее время API платформы не содержит методов навигации и модификации содержимого инфоресурсов с учётом языков.