4

我注意到 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 对象可以在运行时以某种方式重用于多个翻译?

4

1 回答 1

5

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

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

您为每种语言创建一个的假设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()这样做的时候)

于 2013-03-21T15:26:47.820 回答