Snadná internacionalizace v Qt4

noname

Snadná internacionalizace v Qt4
« kdy: 30. 11. 2013, 14:13:46 »
Zdravím všechny.

Před nějakou dobou jsem si začal hrát s Qt a mám v něm udělaný jeden malinký prográmek (formulář s osobními údaji). Když jsem jej ale přeložil, popisky u polí pro vložení údajů QLabel ukazovaly nesmyslné znaky, u čehož jsem celkem rychle pochopil, že projekt nemám uložen v UTF 8. Po převedení souboru s definicí do UTF 8 jsem se bohužel nedočkal požadovaného výsledku opravy všech znaků, což jsem vyřešil pomocí funkce na tomto odkazu http://www.abclinuxu.cz/poradna/linux/show/47664 . Jelikož jsem ale chtěl podporu internacionalizace pomocí funkce tr(), tak jsem musel řešení trošičku poupravit, takže výsledný kód pro zápis parametru do QLabel vypadá nějak takto:
Kód: [Vybrat]
nameLabel = new QLabel(tr(QString::fromLocal8Bit("Jméno: ").toStdString().c_str()));. Každopádně řešení, které jsem tady vymyslel mi přijde příliš zdlouhavé na použití pro každý label, navíc musím zbytečně vkládat další knihovnu. Víte o něčem lepším, ideálně čistě s Qt? Bohužel se mi nepodařilo nic moc kloudného najít. Poznámka: využívám Qt 4.8, kvůli většímu množství dostupných informací.

Děkuji všem předem za odpovědi.
« Poslední změna: 02. 12. 2013, 10:01:37 od Petr Krčmář »


noname

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #1 kdy: 30. 11. 2013, 14:53:08 »
PS: Vyzkoušel jsem některé znaky z české klávesnice a zjistil jsem, že je to nepřekládá, přestože soubory jsou po otevření čitelné v českém jazyce. Pomocí
Kód: [Vybrat]
file -bi "jméno souboru" jsem zjistil, že jsou některé uloženy jako us-ascii. Co se čtení (zkoušel jsem gedit) týče, jsou v pořádku, ale v Qt mi to z nějakého důvodu nepřekládá korektně. Nevíte tedy o nějaké alternativě?

noname

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #2 kdy: 01. 12. 2013, 00:21:01 »
Důvod, proč mi to korektně nepřekládá je, že využívám std::string ...
... jen pokud by někdo někdy narazil na podobný problém...

monitor

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #3 kdy: 01. 12. 2013, 05:51:12 »
V kazdom pripade:
ujasnit si, ako chces mat tie subory ulozene, lebo spominas 3 veci:
v prvom prispevku: "pochopil som, ze nemam projekt v UTF-8"
v druhom prispevku: nieco je v "ascii"
v prvom prispevku: pouzivas fromLocal8Bit - cize, akokeby si mu chcel vyrobit string z ISO-8859-2 (co je pod Linuxom rozumne, 8bitove kodovanie pre cestinu). Keby si mal UTF-8, tak by to asi chcelo fromUtf8, nie?

cize, prekonvertuj (iconv, alebo enconv, alebo co chces) si vsetky subory do jednotneho kodovania, a uvidis...najlepsie asi ozaj do UTF-8, lebo to je aj default pre gcc, aj preprocessor,  a tak...

Co sa tyka "prilis zdlhave", "dalsia kniznica":  podla mna, predcasna optimalizacia. Ak odmerias, ze tvoj projekt spomaluje prave toto, tak sa nad tym zamysli... Inak, podla mna, to teda netreba riesit...

monitor

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #4 kdy: 01. 12. 2013, 05:58:13 »
Aha, a este k optimalizacii...
ak to bude vsetko v UTF-8,
tak nestacilo by namiesto
nameLabel = new QLabel(tr(QString::fromLocal8Bit("Jméno: ").toStdString().c_str()));

(teda, ked uz, ako som spominal skor:
nameLabel = new QLabel(tr(QString::fromUtf8("Jméno: ").toStdString().c_str()));

)
mat len jednoducho

nameLabel = new QLabel(tr("Jméno: "));

?

:-)


Petr Bravenec

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #5 kdy: 01. 12. 2013, 08:38:40 »
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));

trUtf8("řetěžeč");

noname

Re:Jak jednodušeji na internacionalizaci v Qt4 ?
« Odpověď #6 kdy: 02. 12. 2013, 02:32:37 »
Děkuji za všechny odpovědi. Byly velice podnětné a všechny jsem využil. Převod do utf-8 jsem provedl podle doporučení diskutéra "monitor". (Pro ověření převodu jsem využil utilitu file s přepínačem -i.) Nejvíce mi ale pomohl příspěvek p. Petra Bravence, po jehož aplikaci fungovalo vše naprosto dokonale. Dokonce jsem zjistil (když jsem si s znovu hrál s programem a zkoušel znovu vyvolat chybu) že mi vše funguje i pouze s funkcemi trUtf8() oproti dříve použitým tr() a naopak že při nastavení kodeku pro funkci tr() pomocí QTextCodec::setCodecForTr() (zavolal jsem ji hned po inicializaci proměnné typu QApplication ve funkci main()) fungují správně i labely, které jsem zapoměl přepsat na trUtf8(). Poslední rada byla tedy úplně super i pro případ drobné chybky v programu. 

Díky za rady!