Правка "невидимых" элементов управления

Хорошая статья. Только не для всех - новичкам сложновата для понимания будет. Я
  1. Оффлайн

    Solenij

    Звание: Новичок

    Проверенные

    Сообщений: 53

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

    Рейтинг: 2

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

    Баллы: 51

    Страна: не указана!

    Был: 2020-04-27 11:44

    Лайков: 2

    Хорошая статья. Только не для всех - новичкам сложновата для понимания будет. Я бы вообще предложил устанавливать уровень статей - базовый уровень, продвинутый уровень, ну и можно еще профессиональный уровень. Так проще будет ориентироваться в статьях многим пользователям, которые только начинают изучать локализацию.
    greg нравится это сообщение.
    13 февраля 2013 - 09:47 / #1
  2. Оффлайн

    Автор темы

    Leserg

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

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

    Сообщений: 929

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

    Рейтинг: 8

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

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Правка "невидимых" элементов управления
    Пример изменения размеров и координат




    Введение
    ---------------

    Наверняка вам знакома такая ситуация: программа, которую вы собрались переводить, не содержит визуальных ресурсов. Открыв такой файл в редакторе ресурсов, вы кроме манифеста и информации о версии ничего больше не увидите. Такие программы написаны на С/С++. Формирование элементов интерфейса таких приложений осуществляется средствами WinAPI, а в последнее время разработчики стали использовать библиотеки виджетов (QT), которые подключаются к среде разработки в виде дополнительных компонентов. Ясно одно, все строки в подобных программах жестко-закодированные и перевод вполне можно сделать при помощи редактора Radialix и дизассемблера IDA. Есть и другие инструменты, но они уже давно не обновлялись и устарели. Также перевод можно сделать вручную в одном НЕХ-редакторе. Но я не буду касаться вопроса перевода строк, как и чем это делать, каждый для себя решит сам. Хочу остановиться на таком моменте: после перевода может случится так, что переведенный текст не помещается в отведенные границы элементов управления. Изменить же размеры и координаты этих элементов нет возможности, так как они недоступны в визуальном виде, редакторы попросту их не видят.

    Как же быть?

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

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

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

    К сожалению, общих алгоритмов решения таких задач нет, каждая программа индивидуальна и в каждом конкретном случае требует всестороннего анализа. На следующем примере перевода плагина Neat Video я лишь постараюсь вас ознакомить с одним из частных случаев. Возможно, если где-то вам встретится подобная ситуация, то вы сможете достойно из неё выйти.

    Инструменты
    ---------------------

    При работе над переводом плагина Neat Video я использовал:
    1) редактор Radialix с плагином RDMAP к дизассемблеру IDA (и конечно сам дизассемблер);
    2) утилита WinSpy++ v1.7;
    3) НЕХ-редактор WinHex (хотя можно обойтись без него и сделать все в программе IDA).

    Важное замечание: нам потребуется работать с дизассемблированным кодом в программе IDA, поэтому после создания списка жестко-закодированных строк, необходимо сохранить проект IDA. Я всегда так поступаю на тот случай, если вдруг потребуется решать нетривиальные задачи, как например эта. Тогда можно быстро, прямо из проекта Radialix, переходить в проект IDA по выбранному адресу или ссылке. Это очень удобно.

    Правка
    -----------

    После перевода Neat Video и его проверки, в одном из окошек интерфейса обнаружился небольшой баг - строка оказалась обрезанной (не поместилось две буквы 

    Рис. 1



    В данном случае, элементом управления с этой надписью является элемент CheckBox (Флажок). Если его сдвинуть немного влево и увеличить ширину, то текст надписи поместится. Для симметричности придется также подвинуть и верхний элемент с надписью "Высокое качество". Самый простой способ найти желаемый элемент в коде программы - это произвести поиск по его ID-номеру. Выяснить этот номер может помочь утилита WinSpy++. Не прекращая работу программы (плагина) запустим утилиту, захватим мышкой "прицел" и наведем на этот элемент. Утилита отобразит свойства выбранного элемента:

    Рис. 2



    Но тут нас ждет неудача. Как видите, здесь значение свойства Control ID равно нулю (на рисунке показано красной рамкой), а также видно класс элемента - QWidget. Если бы приложение было написано с применением инструментария WinAPI, то класс элемента был бы указан явно - CheckBox, и он бы имел свой собственный ID-номер. Но в данном случае программисты использовали инструментарий QT и все элементы управления имеют один класс - QWidget. Жаль, поиск элемента по ID-номеру отпадает. Но можно выяснить координаты и размеры элемента и произвести поиск по этим данным. Нажмите кнопку [...] в утилите WinSpy++, напротив свойства Rectangle (см. рис. 2). Откроется окошко с координатами и размерами элемента в пикселях. Подобным образом я выяснил все размеры необходимых элементов и преобразовал значения в шестнадцатеричные. Нам это понадобится при анализе дизассемблированного кода плагина.

    Как еще можно найти искомый элемент? Мы точно знаем, что это элемент CheckBox, значит программа должна их как-то распознавать, если он не один. Я решил проверить наличие текста "CheckBox" в жестко-закодированных строках проекта Radialix. Поиск показал следующее:

    Рис. 3



    Рамкой синего цвета я указал искомые элементы управления. Вы спросите, как я это узнал. Отвечу. Обычно программисты к названиям элементов добавляют сокращенную надпись функции, которая на них возложена. Это намного упрощает отладку программы на этапе её создания. Поэтому очень просто догадаться, что приставки перед словом "CheckBox" обозначают надписи этих элементов в интерфейсе приложения.

    Рис. 4



    Ранее я говорил о том, что с помощью утилиты WinSpy++ необходимо выяснить размеры и координаты этих элементов управления (желательно было чтобы вы записывали себе где-то эти данные). Теперь составим себе небольшой макет (я обычно делаю его в графическом редакторе):

    Рис. 5



    Очевидно, что предстоит менять ширину (W) всех элементов "CheckBox", а у двух еще и координату Х. На рисунке показан еще размер . Я о нем узнал во время редактирования свойств элемента и предполагаю, что это правая граница элемента, точно не скажу, мало опыта. Но если его не изменить, то элемент будет перекрывать собой следующий. На основании этих данных можно будет ориентироваться в дизассемблерном коде программы, а также сделать предварительные расчеты значений для новых размеров и положения.

    Теперь перейдем в редактор строк Radialix"a (см. рис. 6) к найденным элементам управления. Я установил на них закладки, чтобы долго не искать.

    Рис. 6



    ID-строки - это адрес размещения данной строки в коде программы, а ссылка - это адрес, откуда идет обращение к этой строке. Нам в первую очередь необходимо изучить именно ссылку. По идее, если идет вызов названия элемента управления, то где-то рядом будет идти его формирование для размещения в интерфейсе программы (установка размеров и координат).

    Рассмотрим первый элемент управления smoothEdgesCheckBox (у меня на нем установлена закладка №9). В проекте Radialix сделайте двойной клик по адресу ссылки, а затем, в открывшемся окошке, снова кликните дважды по ссылке.

    Рис. 7



    После этого вы перейдете по выбранной ссылке в код программы дизассемблера IDA и окажетесь по адресу 1009863D. Что необходимо искать? В первую очередь ищите рядом команды PUSH со значениями установленных размеров элемента управления (мы их определили при помощи утилиты WinSpy++). Например, данный элемент управления имеет ширину 115 пикселей. В шестнадцатеричном формате это число 73h. Значит должна быть команда PUSH 73h. Чуть ниже, по адресу 100986В4, вы увидите эту команду, а перед ней, по адресу 100986В0, будет команда PUSH 13h. Это не что иное как высота элемента - в десятичном формате число 19. Теперь дело техники. Меняем значения на желаемые. Я это делал в редакторе WinHex с уже созданным локализованным файлом. А вот значение было установлено опытным путем.

    Рис. 8



    Аналогичным образом действуем с остальными элементами управления и устанавливаем свои значения.

    Рис. 9



    Рис. 10



    Рис. 11



    В результате сделанных правок, мы получим корректное отображение переведенных строк.

    Рис. 12



    Из своего небольшого опыта исследования кода программ на предмет изменения размеров элементов управления, недоступных визуальным редакторам, могу сказать, что обычно размеры (ширина и высота) элементов управления задаются командой PUSH.

    На этом все. 

    Желаю вам успехов!
    Leserg


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

    13 февраля 2013 - 12:39 / #2
  3. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

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

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Класнный материал! По нему у меня получилось в одном 3D редакторе изменить размер панели инструментов с 2-х рядных кнопочек до 3-х рядных. Теперь больше влазит кнопочек тудаhappy . Респект! От себя добавлю, что расположение кнопочек выставлял не методом подбора координат, а все понастраивал через WinSpy++, потом позаписывал координаты и потом вбил в код эти значения. Редактор написан на С++.
    13 февраля 2013 - 18:35 / #3
  4. Оффлайн

    WYLEK

    Звание: Легенда

    Админ

    Сообщений: 2179

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

    Рейтинг: 10

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

    Баллы: 3405

    Был: 2024-04-28 20:29

    Лайков: 196

    Как всегда все прекрасно

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

    Цитата: Nexus
    По нему у меня получилось в одном 3D редакторе изменить размер панели инструментов




    А мне пришлось другим путем идти - заменить шрифт, окна не вышло перетянуть. В проге на каждый экран свой шрифт можно установить(разделением ссылки)

    Верхнее меню с другим шрифтом.
    Сообщение отредактировал 9 февраля 2017 - 14:31

    13 февраля 2013 - 20:32 / #4
  5. Оффлайн

    Автор темы

    Leserg

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

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

    Сообщений: 929

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

    Рейтинг: 8

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

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Пока один ты отдуёшся за всех

    Та не... Это я написал, чтоб самому не забыть и, как говорится, для накопления статистических данных.wink Чем больше будет примеров, тем легче будет ориентироваться по таким вопросам в будущем . Потом может появится какой-то общий алгоритм.

    Я бы вообще предложил устанавливать уровень статей - базовый уровень, продвинутый уровень, ну и можно еще профессиональный уровень.

    Да я хотел было написать, но в голову ничего не пришло, как это сформулировать. Ясно, что не для начинающих...

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

    14 февраля 2013 - 20:02 / #5
  6. Оффлайн

    Nexus

    Забанен

    Сообщений: 611

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

    Репа: 0

    Баллы: 0

    Был: 2022-07-03 23:07

    Лайков: 7

    Хорошо б было втиснуть материал в PDF, чтоб под рукой всегда было, так как это новые возможности модификации программ и по этому нет нигде никакого материала. А, хотя я и сам могу скатать себе...
       Начал писать статью по борьбе с кряками, будет нестолько частей, первый раз в жизни пишуhappy , мммм тяжело это писать статьи, с оперы ""Тяжело начать, сложнее закончить", но ниче, процесс пошел. В первой части опишу издевательство над WinHex.
       P.S. Не могу никому увеличить репу через Оперу! Что такое, неделю назад нормально все было, переустановка браузера не помогла.
    14 февраля 2013 - 21:27 / #6

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

---
Создано тем
1177
Всего сообщений
15352
Пользователей
17856
Новый участник
Daniel7375ysk