При разработке на Delphi часто приходится писать программы для использования в одном языковом регионе, т.е. для пользователей которым нужен только один язык в программе.
Есть разные методы локализации, в том числе подмена указателей в PResStringRec. Этот способ плох лишним использованием памяти и дополнительными действиями в runtime - фактически нелокализованные строки остаются в модуле и никогда не используются.
Оптимальным же способом локализации является подмена модулей с переводом содержащихся в них строк. Например, можно взять стандартный модуль RTLConsts.pas скопировать его в папку проекта и перевести содержимое. В таком случае перевод будет скомпилирован и прилинкован к модулю.
Подмену указателей можно использовать для временной подмены строк. Например, для отображения диалога с нестандартым текстом кнопок. Для этого надо переделать процедуру HookResourceString в функцию:
Есть разные методы локализации, в том числе подмена указателей в 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;
Комментариев нет:
Отправить комментарий