Войти
  1. ВКонтакте
  2. Facebook
  1. »
  2. »
  3. »
  4. Анализ ресурсов программ от ArcSoft
Скрыть панель справаПоказать панель справа

Анализ ресурсов программ от ArcSoft

Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 1 отправлено 15:56, 26.10.2012
Анализ ресурсов программ от ArcSoft


Удлиняем строки в пределах возможного


Скажу сразу, работа предстоит кропотливая, требующая внимательности и аккуратности. Шаляй-валяй не прокатит. Но за терпение и труд вы будете вознаграждены полученным результатом. Основные инструменты для работы я выбрал такие: текстовый редактор AkelPad и шестнадцатеричный редактор WinHex (пропатченная версия для поддержки кириллицы). Рекомендую сделать резервные копии файлов, над которыми вы будете работать. Это избавит вас от лишних операций по установке и удалению программы, если у вас что-то пойдет не так или вы допустите ошибку. Поехали...

Рассматриваем программу MediaConverter 7.5. Я не стану описывать поиск строк и ресурсов для перевода. Думаю вы с этим справились без меня и уже знаете, что ресурсы программы находятся в файлах с расширением *.aui, которые лежат в папке UI каталога установки. К примеру, для исследования я взял файл MainFrame.aui. В этом файле находятся строки главного окна программы. Откроем файл в НЕХ-редакторе. Посмотрим внимательно на заголовок файла. Если вы когда-либо работали с редакторами ресурсов, то наверняка заметили, что все обычные ресурсы программы имеют схожую структуру: секция значков, секция изображений, секция диалогов, секция строк и т.д.). Когда я начал разбираться с этим форматом, то увидел здесь похожую структуру: в начале файла перечислены секции, из которых он состоит.

Спойлер [+]


Поиск строк показал, что все они находятся в секции text. Больше нигде в файле строки не встречаются. Перейдем в эту секцию. Это можно сделать задав в поиске название этой секции.

Спойлер [+]


Как вы можете видеть, сначала по адресу 000049Е0 идет название секции - text, затем, с адреса 000049F3, в виде таблицы перечисляются номера строк и соответствующее им смещения, и в конце с адреса 00004B40, последовательно друг за другом, идут сами строки, разделенные символом NUL [00]. Строки имеют формат Unicode, т.е. одному символу соответствует 2 байта. Таким образом для перевода на русский необходимо выполнить работу над этими строками. Так как формат *.aui нестандартный, то ни один из редакторов ресурсов вам не поможет. Делать все надо в НЕХ-редакторе. Огромный минус такого перевода: вы ограничены длиной строки на английском. Если, к примеру взять слово "Tools" (5 символов - в Unicode 10 байт), то на русском языке это будет "Инструменты" (11 символов - в Unicode 22 байта!). Переводчику приходится делать сокращение слова. В итоге интерфейс программы будет состоять из одних сокращений и ею будет неприятно пользоваться. Что же можно сделать?

Для этого нужно просто понять принцип, по которому строки записаны в ресурсе. Обратимся к таблице номеров и смещений. Посмотрите на следующий рисунок:

Спойлер [+]


Если вы внимательно посмотрите на этот сегмент данных то легко увидите закономерность: это порядковое возрастание номеров в шестнадцатеричной системе счисления. На рисунке я уже показал вам нулевую строку [00] (отсчет строк начинается с нуля), за ней идет первая строка [01], потом вторая [02] и т.д. Это хорошо видно по цифрам. Также хорошо видно повторение одного и того же байта [01] через одинаковые интервалы, в которых находятся номера строк и смещения. Байтом [01], кто сталкивался с форматом хранения баз данных, обозначается столбец или строка (в данном случае строки). Имея воображение можно сразу представить перед собой простую таблицу:

[01]{NUL}<НОМЕР СТРОКИ 00>{NUL}<СМЕЩЕНИЕ>{NUL}
[01]{NUL}<НОМЕР СТРОКИ 01>{NUL}<СМЕЩЕНИЕ>{NUL}
[01]{NUL}<НОМЕР СТРОКИ 02>{NUL}<СМЕЩЕНИЕ>{NUL}
...
[01]{NUL}<НОМЕР СТРОКИ n>{NUL}<СМЕЩЕНИЕ>{NUL}

где {NUL} - это разделитель (байты [00]) между столбцами и далее между строками.

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

Смещения, что это? Говоря простым языком - это адрес определенной строки относительно адреса нулевой строки. Вот смотрите - нулевая строка (User Center):

Спойлер [+]


Хорошо видно: порядковый номер - 00, смещение - это первая строка в массиве строк, поэтому количество байт [0000] (не забывайте про разделитель между номером строки и смещением). Таким образом полный вид получается [00 00 00 00]. Сама строка начинается по адресу 00004В40. Это начальный адрес для всех последующих строк в массиве. Запоминаем, количество байт до каждой последующей строки будет вестись именно от этого адреса. Еще не забывайте, что формат строк - Unicode (1 символ = 2 байта).

Смотрим следующую строку - "An update is available.". В таблице она записана как [01 00 00 18], т.е. первая строка и количество байт 18 до позиции, где она находится, относительно адреса нулевой строки.

Спойлер [+]


Еще раз внимательно. Нулевая строка начинается по адресу 00004B40. Первая строка начинается по адресу 00004B58. Выполняем простое арифметическое действие 00004B58 - 00004B40 = 18 (калькулятор Windows в инженерном режиме HEX). И именно это число указано в качестве смещения для первой строки - [01 00 00 18]. Также это смещение можно узнать с помощью самого НЕХ-редактора. Поставьте курсор на адрес 00004B40, удерживая левую кнопку нажатой начните вести мышку до адреса 00004B58. Редактор, в правом нижнем углу, покажет вам количество выделенных байт. Это и будет смещение до первой строки.

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

Эти знания позволяют нам сделать более-менее нормальный перевод, без сокращений (по возможности). Я написал "по возможности", т.к. мы еще ограничены размерами секции и размерами элементов управления форм программы. Мы не можем увеличить секции, так ка это повлечет за собой затирание и смещение последующих секций, а в итоге неработоспособность программы. Пока это маленькая победа на гоблином. За счет манипуляции строками внутри секции, можно добиться вполне приемлемого перевода. Например, первая строка "An update is available." содержит 23 символа, в юникоде это 46 байт. На русский эту фразу можно перевести как "Доступно обновление." - 20 символов или 40 байт. Экономия 3 символа или 6 байт. Так постепенно можно набрать недостающую длину строк для перевода на русский.

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

Я использовал редактор AkelPad, т.к. он при выборе документа позволяет указать его кодировку.

Запустите редактор и откройте в нем файл MainFrame.aui, указав кодировку 1200 (UTF-16 LE) (в окне выбора файла снимите флажок с опции "Автовыбор" и из выпадающего списка выберите указанную кодировку). Программа может сообщить, что файл является бинарным. Ничего страшного, мы ничего с ним делать не будем, только скопируем строки. Итак открыли. Включите опцию автопереноса по словам и найдите участок с текстом. Можно воспользоваться поиском, указав к примеру слово "User" из нулевой строки.

Спойлер [+]


Создайте новый документ в той же самой кодировке и назовите его, например, mainframe_en.txt. В него мы скопируем текстовые строки из файла MainFrame.aui.
Выделите текстовую часть строк (на рисунке обведено красным), скопируйте их и вставьте в новый файл. Я не рекомендую переводить прямо в файле MainFrame.aui. Нам необходимо будет готовить новую таблицу смещений для каждой из строк, а это неудобно делать в исходном файле, к тому же очень отвлекает нагромождение лишних символов.

Итак вставили. Теперь отформатируйте текст так, чтобы каждая значащая строка находилась отдельно, т.е. сделайте список. Позаботьтесь о том, чтобы в начале и в конце строк не было никаких лишних символов, пробелов и прочего. У вас должен получиться примерно вот такой список строк:

Спойлер [+]


Далее я сохранил полученный файл, а затем сохранил его под другим именем - mainframe_ru.txt, т.е. сделал копию. Здесь будем делать перевод на русский. Это необходимо для последующей подгонки суммарного количества символов перевода по оригинальному тексту. Откройте файл mainframe_en.txt с английским текстом, выделите весь текст и гляньте на суммарное количество символов - 943. На это число нам необходимо ориентироваться при переводе на русский:

Спойлер [+]


Переводим строки в файле mainframe_ru.txt и стараемся уложиться в отведенные границы текста. Для данного примера я не сильно старался над переводом. Главное, чтобы вы поняли для чего все это делается. После перевода, выделите весь текст и посмотрите на суммарное количество символов. У меня получилось в окончательном варианте 940 символов:

Спойлер [+]


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

Идем дальше. Сохраните документ с переводом, а затем сохраните его под другим именем, я указал имя mainframe_ru_1string.txt. В файле mainframe_ru.txt мы позже будем делать таблицу смещений. А сейчас займемся файлом mainframe_ru_1string.txt. Если помните, то строки в файле MainFrame.aui размещаются последовательно через разделитель NUL [00] (в юникоде [00 00]). Поэтому наша задача свести строки перевода в одну строку через какой-нибудь разделитель. Потом, в НЕХ-редакторе, мы его заменим. Я выбрал в качестве разделителя символ "\" (обратная косая черта). По началу я выбрал символ "=" (равно), но когда открыл файл в НЕХ-редакторе, то увидел (вы чуть ниже тоже увидите), что я поступил неверно, т.к. русские буквы шестнадцатеричного юникода это сплошные арифметические символы и знаки препинания. Лучшим разделителем в данном случае будет именно этот символ. После форматирования текста мы приводим его к такому виду:

Спойлер [+]


Для наглядности я выделил разделитель "\". Сохраните изменения в файле. В итоге мы имеем:
  • 1) файл mainframe_en.txt со строками на английском языке в виде списка;
    2) файл mainframe_ru.txt с переводом на русский, строки в виде списка;
    3) файл mainframe_ru_1string.txt, где все строки сведены в одну через разделитель "\".
    Все файлы в кодировке 1200 (UTF-16 LE).


Продолжим. Откройте файл mainframe_ru_1string.txt в редакторе HEX.

Спойлер [+]


Как видите знак "=" в качестве разделителя не подходит. В юникоде это часть русской буквы "н" (код [3D04]), а в кодировке ANSI ASCII байт 3D - это символ "=" (равно). :) Вот поэтому символ "\" как раз отлично подходит. Теперь наша задача составить для новых строки таблицу смещений. Чтобы легче было ориентироваться по текстовой части, переключите отображение кодировки в НЕХ-редакторе на Unicode.

Спойлер [+]


Теперь, когда хорошо видно текст и разделитель "\" между строками, можно легко составить таблицу смещений. Нулевая строка у нас "Информационный центр", а первая "Доступно обновление." Установите курсор на первую букву первой строки, т.е. 0000002А. Это и есть смещение на первую строку - 2A. Фактически для данного файла это является адресом строки.

Спойлер [+]


Откройте файл mainframe_ru.txt и для этой строки запишите смещение .

Вторая строка у нас "Инструменты". Установите курсор на первую букву и вы запишите смещение для этой строки - 54.

Спойлер [+]


Подобным образом запишите смещения для всех последующих строк. Символ слеша вам поможет быстро ориентироваться в текстовой части НЕХ-редактора. Созданный нами отдельный файл с переведенными строками, избавит нас от изнурительной работы по вычислению смещений. Именно поэтому требовалось провернуть всю эту работу. Я вас не заставляю поступать также, просто рассказываю свои действия и причину своих поступков. Если вы имеете другое мнение или опыт, поделитесь им.

В итоге, в файле mainframe_ru.txt у вас должна получиться такая табличка:

Спойлер [+]


После этого, в файле mainframe_ru_1string.txt, с помощью НЕХ-редатора можно выполнить замену нашего разделителя на тот, который используется в файле MainFrame.aui. Код символа обратного слеша - . Его меняем на код 00 (NUL).

Спойлер [+]


Получили вот такой файл:

Спойлер [+]


Теперь сделаем в файле MainFrame.aui замену блока строк на подготовленный нами. Откройте его также в НЕХ-редакторе. Перейдите на вкладку с файлом mainframe_ru_1string.txt и выделите все байты (кодировку редактора я снова переключил на ANSI ASCII):

Спойлер [+]


Обратите внимание на размер блока - 706 байт. Теперь скопируйте выделенные байты в буфер обмена, нажав клавиши [Ctrl+Shift+C]. Перейдите на вкладку с файлом MainFrame.aui выделите в нем текстовый блок с адреса 00004B40 по 0000524D включительно.

Спойлер [+]


Смотрим размер блока - 70Е байт. Наш блок на 8 байт меньше исходного, поэтому можно смело выполнить его замену. Установите курсор на начало выделенной области в файле MainFrame.aui (адрес 00004B40) и нажмите на клавиатуре комбинацию [Ctrl+B] - запись бинарных данных из буфера обмена на место выделенных. Подтвердите операцию.

Теперь необходимо подкорректировать конец блока, который мы вставили. Опуститесь в конец секции text. По различию цвета хорошо видно, где записаны новые данные, а где остались старые. Как вы помните наш блок со строками на 8 байт меньше оригинального. Требуется отделить разделителем NUL [00] (в юникоде [00 00]) конец новой секции от старой, иначе в последней строке при работающей программе появится мусор.

Спойлер [+]


Вы видите у нас там остаток от старых данных в виде цепочки байт 6Е00740073002Е00. Два байта [6Е 00] меняем на [00 00]. Остальные можно оставить без изменений. Я не стал рисковать заменой оставшихся байт на нули, т.к. просмотрев весь файл и увидел, что разделение между секциями ресурсов составляет 5 байт. Как поведет себя программа, если оно будет другим, я не знаю.

Наконец осталось перенести таблицу с новыми смещениями строк. Открываем рядом с окном НЕХ-редактора текстовый документ mainframe_ru.txt и переносим значения смещений. Здесь необходимо быть очень внимательным. Порядок записи смещений прямой.

Спойлер [+]


Сохраняем изменения в файле MainFrame.aui, но файл пока не закрывайте, возможно придется делать исправления.

Проверяем что у нас получилось, запустив программу:

Спойлер [+]


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

Спойлер [+]


Просмотрите всю секцию и попробуйте визуально оценить данные, характеризующие размер шрифта. Я, например, обратил внимание на следующее:

Спойлер [+]


В любом случае придется экспериментировать. Здесь, наиболее часто, для остальных строк со шрифтами используется размер 0D (13), вероятно что-то вроде стандарта. Поэтому я, не долго думая, заменил байт 0F по адресу 00005463 на байт 0D.

Спойлер [+]


Сохранил изменения и запустил программу.

Спойлер [+]


Угадал... :) Теперь совсем другое дело.

В общем, думаю по такой технологии можно нормально перевести продукцию этого разработчика. Может чего не доглядел или не учел. Первый опыт был блин комом. Это второй блин - говорят знакомым. За вами остается третий блин. Дерзайте!

Если смотреть этот формат файла дальше, на примере MainFrame.aui, то в секции lyr находятся изображения. Правда эти изображения не имеют заголовков, что затрудняет их идентификацию (начало - конец рисунка). Но это с моей колокольни. У меня мало опыта по расшифровке ресурсов. Так что есть еще где развернуться пытливым умам и любителям "хочу все знать". Принимайте эстафету! Хотя, может я и не открыл Америки, и мои потуги на этом поприще выглядят жалкими по сравнению с действиями профессионалов, но могу вам сказать точно, что в моем багаже прибыло и я перешел на следующий уровень.

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

Последний раз редактировал WYLEK 18:46, 01.09.2017

------------------------------------------
Кто ищет, тот всегда найдет!
Сталкер
  1. Офлайн
  2. Мастер
  3. 146 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 2 отправлено 17:05, 26.10.2012


Надо пробовать (опять этот страшный НЕХ )

Последний раз редактировал WYLEK 18:43, 01.09.2017
Сталкер
  1. Офлайн
  2. Стажер
  3. 113 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 3 отправлено 19:12, 26.10.2012
Сразу всё и не запомниш.Надо пробывать всё по очереди :o.

Последний раз редактировал Xotabush 19:55, 26.10.2012
Легенда
  1. Офлайн
  2. Админ
  3. 1664 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 4 отправлено 22:10, 26.10.2012
Ты все таки добил это расширение! Кстати, такое построение кода ресурсов я уже встречал с другим расширением вроде. Это был плагин какой то для фото. На стрельце сейчас перерыл все новости одного модера, но не нашел этой проги. Я тогда поцапался с ним из-за гоблинов в переводе этой проги. Начал было переводить этот плагин (пошел по такому же пути как ты), но, ресурсов много, и вручную лопатить желание пропало. А благодаря твоему толковому и подробному мануалу, возможно и найдется желающий положить на лопатки этих парней с ихним расширением! А может и сам сделаешь перевод этого конвертера.


------------------------------------------
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 5 отправлено 00:28, 27.10.2012
Quote (WYLEK)
А может и сам сделаешь перевод этого конвертера.

Нет, я не буду. Даю возможность сделать это другим. Тем более у этого разработчика довольно широкий арсенал программ. Перефразирую крылатое изречение: "Налетай, торопись, переводи ... живопись!".


------------------------------------------
Кто ищет, тот всегда найдет!
Охотник
  1. Офлайн
  2. Знаток
  3. 234 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 6 отправлено 18:41, 27.10.2012
Да уж сложно все это запомнить а уж русифицировать подавно сложно
Охотник
  1. Офлайн
  2. Знаток
  3. 234 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 7 отправлено 19:21, 29.10.2012
тут нашел одну старую прогу еще 2007 XP по локализации .aui AGE3D UI Editor Beta - попробовал в ней хоть один aiu так ни чего в ней не понял, кто знает тот может поимет
Легенда
  1. Офлайн
  2. Админ
  3. 1664 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 8 отправлено 22:13, 29.10.2012
Quote (ruslangxp)
тут нашел одну старую прогу еще 2007 XP по локализации .aui AGE3D UI Editor Beta - попробовал в ней хоть один aiu так ни чего в ней не понял, кто знает тот может поимет


Это не то sad

>>Данная программа позволяет вам разрабатывать и составлять виджеты и окна, используя на экранные формы, используя такие же виджеты, которые будут использованы в вашем приложении. Компоненты созданные с UI Editor могут быть просмотрены, так что вы можете убедиться в том, что они выглядят так, как вам надо. Важной функцией является возможность интегрирования GUI в вашу графическую сцену и визуализация сцен в ваш GUI, (например: графические окна).

Файловый формат .aui используется UI Editor как XML файл, который описывает все виджеты, добавленные к вашему проекту.<<


------------------------------------------
 
Перейти
Найти

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

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

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

  1. SplitView 2018 RUS
    Автор: LinXP Вчера, 22:17
  2. Debut Video Capture Pro 5.00 Rus
    Автор: 78Sergey Вчера, 21:53
  3. Поговорим?
    Автор: LinXP Вчера, 20:31
  4. Задавайте вопросы по русификации и мы...
    Автор: 007 Вчера, 19:03
  5. TurboMosaic 3.0.4 Professional...
    Автор: troa Вчера, 11:26
  6. Sisulizer Enterprise Edition v3.0
    Автор: LinXP 00:13, 13.01.2018

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

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