Sounds like there should be a qApp->translations() that we can use to remove all currently installed translations? Without it, we have to do what you do.
> Sent: Tuesday, March 08, 2016 at 3:44 PM > From: Gianluca <gmax...@gmail.com> > To: "Jason H" <jh...@gmx.com> > Cc: "interest@qt-project.org" <interest@qt-project.org> > Subject: Re: [Interest] Dynamic translations for mobile apps at runtime? > > qApp->installTranslator add a new translation into the stack. Does not remove > the old ones. > So, if the user click 10 times: Italian - English - Italian - English … etc… > you got ten translator into the memory. > That’s because the translation is searched into the order on which the > translator are installed into the stack. > > That’s why I remove everything so there is only one translators at time into > the memory. > > Il giorno 08/mar/2016, alle ore 18:46, Jason H <jh...@gmx.com> ha scritto: > > > I'm wondering why you load all those languages and then remove all but one > > of them? Being a mobile app, I have to be somewhat conscience of memory > > foot print. Do you see anything wrong with: > > > > void Backend::selectLanguage( QString language ) { > > translator = new QTranslator(this); > > translator->load( language, commonPath()+"/translations" ); > > qApp->installTranslator(translator); > > } > > > > ? > > > > > >> Hello Jason, > >> I got the same issue some times ago … and I found that it’s possible to > >> use the translation feature of Qt … that seems static, but it’s not. > >> And localize.biz it’s a wonderful site that allow you to modify Qt > >> translation files directly on web and download the updated one. > >> > >> The trick to achieve (summarized) is the following: > >> Somewhere in your code maintain and update from remote an array of > >> Translators: > >> translators["en"] = new QTranslator(this); > >> translators["en"]->load( "tr_en", commonPath()+"/translations" ); > >> translators["de"] = new QTranslator(this); > >> translators["de"]->load( "tr_de", commonPath()+"/translations" ); > >> translators["fr"] = new QTranslator(this); > >> translators["fr"]->load( "tr_fr", commonPath()+"/translations" ); > >> translators["ru"] = new QTranslator(this); > >> translators["ru"]->load( "tr_ru", commonPath()+"/translations" ); > >> You can change these entry with new files downloaded at runtime. > >> > >> Then you implement a method that you call at runtime for changing the > >> translator, something like that: > >> > >> void Backend::selectLanguage( QString language ) { > >> foreach( QString lang, translators.keys() ) { > >> if ( lang == language ) { > >> qApp->installTranslator( translators[lang] ); > >> } else { > >> qApp->removeTranslator( translators[lang] ); > >> } > >> } > >> this->language = language; > >> emit languageChanged(); > >> } > >> And then there is the final trick: > >> You create a “fake” property that is always an empty string but it’s > >> binded to languageChanged signal: > >> > >> Q_PROPERTY( QString es READ getES NOTIFY languageChanged ) > >> > >> And (the most annoying part), append this empty string to all string you > >> want to change at runtime like that: > >> > >> qsTr("NEWS<br/>HUB")+backend.es > >> > >> And close the loop. > >> > >> What will happen is the following: the translator change at runtime and > >> you trigger a languageChanged that trigger an update of all string that > >> got backend.es appended that trigger the call of qsTr that take the new > >> translation from the new translator. > >> > > _______________________________________________ Interest mailing list Interest@qt-project.org http://lists.qt-project.org/mailman/listinfo/interest