qt QTranslator重用

时间:2013-03-21 08:48:44

标签: qt runtime translation

我注意到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对象。我在这个假设中是对的吗?

作为一个附带问题。假设removeTranslation()不触及QTranslator对象,可以稍后再次安装它吗?

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

1 个答案:

答案 0 :(得分: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所需的字符串(不要忘记{{1}这样做的时候)