[Qt] Dynamiczna zmiana języka

0

Cześć, mam już wygenerowany plik .qm, a teraz dodałem sobie zmianę języka w menu. Gdy wybieram Angielski to instaluję translator, a gdy polski to go usuwam. Problem w tym, że zmiana języka dla napisów w klasie w ogóle nie następuje. Wyczytałem, że trzeba ręcznie zmienić napisy w klasie w której dokonuje się zmiany języka (czyli w tym przypadku dla MainWindow), rozwiązanie trochę dziwne - zwłaszcza gdy będę miał powiedzmy 10 języków. Przede wszystkim problemem jest jednak to, że mam kilka widgetów które zmieniam w centralnym oknie aplikacji, zmiana w nich języka następuje dopiero gdy wybiorę ten widget drugi raz. Nie ma może jakieś opcji odświeżenia widgetu przy zmianie języka? update() nic nie pomaga.
Jest na to wszystko jakiś sposób?

0

problem leży w sposobie ustawianie zawartości stringów.
Do tego używasz translatora, czyli wywołań statycznej metody: QObject::tr.
Wywołanie to polega na zwykłym tłumaczeniu, czyli translator odnajduje dany ciąg i zwraca jego tłumaczenie, to jak dalej posługujesz się tym napisem to już problem aplikacji.
Czyli jeśli zmieniasz translator (język programu) to twój kod musi zadbać, by wszystkie istotne tłumaczenia - czyli wywołania QObject::tr - zostały wykonane i nowe wartości stringów zostały na nowo wyznaczone.

0

Wobec tego jeśli chciałbym po zmianie języka dynamiczną zmianę napisów w centralnym widgecie na zmieniony język, to muszę przy tym sam wywołać metodę która ustawi na nowo wszystkie napisy w tym języku? A jak zmienię z powrotem na język polski to znów mam zmienić za pomocą kodu na język polski? Przy takim rozumowaniu to plik .qm w ogóle nie jest mi chyba potrzebny, bo skoro i tak wszystko mam w kodzie....

0

Niezupełnie sam. Tu masz instrukcję przykład jak to powinno się robić.
W tej metodzie musisz sam zadbać, by wszystkie napisy dla tego widget'u (które wymagają tłumaczenia), zostały ponownie wyznaczone i ustawione.

0

Teraz dużo lepiej. Dzięki za pomoc.

0

Ha, jak patrzę teraz na ten przykład to ewidentnie jest tam błąd lub dokładniej rzecz biorąc to przykład nie jest dość uniwersalny/ogólny.
Powinno być tak:

 void MyWidget::changeEvent(QEvent *event)
 {
     if (e->type() == QEvent::LanguageChange) {
         titleLabel->setText(tr("Document Title"));
         ...
         okPushButton->setText(tr("&OK"));
     }
     MyWidgetAncestor::changeEvent(event);
 }

Bo jeśli MyWidget rozszerza jakąś klasę, która też wymaga przetwarzania przy zmianie języka, to trzeba przekazać zdarzenie do przodka po tym jak się samemu już go obsłużyło.

1 użytkowników online, w tym zalogowanych: 0, gości: 1