Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: vizir1989 от Июня 04, 2012, 08:33



Название: [РЕШЕНО] Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 04, 2012, 08:33
У меня есть диалоговые окна со стандартными кнопками QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Мне нужно их перевести, для этого я подгрузил QT-шный файл перевода
Код:
    QTranslator qtTranslator;
    qtTranslator.load("qt_ru",QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    app.installTranslator(&qtTranslator);

На моем компе перевод нормально подхватился, а вот на компе без QT перевода нет.
Как сделать так, чтобы на другом компе так же был перевод кнопок?


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: maint от Июня 04, 2012, 09:04
Код:
QTranslator *qtTranslator = new QTranslator(qApp);
    qtTranslator->load(":/translations/qt_ru.qm");
    qApp->installTranslator(qtTranslator);
в ресурс перевод запихать


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 04, 2012, 10:12
Добавил qt_ru.qm в resources/translations
Изменил загрузку на
Код:
	QTranslator qtTranslator;
qtTranslator.load(":/translations/qt_ru.qm");
app.installTranslator(&qtTranslator);
перевод кнопок вообще перестал загружаться


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: interv от Июня 04, 2012, 10:19
Код:
QTranslator qtTranslator;
qtTranslator.load(":/resources/translations/qt_ru.qm");
app.installTranslator(&qtTranslator);


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: sudo от Июня 04, 2012, 10:29
Стандартные кнопки подхватывают системную локаль. Может поэтому не подхватывается?


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 04, 2012, 10:31
Стандартные кнопки подхватывают системную локаль. Может поэтому не подхватывается?
Локаль смотрели, и там и там стоит русская локаль.


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: maint от Июня 04, 2012, 10:32
Добавил qt_ru.qm в resources/translations
Изменил загрузку на
Код:
	QTranslator qtTranslator;
qtTranslator.load(":/translations/qt_ru.qm");
app.installTranslator(&qtTranslator);
перевод кнопок вообще перестал загружаться
само собой. Дальше товарищ уже показал чего надо. Внимательнее надо. Или объяснять, что комп делает только то что написал программер, а не подумал  ;)


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 04, 2012, 10:39
Код:
QTranslator qtTranslator;
qtTranslator.load(":/resources/translations/qt_ru.qm");
app.installTranslator(&qtTranslator);

Не помогло :(


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: maint от Июня 04, 2012, 10:47
Код:
QTranslator qtTranslator;
qtTranslator.load(":/resources/translations/qt_ru.qm");
app.installTranslator(&qtTranslator);

Не помогло :(
усли qrc не большой то можно сюда его высунуть, посмотреть


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 04, 2012, 10:54
Код main.cpp
Код:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTranslator appTranslator;
appTranslator.load(":/translations/rus.qm");
app.installTranslator(&appTranslator);
QTranslator qtTranslator;
qtTranslator.load("qt_ru",QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
BPO::Client::InitTranslate();

boost::scoped_ptr<BPO::Client::Mediator> mediator;
try
{
mediator.reset(new BPO::Client::Mediator());
}
catch (const BPO::Client::MediatorError& /*error*/)
{
QMessageBox messageBox(QMessageBox::Critical,
QObject::tr("Fatal error"), QObject::tr("Can't open serial port"));
messageBox.exec();
return -1;
}

boost::scoped_ptr<BPO::Client::Storage> storage;
storage.reset(new BPO::Client::Storage());

boost::scoped_ptr<BPO::Client::BpoDialog> bpoDialog;
try
{
bpoDialog.reset(new BPO::Client::BpoDialog(*mediator, *storage));
if (bpoDialog->exec() == QDialog::Rejected)
{
return 0;
}
}
catch (const BPO::Client::BpoManagerError& error)
{
QMessageBox messageBox(
QMessageBox::Warning, QObject::tr("File error"), error.what());
messageBox.exec();
return -2;
}

try
{
storage->ChangeUuid(bpoDialog->GetUuid());
}
catch (const BPO::Storage::FileError& error)
{
QMessageBox messageBox(QMessageBox::Critical,
QObject::tr("File error"), error.what());
messageBox.exec();
return -3;
}

boost::scoped_ptr<BPO::Client::DataManager> dataManager;
dataManager.reset(new BPO::Client::DataManager(*mediator, *storage, bpoDialog->IsConnected()));

bpoDialog.reset();

BPO::Client::MainWindow window(*dataManager);
window.show();

return app.exec();
}


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: Serr500 от Июня 04, 2012, 11:04
Положите qt_ru.qm в каталог с бинарником программы. В main.cpp напишите следующее:
Код:
QTranslator Translator;
QStringList LangPaths;
LangPaths << QLibraryInfo::location(QLibraryInfo::TranslationsPath) << QCoreApplication::applicationDirPath();
for (int i = 0; i < LangPath.count(); i++ {
        if (Translator.load("qt_ru", LangPaths[i])) {
            QCoreApplication::installTranslator(&Translator);
            break;
        }
}


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: maint от Июня 04, 2012, 11:12
Код main.cpp
Код:
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
QTranslator appTranslator;
appTranslator.load(":/translations/rus.qm");
app.installTranslator(&appTranslator);
QTranslator qtTranslator;
qtTranslator.load("qt_ru",QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
BPO::Client::InitTranslate();

boost::scoped_ptr<BPO::Client::Mediator> mediator;
try
{
mediator.reset(new BPO::Client::Mediator());
}
catch (const BPO::Client::MediatorError& /*error*/)
{
QMessageBox messageBox(QMessageBox::Critical,
QObject::tr("Fatal error"), QObject::tr("Can't open serial port"));
messageBox.exec();
return -1;
}

boost::scoped_ptr<BPO::Client::Storage> storage;
storage.reset(new BPO::Client::Storage());

boost::scoped_ptr<BPO::Client::BpoDialog> bpoDialog;
try
{
bpoDialog.reset(new BPO::Client::BpoDialog(*mediator, *storage));
if (bpoDialog->exec() == QDialog::Rejected)
{
return 0;
}
}
catch (const BPO::Client::BpoManagerError& error)
{
QMessageBox messageBox(
QMessageBox::Warning, QObject::tr("File error"), error.what());
messageBox.exec();
return -2;
}

try
{
storage->ChangeUuid(bpoDialog->GetUuid());
}
catch (const BPO::Storage::FileError& error)
{
QMessageBox messageBox(QMessageBox::Critical,
QObject::tr("File error"), error.what());
messageBox.exec();
return -3;
}

boost::scoped_ptr<BPO::Client::DataManager> dataManager;
dataManager.reset(new BPO::Client::DataManager(*mediator, *storage, bpoDialog->IsConnected()));

bpoDialog.reset();

BPO::Client::MainWindow window(*dataManager);
window.show();

return app.exec();
}
да нет, файл имя_программы.qrс. У меня в одной и программ он где то так выглядит
Код:
<RCC>
    <qresource prefix="/">
        <file>icons/key_32.png</file>
    </qresource>
</RCC>



Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: kambala от Июня 04, 2012, 11:58
если папку resources будешь распространять со своим приложением, то грузи перевод как qtTranslator.load("resources/translations/qt_ru.qm"); если нет, то этот файл надо добавить в .qrc (в данном примере - не на первый уровень, а под resources/translations/) и грузить как qtTranslator.load(":/resources/translations/qt_ru.qm");


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 09, 2012, 09:37
Удалось подхватить перевод, если запихнуть в папку translation закинуть qt_ru.qm и в qrc указать этот файл.
Код:
<RCC>
    <qresource prefix="/">
        <file>translations/rus.qm</file>
        <file>translations/qt_ru.qm</file>
    </qresource>
</RCC>
Теперь возник такой вопрос. А как сделать че нить в стиле
Код:
<RCC>
    <qresource prefix="/">
        <file>translations/rus.qm</file>
    </qresource>
    <qresource prefix="$QTDIR/">
        <file>translations/qt_ru.qm</file>
    </qresource>
</RCC>

чтобы не пихать qt_ru.qm в ресурсы?


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: kambala от Июня 09, 2012, 12:12
так в qrc не сделаешь - разве что в коде читать значение переменной окружения QTDIR и строить путь. но такое прокатит, только если на всех целевых машинах 100% установлен Qt и эта переменная прописана.


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: Serr500 от Июня 09, 2012, 13:22
чтобы не пихать qt_ru.qm в ресурсы?
Чем моё решение не устраивает?
http://www.prog.org.ru/index.php?topic=22106.msg154192#msg154192 (http://www.prog.org.ru/index.php?topic=22106.msg154192#msg154192)


Название: Re: Стандартные кнопки QDialogButtonBox::Ok, QDialogButtonBox::Cancel и тд.
Отправлено: vizir1989 от Июня 13, 2012, 10:50
чтобы не пихать qt_ru.qm в ресурсы?
Чем моё решение не устраивает?
http://www.prog.org.ru/index.php?topic=22106.msg154192#msg154192 (http://www.prog.org.ru/index.php?topic=22106.msg154192#msg154192)

Решение норм отработало, на нем решил остановиться.