Table of Content
Πώς να δημιουργήσετε μια πολυγλωσσική εφαρμογή με δυνατότητα εναλλαγής γλώσσας κατά το χρόνο εκτέλεσης;
Δημιουργήστε μία standard εφαρμογή, δηλαδή με main window

Στο παράδειγμα αυτό, δημιουργούμε ένα main window με ένα μενού Language και κάποια widget. Εάν ο χρήστης άνοιξε το μενού language, υπάρχει μια επιλογή γλώσσας, η οποία δημιουργείται κατά την έναρξη της εφαρμογής, και εξαρτάται από τα υπάρχοντα γλωσσικά αρχεία.

Η δομή αρχείων της εφαρμογής:
- <Κατάλογος εφαρμογής>
- binaries
- <Κατάλογος εφαρμογής>/languages
- Για κάθε εγκατεστημένη γλώσσα, υπάρχει ένα (προαιρετικό) αρχείο εικόνας μεγέθους 16×16 pixel με μία σημαία (π.χ. de.png)
- Τα μεταφρασμένα αρχεία κειμένου της εφαρμογής (TranslationExample_*.qm, όπου * μπορεί να είναι be de, en, …)
- τα αρχεία μετάφρασης του Qt (qt_*.qm)
Ορισμός κλάσης
Στην κλάση MainWindow, η virtual method changeEvent [doc.qt.nokia.com] γίνεται overwritten. Για κάθε αρχείο μετάφρασης που απαιτείται, ένα QTranslator [doc.qt.nokia.com] στιγμιότυπο δημιουργείται (στο συγκεκριμένο παράδειγμα 2, ένα για τα application texts, ένα για το qt). Η τρέχουσα γλώσσα αποθηκεύεται για να suppress events, εάν ο χρήστης προσπαθήσει να φορτώσει την ίδια γλώσσα δύο φορές.
- {
- ...
- protected:
- /** this event is called, when a new translator is loaded or the system language is changed
- */
- protected slots:
- /** this slot is called by the language menu actions
- */
- private:
- /** loads a language by the given language shortcur (e.g. de, en, ...)
- */
- /** creates the language menu dynamically from the content of m_langPath
- */
- void createLanguageMenu(void);
- Ui::MainWindow ui; /**< ui definition from designer */
- };
Δημιουργία των language μενού
Το language μενού δημιουργείται δυναμικά κατά την έναρξη της εφαρμογής, ανάλογα με τα υπάρχοντα αρχεία μετάφρασης. Το πλεονέκτημα αυτής της λύσης είναι ότι μπορείτε να δώσετε οποιαδήποτε μετάφραση στην πορεία και απλά θα δουλεύει μετά από μια επανεκκίνηση. Στο συγκεκριμένο παράδειγμα, όλα τα αρχεία κειμένου βρίσκονται στον υποκατάλογο “languages”. Είναι δυνατόν να τοποθετηθούν κάποια εικονίδια εκεί (language.png) για χρήση ως εικονίδιο του μενού (π.χ. μία σημαία).
Κάθε γλώσσα αντιπροσωπεύετα από ένα QAction [doc.qt.nokia.com] αντικείμενο το οποίο προστίθεται σε ένα QActionGroup [doc.qt.nokia.com]. Αυτό γίνεται ώστε να διασφαλισθεί το ότι μόνο ένας υποδοχέας (slot) χρειάζεται για όλες τις γλώσσες:
- connect(langGroup, SIGNAL), this, SLOT));
- // we create the menu entries dynamically, dependant on the existing translations.
- void MainWindow::createLanguageMenu(void)
- {
- langGroup->setExclusive(true);
- // format systems language
- defaultLocale.truncate(defaultLocale.lastIndexOf('_')); // e.g. "de"
- m_langPath.append("/languages");
- for (int i = 0; i < fileNames.size(); ++i)
- {
- // get locale extracted by filename
- QString locale;
- locale = fileNames[i]; // "TranslationExample_de.qm"
- locale.truncate(locale.lastIndexOf('.')); // "TranslationExample_de"
- locale.remove(0, locale.indexOf('_') + 1); // "de"
- action->setCheckable(true);
- action->setData(locale);
- ui.menuLanguage->addAction(action);
- langGroup->addAction(action);
- // set default translators and language checked
- if (defaultLocale == locale)
- {
- action->setChecked(true);
- }
- }
- }
Αλλαγή γλώσσας
Εάν η γλώσσα πρέπει να αλλαχθεί, η απαιτούμενη γλώσσα-στόχος εξάγεται από το QAction [doc.qt.nokia.com] αντικείμενο και οι υπάρχουσες μεταφράσεις απομακρύνονται (QApplication::removeTranslator [doc.qt.nokia.com] ). Μετά από αυτό, τα νέα γλωσσικά αρχεία φορτώνονται, και εάν αυτό γίνει επιτυχώς, ο μεταφραστής εγκαθίσταται και πάλι (QApplication::installTranslator [doc.qt.nokia.com] ). Αυτό γίνεται για να διασφαλισθεί ότι ένα QEvent::LanguageChange [doc.qt.nokia.com] event εκπέμπεται (emitted) από το αντικείμενο της εφαρμογής. Εάν η εφαρμογή απλά περιέχει μόνο ένα top level window, το οποίο δημιουργείται εξ’ ολοκλήρου από τον designer, είναι επίσης εφικτό να διαβαστούν απλά τα νέα αρχεία μετάφρασης και να κληθεί το ui.retranslateUi(this) απευθείας.
- // Called every time, when a menu entry of the language menu is called
- {
- if(0 != action)
- {
- // load the language dependant on the action content
- loadLanguage(action->data().toString());
- setWindowIcon(action->icon());
- }
- }
- {
- // remove the old translator
- qApp->removeTranslator(&translator;);
- // load the new translator
- if(translator.load(filename))
- qApp->installTranslator(&translator;);
- }
- {
- if(m_currLang != rLanguage)
- {
- m_currLang = rLanguage;
- ui.statusBar->showMessage(tr("Current Language changed to %1").arg(languageName));
- }
- }
- QEvent::LanguageChange [doc.qt.nokia.com] θα καλείται πάντα, εάν ένα αντικείμενο μετάφρασης είναι εγκατεστημένο στο αντικείμενο της εφαρμογής
- QEvent::LocaleChange [doc.qt.nokia.com] καλείται, όταν η γλώσσα του συστήματος αλλάζει
- {
- if(0 != event)
- {
- switch(event->type())
- {
- // this event is send if a translator is loaded
- ui.retranslateUi(this);
- break;
- // this event is send, if the system, language changes
- {
- locale.truncate(locale.lastIndexOf('_'));
- loadLanguage(locale);
- }
- break;
- }
- }
- }
Προσθήκη μεταφράσεων στο project
Στο QMake [doc.qt.nokia.com] σας project αρχείο, η ακόλουθη μεταβλητή TRANSLATIONS [doc.qt.nokia.com] πρέπει να προστεθεί και πρέπει να περιέχει όλα τα αρχεία συστήματος που θέλετε να δημιουργήσετε αρχικά.
- TRANSLATIONS = languages/TranslationExample_en.ts \
- languages/TranslationExample_de.ts
Καλώντας την lupdate [doc.qt.nokia.com]
- lupdate -verbose TranslationExample.pro
Δημιουργείτε τα γλωσσικά αρχεία (*.ts), τα οποία μεταφράζετε χρησιμοποιώντας το εργαλείο Qt Linguist [doc.qt.nokia.com]
- linguist languages/TranslationExample_en.ts languages/TranslationExample_de.ts
Μετά από αυτό, καλείτε την lrelease [doc.qt.nokia.com] για να δημιουργήσετε τα binary γλωσσικά αρχεία (*.qm):
- lrelease TranslationExample.pro
Στοχεύοντας το Symbian
Σε περίπτωση που η εφαρμογή σας έχει ως στόχο και το Symbian, τότε πρέπει να προστεθεί και ένας ακόμα ειδικός κανόνας στο .pro αρχείο ώστε να τοποθετήσει τα .qm αρχεία μαζί με το εκτελέσιμο αρχείο. Οπότε η προσθήκη είναι η εξής:
- symbian: {
- addFiles.sources = TranslationExample_en.qm TranslationExample_de.qm
- addFiles.path = .
- DEPLOYMENT += addFiles
- }
Με την ελπίδα να φανούν χρήσιμα.

