WonderFox DVD Video Converter

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

    Автор темы

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 945

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1676

    Был: 2024-07-28 22:59

    Лайков: 167

    WonderFox DVD Video Converter




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


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


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

    Рисунок 1


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

    Рисунок 2


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

    Рисунок 3


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

    Рисунок 4

    --[конец цитаты]

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

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

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

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

    Рисунок 5


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

    Рисунок 6


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

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

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

    Рисунок 7


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

    Рисунок 8


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

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

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

    Рисунок 9


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

    Рисунок 10


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

    Рисунок 11


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

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

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

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

    Рисунок 12


    Рисунок 13


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

    Рисунок 14


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

    Рисунок 15


    Смысл последующих команд сводится к следующему: в массиве данных с характеристиками видео файла, сформированном ранее, выполняется поиск выражения "Длительность:". После его нахождения позиция курсора сдвигается вправо на величину длины выражения (для англ. "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<br>  minor_version  : mp42<br>  minor_version  :0<br>  compatible_brands: isommp42<br>  creation_time : 2014-10-22 21:28:02<br>Длительность: 2014-10-22 21:28:02<br>Длительность: 2014-10-22 21:28:02<br>Длительность: 00:00:15.655, start: 0.000000, bitrate: 3193 kb/s</code></pre><br><br>Обратите внимание на последнюю строку в массиве Длительность" уже на русском, значит она сюда попадает из другой части программы (строка с ID #5789352.005851CC в проекте Radialix). А по адресу 008DF26B (в Radialix"e 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


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

    Рисунок 17


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

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

    Рисунок 18


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

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

    Рисунок 19


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

    Рисунок 20


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

    Рисунок 21


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

    Вот и все. Желаю удачи!
    NNK_RTR нравится это сообщение.

    Кто ищет, тот всегда найдет!

    1 ноября 2014 - 10:42 / #1

Статистика форума, пользователей онлайн: 1 (за последние 20 минут)

Создано тем
1197
Всего сообщений
15762
Пользователей
18014
Новый участник
Markhabayev