Res*_*ion 4 qt translation runtime
我注意到Qt文档在翻译的某些方面不是很冗长.我正在试图通过试错来弄清楚他们的行为.最终目标是在运行时更改转换,但我很困惑QTranslator对象可以在多大程度上重用.
考虑一下(其中'a'是应用程序的主要实例):
QTranslator translator;
translator.load("mytranslation_cz");
a.installTranslation(&translator);
(...)
a.removeTranslation(&translator)
Run Code Online (Sandbox Code Playgroud)
现在翻译器已从应用程序中删除但转换器对象发生了什么?
在我的测试中,当上面的代码再次出现时
translator.load("mytranslation_fr");
a.installTranslation(&translator);
Run Code Online (Sandbox Code Playgroud)
它在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?
Run Code Online (Sandbox Code Playgroud)
感谢您的任何澄清,因为我对在安装和删除应用程序中的翻译时QTranslation对象会发生什么有些困惑,特别是如果QTranslation对象可以在运行时以某种方式重复用于多个翻译?
QTranslator :: load基本上在简单意义上可以被视为打开给定.qm文件的函数,读入所有已翻译的值并将其加载到特定语言中.
现在在一般操作中,您不希望将其重用于许多语言,因为"重用"(即使允许)您.qm每次切换UI语言时都会为每种语言添加解析此给定文件的开销,这基本上就是你不需要的开销.
您QTranslator为每种语言创建a的假设是正确的.至于你的问题,是的,你也可以重复使用它.这就是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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,在应用程序的最开始调用此函数.
第二功能如下
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_);
}
Run Code Online (Sandbox Code Playgroud)
而已.使用第二个功能,您可以根据需要在运行时切换语言.
您还需要注意的一些事情是QTranslator在运行时更改将更新.ui标记为可自动翻译的文件字符串中的所有翻译,但是从代码中设置的那些翻译将不会.为了得到它,你将不得不重写QWidget :: changeEvent(),然后检查事件是否是类型QEvent::LanguageChange,然后相应地设置所需的字符串QWidget(不要忘记tr()这样做)