Russian Qt Forum
Ноябрь 24, 2024, 05:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] Глючит QtLinguist, и видна только треть переведенных строк.  (Прочитано 6986 раз)
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« : Декабрь 17, 2010, 01:44 »

Здравствуйте!


Начал я делать перевод программы MyTetra. И что-то у меня не работают механизмы перевода как надо.

1. Глючит QtLinguist

Все исходники у меня в кодировке UTF8. Системная локаль тоже UTF8. После формирования ts-файла с помощью lupdate, при открытии его в QtLinguist, вместо комментариев к переводу отображаются кракозябры. Так же, в окошке исходников вместо русского текста кракозябры.

Выглядит это так:

http://rghost.ru/3638596/image.png

Вот кусок ts-файла. Обратите внимание, что вместо комментариев к переводу lupdate сформировал кракозябры:

Код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="ru_RU" sourcelanguage="en">
<context>
    <name>AddNewRecord</name>
    <message>
        <location filename="../../../src/addnewrecord.cpp" line="34"/>
        <source>Enter a new note</source>
        <translation>Ввод новой записи</translation>
    </message>
    <message>
        <location filename="../../../src/addnewrecord.cpp" line="86"/>
        <source>Please enter the note&apos;s &lt;b&gt;title&lt;/b&gt;. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation>Пожалуйста, введите &lt;b&gt;название&lt;/b&gt; записи. </translation>
    </message>
    <message>
        <location filename="../../../src/addnewrecord.cpp" line="95"/>
        <source>Please enter the note&apos;s &lt;b&gt;text&lt;/b&gt;. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation>Пожалуйста, введите &lt;b&gt;текст&lt;/b&gt; записи. </translation>

Я пробовал и QtLinguist 4.5.0, и 4.5.3 - картина та же самая. Но это не самая большая проблема. Хуже всего другое.


2. В интерфейсе программы переводится только ~треть строк

То есть, в QtLinguist я сделал перевод. Сформировал qm-файл. Запускаю программу, и вижу, что из этого qm-файла используются не все переведенные строки, а где-то треть переведенных строк. В qm-файле видно, что строки переведены, но они всеравно отображаются на английском языке.

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

То есть, в данном случае, сделан перевод настроек программы - он виден. Сделан перевод интерфейса редактора и панели поиска по базе (которая внизу экрана MyTetra) - перевод не виден.

Вот исходники со всеми файлами, необходимыми для старта программы: http://rghost.ru/3638976 (175 Кб).


Кто может помочь разобраться что не так, почему не работает перевод?
« Последнее редактирование: Декабрь 19, 2010, 01:51 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #1 : Декабрь 17, 2010, 02:12 »

Еще, я только что попробовал добавить в pro-файл опцию:

CODECFORTR  = utf8

В результате _некоторые_ комментарии в ts-файле стали отображаться правильно:

Код:
    <message>
        <location filename="../../../src/addnewrecord.cpp" line="95"/>
        <source>Please enter the note&apos;s &lt;b&gt;text&lt;/b&gt;. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation type="unfinished">Пожалуйста, введите &lt;b&gt;текст&lt;/b&gt; записи. </translation>
    </message>
    <message>
        <source>Please enter the note&apos;s &lt;b&gt;title&lt;/b&gt;. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation type="obsolete">Пожалуйста, введите &lt;b&gt;название&lt;/b&gt; записи. </translation>
    </message>

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

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


UPD:

Учитывая, что ts перегенерируется не полностью, а только изменения, я вручную поудалял в нем элементы <comment>...</comment> и перегнерирвал ts-файл. Все комментарии к переводу стали правильными.

Однако, в QtLinguist в окне исходников всё так же кракозябры. И в программе тоже ничего не поменялось (qm конечно же тоже перегенерирвал) - там где перевод не был виден, так же и осталось на английском.

То есть, предположение о том, что перевод отрубается с какой-то строки из-за кривого символа, не подтверждается. Дело в чем-то другом.
« Последнее редактирование: Декабрь 17, 2010, 02:31 от xintrea » Записан

Собираю информацию по крупицам
http://webhamster.ru
Barmaglodd
Гость
« Ответ #2 : Декабрь 17, 2010, 08:52 »

Linguist вообще странный Улыбающийся
В строках на английском нет символов не из latin1? Если есть, то ты попал Улыбающийся
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #3 : Декабрь 17, 2010, 13:29 »

Linguist вообще странный Улыбающийся
В строках на английском нет символов не из latin1? Если есть, то ты попал Улыбающийся

Нет, в английских строках только ASCII символы.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Barmaglodd
Гость
« Ответ #4 : Декабрь 17, 2010, 19:18 »

Тогда пробуй 4.7.1 и пиши в багтрекер с минимальным примером. Улыбающийся
Записан
BRE
Гость
« Ответ #5 : Декабрь 17, 2010, 21:56 »

Смотрю исходники linguist.
Файл sourcecodeview.cpp, метод SourceCodeView::showSourceCode.
Чтение файла с исходниками выполняется через:
Код
C++ (Qt)
fileText = QString::fromLatin1(file.readAll());
 
В других местах думаю также считается, что кодировка Latin1.

Отсюда и все проблемы с декодированием русских строк.
Почему сделали так? Наверное, что бы не мудрить с определением кодировки исходных файлов.
Думаю можно было бы сделать это настраиваемой опцией.

Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #6 : Декабрь 18, 2010, 02:23 »

Тогда пробуй 4.7.1 и пиши в багтрекер с минимальным примером. Улыбающийся

Попробовал 4.7.1. Та же байда.

Я даже поудалял все комментарии переводчику в вызовах tr(). То есть, остались только tr() с английскими строками, в которых есть только ASCII символы. Перегенерирвал ts и qm файлы.

И всеравно, используется не весь перевод, а только до какого-то места.

Но появилось одно отличие. При запуске QtLinguist 4.7.1 ругается вот так:

Код:
В '/mytetra/bin/resource/translations/mytetra_ru.ts' обнаружены повторяющиеся сообщения:
* Контекст: AddNewRecord
* Источник: Please enter the note's <b>title</b>.
* Контекст: AddNewRecord
* Источник: Please enter the note's <b>text</b>.

С чего бы это title и text стали одинаковыми словами - непонятно. Да и переводы у этих строк разные.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #7 : Декабрь 19, 2010, 01:51 »

Всё, разобрался.

Дело было не в кодировке и не в русских символах. Кстати, проверил - комментарии к переводу в коде можно писать по-русски, ничего не глючит. Так что требование использовать в коде только латиницу - бред, нафига тогда UTF создавали, спрашивается? Скажу больше - можно  даже в коде писать фразы интерфейса на русском яыке, а потом подключать перевод на английский - и это работает, даже в Qt 4.5.

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

1. Создается объект QApplication
2. Создается объект главного окна
3. Подключается транслятор
4. Запускается основной цикл программы app.exec()

Однако, при таком подключении, все строки, которые отображаются в главном окне, были непереведенными. Чтобы заработал перевод в главном окне, надо поменять пункты 2 и 3 местами:

1. Создается объект QApplication
2. Подключается транслятор
3. Создается объект главного окна
4. Запускается основной цикл программы app.exec()
Записан

Собираю информацию по крупицам
http://webhamster.ru
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #8 : Декабрь 19, 2010, 10:08 »

>>что транслятор надо подключать до запуска основного цикла программы.
не основного цикла программы!!! основной цикл программы - qApp->exec().
Твоё дальнейшее пояснение оговорит о другом: Транслятор желательно устанавливать до создания графического интерфейса
Записан

Юра.
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #9 : Декабрь 19, 2010, 21:25 »

не основного цикла программы!!! основной цикл программы - qApp->exec().
Твоё дальнейшее пояснение оговорит о другом: Транслятор желательно устанавливать до создания графического интерфейса

Ну, я так и говорю. Я _думал_, что надо подключать до основного цикла программы, т.е. 3 - подключение транслятора, 4 - основной цикл. А оказалось, что надо подключать до создания объекта основного окна (читай - графического интерфейса).
Записан

Собираю информацию по крупицам
http://webhamster.ru
Barmaglodd
Гость
« Ответ #10 : Декабрь 20, 2010, 07:55 »

Так что требование использовать в коде только латиницу - бред, нафига тогда UTF создавали, спрашивается?
К сожалению, это работает не всегда Грустный
http://bugreports.qt.nokia.com/browse/QTBUG-12931
Записан
AlekseyK
Гость
« Ответ #11 : Декабрь 21, 2011, 03:42 »

Всё, разобрался. Чтобы заработал перевод в главном окне, надо поменять пункты 2 и 3 местами:

1. Создается объект QApplication
2. Подключается транслятор
3. Создается объект главного окна
4. Запускается основной цикл программы app.exec()

Да, ты прав! Такой порядок работает.
« Последнее редактирование: Декабрь 21, 2011, 08:18 от AlekseyK » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.151 секунд. Запросов: 23.