加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 在Qt应用程序菜单栏的主菜单中添加和本地化菜单项

发布时间:2020-12-16 09:59:17 所属栏目:百科 来源:网络整理
导读:首先,这里是Evernote菜单的截图,用法语本地化: [] 如您所见,主菜单中的所有菜单项(通过主菜单,我的意思是名称为应用程序名称的菜单项,如此处为Evernote)均使用法语进行本地化. Evernote应用程序本身带来了许多菜单项,例如évaluezEvernotepour Mac(适用于Ma
首先,这里是Evernote菜单的截图,用法语本地化:

[]

如您所见,主菜单中的所有菜单项(通过主菜单,我的意思是名称为应用程序名称的菜单项,如此处为Evernote)均使用法语进行本地化. Evernote应用程序本身带来了许多菜单项,例如évaluezEvernotepour Mac(适用于Mac的费率Evernote),Information du compte …(帐户信息…)等.另外还有标准的OS X提供的菜单Quit Evernote,Preferences等物品也是本地化的.

我的问题:

>如何在此主菜单中添加新项目?如何访问此菜单添加项目?
>我如何根据我的应用本地化来本地化这些项目,OS X提供的默认项目和我添加的项目?
>在Evernote菜单中,除了“服务”菜单选项外,所有内容似乎都已本地化(但子菜单选项已本地化!)?这不能也是本地化的吗?

我尝试过的:

fMenuBar = fMainWindow->menuBar();
fMenuFile = fMenuBar->addMenu(QObject::tr(qPrintable(String_Class::FileMenu))); //"File" in English,translated into other languages
fAboutAppAct = new QAction(QObject::tr(qPrintable(String_Class::About_App)),fMainWindow); //prints "About App",localized in all languages
fMenuFile->addAction(fAboutAppAct);
fAboutAppAct->setMenuRole(QAction::AboutRole); //otherwise it sits with the other file menu options in the File menu

//reset UI language slot,called whenver UI language is reset. It retranslates all strings in all menus,except this
void AppMenu::reTranslateUISlot()
{
    fAboutAppAct->setText(QObject::tr(qPrintable(String_Class::About_App))); 
}

解决方法

也许你可以在MainWindow或AppMenu中重新实现changeEvent.

void MainWindow::changeEvent(QEvent *event)
{
    if (event->type() == QEvent::LanguageChange) {
        this->retranslateUi(this);
        quickStart->retranslateUi(quickStart);
        //etc...
    } else {
        QMainWindow::changeEvent(event);
    }
}

您可以强制Widgets重新翻译自己.但是你需要先注册一些QTranslator.

例如,在MainWindow的构造函数中(或在某些配置对话框中),如果可以在运行时更改语言(我在软件中完成的操作):

CustomizeOptionsDialog::CustomizeOptionsDialog(QWidget *parent)
    : QDialog(parent,Qt::Tool)
{
    // Load the language of the application
    customTranslator.load(languages.value( SettingsPrivate::instance()->language()) );

    // Translate standard buttons (OK,Cancel,...)
    defaultQtTranslator.load("qt_" + SettingsPrivate::instance()->language(),QLibraryInfo::location(QLibraryInfo::TranslationsPath));
    QApplication::installTranslator(&customTranslator);
    QApplication::installTranslator(&defaultQtTranslator);
}

其中language()返回“fr”,“gb”或“cs”(从选项中选择新语言时发出的信号初始化).

/** Change language at runtime. */
void CustomizeOptionsDialog::changeLanguage(const QString &language)
{
    QString lang = languages.value(language);
    SettingsPrivate *settings = SettingsPrivate::instance();

    // If the language is successfully loaded,tells every widget that they need to be redisplayed
    if (!lang.isEmpty() && lang != settings->language() && customTranslator.load(lang)) {
        settings->setLanguage(language);
        defaultQtTranslator.load("qt_" + lang,QLibraryInfo::location(QLibraryInfo::TranslationsPath));
        QApplication::installTranslator(&customTranslator);
        /// TODO: reload plugin UI
        QApplication::installTranslator(&defaultQtTranslator);
    } else {
        labelStatusLanguage->setText(tr("No translation is available for this language :("));
    }
}

我希望它有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读