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?
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.
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....
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.
Teraz dużo lepiej. Dzięki za pomoc.
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.