我注意到,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对象可以在运行时被重用为多个翻译的话?
发布于 2013-03-21 15:26:47
简单地说,QTranslator::load可以看作是一个函数,它打开给定的.qm文件,读取所有已翻译的值,并将其加载到特定语言中。
现在,在一般操作中,您不希望在许多语言中重用它,就像“重用”(即使允许的话)一样,您在每次切换UI语言时为每种语言添加解析这个给定的.qm文件的开销,这基本上是一种不需要的开销。
您为每种语言创建QTranslator的假设是正确的。至于你的问题,是的,你也可以重复使用。这是每个翻译都有单独的QTranslator对象的好处。只需用当前翻译调用qApp->removeTranslator(),然后用新翻译调用qApp->installTranslator()。这样,您就可以在您喜欢的时候重用加载的翻译。
我们的结构是通过子类QApplication和添加两个函数来实现的。
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() )。
https://stackoverflow.com/questions/15542887
复制相似问题