Войти
  1. ВКонтакте
  2. Facebook
  1. »
  2. »
  3. »
  4. WonderFox DVD Video Converter
Скрыть панель справаПоказать панель справа

WonderFox DVD Video Converter

Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 1 отправлено 17:47, 01.11.2014
WonderFox DVD Video Converter

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


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

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

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

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

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

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 Settings\Users\Мои документы\WonderFox Soft\WonderFox DVD Video Converter\Download_Video\NASA_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 (в 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 (три на формат длительности вида "[font=Courier]00:00:00.000
" и три на формат вида "00:00.000"):

Рисунок 20


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

Рисунок 21


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

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

Последний раз редактировал WYLEK 15:58, 13.02.2017

------------------------------------------
Кто ищет, тот всегда найдет!
 
Перейти
Найти

Доступ закрыт.

  1. Вам запрещено отвечать в темах данного форума.

Последние темы

  1. Radialix 3
    Автор: pangasiys Сегодня, 13:27
  2. PartitionGuru 4.9.3.409_х86_х64_RUS
    Автор: Lupik2 Вчера, 11:30
  3. Задавайте вопросы по русификации и мы...
    Автор: Xabib2302 23:24, 18.11.2017
  4. Поговорим?
    Автор: kurkoff1965 11:15, 18.11.2017
  5. QTranslate 5.4.1 + Portable
    Автор: gazon01 07:21, 15.11.2017
  6. Promt Professional 9.0 Giant &...
    Автор: WYLEK 15:04, 14.11.2017

Изменения статуса

  1. Никто не менял личный статус.