LINUX.ORG.RU

[Qt] Перевод программы. Глючит QtLinguist, и видна только треть переведенных строк.


0

1

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


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


1. Глючит QtLinguist

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

Выглядит это так: [img]http://rghost.ru/3638596/thumb.png[/img] 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's <b>title</b>. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation>Пожалуйста, введите <b>название</b> записи. </translation>
    </message>
    <message>
        <location filename="../../../src/addnewrecord.cpp" line="95"/>
        <source>Please enter the note's <b>text</b>. </source>
        <comment>Обязателен пробел в конце предложения</comment>
        <translation>Пожалуйста, введите <b>текст</b> записи. </translation>

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


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

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

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

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

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


Кто может помочь разобраться что не так, почему не работает перевод?


вместо комментариев к переводу отображаются кракозябры

Это потому, что все строки в исходниках и комментарии должны бвть на английском. Или ты думаешь, что все переводчики знают русский?

Kosyak ★★★★ ()

В коде используешь tr() или trUtf8()? А вообще да, не рекомендуется использовать любые не символы вне ascii в коде программы.

unC0Rr ★★★★★ ()

Потому, что перед запуском транслятора нужно указать ему кодировку, по умолчанию это latin1

Gorthauer ★★★★★ ()
Ответ на: комментарий от Gorthauer

> Потому, что перед запуском транслятора нужно указать ему кодировку, по умолчанию это latin1

Ну, я прописал в pro-файл опцию:

CODECFORTR = utf8

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

Но толку от этого мало - c перегенрированным qm-файлом всеравно, где не показывался перевод, там и не показывается.

xintrea ()
Ответ на: комментарий от xintrea

Насколько я понимаю, CODECFORTR влияет на lupdate, но сам метод tr() будет использовать QTextCodec::codecForTr(), который у вас видимо стоит в дефолтном значении latin1. А вообще, как уже выше заметили - в коде символы кроме ASCII недопустимы. В отдельных случаях можно использовать UTF-8, но ваш случай с локализацией к ним не относится.

Dendy ★★★★★ ()
Ответ на: комментарий от Dendy

> Насколько я понимаю, CODECFORTR влияет на lupdate, но сам метод tr() будет использовать QTextCodec::codecForTr(), который у вас видимо стоит в дефолтном значении latin1. А вообще, как уже выше заметили - в коде символы кроме ASCII недопустимы. В отдельных случаях можно использовать UTF-8, но ваш случай с локализацией к ним не относится.

Попробовал прописать перед запуском основного цикла приложения команду:

QTextCodec::setCodecForTr(QTextCodec::codecForName(«UTF-8»));

Толку тоже нет.

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

xintrea ()
Ответ на: комментарий от namezys

Попробовал 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 стали одинаковыми словами - непонятно. Да и переводы у этих строк разные.

xintrea ()
Ответ на: комментарий от CFA

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

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

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

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

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

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

xintrea ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.