avatar_Nexus

QT приложения и методы их модификации

Автор Nexus, 10 сентября 2014, 21:52:00

« | Ох уж эти файлы в формате QM »

NexusАвтор темы

QT приложения и методы их модификации


Эта тема создана для желающих узнать что и как делать с QT библиотеками при их капризной работе с русскими строками. Ветка временная, потому как у меня нету сейчас времени писать полноценные руководства по разборке этих библиотек. Поэтому буду просто выкладывать скрины кода и краткие пояснения к ним что и как нужно делать, все это буду делать постепенно и будем обсуждать здесь все ньюансы этой головной боли русификаторщиков. Получается что-то типа блога или живого журнала :D Со временем возможно и напишу полноценный мануал.
Благодарю за понимание.

Приводится пример модификации QT библиотеки версии 4.4.3.0

Итак, имеется библиотека QtCore4.dll. Вся беда в ней. Грузим этот объект в отладчик Olly Debugger 2.01, кто не знает - для анализа кода жмем Ctrl+A, или выбираем через контекстное меню Analysis -> Analyse code.
После через контекстное меню выбираем Search for -> Names, или Ctrl+N. Вывалится список функций, которые экспортирует данная библиотека. То есть, будут показаны имена функций, которые находятся внутри библиотеки и которые могут быть использованы другими компонентами программы. Для постановления списка по алфавиту щелкнем на столбик Name.

Показать / Скрыть текст
[свернуть]

Далее ищем функцию fromLatin1_helper. Прикол в том, что в разных версиях QT библиотек это название функции может содержать разные дополнительные символы. Например, в версии библиотеки 4.4.3.0, которую я использую для этого примера, полное название будет как ?fromLatin1_helper@QString@@CAPAUData@1@PBDH@Z.
Чтобы узнать в любой библиотеке разных версий полное имя функции, можно через HEX редактор искать строку fromLatin1_helper, в результате найдется строка с полным именем функции.
Итак, в списке нашли эту функцию. Переходим в ее код, щелкая по ее названию.
Мы попадаем в код функции, куда приходят все текстовые строки, которые при переводе отображаются крякозяблями. На скрине весь ее код выделен серым цветом.

Показать / Скрыть текст
[свернуть]

Так вот, данная функция, точнее, эта процедура под названием fromLatin1_helper как раз и мешает переводчикам локализовать QT приложения. Если быть точным, то мешает не сама процедура, а небольшой кусочек ее кода, который выделен на рисунке серым цветом.

Показать / Скрыть текст
[свернуть]

scikod

Наверное всё-таки стоит начать с начала. А именно со стандартного способа перевода.

Переводы у Qt хранятся в двух типах файлов с суффиксом .ts и .qm. Если вам повезло и есть файлы с суффиксом .ts, то всё очень хорошо -- это исходные файлы для перевода. А вот если есть только файлы с суффиксом .qm, то тоже расстраиваться не надо -- их тоже можно использовать.

Для правки переводов нам понадобится Qt Linguist. Это прога есть в Qt SDK, который проще всего взять из своего репа. Если вы -- такой неудачник, что репа у вас нет, то идите на сайт Qt и берите там. Бесплатно.

Теперь ищем подходящий файл для перевода. Если есть файл с суффиксом _ru (например, texmaker_ru.qm), а лучше _ru_RU (например, texmaker_ru_RU.qm), то он нам и нужен.

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

Интерфейс Qt Linguist очень прост, да ещё русскому обучен -- сами разберётесь. Только сделаю пометку, что такое контекст: это условно говоря, то окно к которому относится перевод.

Полученный перевод надо не просто сохранить в файл с суффиксом .ts, а скомпилировать!

Сам формат файлов QM можно посмотреть в сырцах lrelease по ключу -qm.

WYLEK

ЦитироватьНаверное всё-таки стоит начать с начала. А именно со стандартного способа перевода.
Тут речь будет идти не за перевод, а за кодировку исполняемых файлов  Qt :biggrin:  
Перевод файлов с расширением .ts и .qm не составляет труда.

Sergey_Malkov

Вот, вот! перевести та мы могем, а вот настроить кодировку в Qt библиотеке(для корректного отображения текста) вот это и ждем :wow2:

NexusАвтор темы

Цитата: scikodПереводы у Qt хранятся в двух типах файлов с суффиксом .ts и .qm.


Далеко не все QT программы поддерживают QM и TS локали, это уже как автор проги задумал. Тут речь идет о прогах, которым даже Радиаликс со своим патчингом не поможет.

Цитата: scikodДля правки переводов нам понадобится Qt Linguist. Это прога есть в Qt SDK, который проще всего взять из своего репа. Если вы -- такой неудачник, что репа у вас нет, то идите на сайт Qt и берите там. Бесплатно.


У нас на сайте есть в разделе Инструменты. Да и Радиаликс может их редактировать.

Цитата: scikodТеперь ищем подходящий файл для перевода. Если есть файл с суффиксом _ru (например, texmaker_ru.qm), а лучше _ru_RU (например, texmaker_ru_RU.qm), то он нам и нужен. Если такого нет, то устроит и любой другой. Только не забудьте переименовать его суффикс на нужный и исправить язык перевода в свойствах.


Тут есть один специфический ньюанс. Если программа поддерживает .qm файлы, то сначала ищет эти файлы с суффиксом, которое соответствует региональным настройкам системы, проще говроря, если у системы язык Русский, то ищет name_ru.qm, если же стоит язык английский, то ищет name_en.qm. Ну а если не находятся файлы с нужным суффиксом, то программа на крайняк ищет стандартный QM языковый файл без каких-то суффиксов - name.qm. Так заложен механизм работы QT программ. Поэтому для русификации всегда предпочтительно делать QM файлы без суффиксов, так как прога вегда будет отображать русский текст на системах с любыми языковыми параметрами.

Leserg

Еще один вариант нахождения проблемного участка кода. Обратите внимание на константу FFE0h (65504d). Она встречается в файле QtCore4.dll всего два раза! Задаем её поиск и рядом с одной из них будет проблемный участок кода.

Показать / Скрыть текст
[свернуть]
Кто ищет, тот всегда найдет!

NexusАвтор темы

Пока что данную тему развивать не буду из-за того, что начал писать полноценное руководство. Когда его закончу - хрен его ведает...
 Но данная ветка скорее всего была недальновидной глупостью. Так что пока я здесь писать ничего не буду.

Leserg

ЦитироватьПока что данную тему развивать не буду из-за того, что начал писать полноценное руководство. Когда его закончу - хрен его ведает...
Но данная ветка скорее всего была недальновидной глупостью.
Во как?! :surprised:  
Почему глупость? Программ QT становится все больше и больше, а проблема с кодировками никуда не девается. Ясно, что вопрос очень сложный, но хоть вот такие конкретные решения давали бы пищу для самостоятельного изучения. Надеюсь, ты найдешь в себе силы поделиться с нами хоть малой долей информации. Желаю удачи в осуществлении поставленных целей. :wink:
Кто ищет, тот всегда найдет!

NexusАвтор темы

Leserg, ты не понял, я строчу статью в Ворде. Просто что-то у меня отпала охота выкладывать здесь кусками свои наработки :biggrin:  
Хотя что-то мотивация слегка пропала...

Leserg

Цитироватья строчу статью в Ворде
Семен Семёныч! :biggrin:  

Я тут скачал исходники QT и хотел найти в них это проблемное место. А-га, не тут-то было. Там сам чорт ногу сломит. Такая каша и мешанина... :wacko:  Бросил я это дело, не потяну.
Кто ищет, тот всегда найдет!

NexusАвтор темы

Leserg, а причем здесь исходники? Я же в уже скомпилированном ковыряюсь? Исходники QT библиотек позователи не потянут :biggrin:

Leserg

Да я хотел посмотреть, как там и чего со шрифтом выполняется. Потом исправить как надо и скомпилировать. Тогда не нужно было бы лазить и чего-то исправлять в готовых файлах (я имею в виду файл QtCore4.dll).
Кто ищет, тот всегда найдет!

NexusАвтор темы

ЦитироватьДа я хотел посмотреть, как там и чего со шрифтом выполняется.
Шрифты там не при делах. Там проблема в преобразовании ANSI строки в UICODE. Вот этот участок кода на скрине вставляет после каждого символа нули и отсыдлает эту строку ка Юникодную. Ну а для кириллицы такое не прокатывает.

Leserg

Ну, судя по функции fromLatin1 там русскому и не откуда взяться :biggrin:  Тупо для преобразования берется латинский алфавит. Странное решение разработчиков, хоть бы какую-нибудь проверку кодовой страницы сделали, уже было бы одной проблемой меньше. Хотя, конечно, им виднее.
Кто ищет, тот всегда найдет!

bellic

07 июля 2017, 07:44:22 #14 Последнее редактирование: 07 июля 2017, 11:45:36 от bellic
Цитата: scikodСам формат файлов QM можно посмотреть в сырцах lrelease по ключу -qm.

А у кого нет такой возможности?
Можно ли тут расписать и желательно еще разжевать?...)))
Просто не очень шарю в СРР..
...
Глянул придирчиво QM в ВинХексе...
В принципе - для восстановления исходного TS и не нужно расшифровывать индексно-адресный блок, который идет сразу же за 17-байтной сигнатурой!
(Тем более, прочитал где то что там Хэш, который не расшифровывается).
Маркеров хватает для идентификации в самой текстовой части...
Но на всякий случай бы все ж стоило бы взглянуть на алгоритм шифрации и дешифрации - там могут быть нюансы или неизвестные значения полей...)))

P.S. позже распишу свое понимание формата QM, исходя из своих файлов к магнитоле...

* Ваши права на сайте

    Light Portal

  • Вы можете просматривать элементы портала
  • Вы не можете управлять блоками
  • Вы не можете управлять своими страницами
  • Вы не можете размещать свои страницы без модерации

    Simple Machines

  • Вы не можете удалять темы.
  • Вы не можете создавать темы.
  • Вы не можете отвечать на сообщения.
  • Вы не можете прикреплять файлы.
  • Вы не можете изменять свои сообщения.
  • Вы не можете удалять свои сообщения.

Яндекс.Метрика Каталог@MAIL.RU - каталог ресурсов интернет