Работа с локализуемыми ресурсами конфигурации. Реализация мультиязычия
Glossary Item Box
Общие сведения
Конфигурационные ресурсы приложения — это локализуемые строки и изображения, которые используются в приложении для отображения служебной информации пользователю.
Ресурсы приложения размещены в пакетах и привязаны к базовой схеме в иерархии схем. При запросе ресурсов определенной схемы происходит сбор всех ресурсов по иерархии и "схлопывание" с учетом уровней и позиций пакетов.
Отображение ресурсов с учетом иерархии
Существует два режима построения ресурсов для схемы: режим дизайна (Design-time) и режим выполнения приложения (Run-time).
Режим дизайна (Design-time)
Данный режим используется для отображения ресурсов в дизайнерах и мастерах. При этом ресурсы для схем строятся только до уровня пакета, в котором находится схема, для которой запрашиваются ресурсы. Также не учитываются ресурсы пакетов, которые не попадают в иерархию по прямым связям. Например, для схемы ChildSchema (рис. 1) результирующие ресурсы будут такими:
- BaseResource: BaseValue;
- ChildResource: ChildValue.
Как видно по результату, ресурсы не попавших в иерархию построения пакетов PackageWithReplacedResource1 и PackageWithReplacedResource2 не учитываются. Также не учитываются ресурсы в пакетах PackageWithReplacedChildResource1 и PackageWithReplacedChildResource2, которые находятся ниже по уровню запрашиваемой схемы.
Рис. 1. — Пример иерархии пакетов
Исключением является случай, когда запрашивается схема с указанием пакета, от которого нужно собирать все ресурсы. Тогда результирующий набор ресурсов будет сформирован до уровня запрашиваемого пакета. Например, ресурсы для схемы ChildSchema до уровня пакета BottomPackage будут выглядеть так:
- BaseResource: BaseValue;
- ChildResource: ReplacedChildValue2;
- ChildResource1: Value1;
- ChildResource2: Value2.
Здесь значение ресурса ChildResource поменялось на ReplacedChildValue2. Это произошло по причине его замещенияв пакетах на уровень ниже (Level 2). При этом учитывается позиция и имя пакета — преимущество отдается пакету с большим значением позиции. При одинаковом значении позиции преимущество отдается первому по имени пакету.
Режим выполнения приложения (Run-time)
Данный режим отвечает за отображение ресурсов во всех разделах системы кроме дизайнеров. Механизм построения ресурсов в этом режиме в целом очень похож на механизм, используемый в режиме дизайна. Главным отличием является то, что при запросе схемы в результирующем списке ресурсов будут присутствовать еще и ресурсы из пакетов, не входящих напрямую в иерархию. Например, если будут запрашиваться ресурсы схемы ChildSchema, то результат будет следующим:
- BaseResource: ReplacedBaseValue2;
- Resource1: Value1;
- Resource2: Value2;
- ChildResource: ReplacedChildValue2;
- ChildResource1: Value1;
- ChildResource2: Value2.
Отображение ресурсов по умолчанию
Если для культуры, отличающейся от культуры по умолчанию, нет значений ресурсов, которые должны отображаться пользователю, то используется механизм "отката" значений до тех, которые используются в культуре по умолчанию.
Этот механизм реализован в классах Terrasoft.Common.LocalizableString (представляет локализуемую строку) и Terrasoft.Common.LocalizableImage (представляет локализуемое изображение). Эти классы содержат следующие свойства и методы для получения локализованного значения:
- Value — свойство, которое возвращает значение локализованного объекта для текущей культуры или для культуры по умолчанию (если не найдено значение для текущей).
- HasValue — свойство, которое возвращает признак наличия значения локализованного объекта для текущей культуры, или для культуры по умолчанию (если не найдено значение для текущей).
- GetCultureValue() — метод, который возвращает значение локализованного объекта для текущей культуры или для культуры по умолчанию (если не найдено значение для текущей).
- HasCultureValue() — метод, который возвращает признак наличия значения локализованного объекта для запрашиваемой культуры без учета культуры по умолчанию.
Хранение ресурсов
Необходимые для работы приложения ресурсы хранятся в базе данных. Для установки в новое приложение или для переноса между приложениями ресурсы могут храниться в системе контроля версий.
Хранение ресурсов в БД
Ресурсы хранятся в таблице базы данных SysLocalizableValue в виде ключ-значение для каждой локализуемой строки или изображения. Структура таблицы SysLocalizableValue приведена в таблице 1. Каждая запись таблицы SysLocalizableValue привязана к пакету и идентификатору базовой схемы Id, при этом сама схема может находиться в другом пакете.
Табл. 1. — Структура таблицы SysLocalizableValue
Название колонки | Описание |
---|---|
Id | Идентификатор записи. |
CreatedOn | Дата создания записи. |
CreatedById | Ссылка на Контакт (Contact), создавший запись. |
ModifiedOn | Дата изменения записи. |
ModifiedById | Ссылка на Контакт (Contact), изменивший запись. |
SysPackageId | Ссылка на пакет (SysPackage). |
SysSchemaId | Ссылка на базовую схему (SysSchema). Заполняется только для ресурсов конфигурации. |
ResourceManager | Название менеджера ресурсов, заполняется только для ресурсов ядра. |
SysCultureId | Ссылка на культуру (SysCulture). |
ResourceType | Тип ресурса. |
IsChanged | Признак, был ли ресурс изменен пользователем. |
Key | Ключ ресурса. |
Value | Значение строкового ресурса. |
ImageData | Значение графического ресурса. |
Сохранение ресурсов по умолчанию
Если ресурс создается пользователем, который находится в культуре, отличающейся от культуры по умолчанию, для ресурса будет создана запись, соответствующая пользовательской культуре. Чтобы пользователи других культур также могли видеть этот ресурс, используется механизм дублирования в основную культуру. То есть будет создана аналогичная запись ресурса, но со ссылкой на культуру по умолчанию. Соответственно, новое значение ресурса будет отображаться во всех других культурах, если в них не задано своего значения для этого ресурса, как описано выше в разделе "Отображение ресурсов по умолчанию".
Хранение ресурсов в системе контроля версий и файловой системе
Структура хранения ресурсов в системе контроля версий и в файловой системе подробно описана в разделе "Структура хранения ресурсов" статьи "Структура и использование локализуемых ресурсов".