【问题标题】:Using translation on the fly for System Tray and QAction (QT)对系统托盘和 QAction (QT) 使用动态翻译
【发布时间】:2014-12-10 10:14:54
【问题描述】:

我在翻译系统托盘应用程序时遇到问题,该应用程序具有从 QAction 对象创建的菜单。 QAction 对象仅根据主要应用程序状态显示不同的文本(错误的登录凭据......等等),因此该文本会在应用程序的生命周期中发生变化。 问题是如何在给定时间(当用户从​​ GUI 更改语言时)对文本使用动态翻译。语言更改的发送和接收机制已经到位,新翻译器的负载在系统托盘应用程序中完成。 (因为 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;
.................

欢迎任何帮助,谢谢!

【问题讨论】:

    标签: c++ qt qt4 multilingual


    【解决方案1】:

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

    qApp->installTranslator( qtTranslator );
    

    也应该在安装翻译器后调用retranslateUi

    ui->retranslateUi(this);
    

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

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

    【讨论】:

    • 这是我用于GUI部分的,但是对于系统托盘应用程序我没有这样的东西,没有ui_*.h,你可以在其中找到重新翻译Ui 方法。 + 托盘应用程序不继承自 QWidget。有什么东西可以强制每个 QAction 使用新加载的字典吗?
    • @Bogdan 您可以使用QCoreApplication::translate 来返回动作的翻译文本并设置它们的文本。我已经更新了答案。
    • 他们正在使用它,但是在加载新的翻译器后,在我启动应用程序之前语言不会改变(但它会加载正常的 qtTranslator):'status_str = QCoreApplication::translate(" TrayMenu","帐户:未登录");'
    • 我已通过在触发语言更改时根据应用程序状态替换每个文本来纠正此问题。 ui->retranslateUi(this) 只有在对话框是通过 QTCreator(设计器)创建时才有可能,然后它会自动构建。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-18
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多