4

まず最初に、フランス語にローカライズされた Evernote のメニューのスクリーンショットを示します。

[ ここに画像の説明を入力]

ご覧のとおり、メイン メニューのすべてのメニュー項目 (メイン メニューとは、ここではEvernoteのように、名前がアプリケーション名になっているものを意味します) はフランス語にローカライズされています。Évaluez Evernote pour Mac ( Rate Evernote for Mac )、Information du compte... (アカウント情報... ) など、Evernote アプリ自体が提供する多くのメニュー項目があります。さらに、標準の OS X 提供メニューがあります。Evernote を終了環境設定などのアイテムもローカライズされています。

私の質問:

  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

私は自分の問題に対する完全な答えをまだ見つけていません。しかし、ここ数日間で私が行った観察のいくつかを以下に示します。

  1. メイン メニューにメニュー項目を追加できるようにするには、それに応じてメニュー ロールを設定する必要があります。つまり、必要な場所に追加した後 (移動するので問題ありません)、次のようにメニュー ロールを設定します。 :

    fYourAction->setMenuRole(QAction::ApplicationSpecificRole);
    

これにより、メイン メニューにメニュー項目が追加されます。この方法で複数の項目を追加すると、メニュー ロールを設定した順序で表示されます。

  1. Qt が既に提供している特定のロールはほとんどありません。つまり、About <app>item、Quit <app>item、Preferences...item などです。たとえば、アクションに「Foo」というテキストがあり、それをメニュー項目としてどこかに追加し、役割を次のように設定するとします。

    fFooAction->setMenuRole(QAction:: PreferencesRole);
    

その後、自動的にメイン メニューに移動し、 として表示されPreferences...ます。アクションに実際に入力したテキストは重要ではありません。ただし、シグナルへの応答としてアタッチしたスロットが何であれ、triggered()それでも正しく起動します。QAction::AboutRole同様に、そのアクションに追加するテキストが何であれ、メインメニューに移動して として表示されますAbout <your_app_name>

  1. QAction::AboutRoleまたはの問題QAction:: PreferencesRoleは、私が言ったように、ローカライズしようとしてもローカライズされません。システム ロケールが変更された場合にのみローカライズされます。新しいトランスレーターをインストールしてアプリ内だけで変更した場合は、変更されません。回避策は?それらを避けてQAction::ApplicationSpecificRole、メインメニューに表示したいすべてのアイテムに使用してください。次に、カスタム トランスレータに従って適切にローカライズされ、アクションで指定したテキストが尊重されます。つまり、アクションでテキストとしてfooを指定すると、メイン メニューに foo として表示され、それに応じてローカライズされます。繰り返しになりますが、複数のアイテムを追加する場合は、アイテムの役割を外観順に設定してください。つまり、上記の Evernote メニューをシミュレートするには、最初にabout_appアクション、そしてpreferencesアクション。これらは新しいメニューに移動されるため、どこに追加するかは重要ではありません。そのため、アイテムのメニュー ロールを設定する順序によって、メイン メニューに表示される順序が決まります。

  2. 上記のアプローチの問題は、メイン メニューに追加する項目間にセパレータを挿入する方法がわからないことです。メニューオブジェクトにアクセスできるので、追加するメニューでそれを行うのは簡単ですが、ここではアクセスできません (アイテムを別の場所に追加し、メニューロールを設定してメインメニューに移動させます) )なので、メインメニューに複数のセパレーターを追加する方法はまだわかりません。

于 2015-09-28T00:24:09.060 に答える