Автор Тема: Смещение строк при переводе  (Прочитано 23005 раз)

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Смещение строк при переводе
« : 22 Апреля 2020, 14:08:21 »
Всем здоровья! И опять я с очередным затыком от iZotop RX7 версия X64. С таким сталкиваюсь впервые. Оригинальное окно настроек (1) и после перевода (2). Строки смещаются со своего места влево вверх, независимо от кодировки и языка локали, даже если заменена одна буква. Часть кода со строкой Keyboard (3). При замене, например, буквы "b" на "B" у перехода jns меняется адрес, выводящий на строчку, начинающуюся с "Show commands containing" (4). Смена вызова строки с нового адреса приводит к одинаковому результату - смещение строки. В случае с кириллицей в UTF-8, видна только половина. Подскажите, если кто сталкивался с подобной заморочкой.

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: Смещение строк при переводе
« Ответ #1 : 27 Апреля 2020, 20:58:45 »
И вам здоровья!

Обычно  такое происходит, когда разработчик приложения организует выбор вкладок не по индексу, а по имени. Имена вкладок являются ключевыми. Изменение имени вкладки буквально на одну букву, делает её неизвестной. В итоге программа добавляет её в качестве новой. Что вы и наблюдаете при попытке их перевода. В таких случаях нужно искать такие "ключи" по всему файлу программы. Если произвести поиск, например, строки-ключа "Keyboard", то она будет найдена в ресурсах программы, элементе с именем "IZRESEMBED -> RESTORATIONRESEMBED".

Рис. 1


Он является бинарным (двоичным) и содержит графические и текстовые данные с описанием компоновки элементов интерфейса программы. Достанем его из файла, разберем и увидим, что в одном их файлов в формате XML, где встречается искомая строка "Keyboard", описана компоновка диалога с настройками приложения. Причем строка "Keyboard" встречается дважды и является частью строк вида "Keyboard OptionTab (Index 2) Button" и "Option Tab Keyboard". А эти строки в свою очередь являются именами элементов интерфейса. Аналогично и для других заголовков на вкладках.

Рис. 2


На рисунке 2 я выделил цветом ключевые строки, строки, в которые эти ключевые строки входят, а также координаты и размеры кнопок, на которых размещаются ключевые строки. Это важно при локализации, т.к. переведенная строка может быть или длиннее или короче исходной, соответственно также нужно будет под неё корректировать размеры элемента управления. Ниже приведен пример перевода ключевых строк и изменения координат и положения кнопок.

Рис. 3


Документ должен быть в кодировке UTF-8 без BOM (оригинальный документ имеет кодировку ANSI). Также следует добиться исходного размера документа после перевода, иначе вы не сможете выполнить его замену в двоичном ресурсе RESTORATIONRESEMBED.

После изменения документа и замены его в ресурсе приложения нужно перевести ключевые строки в коде программы. Вы уже знаете, что имена вкладок (ключевые строки) являются жестко-кодированными строками. Инструменты перевода жестких строк могут быть какими угодно, важно другое. Все эти ключевые строки имеют указатель длины. Например, строка-ключ "Keyboard" имеет длину 8 байт, что соответствует количеству символов в строке, и эта длина явно устанавливается в коде программе.

Рис. 4


Я перевел эту строку-ключ как "Клавиатура". Длина строки 10 символов, но так как мы использовали кодировку UTF-8, то длина этой строки в байтах будет составлять 20 (или 14 в формате НЕХ). Вот это значение и следует указывать в коде.

Рис. 5


Аналогичным образом необходимо подкорректировать длину строк в соответствии с переводом. По окончании модификации и сохранении результата в файл мы увидим в настройках приложения корректное положение переведенных вкладок.

Рис. 6


При работе над переводом вам следует обратить внимание на то, что многие строки интерфейса находятся в ресурсе  RESTORATIONRESEMBED в таких же документах XML. Для них, возможно, также могут быть применены "ключи" и указатели длин, поэтому вам предстоит быть предельно внимательным. Еще вы можете настраивать положение и размеры элементов управления, редактируя значения тегов "X",  "Y", "Width" и "Height".

Удачи!

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #2 : 27 Апреля 2020, 22:03:39 »
Спасибо за информацию, а то уже всю голову сломал. Остался последний вопрос - как извлечь XML из ресурса и затем обратно вставить? Я пробовал, и у меня вышло большое количество файлов XML. Извлечь получилось, а вот вернуть - с этим проблема.

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: Смещение строк при переводе
« Ответ #3 : 27 Апреля 2020, 22:47:21 »
Вставить обратно можно в НЕХ редакторе. После перевода в XML файле подгоните его размер в размер оригинального. Например, рассматриваемый нами файл  (см. рис. 2 из предыдущего поста) имеет исходный размер 24404 байта. После моих модификаций его размер получился уже 24489 байт. Я уменьшил его размер  до исходного размера за счет удаления символов пробелов, которые выполняет роль форматирования и показывают структуру документа. Это видно на рис. 3 по сравнению с рис. 2 (строки 1-18). После этого открываем файл программы iZotope RX 7 Audio Editor.exe и наш измененный XML файл в НЕХ редакторе, находим массив оригинальных данных файла и выполняем его замещение новыми данными.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #4 : 28 Апреля 2020, 07:15:35 »
Спасибо, буду пробовать.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #5 : 28 Апреля 2020, 11:11:11 »
Ещё один момент, в окне Find Similar, это раздел Measurements, есть строка Make selection to find similar events. Она длиной 37 байт, кириллица занимает примерно 39 байт и дальше обрез. Пытался воспользоваться примером выше, но неудачно. В этом случае где находится счётчик?

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #6 : 28 Апреля 2020, 15:22:27 »
Разобрался, смотрел не туда   :umnik:

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: Смещение строк при переводе
« Ответ #7 : 28 Апреля 2020, 22:34:10 »
Она длиной 37 байт, кириллица занимает примерно 39 байт и дальше обрез. В этом случае где находится счётчик?
В отладчике все значения представлены в шестнадцатеричном формате!  37 в десятичном формате, а в шестнадцатеричном - 25:yes:

Памятка, если не знаете:


Разобрался, смотрел не туда
Это хорошо, что сами разобрались.  :up:


Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #8 : 29 Апреля 2020, 12:54:05 »
Странная вещь происходит в отладчике x64dbg. 64-битная версия отказывается сохранять изменения при добавлении строки на новый адрес. Места ещё много. На скрине сохранился 1 байт из 37 изменённых. Пробовал в WinHex, всё сохраняется, но отладчик x64dbg это сохранение видит лишь небольшим куском. Файл ограничен по размеру?

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: Смещение строк при переводе
« Ответ #9 : 29 Апреля 2020, 22:28:10 »
Места ещё много. На скрине сохранился 1 байт из 37 изменённых. Пробовал в WinHex, всё сохраняется, но отладчик x64dbg это сохранение видит лишь небольшим куском. Файл ограничен по размеру?
Вы ошибаетесь. Там где вы пытаетесь записать свои данные, места как раз-то уже и нет. Если вы перейдете по тому адресу в НЕХ редактор, то увидите, что пытаетесь записать свои данные поверх существующих. В характеристиках секций любого РЕ-файла определены виртуальные границы, куда будут спроецированы данные программы при загрузке её в память. Вот отладчик вам и показывает виртуальную область памяти с кучей пустого места. На самом деле, на физическом уровне, этого пустого места в файле нет. Вы можете сами в этом удостовериться.

Вот смотрите, берем адрес 00000001421289FA,  с которого у вас отладчик отказывается записывать данные патча. Обратите внимание на информационную область под окном дизассемблированного кода. Там отображается физическое смещение в файле по выбранному адресу. Это смещение - 2126BFA.



Переходим по этому смещению в НЕХ редактор, открыв в нем файла программы. Что вы видите?



Вы находитесь уже перед началом следующей секции в файле. Это секция .data, которая начинается со смещения 2126C00.



Обратите внимание на параметры секций "Raw Size" (физический размер) и "Virtual Size" (виртуальный размер). Виртуальный размер обычно всегда больше. Это тот размер, который вы видите в отладчике.

Также в отладчике можно увидеть, где заканчивается секция. Он будет показывать нулевое смещение, т.е. смещения не будет, хотя в памяти эта секция все еще продолжается. Просто опускайтесь вниз по адресам, пока для значения смещения отладчик не покажет ноль.



Вот поэтому отладчик отбрасывает байты, которые выходят за границы физического размера секции. Или вы хотите получить заведомо неработоспособный файл программы?
« Последнее редактирование: 29 Апреля 2020, 22:29:46 от leserg73 »

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #10 : 29 Апреля 2020, 22:46:17 »
Ясно. Грустная история. И можно ли как-то всё это побороть?

Оффлайн leserg73

  • Постоялец
  • ***
  • Сообщений: 105
    • Wylek.ru
Re: Смещение строк при переводе
« Ответ #11 : 29 Апреля 2020, 23:14:59 »
И можно ли как-то всё это побороть?
Можно. Добавить в конце файла новую секцию и все строки сносить туда. Так, например, делает шаблонный редактор Radialix, когда перевод касается жестко закодированных строк.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #12 : 29 Апреля 2020, 23:38:22 »
Хорошо. Спасибо за советы. Буду теперь знать.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #13 : 30 Апреля 2020, 19:54:36 »
Не нашёл в Radialix как это сделать. По другим примерам, из сети, тоже ничего. Файл не рабочий. Честно говоря, внятных пояснений, кроме ваших, я не нашёл. Такое впечатление, что люди объясняют сами себе. На Wilek вопросы задавать не могу, такие правила.

Оффлайн миха04

  • Модератор
  • Старожил
  • *****
  • Сообщений: 374
    • http://
Re: Смещение строк при переводе
« Ответ #14 : 01 Мая 2020, 17:36:35 »
Добавил новую секцию через LordPE. В неё можно попасть через Карту памяти. Что нужно сделать, чтобы секцию было видно не таким путём?