Prognoz Platform: платформа международного общения

Василий Титов

Prognoz Platform поддерживает несколько языков интерфейса. Также инструменты разработки в Prognoz Platform позволяют создавать собственные приложения, поддерживающие одновременно несколько языков. Такие приложения называются мультиязычными, и в данной статье я хочу рассказать о них.

В процессе разработки систем может возникнуть потребность перевода их на различные языки. Для того чтобы адаптировать систему под заданные языки, а также хранить все текстовые и графические данные в одном месте, был создан инструмент разработки «Ресурсы». «Ресурсы» – это контейнер, хранящий различные текстовые и графические значения для заданных языков. «Ресурсы» позволяют разделить работу разработчика и переводчика, что влечет за собой повышение скорости разработки и улучшение качества переводов. Для поддержки других языков не нужно изменять компоненты в самой системе, достаточно добавить переводы в «Ресурсы».

Мультиязычная Fore-форма

С ресурсами можно взаимодействовать как на Fore, так и на Fore.NET. Поделюсь с вами небольшим лайфхаком, в какой последовательности нужно работать с ресурсами на примере Fore-формы.

Пусть перед нами стоит задача написать мультиязычное приложение, интерфейс которого будет меняться в зависимости от выбранного нами языка. Для начала создадим объект «Ресурсы». Изначально в ресурсах будет присутствовать «язык репозитория по умолчанию». Далее необходимо добавить языки, которые будет поддерживать ваше приложение. Я в своем примере использовал «Русский (Russia)» и «Английский (США)». После этого необходимо сохранить ресурсы.

Теперь нам необходимо создать форму и прикрепить ресурсы к ней. Для этого необходимо подключить ресурсы в поле «Resources» в «Инспекторе объектов». В диалоговом окне выберем только что созданный файл с ресурсами.

К форме также можно подключать ресурсы через язык Fore. Для этого необходимо сначала подключить сборки «IO» и «Metabase». А далее выполнить следующий код:

Sub Resource; Var MB: IMetabase; Res: IResourceObject; Begin MB := MetabaseClass.Active; Res := MB.ItemById("MyRes").Bind As IResourceObject; Self.Resources := Res; End Sub Resource;

Обратите внимание: если ресурсы не подключены, то элементы формы, требующие перевода, будут отображаться на языке, использовавшемся при разработке формы.

Так как ресурсы у нас подключены, то при добавлении нового компонента ему будет уже присвоен ResourceID в свойствах инспектора объектов.

В качестве примера я разместил на Fore-форме 4 компонента: GroupBox, RadioButton – 2 и ImageBox.

После того как все необходимые компоненты добавлены, отредактируем созданные ранее ресурсы. На вкладке «Строки» добавим текстовые значения для нужных языков каждому идентификатору. Как мы видим, нам не придется создавать самим идентификаторы, они будут сгенерированы автоматически. Мною были заданы следующие значения:

На вкладке «Изображения» создавать идентификатор придется уже самим. Редактор ресурсов поддерживает основные типы изображений: bmp, jpg, giff, tiff, png, ico.

Также вы можете открывать изображение в режиме предпросмотра.

Для того чтобы наглядно отобразить изменения интерфейса в зависимости от языка, добавим два обработчика – на создание формы и на клик по RadioButton. Ввиду того, что ресурсы у нас уже подключены, к ним можно обращаться как к текущему объекту через Self.Resources.

Полный код формы имеет вид:

Class MltLNGForm: Form GroupBox1: GroupBox; RadioButton1: RadioButton; RadioButton2: RadioButton; ImageBox1: ImageBox; Sub RadioButtonOnClick(Sender: Object; Args: IMouseEventArgs); Var MB: IMetabase; Res: IResourceObject; ResSt: IResourceStrings; Begin MB := MetabaseClass.Active; If (Sender As IRadioButton) = RadioButton1 Then MB.CurrentLocale := LocaleCodeID.Russian; Elseif (Sender As IRadioButton) = RadioButton2 Then MB.CurrentLocale := LocaleCodeID.English_UnitedStates; End If; Res := Self.Resources; ResSt := Res.Locales.CurrentLocale.Strings; Self.Text := ResSt.Value("MLTLNGForm.MLTLNGForm"); GroupBox1.Text := ResSt.Value("MLTLNGForm.GroupBox1"); RadioButton1.Text := ResSt.Value("MLTLNGForm.RadioButton1"); RadioButton2.Text := ResSt.Value("MLTLNGForm.RadioButton2"); ImageBox1.LoadImageFromStream(Res.Binaries.Value("IDB_IMG")); End Sub RadioButtonOnClick; Sub MLTLNGFormOnCreate(Sender: Object; Args: IEventArgs); Var MB: IMetabase; Begin MB := MetabaseClass.Active; If MB.CurrentLocale = LocaleCodeID.Russian Then RadioButton1.Checked := True; Elseif MB.CurrentLocale = LocaleCodeID.English_UnitedStates Then RadioButton2.Checked := True; End If; RadioButtonOnClick(Null, Null); End Sub MLTLNGFormOnCreate; End Class MltLNGForm;

Текстовые ресурсы выбираются для текущего языка через метод Locales.CurrentLocale. Графические загружаются через функцию LoadImageFromStream(), в ней текущий язык определяется сам. Обращение к текстовым значениям ресурсов происходит через функцию Strings.Value(), где мы указываем идентификатор ресурса, а к графическим через Binaries.Value().

А теперь наглядно продемонстрируем работу формы. Пусть у нас изначально установлен «Язык репозитория по умолчанию» (Русский). Запустим нашу форму. Она отобразится на русском языке:

Установим флаг на английский язык. Форма автоматически переведется на английский язык, текстовые и графические значения компонентов будут загружены из ресурсов.

Теперь проведем еще один опыт. Добавим только текстовые переводы в ресурсы нашей формы для еще одного языка, например, немецкого.

Сменим язык репозитория для текущего пользователя на немецкий.

После запуска формы мы увидим следующее:

Форма автоматически перевелась, но так как мы не добавляли графические ресурсы для немецкого языка, то они загрузились для «языка репозитория по умолчанию».

На ниже представленной схеме показано, как выбирается язык при работе с объектом «Ресурсы».

Мультиязычные отчеты

Так как «Ресурсы» — это объект, доступный на Fore через интерфейс IResourceObject, то его можно использовать в регламентном отчете ввиду того, что модуль Fore можно подключить к отчету. Например:

Тут мы видим, что вызывается из модуля функция – GetResource(), которая в свою очередь берет из ресурса значение с нужным нам идентификатором.

Function GetResourceAux(id : string; Var ResourceObject : IResourceObject) : string; Var ReportId : string; Descriptor : IMetabaseObjectDescriptor; Report : IPrxReport; Begin If ResourceObject=Null Then Report := PrxReport.ActiveReport; ReportId := Report.MetabaseObject.Id + "_RESOURCE"; Descriptor := MetabaseClass.Active.ItemById(ReportId); If Descriptor=Null Then Return ""; End If; ResourceObject := Descriptor.Bind As IResourceObject; End If; If ResourceObject.Strings.FindById(id)=-1 Then Return ""; End If; Return ResourceObject.Strings.Value(id); End Function GetResourceAux; Public Function GetResource(id : string) : string; Var r : IResourceObject; Begin Return GetResourceAux(id, r); End Function GetResource;

Аналитические панели в веб-приложении могут поддерживать несколько языков пользовательского интерфейса. Для того чтобы создать мультиязычную аналитическую панель, необходимо установить флажок «Мультиязычность» на вкладке боковой панели «Документ».

После включения мультиязычности к объекту «Аналитические панели» будет автоматически создан и прикреплен объект «Ресурс».

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

После нажатия на данную кнопку вы сможете добавлять языки, а также необходимые переводы для них.

Элементы, которые поддерживают мультиязычность:

- наименования блоков, вкладок и аналитической панели;

- заголовки блоков и визуализаторов;

- текст кнопки, надписи и блока «Текст».

Через язык Fore также можно преобразовать аналитическую панель в мультиязычную, указав уже созданный объект «Ресурс». Для этого необходимо выполнить следующий код:

Sub Main; Var mb: IMetabase; resource: IResourceObject; repObj: IMetabaseObject; report: IAdhocReport; Begin mb := MetabaseClass.Active; resource := mb.ItemById("MYRES").Bind As IResourceObject; repObj := mb.ItemById("MYADHOC").Edit; report := repObj As IAdhocReport; report.Resources := resource; report.SupportMultyLanguage := True; If report.IsDirty Then repObj.Save; End If; End Sub Main;

Также хочу добавить, что в Prognoz Platform можно создавать экспресс-отчеты с мультиязычными заголовками. Создание мультиязычного заголовка в экспресс-отчете доступно только через язык Fore. Для этого создадим пустой объект «Ресурсы» добавим необходимые языки и сохраним его. Предполагается, что у нас имеется экспресс-отчет.

Sub Main; Var mb: IMetabase; resource: IResourceObject; repObj: IMetabaseObject; report: IEaxAnalyzer; Begin mb := MetabaseClass.Active; resource := mb.ItemById("MYRES").Bind As IResourceObject; repObj := mb.ItemById("MYEAX").Edit; report := repObj As IEaxAnalyzer; report.Resources := resource; report.SupportMultiLanguage := True; repObj.Save; End Sub Main;

Заголовок нашего экспресс-отчета станет мультиязычным и будет являться «языком репозитория по умолчанию». Также он будет добавлен в ресурсы с идентификатором *.TITLE, где для каждого языка мы сможем установить значения.

Теперь при смене языка будет меняться заголовок экспресс-отчета. Кстати, к нескольким объектам репозитория можно подключать один файл ресурсов.

Примечание: Заголовок экспресс-отчета может подаваться не только в виде простого текста, а также в виде RTF, который преобразуется в строковый формат. Это значит, что для разных языков можно устанавливать не только свой текст, но и свой стиль, цвет и т.д. Что очень удобно, так как стандартизированные стили текста в разных странах отличаются.

Заключение

Таким образом, используя ресурсы, можно создавать мультиязычные приложения, прилагая минимум усилий. Также хочется отметить, что ресурсы — это еще контейнер, который может хранить в себе информацию, многократно переиспользуемую различными объектами Prognoz Platform.

Читайте также

Комментарии

Подробнее о политике использования персональных данных