Russian Qt Forum

Qt => Вопросы новичков => Тема начата: CJ1 от Ноябрь 12, 2013, 09:13



Название: Правильно ли я организовал перевод?
Отправлено: CJ1 от Ноябрь 12, 2013, 09:13
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   p = new QLabel(tr("Русский"));
 
   this->ui->gridLayout->addWidget(p,2,0);
 
   language = RU;
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changeEvent(QEvent * event)
{
 
   if (event->type() == QEvent::LanguageChange) {
       if (language == RU)
       {
           language = RU;
           p->setText(tr("Русский"));
       }
       if (language == KZ)
       {
           language = KZ;
           p->setText(tr("қазақ тілі"));
       }
   } else
     QWidget::changeEvent(event);
}
 
void MainWindow::on_pushButton_clicked()
{
   QTranslator translator;
 
   if (ui->comboBox->currentIndex() == 0)
   {
       language = RU;
       QTranslator t;
       QCoreApplication::installTranslator(&t);
       ui->retranslateUi(this);
       return;
   }
 
   if (ui->comboBox->currentIndex() == 1)
   {
       language = KZ;
       if (!translator.load("C:\\Qt\\Qt5.0.2\\Tools\\QtCreator\\bin\\translation\\helloworld_ru"))
           QMessageBox::critical(0,"", "Не загрузился Перевод");
       else
       {
           QApplication::installTranslator(&translator);
           ui->retranslateUi(this);
       }
       return;
   }
}



Название: Re: Правильно ли я организовал перевод?
Отправлено: kambala от Ноябрь 12, 2013, 13:07
- неправильно: объект QTranslator не должен умирать.
- в changeEvent натыканы какие-то гениальные условия. приведу известный пример индусского кода: if (a == 1) a = 1;
- последующие условия лучше проверять через else if, тогда например не придется лепить return.
- грузить перевод по полному пути — неправильно, почти наверняка у конечного пользователя путь будет отличаться.
- вынеси весь код перевода в отдельный метод — тогда не придется дублировать строки в конструкторе.
- (не ошибка) в одном месте ты вызываешь QCoreApplication::installTranslator, в другом — QApplication::installTranslator. лучше использовать один и тот же класс, а то и вовсе qApp.


Название: Re: Правильно ли я организовал перевод?
Отправлено: CJ1 от Ноябрь 12, 2013, 13:13
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
   QMainWindow(parent),
   ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   p = new QLabel(tr("Русский"));
   translator = new QTranslator(this);
   this->ui->gridLayout->addWidget(p,3,0);
 
   language = RU;
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::changeEvent(QEvent * event)
{
   if (event->type() == QEvent::LanguageChange) {
       if (language == RU)
       {
           language = RU;
           p->setText(tr("Русский"));
       }
       if (language == KZ)
       {
           language = KZ;
           p->setText(tr("қазақ тілі"));
       }
   } else
     QWidget::changeEvent(event);
}
 
void MainWindow::on_pushButton_clicked()
{
 
 
   if (ui->comboBox->currentIndex() == 0)
   {
       language = RU;
       QApplication::removeTranslator(translator);
       ui->retranslateUi(this);
       return;
   }
 
   if (ui->comboBox->currentIndex() == 1)
   {
       language = KZ;
 
       if (!translator->load("C:\\Qt\\Qt5.0.2\\Tools\\QtCreator\\bin\\translation\\helloworld_ru"))
           QMessageBox::critical(0,"", "Не загрузился Перевод");
       else
       {
           QApplication::installTranslator(translator);
           ui->retranslateUi(this);
       }
       return;
   }
 
 
}
 
 



Вот! Я теперь оставляю жить QTranslator


Название: Re: Правильно ли я организовал перевод?
Отправлено: CJ1 от Ноябрь 12, 2013, 13:15
На счет пути, да, это пример,

- последующие условия лучше проверять через else if, тогда например не придется лепить return.
это тоже понятно!

Но вобщем ясно, спасибо!