9.3. Обновление таблиц строк

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

Для интернационализации вашей программы недостаточно выполнить её компиляцию с разделом resourcestrings. Во время выполнения программа должна инициализировать таблицы строк с правильными значениями для языка, который выберет пользователь. По умолчанию такая инициализация не выполняется. Все строки инициализируются с их объявленными значениями.

Модуль objpas предоставляет механизм для правильной инициализации строковых таблиц. Нет необходимости включать этот модуль в раздел uses, так как он загружается автоматически, если программа или модуль компилируются в режиме Delphi или objfpc. Так как для использования строковых ресурсов требуется один из этих режимов, то модуль в любом случае будет загружаться автоматически.

Строка ресурса сохраняется в таблицах, одна на модуль и одна на программу, если она также содержит раздел resourcestring. Каждый раздел resourcestring сохраняется со своим именем, хэш-значением, значением по умолчанию и текущим значением, всё как в AnsiStrings.Модуль objpas предоставляет методы для извлечения количества таблиц строковых ресурсов, количества строк в таблице и приведённой выше информации для каждой строки. Он также предоставляет метод для установки текущего значения строки.

Ниже приводятся объявления всех функций:

Function ResourceStringTableCount : Longint;
Function ResourceStringCount(TableIndex: longint): longint;
Function GetResourceStringName(TableIndex, StringIndex: Longint): Ansistring;
Function GetResourceStringHash(TableIndex, StringIndex: Longint): Longint;
Function GetResourceStringDefaultValue(TableIndex, StringIndex: Longint): AnsiString;
Function GetResourceStringCurrentValue(TableIndex, StringIndex: Longint): AnsiString;
Function SetResourceStringValue(TableIndex, StringIndex : longint; Value: Ansistring): Boolean;
Procedure SetResourceStrings (SetFunction: TresourceIterator);

Следующие две функции существуют только для удобства:

Function Hash(S: AnsiString): longint;
Procedure ResetResourceTables;

Далее приводятся краткие описания назначения функций. Подробно они описаны в файле Справочное руководство Free Pascal.

ResourceStringTableCount возвращает количество таблиц строковых ресурсов в программе.

ResourceStringCount возвращает количество вхождений строковых ресурсов в данную таблицу (таблицы обозначаются индексами с основанием 0).

GetResourceStringName возвращает имя строкового ресурса в таблице ресурсов. Это имя модуля, точка (.) и имя строковой константы, всё в нижнем регистре. Строки обозначаются индексом с нулевым основанием.

GetResourceStringHash возвращает значение хэша строкового ресурса как вычисленное компилятором с помощью функции Hash.

GetResourceStringDefaultValue возвращает значение по умолчанию для строкового ресурса, то есть значение, которое появляется в объявлении строкового ресурса и которое сохранено в бинарном файле.

GetResourceStringCurrentValue возвращает текущее значение строкового ресурса, то есть значение, установленное при инициализации (значение по умолчанию), или значение, установленное какой-либо процедурой инициализации.

SetResourceStringValue устанавливает текущее значение строкового ресурса. Эта функция должна быть вызвана для инициализации всех строк.

SetResourceStrings передача этой функции обратного вызова приведёт к тому, что обратный вызов будет вызывать строки одну за одной, устанавливая значение строки для возврата значения обратного вызова.

Две другие функции существуют только для удобства:

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

ResetResourceTables сбрасывает все строковые ресурсы в их значения по умолчанию. Она вызывается в коде инициализации модуля objpas.

Ниже приведён пример функции Translate, которая будет инициализировать все строковые ресурсы:

Var I,J : Longint;
  S : AnsiString;
begin
  For I:=0 to ResourceStringTableCount-1 do
  For J:=0 to ResourceStringCount(i)-1 do
    begin
      S:=Translate(GetResourceStringDefaultValue(I,J));
      SetResourceStringValue(I,J,S);
    end;
  end;

Конечно, возможны другие способы, а функция Translate может быть реализована различными путями.