即时使用系统托盘和QAction(QT)进行翻译

时间:2014-12-10 10:14:54

标签: c++ qt qt4 multilingual

我遇到了有关系统托盘应用程序翻译的问题,该应用程序具有从QAction对象创建的菜单。 QAction对象仅根据主应用程序状态(错误的登录凭据等等)显示不同的文本,因此该文本在应用程序的生命周期中发生变化。 问题是如何在给定时间(当用户从​​GUI更改语言时)对文本使用动态翻译。语言更改的发送和接收机制已就绪,新转换程序的负载在sys托盘应用程序中完成。 (对于GUI是在GUI应用程序中进行的,并根据翻译事件捕获,因此它是动态完成的。)

这是翻译的加载代码:

void Application::_SetLanguage(QString language)
{
    QTranslator *qtTranslator = new QTranslator();

    if ( qtTranslator->load( "qt_" + language, m_sExecutableDir + "/lang" ) ) {
        if ( m_qtTranslator ) {
            removeTranslator( m_qtTranslator );
            delete m_qtTranslator;
        }
        m_qtTranslator = qtTranslator;
        installTranslator(qtTranslator);
    }

    QTranslator *trayTranslator = new QTranslator();
    if ( trayTranslator->load( "ff_" + language, m_sExecutableDir + "/lang" ) ) {

        if ( m_appTranslator ) {
            removeTranslator( m_appTranslator );
            delete m_appTranslator;
//          _restartApp();
        }

        m_appTranslator = trayTranslator;
        installTranslator( trayTranslator );
    }
    emit changeLangInTray();
}

以下是信号的代码:

ENSURE(connect(this, SIGNAL(changeLangInTray()), &m_tray, SLOT(_ChangeLanguage())));

来自Tray的_ChangeLanguage方法应该为它的对象进行翻译:

QMenu               m_trayMenu;
QSystemTrayIcon     m_trayIcon;
QAction*    m_pOpenGuiAction;
.................

欢迎任何帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过以下方式在应用程序对象上安装翻译器:

qApp->installTranslator( qtTranslator );

安装翻译器后,还应调用retranslateUi

ui->retranslateUi(this);

对于系统托盘菜单,您可以使用QCoreApplication::translate翻译每个操作。类似的东西:

m_pOpenGuiAction->setText(QApplication::translate("TrayClass", "Text to translate", 0, QApplication::UnicodeUTF8));

答案 1 :(得分:0)

我已经通过在触发语言更改时根据应用程序状态替换每个文本来纠正问题。

void _ChangeLanguage() {
    m_pOpenGuiAction->setText(Helper::getTextOpenGui(trayStatus));
    ......
}

ui->retranslateUi(this)只有在通过QTCreator(设计师)创建对话框时才有可能,然后这个方法会自动添加到ui _ * .h文件中。