1 (10.09.2011 12:50:52 отредактировано Peter)

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

Последние три года я в Qt не работал, а до этого в версии 3.x для перевода
в локали KOI8-R пользовался утилитой msg2qm. Тогда же перевёл две программы
на Qt 4.1 и воспользовался Qt Linguist, но уже не помню, работал ли там русский
язык.
Сейчас локаль UTF-8 и  никак не удаётся из file_ru_RU.ts получить qm-файл
с переводом, ни непосредственным вызовом lrelease, ни с помощью
Qt Linguist, т.е. и в нём не видно русского текста и при запуске программы
сообщения остаются на английском.

Debian Wheezy, Qt 4.7. Я посмотрел, как выглядят ts-файлы в пакете qt4-demos,
например, /usr/lib/qt4/examples/linguist/trollprint/trollprint_pt.ts. Если его обработать
lrelease, то в qm-файле появляются португальские слова, причём там в теге TS нет
указания языка. Если же заменить слова на русские, добавить в тег TS language="ru_RU",
так же, как это делает lupdate, то русские буквы не появляются.
Ещё lupdate в начало ts-файла помещает строку
<?xml version="1.0" encoding="utf-8"?>
а в примере с португальским её нет, но и её добваление не помогает.

Как же правильно делать перевод и создавать qm-файлы?


Правда, это не главное,  в моём случае можно русский текст вставить прямо
в программу, но хотелось бы понять, в чём дело. Хуже оказалось другое -
программа не работает на моём компьютере. Причём она пока ничего не
делает, там, как обычно, из main вызывается mainwidget, в нём сначала
заводятся массивы, вызывается подпрограмма открытия COM-порта и она
работает - выдаёт сообщение, что порт открыт, потом рассчитываются
размеры окна, создаётся шрифт, одно меню, один объект QPixmap, а когда
система вызывает paintEvent, в нем создаётся объект QPainter для QPixmap
и рисование делается в нём - выбираются цвет фона и текста, шрифт,
стирается весь pixmap, в нём проводятся две диагонали и потом другой
QPainter выводит этот pixmap на экран. Больше ничего не делается.

В Mandriva это без проблем работало, там была установлена в /opt
Qt версии 4.6.3. У меня же главное окно только мелькает и сразу же
происходит Segmentation fault. Раза два или три окно всё же оставалось
на экране, при этом, как мне показалось, пункт меню Exit был затенён.
При выходе было множество сообщений насчёт какой-то библиотеки от Qt.

В gdb ещё не запускал, но, м.б., кто-нибудь уже сталкивался с подобным?


Сейчас посмотрел в gdb: жалоба на
QDesktopWidget::screen(int)    /usr/lib/libQtGui.so.4.
Я этот объект использую для получения размеров экрана и он их
возвращает правильно, так что буду искать причину.


Пётр.

Пётр.

2

Прошу прощения, но segmentation fault происходил по моей вине:
указателю на QDesktopWidget присваивалось значение, возвращаемое
функцией QApplication::dekstop(), а в конце подпрограммы, где это
делалось, для этого указателя вызывалась функция delete, как если
бы он получен оператором new. После удаления этого delete
segmentation fault прекратился.

Так что остался только вопрос насчёт перевода.

Пётр.

Пётр.

3 (11.09.2011 17:12:21 отредактировано Peter)

Оказалось, что lrelease работает правильно, а русские буквы в qm-файле
действительно не видны. Переведённые строки в запущенном приложении
не появлялись опять же по моей вине, а также вследствие того, что Qt
неправильно распознаёт системную локаль, т.е. QLocale::system().name()
возвращает не ru_RU, а C. По-видимому, так было и раньше, т.к.
в предыдущих программах я для получения локали вызывал qgetenv("LANG"),
а сейчас попытался это делать вызовом QLocale::system().name(), т.к. мне
показалось, что qgetenv() больше нет. Теперь, когда я получаю локаль
вызовом qgetenv("LANG"), мой qm-файл с переводами загружается
и интерфейс программы делается русским.

Пётр.

Пётр.

4

QLocale::system() проверяет LC_NUMERIC, так что надо, чтобы одно из двух было
установлено в ru_RU.<..>: или она или LANG.

Пётр.

Пётр.