При разработке на Delphi часто приходится писать программы для использования в одном языковом регионе, т.е. для пользователей которым нужен только один язык в программе.
Есть разные методы локализации, в том числе
подмена указателей в
PResStringRec. Этот способ плох лишним использованием памяти и дополнительными действиями в runtime - фактически нелокализованные строки остаются в модуле и никогда не используются.
Оптимальным же способом локализации является подмена модулей с переводом содержащихся в них строк. Например, можно взять стандартный модуль RTLConsts.pas скопировать его в папку проекта и перевести содержимое. В таком случае перевод будет скомпилирован и прилинкован к модулю.
Подмену указателей можно использовать для временной подмены строк. Например, для отображения диалога с нестандартым текстом кнопок. Для этого надо переделать процедуру HookResourceString в функцию:
function HookResourceString(ResStringRec: PResStringRec;
NewStr: PChar): PChar;
var
OldProtect: DWORD;
begin
VirtualProtect(ResStringRec, SizeOf(ResStringRec^),
PAGE_EXECUTE_READWRITE, @OldProtect);
Result := PChar(ResStringRec^.Identifier);
ResStringRec^.Identifier := Integer(NewStr);
VirtualProtect(ResStringRec, SizeOf(ResStringRec^),
OldProtect, @OldProtect);
end;
Сам код временной подмены:
const
sAccept: PChar = '&Accept';
sDecline: PChar = '&Decline';
var
SaveYes: PChar;
SaveNo: PChar;
begin
SaveYes := HookResourceString(@SMsgDlgYes, sAccept);
SaveNo := HookResourceString(@SMsgDlgNo, sDecline);
MessageDlg('Do you accept terms?', mtConfirmation, mbYesNo, 0);
HookResourceString(@SMsgDlgYes, SaveYes);
HookResourceString(@SMsgDlgNo, SaveNo);
MessageDlg('Do you accept terms?', mtConfirmation, mbYesNo, 0);
end;