Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Den2009 от Декабрь 11, 2009, 00:08



Название: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 11, 2009, 00:08
в общем, сделал Luguist файлы перевода, используя литературу Шлее попытался реализовать динамическую смену языка, вот код:
proga1.h
Код:
#ifndef PROGA1_H
#define PROGA1_H
#include <QMainWindow>
#include <QObject>
#include "ui_proga1.h"

class MainWindow : public QMainWindow, Ui::MainWindow // <--------Наследуемся
{
    Q_OBJECT
public:
    int m_rus; // объявляем глобальную переменную...
    MainWindow(QMainWindow* p = 0) : QMainWindow(p)
    {
        setupUi(this);
        connect(pushButton, SIGNAL(clicked()), this, SLOT(rasschet())); //подключаем кнопку рассчет
        connect(kn_about, SIGNAL(triggered()), this, SLOT(about())); // подключаем кнопку о программе
        connect(kn_help, SIGNAL(triggered()), this, SLOT(help())); //подключаем кнопку помощь
        connect(kn_author, SIGNAL(triggered()), this, SLOT(author())); //подключаем кнопку об авторе
        connect(kn_rus, SIGNAL(triggered()), this, SLOT(switchlang()));
        connect(kn_eng, SIGNAL(triggered()), this, SLOT(switchlang()));
    }
public slots:
    void rasschet(); // создаем слот рассчет
    void about(); // создаем слот о программе
    void help(); // создаем слот помощь
    void author(); // создаем слот об авторе
    void swlang(); // создаем слот смены языка
    void switchlang();

};

#endif

proga1.cpp
Код:
#include <QtCore>
#include <QTextCodec>
#include <QtGui>
#include <QTranslator>
#include "proga1.h"
............
void MainWindow::switchlang()
{
    if (kn_rus -> isChecked())
    {
        (m_rus << 1);
        kn_eng -> setCheckable(true);
        kn_eng -> setChecked(false);
    }
    if (kn_eng -> isChecked())
    {
        (m_rus << 2);
        kn_rus -> setCheckable(true);
        kn_rus -> setChecked(false);
    }
}

void MainWindow::swlang()
{
    QTranslator translator;
    {
        switch(m_rus)
    case 1:  //<===========
        translator.load("rus.qm",".");
        break;
    case 2:  //<===========
        translator.load("eng.qm",".");
        break;
    }

    qApp->installTranslator(&translator);
}
при компиляции следующие ошибки:
Код:
break statement not within loop or switch
case label '2' not within a switch statement
break statement not within loop or switch
за 2 вечера перерыл кучу всякой литературы и интернета, но так и не нашел решение... ((


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 11, 2009, 00:40
и еще... прочитал, что надо генерировать из файлов перевода статический константный массив данных, но почему-то у меня в папке с QT (и во всех ее подпапках) нет утилиты QEmbed, хотя она должна быть в папке /tools не мог бы кто-нибудь выложить ее и сопутствующие файлы, с указанием директорий?


Название: Re: Проблема с переключением языка
Отправлено: denka от Декабрь 11, 2009, 00:47
Думаю для начала надо бы подправить знания  в С++ :)

мне вот(как и компилятору) не понятна следующая конструкция
Код:
   QTranslator translator;
    {
        switch(m_rus)
    case 1:  //<===========
        translator.load("rus.qm",".");
        break;
    case 2:  //<===========
        translator.load("eng.qm",".");
        break;
    }
Скобки не смущают?

Дальше. Что значит
Код:
(m_rus << 2);
Куда мы че сдвигаем?


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 11, 2009, 07:32
1. m_rus << 2 замени на m_rus = 2
2.
Код
C++ (Qt)
  QTranslator translator;
 
       switch(m_rus) {
   case 1:  //<===========
       translator.load("rus.qm",".");
       break;
   case 2:  //<===========
       translator.load("eng.qm",".");
       break;
   }
 


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 11, 2009, 08:59
спс, помогло, теперь еще вопрос:
Код:
void MainWindow::switchlang()
{
    if (kn_rus -> isChecked())
    {
        (m_rus = 1);
        kn_eng -> setCheckable(true);
        kn_eng -> setChecked(false);
    }
    if (kn_eng -> isChecked())
    {
        (m_rus = 2);
        kn_rus -> setCheckable(true);
        kn_rus -> setChecked(false);
    }
}
что тут не так? проблема такая: если выбран русский, то для того, чтоб выбрать английский, надо сначала кликнуть по русскому, чтобы снять галочку, а потом уже по английскому... если же английский, то нормально переключает


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 11, 2009, 12:41
Почитай в ассистенте про QActionGroup.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 11, 2009, 13:38
сделал так:
proga1.h
Код:
#ifndef PROGA1_H
#define PROGA1_H
#include <QMainWindow>
#include <QObject>
#include "ui_proga1.h"

class MainWindow : public QMainWindow, Ui::MainWindow // <--------Наследуемся
{
    Q_OBJECT
public:
    bool m_rus;
    MainWindow(QMainWindow* p = 0) : QMainWindow(p)
    {
        m_rus = true; // по умолчанию русский
        setupUi(this);
        ..........
        connect(kn_rus, SIGNAL(triggered()), this, SLOT(triggeredRussian())); // выбираем русский
        connect(kn_eng, SIGNAL(triggered()), this, SLOT(triggeredEnglish())); // выбираем английский
     }
public slots:
    ........
    void triggeredRussian();
    void triggeredEnglish();

};

#endif

proga1.cpp
Код:
#include <QtCore>
#include <QTextCodec>
#include <QtGui>
#include <QTranslator>
#include "proga1.h"
#include "proga1_about.h"
#include "proga1_author.h"
#include "proga1_help.h"
#include "qm_files.h"
#define tr QObject::tr
.........
void MainWindow::triggeredRussian()
{
    QTranslator translator;
    qDebug() << "Грузим русский перевод" ;
    m_rus = true;
    kn_eng->setChecked(false);
    translator.load("rus.qm",".");
    qApp->installTranslator(&translator);
}
void MainWindow::triggeredEnglish()
{
    QTranslator translator;
    qDebug() << "Грузим английский перевод" ;
    m_rus = false;
    kn_rus->setChecked(false);
    translator.load("eng.qm",".");
    qApp->installTranslator(&translator);
}
все переключается, но почему-то не меняется язык...
rus.ts, eng.ts, rus.qm, eng.qm создавал с помощью linguist

rus.ts
Код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_US" sourcelanguage="ru_RU">
<context>
    <name>About</name>
    <message utf8="true">
        <location filename="proga1_about.ui" line="26"/>
        <source>О программе</source>
        <translation>About program</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="41"/>
        <source>Закрыть</source>
        <translation>Close</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="54"/>
        <source>Программа переводит заданные с клавиатуры</source>
        <translation>The program translates the specified keyboard</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="67"/>
        <source>секунды в вид ЧЧ:ММ:СС</source>
        <translation>seconds in the form HH:MM:SS</translation>
    </message>
</context>
<context>
    <name>Author</name>
    <message utf8="true">
        <location filename="proga1_author.ui" line="35"/>
        <source>Об авторе</source>
        <translation>About author</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="50"/>
        <source>Закрыть</source>
        <translation>Close</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="63"/>
        <source>Автор программы: </source>
        <translation>Author program:</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="76"/>
        <source>Мухин Денис Михайлович</source>
        <translation>Mukhin Denis Mikhailovich</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="89"/>
        <source>студент группы ВМ-21</source>
        <translation>student group VM-21</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="102"/>
        <source>2009 год</source>
        <translation>2009</translation>
    </message>
</context>
<context>
    <name>Help</name>
    <message utf8="true">
        <location filename="proga1_help.ui" line="14"/>
        <source>Помощь</source>
        <translation>Help</translation>
    </message>
    <message utf8="true">
        <location filename="proga1_help.ui" line="26"/>
        <source>Закрыть</source>
        <translation>Close</translation>
    </message>
</context>
<context>
    <name>MainWindow</name>
    <message utf8="true">
        <location filename="proga1.ui" line="32"/>
        <source>Программа №1 :)</source>
        <translation>Programm #1</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="86"/>
        <source>Рассчитать</source>
        <translation>Calculate</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="99"/>
        <location filename="proga1.ui" line="196"/>
        <source>Выход</source>
        <translation>Quit</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="112"/>
        <source>Введите количество секунд</source>
        <translation>Enter the number of seconds</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="125"/>
        <source>Результат работы программы</source>
        <translation>The result of the program</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="141"/>
        <source>Файл</source>
        <translation>File</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="149"/>
        <source>Язык</source>
        <translation>Language</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="156"/>
        <source>Справка</source>
        <translation>Help</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="173"/>
        <source>Русский</source>
        <translation>Russian</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="181"/>
        <source>Английский</source>
        <translation>English</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="186"/>
        <source>О программе</source>
        <translation>About programm</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="191"/>
        <source>Об авторе</source>
        <translation>About author</translation>
    </message>
    <message>
        <location filename="proga1.ui" line="199"/>
        <source>Ctrl+Q</source>
        <translation>Ctrl+Q</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="204"/>
        <source>Помощь</source>
        <translation>Help</translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="209"/>
        <source>Открыть log-файл</source>
        <translation>Open log-file</translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source>Введенное количество секунд </source>
        <translation>The entered number of seconds</translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> соответствует </source>
        <translation>matches</translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> часам, </source>
        <translation>hours</translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> минутам, </source>
        <translation>minutes</translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> секундам</source>
        <translation>seconds</translation>
    </message>
</context>
</TS>

eng.ts
Код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="ru_RU" sourcelanguage="en_US">
<context>
    <name>About</name>
    <message utf8="true">
        <location filename="proga1_about.ui" line="26"/>
        <source>О программе</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="41"/>
        <source>Закрыть</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="54"/>
        <source>Программа переводит заданные с клавиатуры</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_about.ui" line="67"/>
        <source>секунды в вид ЧЧ:ММ:СС</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>Author</name>
    <message utf8="true">
        <location filename="proga1_author.ui" line="35"/>
        <source>Об авторе</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="50"/>
        <source>Закрыть</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="63"/>
        <source>Автор программы: </source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="76"/>
        <source>Мухин Денис Михайлович</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="89"/>
        <source>студент группы ВМ-21</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_author.ui" line="102"/>
        <source>2009 год</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>Help</name>
    <message utf8="true">
        <location filename="proga1_help.ui" line="14"/>
        <source>Помощь</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1_help.ui" line="26"/>
        <source>Закрыть</source>
        <translation></translation>
    </message>
</context>
<context>
    <name>MainWindow</name>
    <message utf8="true">
        <location filename="proga1.ui" line="32"/>
        <source>Программа №1 :)</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="86"/>
        <source>Рассчитать</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="99"/>
        <location filename="proga1.ui" line="196"/>
        <source>Выход</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="112"/>
        <source>Введите количество секунд</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="125"/>
        <source>Результат работы программы</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="141"/>
        <source>Файл</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="149"/>
        <source>Язык</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="156"/>
        <source>Справка</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="173"/>
        <source>Русский</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="181"/>
        <source>Английский</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="186"/>
        <source>О программе</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="191"/>
        <source>Об авторе</source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.ui" line="199"/>
        <source>Ctrl+Q</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="204"/>
        <source>Помощь</source>
        <translation></translation>
    </message>
    <message utf8="true">
        <location filename="proga1.ui" line="209"/>
        <source>Открыть log-файл</source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source>Введенное количество секунд </source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> соответствует </source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> часам, </source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> минутам, </source>
        <translation></translation>
    </message>
    <message>
        <location filename="proga1.cpp" line="28"/>
        <source> секундам</source>
        <translation></translation>
    </message>
</context>
</TS>

и еще... при запуске приложения в кутэкреаторе, при переключении языков, в окне "консоль приложения" появляется такое сообщение:
Код:
A?ocei ?onneee ia?aaia
хотелось бы бы понять, о чем речь, т.е. как сделать, чтоб было на русском, ну или хотя бы на английском


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 11, 2009, 17:39
1. Дай сюда вывод qDebug() << translator.load("rus.qm",".");
2. Пропиши полный путь, т.е. translator.load("c:\path_to_file\rus.qm");

A?ocei ?onneee ia?aaia как раз и есть твое "Грузим русский перевод" только в другой кодировке. Поэтому не рекомендую использовать в коде кирилических символов.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 11, 2009, 20:42
3. Написал на английском, теперь пишет load english или load russian
2. Прописал полный путь - результат тот же
1. Как это сделать? я до сих пор не могу понять, как реализовать отслеживание переменных в креаторе


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 12, 2009, 08:43
Так и делаешь:
qDebug() << translator.load("rus.qm",".");


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 12, 2009, 09:31
выводит true при переключении и на русский и на английский


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 12, 2009, 09:38
Значит перевод подгружается.
Почитай в ассистенте про void QCoreApplication::installTranslator ( QTranslator * translationFile )   [static]


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 12, 2009, 13:54
у меня ассистент при запуске выдает "cannot load sqlite database driver!" хз, в чем дело... интернет результатов не дал


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 12, 2009, 23:16
глянул код формы, сгенерированной дизайнером, смутило то, что вместо нормальных букв в названиях кнопок, полей и т.п., какие-то цифры:
Код:
 void retranslateUi(QMainWindow *MainWindow)
    {
        MainWindow->setWindowTitle(QApplication::translate("MainWindow", "\320\237\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\260 \342\204\2261 :)", 0, QApplication::UnicodeUTF8));
        kn_rus->setText(QApplication::translate("MainWindow", "\320\240\321\203\321\201\321\201\320\272\320\270\320\271", 0, QApplication::UnicodeUTF8));
        kn_eng->setText(QApplication::translate("MainWindow", "\320\220\320\275\320\263\320\273\320\270\320\271\321\201\320\272\320\270\320\271", 0, QApplication::UnicodeUTF8));
        kn_about->setText(QApplication::translate("MainWindow", "\320\236 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\320\265", 0, QApplication::UnicodeUTF8));
        kn_author->setText(QApplication::translate("MainWindow", "\320\236\320\261 \320\260\320\262\321\202\320\276\321\200\320\265", 0, QApplication::UnicodeUTF8));
        kn_exit->setText(QApplication::translate("MainWindow", "\320\222\321\213\321\205\320\276\320\264 (Ctrl+Q)", 0, QApplication::UnicodeUTF8));
        kn_exit->setShortcut(QApplication::translate("MainWindow", "Ctrl+Q", 0, QApplication::UnicodeUTF8));
        kn_help->setText(QApplication::translate("MainWindow", "\320\237\320\276\320\274\320\276\321\211\321\214 (F1)", 0, QApplication::UnicodeUTF8));
        kn_help->setShortcut(QApplication::translate("MainWindow", "F1", 0, QApplication::UnicodeUTF8));
        kn_log->setText(QApplication::translate("MainWindow", "\320\236\321\202\320\272\321\200\321\213\321\202\321\214 log-\321\204\320\260\320\271\320\273", 0, QApplication::UnicodeUTF8));
#ifndef QT_NO_WHATSTHIS
        spinBox->setWhatsThis(QString());
#endif // QT_NO_WHATSTHIS
        pushButton->setText(QApplication::translate("MainWindow", "\320\240\320\260\321\201\321\201\321\207\320\270\321\202\320\260\321\202\321\214", 0, QApplication::UnicodeUTF8));
        pushButton_2->setText(QApplication::translate("MainWindow", "\320\222\321\213\321\205\320\276\320\264", 0, QApplication::UnicodeUTF8));
        label->setText(QApplication::translate("MainWindow", "\320\222\320\262\320\265\320\264\320\270\321\202\320\265 \320\272\320\276\320\273\320\270\321\207\320\265\321\201\321\202\320\262\320\276 \321\201\320\265\320\272\321\203\320\275\320\264", 0, QApplication::UnicodeUTF8));
        label_2->setText(QApplication::translate("MainWindow", "\320\240\320\265\320\267\321\203\320\273\321\214\321\202\320\260\321\202 \321\200\320\260\320\261\320\276\321\202\321\213 \320\277\321\200\320\276\320\263\321\200\320\260\320\274\320\274\321\213", 0, QApplication::UnicodeUTF8));
        menu->setTitle(QApplication::translate("MainWindow", "\320\244\320\260\320\271\320\273", 0, QApplication::UnicodeUTF8));
        menu_2->setTitle(QApplication::translate("MainWindow", "\320\257\320\267\321\213\320\272", 0, QApplication::UnicodeUTF8));
        menu_3->setTitle(QApplication::translate("MainWindow", "\320\241\320\277\321\200\320\260\320\262\320\272\320\260", 0, QApplication::UnicodeUTF8));
    } // retranslateUi
это нормально?


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 13, 2009, 00:04
вобщем, вот...
(http://www.imageup.ru/img71/01226925.jpg)
как я понял, файл перевода не генерируется... а почему?


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 13, 2009, 11:18
нашел что можно сделать динамический перевод с помощью QUiLoader, т.к. формы были сделаны в дизайнере... но в инете очень мало инфы, если кто делал, объясните, как это использовать


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 13, 2009, 16:59
Запакуйте проект и прикрепите, проще посмотреть глазами. Не думаю, что вам стоит заморачиваться с QUILoader.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 13, 2009, 23:20
вот архив с проектом
http://file.qip.ru/file/112125928/17d317b4/_2__Pr1.html
 (http://file.qip.ru/file/112125928/17d317b4/_2__Pr1.html)


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 14, 2009, 01:39
По порядку.

1. RAR в наше время моветон. Используйте ZIP, 7z, tar.gz, tar.bz2
2. Не пишите комментарии в исходниках на русском, их кроме вас никто не прочитает.
3. Не пишите в коде вообще что-то на русском, только латиница.
4. В UI файлах не должно быть кирилицы, только латинские буквы. Переводить нужно ровно наоборот - с английского на русский.
Собственно полюбуйтесь, как это выглядит: http://img697.imageshack.us/img697/3535/win1251.png
5. Феерично: #define tr QObject::tr
6. Забудьте про QTextCodec::setCodecForTr()

Код страшен, если хватит здоровья, постараюсь исправить.


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 14, 2009, 02:13
Да, забыл ещё. QTranslator нужно выделять в куче через new, а так как у вас сейчас  - он уничтожается сразу после создания, а вместе с ним уничтожается и подгруженый перевод.


Название: Re: Проблема с переключением языка
Отправлено: gmorgunov от Декабрь 14, 2009, 09:08
Пока суд да дело, составил пример динамической смены языка. В примере: меню смены языка и
единственная кнопка- Calculate/Вычислить. Den2009, посмотрите, может пригодится.
И в дальнейшем, старайтесь давать "говорящие названия", и вам и помогающим будет легче.  А то pushButton_2, вот и гадай, что это за кнопка.
main.cpp
Код:
#include <QtGui>
//-----------------------------------------------------------------
class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow();
private slots:
    void triggeredRussian();
    void triggeredEnglish();
private:
    void createActions();
    void createMenus();
    void retranslateUi();
    QPushButton *buttonCalculate;
    QMenu *languageMenu;
    QAction *russianAct;
    QAction *englishAct;
    QTranslator *translator;
};
//----------------------------------------------------------------
MainWindow::MainWindow(){
    buttonCalculate = new QPushButton(tr("Calculate"));
    setCentralWidget(buttonCalculate);
    createActions();
    createMenus();
    translator = new QTranslator;
}
void MainWindow::createActions(){
    russianAct = new QAction(tr("Russian"), this);
    russianAct->setCheckable(true);
    russianAct->setChecked(false);
    englishAct = new QAction(tr("English"), this);
    englishAct->setCheckable(true);
    englishAct->setChecked(true);
    connect(russianAct, SIGNAL(triggered()), this, SLOT(triggeredRussian()));
    connect(englishAct, SIGNAL(triggered()), this, SLOT(triggeredEnglish()));
}
void MainWindow::createMenus(){
    languageMenu = menuBar()->addMenu(tr("Language"));
    languageMenu->addAction(russianAct);
    languageMenu->addAction(englishAct);
}
void MainWindow::triggeredRussian() {
    russianAct->setChecked(true);
    englishAct->setChecked(false);
    translator->load("eng_to_rus.qm",".");
    qApp->installTranslator(translator);
    retranslateUi();
}
void MainWindow::triggeredEnglish() {
    russianAct->setChecked(false);
    englishAct->setChecked(true);
    qApp->removeTranslator(translator);
    retranslateUi();
}
void MainWindow::retranslateUi() {
    languageMenu->setTitle(tr("Language"));
    russianAct->setText(tr("Russian"));
    englishAct->setText(tr("English"));
    buttonCalculate->setText(tr("Calculate"));
}
int main(int argc, char *argv[]){
    QApplication app(argc, argv);
    MainWindow mw;
    mw.show();
    return app.exec();
}
#include "main.moc"
eng_to_rus.ts
Код:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="ru_RU">
<defaultcodec></defaultcodec>
<context>
    <name>MainWindow</name>
    <message>
        <location filename="main.cpp" line="60"/>
        <source>Calculate</source>
        <translation type="unfinished">Вычислить</translation>
    </message>
    <message>
        <location filename="main.cpp" line="58"/>
        <source>Russian</source>
        <translation type="unfinished">Русский</translation>
    </message>
    <message>
        <location filename="main.cpp" line="59"/>
        <source>English</source>
        <translation type="unfinished">Английский</translation>
    </message>
    <message>
        <location filename="main.cpp" line="57"/>
        <source>Language</source>
        <translation type="unfinished">Язык</translation>
    </message>
</context>
</TS>


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 18, 2009, 22:01
Да, забыл ещё. QTranslator нужно выделять в куче через new, а так как у вас сейчас  - он уничтожается сразу после создания, а вместе с ним уничтожается и подгруженый перевод.
сделал так:
Код:
void MainWindow::triggeredEnglish()
{
    QTranslator* translator = new QTranslator;
    m_rus = false;
    //qDebug() << m_rus;
    kn_rus->setChecked(false);
    translator->load("C:/Pr1/pr1_en.qm",".");
    // QUiLoader::setLanguageChangeEnabled(true);
    qDebug() << translator->load("C:/Pr1/pr1_en.qm",".");
    qApp->installTranslator(translator);
}
от части помогло: окна, открываемые из программы, переводятся, а вот главное окно - нет... где копать дальше


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 18, 2009, 22:14
Добавить:

Код
C++ (Qt)
bool MainWindow::event( QEvent * e )
{
   if ( e->type() == QEvent::LanguageChange )
   {
       retranslateUi( this );
       return true;
   }
 
   return QMainWindow::event( e );
}


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 18, 2009, 22:35
Код:
void MainWindow::triggeredEnglish()
{
    QTranslator* translator = new QTranslator;
    m_rus = false;
    kn_rus->setChecked(false);
    translator->load("C:/Pr1/pr1_en.qm",".");
    qDebug() << translator->load("C:/Pr1/pr1_en.qm",".");
    qApp->installTranslator(translator);
}
bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        return true;
    }
    return QMainWindow::event(e);
}
ругается... пишет, что
Код:
no 'bool MainWindow::event(QEvent*)' member function declared in class 'MainWindow'


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 18, 2009, 23:11
и еще, если поставить английский перевод, открыть дочернее окно, закрыть его, поставить русский перевод, то дочерние окна остаются все равно на английском


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 18, 2009, 23:32
C++, матчасть, добавьте

Код
C++ (Qt)
bool event( QEvent * e );

в обьявление MainWindow. Для дочерних окон тоже нужно вызвать retranslateUi() по событию.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 19, 2009, 00:30
в общем, стало нормально... на английский переводится все, а на русский - ничего )
а случайно, не надо делать файл перевода с английского на русский и загружать его при переключении с английского на русский?
и еще вопрос: будет написан лог к проге, если все, что должно туда писаться, тоже забить в файл перевода, то при смене языка, язык записи в лог будет меняться или же надо писать так:

.........
если русский {
пишем по русски
}
если английский {
пишем по английски
}
.........

только что заметил: не переводится то, что программа выводит в окне вывода результата
вот код:
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
textEdit->setText(tr("Введенное количество секунд ")+QString::number(iS)  + tr(" соответствует ") + QString::number(oH) + tr(" часам, " ) + QString::number(oM) + tr(" минутам, ") + QString::number(oS) + tr(" секундам"));


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 19, 2009, 01:50
Никакой кирилицы в коде и на формах дизайнера. Только латинские буквы. Перевод всегда с английского на другие языки. Текущий транслятор влияет только на возвращаемое tr() значение.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 19, 2009, 12:28
сделал все на английском, при загрузке по умолчанию - английский, как сделать русский?
переключение работает только один раз... т.е. если переключиться с английского на русский, то обратно - никак
выводимое сообщение не переводится
вот код:
Код:
void MainWindow::triggeredRussian()
{
    QTranslator* translator = new QTranslator;
    m_rus = true;
    qDebug() << m_rus;
    kn_eng->setChecked(false);
    translator->load("./pr1_ru.qm",".");
    qDebug() << translator->load("./pr1_ru.qm",".");
    qApp->installTranslator(translator);
}
void MainWindow::triggeredEnglish()
{
    QTranslator* translator = new QTranslator;
    m_rus = false;
    kn_rus->setChecked(false);
    translator->load("./pr1_en.qm",".");
    qDebug() << translator->load("./pr1_en.qm",".");
    qApp->installTranslator(translator);
}
bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        return true;
    }
    return QMainWindow::event(e);
}
во всех дочерних окнах так:
Код:
#include <QtGui>
#include "proga1_about.h"

MyAbout::MyAbout(QWidget *parent)
    : QWidget(parent)
{
    setupUi(this);
    connect(pushButton, SIGNAL(pressed()), this, SLOT(close()));
}
bool MyAbout::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        return true;
    }
    return QWidget::event(e);
}


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 19, 2009, 14:48
Дело в том, что трансляторов может быть установлено несколько и переводы в них ищутся по очереди. Перед тем как устанавливать новый вызовите: QCoreApplication::removeTranslator(), куда передадите указатель на старый. Это простенькая схемка, когда в программе всего один файл перевода, в более сложных нужно хранить список текущих трансляторов.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 19, 2009, 22:17
че-то я не понял, как его использовать... в справке к КуТэ только это:
Код:
void QCoreApplication::removeTranslator ( QTranslator * translationFile )   [static]
Removes the translation file translationFile from the list of translation files used by this application. (It does not delete the translation file from the file system.)

See also installTranslator(), translate(), and QObject::tr().
в интернете тоже самое везде


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 20, 2009, 01:15
Подставляете туда указатель на транслятор, который ранее передали в QCoreApplication::installTranslator().


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 20, 2009, 10:24
сделал так:
Код:
void MainWindow::triggeredRussian()
{

    QTranslator* translator = new QTranslator;
    QCoreApplication::removeTranslator(translator);
    m_rus = true;
    qDebug() << m_rus;
    kn_eng->setChecked(false);
    translator->load("./pr1_ru.qm",".");
    qDebug() << translator->load("./pr1_ru.qm",".");
    qApp->installTranslator(translator);
   
}

void MainWindow::triggeredEnglish()
{
//removeTranslator(translator);
//    QCoreApplication::removeTranslator(translator);
//    QTranslator* translator = new QTranslator;
    m_rus = false;
    kn_rus->setChecked(false);
//    translator->load("./pr1_en.qm",".");
//    qDebug() << translator->load("./pr1_en.qm",".");
//    qApp->installTranslator(translator);
}

bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        return true;
    }
    return QMainWindow::event(e);
}
все равно не работает


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 20, 2009, 17:31
Подставляете туда указатель на транслятор, который РАНЕЕ передали в QCoreApplication::installTranslator().

А вы что подставили?


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 21, 2009, 21:27
дак вот же указатель translator, переданный installTranslator()
Код:
qApp->installTranslator(translator);
блин, как сделать?? нифига документации нету...
у меня есть идея такая:
сначала удалить перевод, а потом создавать, ну примерно так:
Код:
void MainWindow::triggeredRussian()
{
    QCoreApplication::removeTranslator(translator);
    m_rus = true;
    qDebug() << m_rus;
    kn_eng->setChecked(false);
    translator->load("./pr1_ru.qm",".");
    qDebug() << translator->load("./pr1_ru.qm",".");
    qApp->installTranslator(translator);
   
}

void MainWindow::triggeredEnglish()
{
    QCoreApplication::removeTranslator(&translator);
    m_rus = false;
    kn_rus->setChecked(false);
    translator->load("./pr1_en.qm",".");
    qDebug() << translator->load("./pr1_en.qm",".");
    qApp->installTranslator(translator);
}

bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        return true;
    }
    return QMainWindow::event(e);
}

но тогда translator надо объявлять глобально
правильно ли я мыслю?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 21, 2009, 22:00
translator будет переменной-членом вашего класса, выделяете память под него при старте. А дальше - как у вас и написано, должно работать.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 22, 2009, 12:32
я, конечно, понимаю, что мои знания С++ оставляют желать лучшего, но учить особо некогда - сессия :) поэтому приходится учить и писать одновременно
Цитировать
translator будет переменной-членом вашего класса, выделяете память под него при старте.
как это реализовать?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 22, 2009, 16:29
Код
C++ (Qt)
class MainWindow
{
...
   QTranslator * translator;
...
}
 
MainWindow::MainWindow()
{
...
   translator = new QTranslator( this );
...
}
 

А дальше - как у вас.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 22, 2009, 20:52
спс, работает... только эта строка не переводится:
Код:
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
textEdit->setText(tr("The entered number of seconds ")+QString::number(iS)  + tr(" corresponds ") + QString::number(oH) + tr(" hours, " ) + QString::number(oM) + tr(" minutes, ") + QString::number(oS) + tr(" seconds"));
я, кстати, почти так же объявлял, только это не указывал, и поэтому не работало:
Код:
MainWindow::MainWindow()
{
...
    translator = new QTranslator( this );
...
}


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 22, 2009, 21:10
Во-первых, удалите вызов QTextCodec::setCodecForTr().
Во-вторых, лучше делать так:

Код
C++ (Qt)
textEdit->setText(tr("The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds").arg(iS).arg(oH).arg(oM).arg(oS));
 

И проверьте, что эта строка переведена в ts-файле.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 22, 2009, 23:45
все равно не переводит.... строка в ts-файле переведена


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 22, 2009, 23:50
Это строка конечно же должна быть в обработчике QEvent::LanguageChanged. Лучше всего её вынести в отдельный метод.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 23, 2009, 10:04
а как это реализовать?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 23, 2009, 10:15
Метод без параметров:

Код
C++ (Qt)
void MainWindow::retranslateTextEdit()
{
   textEdit->setText( tr("The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds")
       .arg( iS_ )
       .arg( oH_ )
       .arg( oM_ )
       .arg( oS_ ) );
 

Где переменнные с подчерками в конце - члены класса MainWindow.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 01:04
сделал так:
proga1.h
Код:
class MainWindow : public QMainWindow, Ui::MainWindow
{
    Q_OBJECT
public:
    bool m_rus;
    bool event(QEvent* e);
    int iS, oS, oM, oH;
    QTranslator* translator;
    MainWindow(QMainWindow* p = 0) : QMainWindow(p)
    {
        translator = new QTranslator(this);

        m_rus = true;
        setupUi(this);
............
proga1.cpp
Код:
.................
void MainWindow::retranslateTextEdit()
{
    textEdit->setText( tr("The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds")
        .arg( iS )
        .arg( oH )
        .arg( oM )
        .arg( oS ) );
}
...........
все равно не переводит...
есть, конечно, 100% рабочий вариант, но он не очень грамотный:
Код:
if русский 
{
    пишем по-русски
}
if английский

    пишем по-английски
}
забыл:
файл перевода:
Код:
<message>
        <location filename="proga1.cpp" line="32"/>
        <source>The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds</source>
        <translation>Введенное количество секунд %1 соответствует %2 часам, %3 минутам, %4 секундам</translation>
    </message>


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 01:21
А где вы вызываете retranslateTextEdit()?


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 09:04
в proga1.h
Код:
public slots:
    .................
    void retranslateTextEdit();


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 13:20
мож оффтопик, но чтоб из-за одного вопроса тему не создавать:
как сделать, чтоб каждая следующая запись в файле начиналась с новой строки?
делал так:
Код:
file.write("This is log-file \n");
не работает.. следующая запись идет вслед за этой


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 13:26
в proga1.h
Код:
public slots:
    .................
    void retranslateTextEdit();

Это вы её обьявили, а вызвать нужно в программе при реагировании на событие LanguageChanged.


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 13:29
не работает.. следующая запись идет вслед за этой

Сейчас угадаю, проверяете Notepad'ом? Эта программа не работает с UNIX'овыми окончаниями файлов. Эдакий питекантроп в наше время, жалко не вымер. Смотрите любым другим просмотрщиком, например: http://notepad-plus.sourceforge.net/ru/site.htm


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 13:43
угадали )) в нотепаде не работает, в тоталкоммандере по F3 тоже не работает... работает в AkelPad
а как можно сделать, чтоб везде работало?
и еще вопрос: как запихнуть в текст лога текущую дату?
делаю так:
Код:
QString sdate = QDateTime::currentDateTime().toString(Qt::SystemLocaleDate);
     file.write(sdate, "  This is log-file \n");
выводит такую ошибку:
Код:
C:/Pr1/main.cpp:37: error: no matching function for call to 'QFile::write(QString&, const char [21])'


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 13:51
в proga1.h
Код:
public slots:
    .................
    void retranslateTextEdit();

Это вы её обьявили, а вызвать нужно в программе при реагировании на событие LanguageChanged.
я вызывал при нажатии на кнопку рассчитать:
Код:
connect(pushButton, SIGNAL(clicked()), this, SLOT(retranslateTextEdit()));
т.е. так:
Код:
bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        retranslateTextEdit();
        return true;
    }
    return QMainWindow::event(e);
}
если так, то тоже не работает


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 13:52
Используйте QTextStream. C Win-окончаниями файлов он тоже позволяет работать с помощью endl(), хотя это в наше время моветон.


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 13:53
Код выложите, посмотрю почему не переводится.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 14:04
proga1.h
Код:
#ifndef PROGA1_H
#define PROGA1_H
#include <QMainWindow>
#include <QTranslator>
#include <QFile>
#include <QObject>
#include "ui_proga1.h"

class MainWindow : public QMainWindow, Ui::MainWindow // <--------Наследуемся
{
    Q_OBJECT
public:
    bool m_rus;
    bool event(QEvent* e);
    int iS, oS, oM, oH;
    QTranslator* translator;
    QFile* file;
    MainWindow(QMainWindow* p = 0) : QMainWindow(p)
    {
        translator = new QTranslator(this);
        file = new QFile(this);
        m_rus = true; // по умолчанию русский
        setupUi(this);
        connect(pushButton, SIGNAL(clicked()), this, SLOT(rasschet())); //подключаем кнопку рассчет
        connect(pushButton, SIGNAL(clicked()), this, SLOT(retranslateTextEdit()));
        connect(kn_about, SIGNAL(triggered()), this, SLOT(about())); // подключаем кнопку о программе
        connect(kn_help, SIGNAL(triggered()), this, SLOT(help())); //подключаем кнопку помощь
        connect(kn_author, SIGNAL(triggered()), this, SLOT(author())); //подключаем кнопку об авторе
        connect(kn_rus, SIGNAL(triggered()), this, SLOT(triggeredRussian())); // выбираем русский
        connect(kn_eng, SIGNAL(triggered()), this, SLOT(triggeredEnglish())); // выбираем английский
        connect(kn_log, SIGNAL(triggered()), this, SLOT(logFile()));

    }
public slots:
    void rasschet(); // создаем слот рассчет
    void about(); // создаем слот о программе
    void help(); // создаем слот помощь
    void author(); // создаем слот об авторе
    void triggeredRussian();
    void triggeredEnglish();
    void retranslateTextEdit();
    void logFile();

};

#endif
proga1.cpp
Код:
#include <QtCore>
#include <QTextCodec>
#include <QtGui>
#include <QTranslator>
#include <QUiLoader>
#include "proga1.h"
#include "proga1_about.h"
#include "proga1_author.h"
#include "proga1_help.h"
#define tr QObject::tr

void MainWindow::rasschet()
{
    int notH, notM;  //Объявление переменных
    const int SiH=3600, SiM=60;
    QString inSec, outHr, outMin, outSec;
    textEdit->clear();
    inSec = spinBox->text(); //Ввод
    qDebug() << inSec;
    iS = inSec.toInt();
    qDebug() << iS;
    //Вычисление
    oH = (iS / SiH); //Количество часов
    notH = iS - (oH * SiH); //Убираем количество часов
    oM = (notH / SiM); //Количество минут
    notM = notH - (oM * SiM); //Убираем количество минут
    oS = notM; //Оставшееся число равно количеству секунд
}
void MainWindow::retranslateTextEdit()
{
    textEdit->setText(tr("The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds").arg(iS).arg(oH).arg(oM).arg(oS));
}

//тут идут процедуры вызова дочерних окон, думаю, они тут не причем

void MainWindow::triggeredRussian()
{
    QCoreApplication::removeTranslator(translator);
    m_rus = true;
    qDebug() << m_rus;
    kn_eng->setChecked(false);
    translator->load("./main_eng.qm",".");
    qDebug() << translator->load("./main_eng.qm",".");
    qApp->installTranslator(translator);

}
void MainWindow::triggeredEnglish()
{
    QCoreApplication::removeTranslator(translator);
    m_rus = false;
    kn_rus->setChecked(false);
}

bool MainWindow::event(QEvent* e)
{
    if (e->type() == QEvent::LanguageChange)
    {
        retranslateUi(this);
        retranslateTextEdit();
        return true;
    }
    return QMainWindow::event(e);
}


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 14:20
Не вижу чтобы в rasschet() в конце вызывался retranslateTextEdit().


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 19:23
Код:
void MainWindow::rasschet()
{
    int notH, notM;  //Объявление переменных
    const int SiH=3600, SiM=60;
    QString inSec, outHr, outMin, outSec;
    textEdit->clear();
    inSec = spinBox->text(); //Ввод
    qDebug() << inSec;
    iS = inSec.toInt();
    qDebug() << iS;
    //Вычисление
    oH = (iS / SiH); //Количество часов
    notH = iS - (oH * SiH); //Убираем количество часов
    oM = (notH / SiM); //Количество минут
    notM = notH - (oM * SiM); //Убираем количество минут
    oS = notM; //Оставшееся число равно количеству секунд
    retranslateTextEdit();
}
все равно не работает ((


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 19:42
немного оффтопика:
сделал через QTextStream
Код:
     QFile file("./log.txt");
     file.open(QIODevice::WriteOnly);
     if (file.open(QFile::WriteOnly | QFile::Truncate))
     {
         QTextStream out(&file);
         out << "This is log-file" << endl;
     }
в лог не пишется ничего


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 20:25
Я уже забыл, что не работает?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 20:26
немного оффтопика:
сделал через QTextStream
Код:
     QFile file("./log.txt");
     file.open(QIODevice::WriteOnly);
     if (file.open(QFile::WriteOnly | QFile::Truncate))
     {
         QTextStream out(&file);
         out << "This is log-file" << endl;
     }
в лог не пишется ничего


Во-первых, вы открываете файл два раза. Во вторых - забыли флаг QIODevice::Text.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 20:40
Я уже забыл, что не работает?
много чего... ))
но пока я больше озабочен тем, что не переводится выводимая строка


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 20:44
Не переводится когда именно?


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 20:49
вообще никогда
ни когда перевожу приложение, ни когда уже в переведенном приложении жму кнопку "вычислить"


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 22:36
счас заметил еще одну странность:
окно помощи сделал другое, заголовок окна задавал не в дизайнере, а вручную:
Код:
void MainWindow::helpBrowser()
{
    this->setWindowModality(Qt::NonModal);
    HelpBrowser* helpbrowser = new HelpBrowser("doc", "./help/index.html");
    helpbrowser->setWindowTitle(tr("Help")); //---------!!!!!!
    helpbrowser->resize(500, 400);
    helpbrowser->setMaximumSize(500, 400);
    helpbrowser->setMinimumSize(500, 400);
    helpbrowser->show();
}
естественно, поправил файл перевода... и этот заголовок тоже не переводится... получается, что описано в дизайнере и сохранено в ui - переводится, а что описано в коде - нет


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 24, 2009, 22:51
А вы уверены, что файл перевода у вас вообще подгружается? Что выдаёт QTranslator::load()? Наставьте брейкпоинтов, подебажьте и проверьте совпадает ли ожидаемое поведение программы от того, что у вас получилось.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 24, 2009, 23:33
ну то, что файл перевода подгружается - уверен... остальное то переводится... с брейк-пойнтами попробую сейчас

фигня какая-то... если запускаю из креатора, то перевод не загружается и не переводится, а если запускаю из папки ехе-шник, то переводится все, кроме того, что описано в коде, а не создавалось в дизайнере


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 25, 2009, 12:46
Сегодня столкнулся с такой же проблемой. Вот код:
Код
C++ (Qt)
void GlobalPreferences::saveSettings()
{
if (currentTranslator) {//&#1058;&#1077;&#1082;&#1091;&#1097;&#1080;&#1081; &#1090;&#1088;&#1072;&#1085;&#1089;&#1083;&#1103;&#1090;&#1086;&#1088;
QCoreApplication::removeTranslator(currentTranslator);
delete currentTranslator;
currentTranslator = 0;
}
currentTranslator = new QTranslator();
const QString& translatorPath = translationsList->currentItem()->data(Qt::UserRole).toString();//&#1055;&#1091;&#1090;&#1100; &#1082; &#1092;&#1072;&#1081;&#1083;&#1091; &#1089; &#1087;&#1077;&#1088;&#1077;&#1074;&#1086;&#1076;&#1086;&#1084;
if (!translatorPath.isEmpty()) {
currentTranslator->load(translatorPath);
qApp->installTranslator(currentTranslator);
}
}
bool GlobalPreferences::event(QEvent *ev)
{
if (ev->type() == QEvent::LanguageChange) {
retranslateStrings();
}
 
return QWidget::event(ev);
}
void GlobalPreferences::retranslateStrings()
{
 qDebug(QApplication::translate("GlobalPreferences", "Translates").toLocal8Bit());//&#1042;&#1099;&#1074;&#1086;&#1076;&#1080;&#1090;&#1089;&#1103; &#1074; &#1089;&#1086;&#1086;&#1090;&#1074;&#1077;&#1090;&#1089;&#1090;&#1074;&#1080;&#1080; &#1089; &#1087;&#1077;&#1088;&#1077;&#1074;&#1086;&#1076;&#1086;&#1084;
 qDebug(tr("GlobalPreferences", "Translates").toLocal8Bit()); //&#1042;&#1089;&#1077;&#1075;&#1076;&#1072; &#1087;&#1086;-&#1072;&#1085;&#1075;&#1083;&#1080;&#1081;&#1089;&#1082;&#1080;
}
 

И чего это за фигня? В файле перевода все строки переведены.

=========================
Ппц. Оказывается нужно обязательно указать макрос Q_OBJECT.


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 25, 2009, 13:54
Во-первых, я так и не понял в чём проблема.
Во-вторых, да, для использования tr() нужен Q_OBJECT.


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 25, 2009, 14:32
Проблему я описал в коде, только тег кода сделал русские символы нечитаемыми:
  qDebug(QApplication::translate("GlobalPreferences", "Translates").toLocal8Bit());//Выводится в соответствии с переводом
  qDebug(tr("GlobalPreferences", "Translates").toLocal8Bit()); //Всегда по-английски

Q_OBJECT проблему решил.

Теперь еще одна проблема - как удалить текущий перевод. Мне кажется, что тролли конкретно промахнулись с тем, что не сделали вот такую вещь QList<QTranslator*> QCoreApplication::translators().
В данный момент у меня только одно решение - ввести в программу синглтон, в котором хранить список переводов. Но это делать как-то не очень хочется. Есть еще идеи?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 25, 2009, 15:18
Мне тоже кажется, что в Qt эта схема недоработана, поэтому в своих программах переключением языков занимается собственный класс, синглтон.


Название: Re: Проблема с переключением языка
Отправлено: Пантер от Декабрь 25, 2009, 16:57
Забабахал небольшой синглтончик, пока прокатит. Может троллям того самого, намекнуть?


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 25, 2009, 17:25
Думаю они и сами прекрастно знают. У нас есть низкоуровневое API, этого достаточно. А высокоуровневое неизвестно как должно выглядеть.


Название: Re: Проблема с переключением языка
Отправлено: lit-uriy от Декабрь 25, 2009, 18:23
по мне да понятно как должно выглядеть высокоуровневое АПИ:
Нахомячиваем переводов в транслятор, псевдокод:
translator.add("path/to/translation/dir");
...
translator.setActive("ru");
и все приоги :)


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 25, 2009, 18:42
Высокоуровневое АПИ может выглядеть по разному, а нужно одно.

Дальнейший оффтоп будет удаляться.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 26, 2009, 16:45
че-т я не совсем понял, как проблему с переводом решить... объясните, плиз, подоступнее


Название: Re: Проблема с переключением языка
Отправлено: Dendy от Декабрь 26, 2009, 17:14
Вы для начала расскажите что уже сделали. Попадаете ли вы на точки останова в retranslateTextEdit() и в событие QEvent::LanguageChanged. Что происходит при переключении языка, при рассчёте?

Запакуйте ещё раз код, будет время - посмотрю.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 27, 2009, 00:45
код:
http://file.qip.ru/file/113911072/746553e/Pr1.html
 (http://file.qip.ru/file/113911072/746553e/Pr1.html)
при запуске проги из креатора язык не переключается и перевод не загружается... если запустить не из креатора, то переводится все, кроме того, что описано в коде, а не создано в дизайнере
при нажатии на кнопку расчет появляется сообщение на английском, не зависимо от того, какой язык установлен в приложении
про точки останова:
КуТэ не собирает помощник отладчика:
Код:
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\gdbmacros.dll] Error 1
mingw32-make[1]: Leaving directory `C:/Qt/4.6.0/qtc-debugging-helper'
mingw32-make: *** [debug-all] Error 2
при запуске отладчика, появляется "завершился поток 7 из группы 1552" цифры бывают и другие... и все, дальше ничего не происходит...


Название: Re: Проблема с переключением языка
Отправлено: gmorgunov от Декабрь 27, 2009, 10:47
Den2009. Вот рабочий код( Windows XP, Qt 4.6.0, MinGW 4.4):
proga1.h
Код:
#ifndef PROGA1_H
#define PROGA1_H
#include <QMainWindow>
#include <QTranslator>
#include <QFile>
#include <QObject>
#include "ui_proga1.h"

class MainWindow : public QMainWindow, Ui::MainWindow // <--------Наследуемся
{
    Q_OBJECT
public:
    int iS, oS, oM, oH;
    QTranslator* translator;
    QFile* file;
    MainWindow(QMainWindow* p = 0) : QMainWindow(p)
    {
        translator = new QTranslator(this);
        file = new QFile(this);
        setupUi(this);
        connect(pushButton, SIGNAL(clicked()), this, SLOT(rasschet())); //подключаем кнопку рассчет
        connect(kn_about, SIGNAL(triggered()), this, SLOT(about())); // подключаем кнопку о программе
//        connect(kn_help, SIGNAL(triggered()), this, SLOT(help())); //подключаем кнопку помощь
        connect(kn_help, SIGNAL(triggered()), this, SLOT(helpBrowser()));
        connect(kn_author, SIGNAL(triggered()), this, SLOT(author())); //подключаем кнопку об авторе
        connect(kn_rus, SIGNAL(triggered()), this, SLOT(triggeredRussian())); // выбираем русский
        connect(kn_eng, SIGNAL(triggered()), this, SLOT(triggeredEnglish())); // выбираем английский
        connect(kn_log, SIGNAL(triggered()), this, SLOT(logFile()));
    }
public slots:
    void rasschet(); // создаем слот рассчет
    void about(); // создаем слот о программе
    void author(); // создаем слот об авторе
    void triggeredRussian();
    void triggeredEnglish();
    void helpBrowser();
    void logFile();

};
#endif
proga1.cpp
Код:
#include <QtCore>
#include <QTextCodec>
#include <QtGui>
#include <QTranslator>
#include "proga1.h"
#include "proga1_about.h"
#include "proga1_author.h"
#include "proga1_helpbrowser.h"

void MainWindow::rasschet()
{
    int notH, notM;  //Объявление переменных
    const int SiH=3600, SiM=60;
    QString inSec, outHr, outMin, outSec;
    textEdit->clear();
    inSec = spinBox->text(); //Ввод
    iS = inSec.toInt();
    //Вычисление
    oH = (iS / SiH); //Количество часов
    notH = iS - (oH * SiH); //Убираем количество часов
    oM = (notH / SiM); //Количество минут
    notM = notH - (oM * SiM); //Убираем количество минут
    oS = notM; //Оставшееся число равно количеству секунд
    textEdit->setText(tr("The entered number of seconds %1 corresponds %2 hours, %3 minutes, %4 seconds").arg(iS).arg(oH).arg(oM).arg(oS));
}
void MainWindow::about()
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    this->setWindowModality(Qt::NonModal);
    MyAbout *myabout = new MyAbout;
    myabout->show();
}
void MainWindow::helpBrowser()
{
    this->setWindowModality(Qt::NonModal);
    HelpBrowser* helpbrowser = new HelpBrowser("doc", "./help/index.html");
    helpbrowser->setWindowTitle(tr("Help"));
    helpbrowser->resize(500, 400);
    helpbrowser->setMaximumSize(500, 400);
    helpbrowser->setMinimumSize(500, 400);
    helpbrowser->show();
}
void MainWindow::author()
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
    this->setWindowModality(Qt::NonModal);
    MyAuthor *myauthor = new MyAuthor;
    myauthor->show();
}
void MainWindow::triggeredRussian()
{
    qApp->removeTranslator(translator);
    translator->load("eng.qm","C:\\Pr1");
    qApp->installTranslator(translator);
    retranslateUi(this);
    kn_rus->setChecked(true);
    kn_eng->setChecked(false);
}
void MainWindow::triggeredEnglish()
{
    QCoreApplication::removeTranslator(translator);
    retranslateUi(this);
    kn_eng->setChecked(true);
    kn_rus->setChecked(false);
}
void MainWindow::logFile()
{  
    file = new QFile("C:\\Pr1\\log.txt");
    file->open(QIODevice::ReadOnly | QIODevice::WriteOnly);
    QByteArray a = file->readAll();
    qDebug() << a;
    file->close();
}
ui_proga1.h
Код:
...
        kn_rus->setChecked(false);
        QFont font;
        font.setFamily(QString::fromUtf8("Segoe Script"));
        kn_rus->setFont(font);
        kn_rus->setSoftKeyRole(QAction::NoSoftKey);
        kn_eng = new QAction(MainWindow);
        kn_eng->setObjectName(QString::fromUtf8("kn_eng"));
        kn_eng->setCheckable(true);
        kn_eng->setChecked(true);
...






Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 27, 2009, 13:26
не работает... строки, описанные в proga1.cpp не переводятся
Win 7, QT 4.6.0, MinGW 4.4


Название: Re: Проблема с переключением языка
Отправлено: gmorgunov от Декабрь 27, 2009, 15:21
Позвольте не поверить... :) . У меня прекрасно работает и на Windows XP, и на Linux - openSUSE11.1.
Еще раз проверьте:
- не должно быть макроса #define tr QObject::tr
- должен быть макрос Q_OBJECT
- везде должны быть полные пути к файлам, с экранир. обратным слешем:
  translator->load("eng.qm","C:\\Pr1");
Если действительно не работает, сносите эту Windows7, ставьте XP... Больше времени потеряете.


Название: Re: Проблема с переключением языка
Отправлено: Den2009 от Декабрь 27, 2009, 22:32
пропустил #define tr QObject::tr
работает, спс большое