我注意到 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 对象可以在运行时以某种方式重复用于多个翻译?
最佳答案
QTranslator::load 基本上在简单意义上可以被认为是一个函数,它打开给定的 .qm
文件,读入所有翻译值并将其加载到特定语言中。
现在,在一般操作中,您不希望在许多语言中重用它,因为“重用”(即使允许)每次切换 UI 语言时都会增加为每种语言解析给定 .qm
文件的开销,这基本上是你不需要的开销。
您为每种语言创建 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()
)关于qt QTranslator 复用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15542887/