9.2. Файл строковых ресурсов

На верх  Назад  Вперёд

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

1.Генерирует таблицу, содержащую значения строк, как они объявлены в исходных кодах

2.Генерирует файл строк ресурсов (resource string file), который содержит имена всех строк вместе с их объявленными значениями

Такой подход имеет два преимущества: во-первых, значение строки всегда присутствует в программе. Если программист не позаботился о переводе строк, то значения по умолчанию всегда присутствуют в бинарном файле. Это также позволяет избежать необходимости указывать файл, содержащий строки. Во-вторых, имея все строки вместе в сгенерированном компилятором файле, вы можете быть уверены, что все эти стоки будут в одном месте (вы можете иметь множество разделов resourcestring в одном модуле или программе), а, имея этот файл в известном формате, программист может выбирать способ интернационализации.

Для каждого компилируемого модуля. Содержащего раздел resourcestring, компилятор генерирует файл, который имеет имя модуля и расширение .rst. Формат этого файла следующий:

1.Пустая строка.

2.Строка, начинающаяся со знака решётки (#) и хэш-значение строки, которому предшествует текст hash value =.

3.Третья строка, содержащая имя строки ресурсов в формате unitname.constantname (имямодуля.имяконстанты), все символы в нижнем регистре, за которой следует знак равенства и значение строки в формате, эквивалентном представлению строк в Pascal. Строка может продолжаться на следующей строке, в этом случае она читается как строковое выражение в Pascal (со знаком «Плюс» в строке).

4.Ещё одна пустая строка.

Если модуль не содержит раздела resourcestring, то файл не создаётся.

Например, следующий модуль:

unit rsdemo;
{$mode delphi}
{$H+}
interface
resourcestring
First = 'First';
Second = 'A Second very long string that should cover more than 1 line';
implementation
end.

В результате компиляции сгенерирует файл строковых ресурсов:

# hash value = 5048740
rsdemo.first='First'

# hash value = 171989989

rsdemo.second='A Second very long string that should cover more than 1 li'+ 'ne'

Хэш-значение вычисляется с помощью функции Hash. Она представлена в модуле objpas. Значение является таким же значением, которое использует механизм GNU gettext. Оно ни коим образом не является уникальным и может использоваться только для ускорения поиска.

Утилита rstconv, которая поставляется с компилятором Free Pascal, позволяет манипулировать этими файлами строковых ресурсов. В данный момент её можно использовать только для того, чтобы сделать файл .po, который может быть передан в программу GNU msgfmt. Если кто-то желает иметь другой формат (приходят на ум файлы ресурсов Win32 ), то можно усовершенствовать программу rstconv таким образом, чтобы она могла генерировать другие типы файлов. Механизм GNU gettext был выбран потому, что он доступен на всех платформах и уже широко используется в Unix я является свободно распространяемым (бесплатным). Так как команда Free Pascal не хочет ограничивать использование строковых ресурсов, формат .rst был выбран, чтобы обеспечить независимый метод, не ограниченный каким-либо инструментом.

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