|
JPAGE_CURRENT_OF_TOTAL Radialix 2 поддерживает локализацию не только ресурсов, но и строк, размещенных в коде приложения - жестко-закодированных строк. В дополнение ко встроенным средствам поиска строк в дистрибутив Radialix 2 включен плагин RDMAP к дизассемблеру IDA http://www.hex-rays.com/idapro/, позволяющий существенно улучшить качество поиска и возможности редактирования жестко-закодированных строк. При увеличении длины строки после перевода Radialix 2 поддерживает автоматический перенос строк в новую секцию и коррекцию ссылок на строку, а также возможность увеличения размера строки за счет использования байтов-заполнителей в конце строки с помощью плагина RDMAP.
Локализация жестко закодированных строк возможна только при создании локализованного файла, создание многоязычных файлов не поддерживается.
Типы поддерживаемых строк
Поддерживается редактирование следующих типов жестко-закодированных строк: Pascal - строки, имеющие в Delphi тип string Структура данных этих строк в коде в Delphi 2007 и младше:
RefCnt dd 0xFFFFFFFF //Счетчик ссылок, равен -1 Len dd ? //Длина строки в символах Text db 0 dup(?) //Символы, каждый символ занимает 1 байт terminator db 0 //Нулевой символ-терминатор
При извлечении этих строк производится их преобразование в UNICODE в соответствии с кодовой страницей языка текста, который установлен в параметрах файла.
В Delphi 2009 эти строки имеют разный формат в зависимости от числа байт, которые занимает один символ. ANSI строки:
CodePage dw ? //Кодовая страница символов строки CharSize dw 1 //размер символов в байтах RefCnt dd 0xFFFFFFFF //Счетчик ссылок, равен -1 Len dd ? //Длина строки в символах Text db 0 dup(?) //Символы terminator db 0 //Нулевой символ-терминатор
UNICODE строки:
CodePage dw ? //Кодовая страница символов строки CharSize dw 2 //размер символов в байтах RefCnt dd 0xFFFFFFFF //Счетчик ссылок, равен -1 Len dd ? //Длина строки в символах Text dw 0 dup(?) //Символы terminator dw 0 //Нулевой символ-терминатор
Pascal Wide - строки, имеющие в Delphi тип widestring Формат строки:
Len dd ? //Длина строки в байтах Text dw 0 dup(?) //Символы, каждый символ занимает 2 байта terminator dw 0 //Нулевой символ-терминатор Pascal Short - строки, имеющие в Delphi тип shortstring Формат строки:
Len dd ? //Длина строки в символах, максимум 255. Text db 0 dup(?) //Символы, каждый символ занимает 1 байт
WIDEZ - строки в кодировке UNICODE (2 байта на символ), заканчивающиеся нулевым символом
Text dw 0 dup(?) //Символы, каждый символ занимает 2 байта terminator dw 0 //Нулевой символ-терминатор
ASCIIZ - строки в кодировке ANSI (1 байт на символ), заканчивающиеся нулевым символом
Text db 0 dup(?) //Символы, каждый символ занимает 1 байт terminator db 0 //Нулевой символ-терминатор
В процессе редактирования длина перевода может оказаться больше длины оригинального текста, в результате перевод не будет вмещаться в существующую структуру данных в коде локализуемого файла. Radialix позволяет решить эту проблему двумя способами:
- размещение строки в новой секции данных. Для обеспечения корректного переноса производится поиск, а затем при создании локализованных файлов коррекция всех ссылок на строку. В текущей версии поддерживается только один тип ссылок - 32-х разрядное поле, содержащее виртуальный адрес поля Техt в структуре данных строки (для Pascal String - адрес поля Len). Поиск ссылок производится с использованием таблицы перемещений, а при использовании плагина RDMAP дизассемблера IDA - во всем коде. Управление ссылками (удаление, добавление) может производиться только с помощью плагина RDMAP. Добавление новой секции и размещение в ней строк, увеличившейся длины, производится автоматически при создании локализованного файла. В список сообщений при этом добавляется соответствующая запись. Не смотря на перенос строки в новую секцию данные в оригинальном размещении строки также заменяются на перевод - сохраняется укороченная строка.
- увеличение размера структуры данных строки за счет использования байтов-заполнителей в конце строки. Обычно структуры данных в PE файле выровнены на границу 4-х байт, промежутки меду данными заполнены нулями. Увеличить размер данных строки можно только в дизассемблере IDA c помощью плагина RDMAP.
|