Описание пользователя
Глава 4. Перевод интерфейса пользователя RDS
В этой главе описываются встроенные в RDS функции, позволяющие перевести интерфейс пользователя главной программы и программ моделей блоков на другой язык.
§4.1. Хранение данных для разных языков
Рассматиривается общий принцип организации многоязычного интерфейса пользователя в RDS.
К интерфейсу пользователя RDS относятся все тексты, встроенные в основную программу («Rds.exe»/«Rds64.exe») и в программы моделей блоков: названия пунктов меню, заголовки окон и полей ввода, тексты сообщений, выводимых пользователю в отдельных окнах и т.п. К интерфейсу пользователя не относятся любые тексты в схемах: надписи на блоках, комментарии переменных и т.п. (такие тексты переводятся при помощи функций перевода текстов в схемах). Важно уметь отличать одно от другого. Например, надпись «Шрифт…» на кнопке в окне настроек какого-либо блока относится к интерфейсу пользователя, а любая надпись на блоке-кнопке, расположенном в схеме – к этой схеме. Текущий язык в схеме и в интерфейсе пользователя устанавливаются независимо: можно, например, работать в RDS с русским интерфейсом со схемой, переведенной на английский, и наоборот.
Тексты элементов интерфейса пользователя главной программы и DLL с моделями блоков хранятся в служебных файлах, входящих в состав RDS. Каждый набор таких файлов соответствует одному языку интерфейса. Перевод окон настроек автокомпилируемых моделей в стандартных модулях автокомпиляции сделан по-другому: для каждого элемента интерфейса окна настройки тексты на разных языках хранятся в самом файле модели («.mdl»), они автоматически подставляются в нужные места программы при ее формировании в момент компиляции. Разработчику модели достаточно для каждого поля ввода указать названия на всех необходимых языках. Если в модели выводятся какие-либо окна с сообщениями пользователю, тексты этих сообщений нужно сделать текстовыми константами, для которых тоже можно задавать разные значения для разных языков.
В целом процедура перевода интерфейса пользователя будет похожа на процедуру перевода текстов схемы: создается новый язык, экспортируются файлы с текстами, тексты в файлах переводятся на этот новый язык, после чего файлы загружаются обратно. Но есть и принципиальные отличия.
- При переводе схем в каждой схеме может быть свой набор равноправных языков, которые пользователь сам добавляет и удаляет по желанию. При переводе интерфейса языки создаются и выбираются централизованно для всей программы (RDS), причем один из них (русский) всегда существует как «язык по умолчанию», и его тексты не могут быть изменены.
- При переводе схем файл перевода должен постоянно храниться вместе со схемой, тексты на разных языках загружаются из него в схему по команде пользователя. Если в схему добавлены новые блоки с новыми надписями, содержимое схемы синхронизируется (снова по команде пользователя) с файлом перевода, где появляются новые тексты, которые нужно перевести. При переводе интерфейса экспортированный файл с текстами нужен только до момента его импорта (обратной загрузки) после перевода. Переведенные тексты встраиваются в служебные файлы RDS или в файлы автокомпилируемых моделей, после чего экспортированный файл можно стирать.
- При переводе схем файл перевода содержит данные всех языков схемы в отдельных столбцах формата CSV. При переводе интерфейса файл содержит тексты только для одного языка – того, для которого он был экспортирован.
- При переводе схем файл перевода всегда выгружается в формате CSV (возможно, с дополнительным служебным файлом). При переводе интерфейса можно выбрать между CSV и форматом, аналогичным INI-файлам Windows (этот формат удобнее и понятнее для программиста).
- При переводе схем служебная информация в файле перевода закодирована и никак не связана с назначением переводимого текста – например, «0101qj4q2w». При переводе интерфейса по формату служебной информации можно, в принципе, понять, к чему относится данный текст – например, «General._HelpButton.Caption» (надпись на кнопке вызова справки).
Следует учитывать, что некоторые элементы интерфейса стандартных диалогов и окон сообщений создаются операционной системой, и на них невозможно повлиять. Например, заголовки различных полей в окне выбора шрифта или окне открытия файла всегда будут отображаться в текущем языке Windows.
Локализация RDS, то есть хранение текстов интерфейса для разных языков, устроена следующим образом. В RDS есть «интерфейс пользователя по умолчанию» – это текущий интерфейс главной программы и всех DLL с моделями блоков. Без загрузки переводов на другой язык все меню, окна и т.п. будут на русском языке. Все «управляемые» объекты интерфейса пользователя и тексты для этих объектов записываются разработчиками (как разработчиками главной программы, так и разработчиками DLL стандартных, не автокомпилируемых, моделей) в специальных текстовых файлах описания интерфейса пользователя, формат которых приведен в §4.2. Эти файлы должны иметь расширение «.dat» и размещаться в папке «Description\» или вложенных в нее папках внутри папки установки RDS. Каких-либо строгих требований к именам этих файлов нет, но на данный момент принята следующая, достаточно простая, схема: файл описания интерфейса называется так же, как исполняемый файл, к которому он относится, и располагается в папке, совпадающей по имени с папкой исполняемого файла. Например, исполняемый файл «Rds.exe» находится непосредственно в папке установки RDS, поэтому его файлом описания будет «Description\rds.dat». Шестидесятичетырехразрядная версия программы («Rds64.exe») будет использовать этот же файл, хотя ее имя и отличается (это же касается всех остальных программ и DLL). Библиотека с моделями стандартных блоков «Common.dll» находится в подпапке «Dll\» внутри папки RDS, поэтому ее файлом описания будет «Description\Dll\Common.dat». Размещение файлов описаний внутри папки «Description\» будет определять размещение созданных на их основе двоичных файлов перевода (о них – ниже), поэтому лучше делать так, чтобы исполняемому файлу было просто найти относящиеся к нему файлы.
Все данные интерфейса пользователя для разных языков (кроме русского, который жестко встроен в исполняемые файлы) будут находиться в папке «Interface\Language\» внутри папки установки RDS. Каждому языку соответствует одна папка, названием языка считается имя этой папки. Например, для языка с названием «English», все данные находятся в папке «Interface\Language\English\» внутри папки установки RDS. Имя «Default» зарезервировано для папки хранения данных по умолчанию, никакой язык не может так называться.
В папке языка должны располагаться двоичные файлы с текстами, соответствующими файлам описания интерфейса из папки «Description\», упомянутой выше. Эти файлы можно создавать средствами RDS при помощи экспорта/импорта текстовых файлов специального формата. Каждому файлу описания интерфейса с расширением «.dat» из папки «Description\» будет соответствовать один двоичный файл перевода с расширением «.bin» в подпапке каждого языка. Двоичными эти файлы сделаны для повышения скорости поиска данных в них: хотя загрузка переводов объектов одного окна и занимает очень небольшое время как в текстовом, так и в двоичном формате, поиск данных в гигантском текстовом файле (только в главной программе на данный момент около ста окон, в каждом из которых не меньше десятка текстов, требующих перевода) последовательным чтением может занимать существенное время. В формате двоичных файлов предусмотрено содержание, располагающееся в начале файла, поэтому поиск данных нужного окна будет выполняться быстрее (загрузка содержания – поиск в нем имени окна – быстрый переход в нужную позицию файла для загрузки данных).
В папке языка должен также находиться настроечный файл с названием «params.ini», в котором описываются действия, выполняемые RDS при переключении языка пользователем. Обычно при таком переключении мало начать загружать файлы с текстами на другом языке при работе программы, нужно еще поменять и некоторые настройки и служебные файлы. Например, при переключении на английский язык нужно автоматически перенастроить RDS на другую панель блоков с английскими названиями вкладок-папок и, возможно, другими иконками блоков (если на иконках нарисованы русские буквы). Кроме того, при наличии английской документации (на данный момент она отсутствует) нужно переключить RDS на другие файлы справки, и т.д. Предполагается, что документация, отдельная панель блоков и т.п. для языка также будут находиться в папке этого языка.
Папка «Interface\Language\» существует не только внутри папки установки RDS, но и внутри папки настроек. В папке настроек для текущего языка хранятся данные, которые могут быть изменены пользователем (например, стили связей или описание панели блоков), и которые, по этой причине, нельзя размещать в папк установки, к которой может не быть доступа по записи. Кроме того, там могут располагаться и двоичные файлы перевода, которые в этом случае будут иметь приоритет над размещенными в папке установки.
Для примера рассмотрим структуру папок RDS для английскгог языка (название папки – «English»). Из всех библиотек с моделями блоков будем рассматривать только «Common.dll», чтобы не перегружать пример. В путях символическое обозначение «$RDS$» будет указывать на папку установки RDS, «$INI$» – на папку настроек.
Структура папок с файлами будет следующей (голубым выделены данные английского языка, зеленым – общие для всех языков интерфейса):
| Папка или файл | Назначение |
|---|---|
| $RDS$\Rds.exe, $RDS$\Rds64.exe |
Главная программа |
| $RDS$\Dll\Common.dll, $RDS$\Dll\Win64\Common.dll |
Стандартные модели блоков |
| $RDS$\Description\ | Папка с описаниями интерфейса пользователя главной программы и стандартных DLL |
| $RDS$\Description\rds.dat | Описание интерфейса пользователя главной программы |
| $RDS$\Description\Dll\Common.dat | Описание интерфейса пользователя стандартных моделей блоков |
| $RDS$\Interface\Language\Default\ | Папка параметров «интерфейса по умолчанию» (русского) |
| $RDS$\Interface\Language\English\ | Папка с данными английского языка |
| $RDS$\Interface\Language\English\params.ini | Настройки параметров переключения на английский язык |
| $RDS$\Interface\Language\English\rds.bin | Перевод главной программы на английский язык |
| $RDS$\Interface\Language\English\Dll\Common.bin | Перевод стандартных моделей блоков на английский язык |
| $INI$\Interface\Language\English\Panel\ | Папка английской панели блоков |
| $INI$\Interface\Language\English\Template\ | Папка с английскими шаблонами схем и автокомпилируемых моделей |
| $INI$\Interface\Language\English\*.dat, $INI$\Interface\Language\English\*.lst |
Версии служебных файлов RDS для английского языка |
В RDS не предусмотрено средств перевода панели блоков, шаблонов, названий модулей автокомпиляции, расширений и т.п. – эти действия необходимо выполнять вручную.
Автокомпилируемые модели для стандартных модулей компиляции не используют двоичные файлы перевода из папки языка, поскольку модели пользователя обычно размещаются в одной папке со схемой, и хранить для них данные централизованно не имеет смысла. Вместо этого тексты на разных языках хранятся в самом файле модели с расширением «.mdl». Эти тексты могут быть экспортированы, переведены и импортированы обратно для загруженной схемы централизованно, через окно настроек RDS (см. §4.7.2). Разработчик модели может и сам, не дожидаясь перевода, указать для объектов тексты на разных языках. Следует помнить, что набор языков и их названия все равно задаются в RDS централизованно – нельзя добавить текст для языка, который не был создан заранее.