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

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

Страниц: 1 [2] 3 4 ... 6   Вниз
  Печать  
Автор Тема: Проблема с переключением языка  (Прочитано 42104 раз)
Den2009
Гость
« Ответ #15 : Декабрь 13, 2009, 11:18 »

нашел что можно сделать динамический перевод с помощью QUiLoader, т.к. формы были сделаны в дизайнере... но в инете очень мало инфы, если кто делал, объясните, как это использовать
Записан
Dendy
Гость
« Ответ #16 : Декабрь 13, 2009, 16:59 »

Запакуйте проект и прикрепите, проще посмотреть глазами. Не думаю, что вам стоит заморачиваться с QUILoader.
Записан
Den2009
Гость
« Ответ #17 : Декабрь 13, 2009, 23:20 »

вот архив с проектом
http://file.qip.ru/file/112125928/17d317b4/_2__Pr1.html
Записан
Dendy
Гость
« Ответ #18 : Декабрь 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()

Код страшен, если хватит здоровья, постараюсь исправить.
Записан
Dendy
Гость
« Ответ #19 : Декабрь 14, 2009, 02:13 »

Да, забыл ещё. QTranslator нужно выделять в куче через new, а так как у вас сейчас  - он уничтожается сразу после создания, а вместе с ним уничтожается и подгруженый перевод.
Записан
gmorgunov
Гость
« Ответ #20 : Декабрь 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>
Записан
Den2009
Гость
« Ответ #21 : Декабрь 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);
}
от части помогло: окна, открываемые из программы, переводятся, а вот главное окно - нет... где копать дальше
Записан
Dendy
Гость
« Ответ #22 : Декабрь 18, 2009, 22:14 »

Добавить:

Код
C++ (Qt)
bool MainWindow::event( QEvent * e )
{
   if ( e->type() == QEvent::LanguageChange )
   {
       retranslateUi( this );
       return true;
   }
 
   return QMainWindow::event( e );
}
Записан
Den2009
Гость
« Ответ #23 : Декабрь 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'
Записан
Den2009
Гость
« Ответ #24 : Декабрь 18, 2009, 23:11 »

и еще, если поставить английский перевод, открыть дочернее окно, закрыть его, поставить русский перевод, то дочерние окна остаются все равно на английском
Записан
Dendy
Гость
« Ответ #25 : Декабрь 18, 2009, 23:32 »

C++, матчасть, добавьте

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

в обьявление MainWindow. Для дочерних окон тоже нужно вызвать retranslateUi() по событию.
Записан
Den2009
Гость
« Ответ #26 : Декабрь 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(" секундам"));
« Последнее редактирование: Декабрь 19, 2009, 00:39 от Den2009 » Записан
Dendy
Гость
« Ответ #27 : Декабрь 19, 2009, 01:50 »

Никакой кирилицы в коде и на формах дизайнера. Только латинские буквы. Перевод всегда с английского на другие языки. Текущий транслятор влияет только на возвращаемое tr() значение.
Записан
Den2009
Гость
« Ответ #28 : Декабрь 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);
}
« Последнее редактирование: Декабрь 19, 2009, 12:32 от Den2009 » Записан
Dendy
Гость
« Ответ #29 : Декабрь 19, 2009, 14:48 »

Дело в том, что трансляторов может быть установлено несколько и переводы в них ищутся по очереди. Перед тем как устанавливать новый вызовите: QCoreApplication::removeTranslator(), куда передадите указатель на старый. Это простенькая схемка, когда в программе всего один файл перевода, в более сложных нужно хранить список текущих трансляторов.
Записан
Страниц: 1 [2] 3 4 ... 6   Вверх
  Печать  
 
Перейти в:  


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