4

所以首先这里是 Evernote 的上述菜单的截图,本地化为法语:

[ 在此处输入图像描述]

如您所见,主菜单中的所有菜单项(我的主菜单是指名称为应用程序名称的菜单项,就像这里是Evernote一样)已本地化为法语。Evernote 应用程序本身带来了许多菜单项,例如Évaluez Evernote pour MacRate Evernote for Mac)、Information du compte...Account Info...)等。此外,还有标准 OS X 提供的菜单Quit EvernotePreferences等项目也已本地化。

我的问题:

  1. 如何在此主菜单中添加新项目?如何访问此菜单以添加项目?
  2. 如何根据我的应用本地化本地化这些项目,OS X 提供默认项目和我添加的项目?
  3. 在 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))); 
}
4

2 回答 2

4

也许您可以MainWindowAppMenu.changeEvent

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

您可以强制小部件重新翻译自己。但是你需要先注册一些 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 :("));
    }
}

我希望它有所帮助。

于 2015-09-21T22:36:10.373 回答
4

我仍然没有找到我的问题的完整答案。但是这里有一些我在过去几天中所做的观察:

  1. 为了能够在主菜单中添加菜单项,您必须相应地设置菜单角色,即在将其添加到您想要的任何位置之后(没关系,因为它会移出),您可以像这样设置菜单角色:

    fYourAction->setMenuRole(QAction::ApplicationSpecificRole);
    

这将在主菜单中添加菜单项。如果您以这种方式添加多个项目,它们将按照您设置其菜单角色的顺序出现。

  1. Qt 已经提供了一些特定的角色 - 即About <app>项目,Quit <app>项目,Preferences...项目等。他们在这里提到。例如,如果您的操作有一个文本“Foo”,并且您将其作为菜单项添加到某处,并将角色设置为

    fFooAction->setMenuRole(QAction:: PreferencesRole);
    

然后它会自动移动到主菜单并显示为Preferences...,您在操作中实际输入的文本将无关紧要。但是,无论您连接到它的哪个插槽作为对信号的响应,它triggered()仍然会正确触发。同样适用QAction::AboutRole,无论您在该操作中添加什么文本,它都会移动到主菜单并显示为About <your_app_name>.

  1. QAction::AboutRoleor的问题QAction:: PreferencesRole就像我说的那样,即使您尝试,它们也不会本地化。只有当系统区域设置更改时,它们才会被本地化,如果您只是通过安装新的翻译器在应用程序中更改它,它不会改变。解决方法?避免使用它们并QAction::ApplicationSpecificRole用于您希望出现在主菜单中的所有项目。然后它们将根据您的自定义翻译器正确本地化,并尊重您在操作中提供的任何文本,即如果您在操作中将foo作为文本提供,它将在主菜单中显示为foo ,并相应地进行本地化。再次提醒您,当您添加多个项目时,按其出现的顺序设置项目的角色,即模拟上面的印象笔记菜单,首先设置菜单角色为about_app行动,然后preferences行动。添加它们的位置并不重要,因为它们将被移至新菜单,因此您为项目设置菜单角色的顺序将决定它们在主菜单中出现的顺序。

  2. 上述方法的问题是我不知道如何在主菜单中添加的项目之间插入分隔符。在我们添加的菜单中很容易做到这一点,因为我们可以访问菜单对象,但是在这里我们没有访问权限(我们将项目添加到其他地方,并通过设置菜单角色使它们移动到主菜单),所以我还不知道如何在主菜单中添加多个分隔符。

于 2015-09-28T00:24:09.060 回答