我注意到 Qt 文档在翻译的某些方面不是很冗长。我在玩弄它,试图通过反复试验找出他们的行为。最终目标是在运行时更改翻译,但我很困惑 QTranslator 对象可以在多大程度上被重用。

考虑一下(其中“a”是应用程序的主要实例):

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

(...)

a.removeTranslation(&translator)

现在翻译器已从应用程序中删除,但是翻译器对象发生了什么变化?

在我的测试中,当上面的代码再次被这个
translator.load("mytranslation_fr");
a.installTranslation(&translator);

它在 main() 中没有做任何事情,并且在从其中一个小部件调用时使应用程序崩溃(使用指向主应用程序的指针)。

因此,我怀疑我需要为每个要加载到应用程序中的翻译创建一个 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 对象可以在运行时以某种方式重复用于多个翻译?

最佳答案

QTranslator::load 基本上在简单意义上可以被认为是一个函数,它打开给定的 .qm 文件,读入所有翻译值并将其加载到特定语言中。

现在,在一般操作中,您不希望在许多语言中重用它,因为“重用”(即使允许)每次切换 UI 语言时都会增加为每种语言解析给定 .qm 文件的开销,这基本上是你不需要的开销。

您为每种语言创建 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);
  }
}

现在这个函数在应用程序的一开始就被调用。

第二个功能如下
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_);
}

就是这样。使用第二个函数,您可以在运行时随意切换语言。

您还需要注意的几件事是在运行时更改 QTranslator 将自动更新标记为可翻译的 .ui 文件字符串中的所有翻译,但是那些从代码设置的不会更新。为此,您必须覆盖 QWidget::changeEvent(),然后检查事件是否属于 QEvent::LanguageChange 类型,然后相应地为该 QWidget 设置所需的字符串(这样做时不要忘记 tr())

关于qt QTranslator 复用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15542887/

10-09 08:00