WonderFox DVD Video Converter
WonderFox DVD Video ConverterХотите наслаждаться готовым фильмом с вашей семьей вечером, вместо того чтобы ждать
-
Оффлайн
Автор темы
Звание: Ветеран
Команда сайта
Сообщений: 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 Длительность" уже на русском, значит она сюда попадает из другой части программы (строка с 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