我注意到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对象可以在运行时以某种方式重复用于多个翻译?
答案 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}这样做的时候)