首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >qt QTranslator重用

qt QTranslator重用
EN

Stack Overflow用户
提问于 2013-03-21 08:48:44
回答 1查看 1.5K关注 0票数 4

我注意到,Qt文档在翻译的某些方面并不详细。我只是在玩弄它,试图用试错来找出他们的行为。最终目标是在运行时更改转换,但对于QTranslator对象在多大程度上可以被重用,我感到非常困惑。

考虑这一点(其中'a‘是应用程序的主要实例):

代码语言:javascript
复制
QTranslator translator;
translator.load("mytranslation_cz");
a.installTranslation(&translator);

(...)

a.removeTranslation(&translator)

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

在我的测试中,当上面的代码被再次跟随时

代码语言:javascript
复制
translator.load("mytranslation_fr");
a.installTranslation(&translator);

它没有在main()中执行任何操作,当从一个小部件(使用指向主应用程序的指针)调用应用程序时,它使应用程序崩溃。

因此,我怀疑我需要在每个翻译中创建一个QTranslator对象,并且不能重用QTranslator对象。我这个假设是对的吗?

作为一个附带的问题。假设QTranslator对象不受removeTranslation()的影响,那么以后是否可以像这样再次安装它呢?

代码语言:javascript
复制
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对象可以在运行时被重用为多个翻译的话?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-21 15:26:47

简单地说,QTranslator::load可以看作是一个函数,它打开给定的.qm文件,读取所有已翻译的值,并将其加载到特定语言中。

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

您为每种语言创建QTranslator的假设是正确的。至于你的问题,是的,你也可以重复使用。这是每个翻译都有单独的QTranslator对象的好处。只需用当前翻译调用qApp->removeTranslator(),然后用新翻译调用qApp->installTranslator()。这样,您就可以在您喜欢的时候重用加载的翻译。

我们的结构是通过子类QApplication和添加两个函数来实现的。

代码语言:javascript
复制
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);
  }
}

现在,这个函数在应用程序开始时就被调用了。

第二个函数如下

代码语言:javascript
复制
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() )。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15542887

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档