4

Qt のドキュメントは、翻訳のいくつかの面であまり冗長ではないことに気付きました。試行錯誤を使って彼らの行動を理解しようとして、私はそれをいじっていました。最終的な目標は、実行時に翻訳を変更することですが、QTranslator オブジェクトをどの程度再利用できるかについて非常に混乱しています。

これを考慮してください (「a」はアプリケーションのメイン インスタンスです)。

QTranslator translator;
translator.load("mytranslation_cz");
a.installTranslation(&translator);

(...)

a.removeTranslation(&translator)

翻訳者はアプリケーションから削除されましたが、翻訳者オブジェクトはどうなったのでしょうか?

私のテストでは、上記のコードの後に​​これが再び続きました

translator.load("mytranslation_fr");
a.installTranslation(&translator);

main() では何もせず、ウィジェットの 1 つから (メイン アプリへのポインターを使用して) 呼び出されると、アプリケーションがクラッシュしました。

したがって、アプリケーションにロードする翻訳ごとに 1 つの QTranslator オブジェクトを作成する必要があり、QTranslator オブジェクトを再利用できないのではないかと考えています。私はこの仮定で正しいですか?

そして副質問として。QTranslator オブジェクトが removeTranslation() によって変更されていないと仮定すると、後でこのように単純に再インストールすることは可能ですか?

QTranslator translator; 
QTranslator translator1;
translator.load("mytranslation_cz");
translator1.load("mytranslation_fr");
a.installTranslation(&translator);
(...)
a.removeTranslation(&translator);
a.installTranslation(&translator1);
(...)
a.removeTranslation(&translator1);
a.installTranslation(&trasnlator); //Will this work?

アプリケーションから翻訳をインストールおよび削除するときに QTranslation オブジェクトに何が起こるか、特に実行時に QTranslation オブジェクトを複数の翻訳に再利用できる場合はどうなるかについて、少し混乱しているため、明確にしていただきありがとうございます。

4

1 に答える 1

5

QTranslator::load.qmは基本的に単純な意味で、特定のファイルを開き、翻訳されたすべての値を読み取り、特定の言語にロードする関数と見なすことができます。

.qm一般的な操作では、UI 言語を切り替えるたびにすべての言語に対してこの特定のファイルを解析するオーバーヘッドを追加することで (許可されていても) 「再利用」することで、これを多くの言語で再利用したくないでしょう。必要のないオーバーヘッド。

for each languageを作成するというあなたの仮定QTranslatorは正しいです。副次的な質問ですが、はい、再利用することもできます。QTranslatorこれが、翻訳ごとに個別のオブジェクトを持つ利点です。現在の翻訳でqApp->removeTranslator()を呼び出しqApp->installTranslator()てから、新しい翻訳で呼び出すだけです。このようにして、読み込んだ翻訳を好きなときに再利用できます。

これを構造化する方法は、サブクラス化QApplicationして 2 つの関数を追加することです

void Application::CreateTranslators() {
  // translators_ is a QMap<QString, QTranslator*>
  if (!translators_.isEmpty())  
    return;
  QStringList languages;
  languages << "en" << "ar" << "zh";
  foreach(QString language, languages) {
    QTranslator* translator = new QTranslator(instance());
    translator->load(language);
    translators_.insert(language, translator);
  }
}

現在、この関数はアプリケーションの開始時に呼び出されます。

2番目の関数は次のとおりです

void Application::SwitchLanguage(QString language) {
  // current_translator_ is a QTranslator*
  if (current_translator_)
    removeTranslator(current_translator_);

  current_translator_ = translators_.value(language, nullptr);
  if (current_translator_)
    installTranslator(current_translator_);
}

それでおしまい。2 番目の関数を使用すると、実行時に好きなように言語を切り替えることができます。

QTranslator実行時に変更する.uiと、翻訳可能としてマークされたファイル文字列からすべての翻訳が自動的に更新されますが、コードから設定された翻訳は更新されません。それを取得するには、QWidget::changeEvent()をオーバーライドしてから、イベントのタイプQEvent::LanguageChangeを確認し、それに応じて必要な文字列を設定する必要がありますQWidget(そうしている間は を忘れないでくださいtr()) 。

于 2013-03-21T15:26:47.820 に答える