0

Тема: WonderFox DVD Video Converter

WonderFox DVD Video Converter

WonderFox DVD Video Converter

Хотите наслаждаться готовым фильмом с вашей семьей вечером, вместо того чтобы ждать долгое время преобразование? WonderFox DVD Video Converter является лучшим выбором. Он предоставляет универсальное комплексное решение для рипа DVD.


Проблема с переводом строки

При локализации программы WonderFox DVD Video Converter пользователь 78Sergey столкнулся со следующей проблемой:
[начало цитаты (в тексте мною сделаны уточнения)]--
Не могу справиться со словом Duration: (Длительность), в PASCAL_STRINGS
1) Если только перевести Duration: с идентификатором 008DCD80, то получается так:

Рисунок 1
WonderFox DVD Video Converter

Длительность без счётчика. Если же открыть окно Скачаное видео, то значение отображается нормально.

Рисунок 2
WonderFox DVD Video Converter

2) Если перевести Duration: с идентификаторами 008DCD80 и 005856A8, то получается так:

Рисунок 3
WonderFox DVD Video Converter

В главном окне значение длительности не верное, но в окне информация все правильно. Если же открыть окно Скачанное видео, то вместо значения длительности отображается какой-то путь.

Рисунок 4
WonderFox DVD Video Converter
--[конец цитаты]

Вот такая получается чехарда со значением длительности. Это признаки того, что строка Duration:, возможно, используется в качестве переменной (идентификатора). После перевода этой строки программа не может найти переменную и вместо значения подставляет мусор. Но чтобы ответить точно, необходимо провести анализ приложения и выяснить алгоритм формирования значения длительности. Эта операция очень сложная, особенно для начинающих. Самым простым решением является отказ от перевода именно той строки, которая приводит к глюкам. Так и поступил пользователь 78Sergey, в своей работе он оставил без перевода строку Duration:, которая выводится в окне Информация.

Если в ходе локализации вы столкнетесь с такими проблемами, когда перевод какой-то одной строки нарушает работу программы или отдельного её элемента, то попробуйте следующие варианты (в проектах перевода Radialix+`IDA):

Далее я опишу свои рассуждения и ход действий для решения этого вопроса. Надеюсь, это поможет вам при локализации других приложений, если попадется нечто подобное.

1) Как было сказано ранее, строка может использоваться в качестве переменной, поэтому необходимо найти в проекте все строки этого типа и все их перевести. В этом случае программа сможет найти локализованную переменную и будет её использовать. Для удобства работы с проблемными строками воспользуйтесь фильтром строк редактора Radialix.

Рисунок 5
WonderFox DVD Video Converter

Получим все строки для выбранного ресурса, в нашем примере это жестко-закодированные строки (~HARDCODED -> PASCAL STRINGS).

Рисунок 6
WonderFox DVD Video Converter

После создайте локализованный файл и проверьте программу. В некоторых случаях этот способ помогает. В данном же случаем, с программой WonderFox DVD Video Converter, нет. Пробуем другой вариант.

2) Если строка используется в программе в качестве переменной (мы не знаем этого наверняка, но исключать такую возможность нельзя), то обращение к ней может быть организовано не напрямую, посредством указания конкретного адреса (ссылка), а через регистр. В этом случае обращение к строке будет неизменным, т.е. программа будет считывать её по оригинальному адресу, даже при создании новой ссылки на строку (когда её длина больше оригинальной и она перемещена в новое место). Таким образом одна строка может использоваться и как переменная, и как текст для размещения на элементе управления. Причем для переменной важно оригинальное значение строки. Поэтому, чтобы не нарушить функциональность приложения, используется такой прием как разделение ссылок, когда в новом месте создается копия проблемной строки, которая редактируется нужным образом, а в коде программы изменяется адрес обращения к ней. При этом исходная строка оставляется без изменений. В итоге, при регистровой адресации программа получает оригинальную строку, а при прямой адресации - изменённую (переведенную и т.п.).

Для разделения ссылок в редакторе Radialix, в контекстном меню, предусмотрена специальная команда Ссылки.

Рисунок 7
WonderFox DVD Video Converter

Выделите в редакторе все строки Duration:, а затем разделите ссылки (Ссылки -> Разделить). Начальным строкам (исходные строки, у которых нет ссылок) верните оригинальное значение (горячие клавиши [Ctrl+U]) и установите для них признак только для чтения (горячие клавиши [Ctrl+K]), чтобы случайно их не перевести.

Рисунок 8
WonderFox DVD Video Converter

Как видите, после разделения оригинальные строки у нас теперь без ссылок (колонка Ссылки), т.е. равны нулю. А для новых строк, полученных разделением, редактор присвоил новые ID, согласно адресации обращения к ним. Теперь создайте локализованный файл и проверьте его работу, а также поведение проблемной строки. В некоторых случаях такой вариант дает положительный вариант, но в нашем - это не помогло. Переходим к третьему варианту.

3) Когда ни первый, ни второй способ не принесли успеха, нужно проверять каждую строку, полученную разделением ссылок, по отдельности. Причина все та же: какие-то строки могут быть использованы в качестве переменных и переводить их нельзя. Работа не приятных. От вас требуется очень большое терпение и внимательность.

Временно устанавливаем признак только для чтения для всех разделенных строк, кроме одной, и создаем локализованный файл. Затем запускаем его и смотрим, где в интерфейсе она покажется. От вас требуется проверить все возможные функции программы, пока вы её не найдете. И так последовательно нужно проверить все строки. Для тех из них, которые не будут найдены в работающем приложении, окончательно устанавливаете признак только для чтения. Для тех строк, которые нашлись визуально, сделайте пометки, где именно в интерфейсе они расположены. Это поможет вам быстро сориентироваться при локализации следующей версии программы, а также выполнить анализ кода в случае каких-то осложнений. Когда строк по разделенным ссылкам много, то для удобства их поиска, можно добавлять числовые индексы. Например, возьмем строку с ID #9830932.#0, добавим числовые индексы и создадим локализованный файл.

Рисунок 9
WonderFox DVD Video Converter

Запустим его и увидим, что обе строки используется в главном окне программы при добавлении файла с жесткого диска:

Рисунок 10
WonderFox DVD Video Converter

Убираем у строк в редакторе числовые индексы и устанавливаем для них состояние перевода Проверен. Потом добавьте эту строку в закладки и напиши примечание, где эта строка выводится.

Рисунок 11
WonderFox DVD Video Converter

Переходим к следующей строке и т.д.

Можно сразу всем строкам добавить числовые индексы по порядку, не устанавливая признак только для чтения, и создать для проверки локализованный файл, а можно проверять строки группами. В общем, способы могут быть разные, но вот таким методом проб и ошибок нужно вычленить строки, которые можно переводить, а которые и не нужно. Еще раз повторю, что на этом этапе вы должны самым дотошным способом проверить все возможные режимы и функции программы.

Если вышеперечисленные способы не помогли, то тогда нужно привлекать в помощь отладчик (OllyDbg).

Вот и в нашем случае, с программой WonderFox DVD Video Converter, придется заняться анализом кода. Но прежде необходимо определить место анализа. При построчной проверке строк в проекте Radialix, я обратил внимание, что при переводе строки с ID #9306252.008DF26C вместо пути для значения длительности появляется часть корректной строки со значением длительности.

Рисунок 12
WonderFox DVD Video Converter

Рисунок 13
WonderFox DVD Video Converter

Если же отменить перевод, то появляется часть пути.

Рисунок 14
WonderFox DVD Video Converter

Выходит, что в этом приложении помимо того, строка, возможно, используется в качестве переменной, но и с самими строками происходит какая-то манипуляция перед тем, как они будут выведены на экран. Что ж, имеет смысл глянуть на эту строку в отладчике. Загружаем в него нашу программу и переходим на адрес 008DF26C (адрес берем из второй половины идентификатора строки, после точки - ID #9306252.008DF26C). С ходу тут ничего не будет понятно, нужно трассировать этот участок кода и проверять содержимое регистров и адреса обращений. Устанавливаете по адресу 008DF26C точку останова (ВР), запускаете программу на выполнение (функциональная клавиша [F9]) и когда её работа прервется на ВР, исследуйте код в пошаговом режиме (клавиша [F7]).

Рисунок 15
WonderFox DVD Video Converter

Смысл последующих команд сводится к следующему: в массиве данных с характеристиками видео файла, сформированном ранее, выполняется поиск выражения Длительность:. После его нахождения позиция курсора сдвигается вправо на величину длины выражения (для англ. Duration: - 9h плюc символ пробела = 0Ah). Затем выделяется значение длительности и отправляется на экран в окне программы. Ниже я привожу пример одного из массивов со свойствами файла, чтобы объяснить вам, почему вместо значения длительности выводится мусор.

File Name: C:Documents and SettingsUsersМои документыWonderFox SoftWonderFox DVD Video ConverterDownload_Video

ASA_SDO___Prodigious_Sunspot0.MP4

Format Name: mov,mp4,m4a,3gp,3g2,mj2

Format Long Name: QuickTime / MOV

File Size: 5,96 MB

Metadata:

  major_brand    : mp42

  minor_version  : 0

  compatible_brands: isommp42

  creation_time  : 2014-10-22 21:28:02

Длительность: 00:00:15.655, start: 0.000000, bitrate: 3193 kb/s

Обратите внимание на последнюю строку в массиве Длительность: 00:00:15.655, start: 0.000000, bitrate: 3193 kb/s. Как видите, часть строки Длительность уже на русском, значит она сюда попадает из другой части программы (строка с ID #5789352.005851CC в проекте Radialix). А по адресу 008DF26B (в Radialixe 008DF26C) в регистр заносится другая строка с тем же словом Длительность. Если помните, чуть выше я писал, что при переводе строки с ID #9306252.008DF26C вместо пути для значения длительности появляется часть корректной строки со значением длительности. Если же отменить перевод, то появляется часть пути. Так вот, эта строка используется в качестве выражения для поиска в массиве свойств. Если мы оставим строку без перевода, т.е. Duration:, то конечно она не будет найдена, т.к. у нас там уже локализованная строка. По условиям поиска известно, что если искомое слово не будет найдено в тексте, то курсор остается в начальной позиции. В нашем случае на первой строке с именем файла. Далее позиция курсора сдвигается вправо на количество символов в строке Duration: плюс символ пробела, т.е. 9+1=10. В шестнадцатеричной системе счисления - 0Ah. Установите курсор на десятую позицию в первой строке массива, вы окажетесь перед символом двоеточия. Теперь отсчитайте 8 символов - получим строку : C:Doc. Вот их то мы и наблюдаем в приложении вместо значения длительности (см. рис. 14).

Теперь, что происходит, когда мы переведем строку с ID #9306252.008DF26C. В этом случае строка в массиве свойств файла будет успешно найдена, но из-за того, что указано конкретное значение символов (по длине оригинальной строки), на которые нужно сдвинуть позицию курсора, то снова получается чехарда, т.к. в переведенной строке больше символов (13) по сравнению с оригинальной (9). В итоге вместо значения длительности получается ть: 00:0, что и видно в программе (см. рис. 13).

Думаю вы уже догадались, как можно исправить ошибку. Необходимо увеличить значение по адресу 008DF29D для инструкции ADD EDX,0A на число соответствующее длине локализованной строки, т.е. на 5 плюс символ пробела. Всего 6. Итого 0Ah+6h=11h.

Рисунок 16
WonderFox DVD Video Converter

Запускаем программу и проверяем:

Рисунок 17
WonderFox DVD Video Converter

Все в порядке.

ИТОГИ.
На поверку оказалось, что строки еще могут использоваться в качестве выражений для поиска. Их частичный перевод однозначно влечет за собой нарушение функции поиска и, как результат, к ошибкам в работе приложения. Поэтому переводить надо все строки (см. рис. 6). Также исправлять длину строк (или смещение позиции курсора) необходимо в нескольких местах программы. Пока я только определил следующие адреса:

Рисунок 18
WonderFox DVD Video Converter

Адреса могут отличаться по причине не соответствия версии программы, которую исследовал я, и которой будете заниматься вы. Но вы их легко сможете определить при помощи Radialix+IDA.
При переводе последующих версий программы процедуру патчинга можно выполнять в НЕХ редакторе, задав поиск сигнатуры

Первый блок поиска и замены

Рисунок 19
WonderFox DVD Video Converter

В найденных вхождениях необходимо заменить значение 0Ah на 11h. Всего таких замен нужно сделать 6 (три на формат длительности вида 00:00:00.000 и три на формат вида 00:00.000):

Рисунок 20
WonderFox DVD Video Converter

А возможно и больше, подобные места в коде есть еще, но я их не проверял. Предлагаю вам исследовать их самостоятельно. Ориентироваться можно по жестко-закодированным строкам в проекте Radialix+IDA с форматом длительности видео файла. Перед этими строками в отладчике идет обращение к строкам Duration:.

Рисунок 21
WonderFox DVD Video Converter

Для первых двух выделенных в списке строк исправление кода уже выполнено (см. рис. 18). А вот остальные необходимо проверить, возможно для них исправление и не требуется.

Вот и все. Желаю удачи!

Кто ищет, тот всегда найдет!
WonderFox DVD Video Converter

Рейтинг поста: 0