Войти
  1. ВКонтакте
  2. Facebook
  1. »
  2. »
  3. »
  4. QT приложения и методы их модификации
Новые публикации Скрыть панель справаПоказать панель справа

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

Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 1 отправлено 00:38, 11.09.2014
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 приложения. Если быть точным, то мешает не сама процедура, а небольшой кусочек ее кода, который выделен на рисунке серым цветом.

Фрагмент кода

Последний раз редактировал WYLEK 16:06, 13.02.2017
Прибывший
  1. Офлайн
  2. Прохожие
  3. 1 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 2 отправлено 20:55, 15.09.2014
Наверное всё-таки стоит начать с начала. А именно со стандартного способа перевода.

Переводы у 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.

Последний раз редактировал gazon01 22:04, 15.09.2014
Мастер
  1. Офлайн
  2. Админ
  3. 1587 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 3 отправлено 11:29, 16.09.2014
Цитата scikod ()
Наверное всё-таки стоит начать с начала. А именно со стандартного способа перевода.

Тут речь будет идти не за перевод, а за кодировку исполняемых файлов  Qt biggrin
Перевод файлов с расширением .ts и .qm не составляет труда.
Прибывший
  1. Офлайн
  2. Участники
  3. 14 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 4 отправлено 13:43, 16.09.2014
Вот, вот! перевести та мы могем, а вот настроить кодировку в Qt библиотеке(для корректного отображения текста) вот это и ждем wow2
Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 5 отправлено 00:08, 18.09.2014
scikod;13115 писал:Переводы у Qt хранятся в двух типах файлов с суффиксом .ts и .qm.


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

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


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

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


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

Последний раз редактировал WYLEK 16:09, 13.02.2017
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 866 сообщений
  4. Репутация: 5
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 6 отправлено 23:25, 24.09.2014
Еще один вариант нахождения проблемного участка кода. Обратите внимание на константу FFE0h (65504d). Она встречается в файле QtCore4.dll всего два раза! Задаем её поиск и рядом с одной из них будет проблемный участок кода.

Спойлер [+]

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

------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 7 отправлено 00:20, 23.10.2014
Пока что данную тему развивать не буду из-за того, что начал писать полноценное руководство. Когда его закончу - хрен его ведает...
 Но данная ветка скорее всего была недальновидной глупостью. Так что пока я здесь писать ничего не буду.
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 866 сообщений
  4. Репутация: 5
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 8 отправлено 16:58, 01.11.2014
Цитата Nexus ()
Пока что данную тему развивать не буду из-за того, что начал писать полноценное руководство. Когда его закончу - хрен его ведает...
Но данная ветка скорее всего была недальновидной глупостью.

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


------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 9 отправлено 22:16, 01.11.2014
Leserg, ты не понял, я строчу статью в Ворде. Просто что-то у меня отпала охота выкладывать здесь кусками свои наработки biggrin
Хотя что-то мотивация слегка пропала...
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 866 сообщений
  4. Репутация: 5
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 10 отправлено 22:33, 01.11.2014
Цитата Nexus ()
я строчу статью в Ворде

Семен Семёныч! biggrin

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


------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 11 отправлено 22:47, 01.11.2014
Leserg, а причем здесь исходники? Я же в уже скомпилированном ковыряюсь? Исходники QT библиотек позователи не потянут biggrin
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 866 сообщений
  4. Репутация: 5
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 12 отправлено 22:57, 01.11.2014
Да я хотел посмотреть, как там и чего со шрифтом выполняется. Потом исправить как надо и скомпилировать. Тогда не нужно было бы лазить и чего-то исправлять в готовых файлах (я имею в виду файл QtCore4.dll).


------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 620 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 13 отправлено 23:10, 01.11.2014
Цитата Leserg ()
Да я хотел посмотреть, как там и чего со шрифтом выполняется.

Шрифты там не при делах. Там проблема в преобразовании ANSI строки в UICODE. Вот этот участок кода на скрине вставляет после каждого символа нули и отсыдлает эту строку ка Юникодную. Ну а для кириллицы такое не прокатывает.
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 866 сообщений
  4. Репутация: 5
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 14 отправлено 23:18, 01.11.2014
Ну, судя по функции fromLatin1 там русскому и не откуда взяться biggrin Тупо для преобразования берется латинский алфавит. Странное решение разработчиков, хоть бы какую-нибудь проверку кодовой страницы сделали, уже было бы одной проблемой меньше. Хотя, конечно, им виднее.


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

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

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

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

  1. MiniTool Partition Wizard Free
    Автор: mikl88 Вчера, 10:33
  2. Поговорим?
    Автор: gazon01 Вчера, 00:33
  3. WonderFox DVD Video Converter 13.0 Rus
    Автор: 78Sergey 23:55, 27.05.2017
  4. WonderFox HD Video Converter Factory...
    Автор: 78Sergey 21:07, 26.05.2017
  5. RuPack Sharpinion HD 2 (32x64)
    Автор: alpek07 08:36, 22.05.2017
  6. BB FlashBack Pro 5.22.0.4178 RUS
    Автор: druc 16:41, 21.05.2017

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

  1. профиль Лучше быть бедным чем дешёвым. 17:18, 04.04.2017
  2. профиль Новичок 16:30, 10.02.2017
  3. профиль Офлайн 05:14, 11.12.2016