abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
včera 11:34 | Zajímavý článek

Mozilla.cz radí, jak na plynulejší přehrávání YouTube videí. Pokud se vám videa na YouTube nepřehrávají moc plynule, může vám pomoci vypnutí podpory formátů VP8 a VP9, které YouTube používá jako výchozí. Jejich přehrávání není hardwarově akcelerované, takže s ním má počítač více práce. Oproti tomu formát H.264 je akcelerovaný velmi dobře. Všechno, co budete potřebovat, je doplněk h264ify.

Ladislav Hagara | Komentářů: 48
včera 00:30 | Komunita

Nadace The Document Foundation (TDF) zastřešuje nejenom svobodný kancelářský balík LibreOffice, ale také projekt Document Liberation. Ten byl založen v dubnu 2014 (zprávička) a jeho cílem je vývoj knihoven pro zpřístupnění (osvobození) dokumentů vytvořených v proprietárních formátech. K dispozici jsou již knihovny například pro formáty Corel WordPerfect, Microsoft Works, Corel Draw, Microsoft Publisher, Microsoft Visio nebo

… více »
Ladislav Hagara | Komentářů: 2
23.5. 20:10 | Nová verze

Včera, 22. mája 2016, bola vydaná nová verzia 1.2.0 populárneho webmailového klienta Roundcube Webmail (Release Announcement). Medzi nové vlastnosti je mozné spomenúť: kompatibilita s PHP7, PGP šifrovanie (na strane klienta aj servera), vyhladávanie mailov podla časových intervalov a ďalsie. Súčasťou novej verzie je aj množstvo malých zlepšení a bug fixov (ich kompletný zoznam je možné najsť v Changelogu). Stiahnuť novu verziu Roundcube je možné v Download sekcií.

timeos | Komentářů: 0
23.5. 07:00 | Nová verze

Byla vydána verze 8.0.1 překladače funkcionálního programovacího jazyka Haskell (Wikipedie) Glasgow Haskell Compiler (GHC). Nová major verze 8 vychází po téměř šesti letech od vydání verze 7. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
22.5. 20:00 | Zajímavý článek

Nezisková organizace Girls Who Code (Wikipedie), jejíž cílem je podpořit a zvýšit počet holek a žen ve světě IT, zveřejnila sérií videí, ve kterých rozebírá 3 důvody, proč nemohou holky programovat: mají prsa, menstruují a jsou krásné.

Ladislav Hagara | Komentářů: 159
22.5. 20:00 | Nová verze

Po více než třech měsících vývoje od vydání verze 229 (zprávička) oznámil Zbigniew Jędrzejewski-Szmek vydání verze 230 správce systému a služeb systemd (GitHub, NEWS). Lennart Poettering nedávno oznámil, že letošní konference systemd.conf věnována systemd proběhne v Berlíně ve dnech 28. září až 1. října. CFP běží do 1. srpna.

Ladislav Hagara | Komentářů: 64
20.5. 15:00 | IT novinky

Po dvou úspěšných kampaních na notebooky Librem 15 a Librem 13 na crowdsourcingovém portálu Crowd Supply představila společnost Purism, tentokrát na portálu Indiegogo, zařízení 2v1 (tablet a notebook v jednom) Librem 11 s operačním systémem PureOS 3.0, tj. forkem Debianu. Stejně jako u noteboocích říká (zprávička), že se jedná o zařízení respektující bezpečnost, svobodu a soukromí uživatelů a hardwarové komponenty byly vybrány tak, aby bylo možné používat pouze svobodný software.

Ladislav Hagara | Komentářů: 47
20.5. 12:11 | Zajímavý software

Dle plánu byly uvolněny zdrojové kódy svobodného online kancelářského balíku Open365 (zprávička). Dnes byl vydán také instalátor (GitHub).

Ladislav Hagara | Komentářů: 4
19.5. 18:18 | Komunita

V aktuální stabilní verzi 50 a beta verzi 51 webových prohlížečů Chrome a Chromium je možné pomocí klávesy Backspace přejít na předchozí stránku v historii prohlížení aktuální karty (Klávesové zkratky v Chromu). Ve vývojové verzi 52 byla tato možnost odstraněna [Hacker News, Monorail, Code Reviews].

Ladislav Hagara | Komentářů: 20
18.5. 22:23 | Nová verze

Byl vydán GNU Hurd 0.8, GNU Mach 1.7 a GNU MIG 1.7. Cílem projektu GNU Hurd je nahrazení unixového jádra sadou serverů běžících nad mikrojádrem GNU Mach. GNU MIG je nástroj potřebný pro překlad GNU Hurd a GNU Mach. Od pondělí budou na Hurdu pracovat 2 studenti v rámci letošního Google Summer of Code.

Ladislav Hagara | Komentářů: 18
Jaký poměr stran pracovní plochy (příp. složené z více monitorů) preferujete?
 (6%)
 (13%)
 (51%)
 (22%)
 (4%)
 (2%)
 (1%)
Celkem 387 hlasů
 Komentářů: 28, poslední dnes 03:44
    Rozcestník
    Reklama

    Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    29. 5. 2009 | David Watzke | Programování | 9888×

    V dnešním díle se dozvíte, jak program lokalizovat a jak k němu korektně přibalit nějaká data - třeba obrázky, ikony nebo zvuky.

    Lokalizace (kalendář)

    Hned na začátku seriálu jsem doporučoval označovat všechny řetězce viditelné uživateli pro překlad, což se dělá vložením řetězce do metody tr() třídy QObject. Když budete chtít překladatelům trochu usnadnit práci, můžete do kódu přidat ještě speciální komentáře, které budou obsahovat například informace o kontextu, což se hodí především u rozsáhlých projektů. Tyto komentáře se vytvářejí tak, že přímo nad řádek s řetězcem označeným pro překlad vytvoříte C++ komentář začínající dvojtečkou:

    //: this is the hidden button
    hBtn = new QPushButton(tr("Explode!"));
    
    /*: example string */
    QString str(tr("Go"));
    

    Tohle ovšem nestačí k tomu, aby program použil dodané překlady. Je třeba načíst překlad ve funkci main() pomocí vytvoření a registrace objektu QTranslator, což je vysvětleno o kousek níže, u zdrojového kódu main.cpp. Z programátorského hlediska nám tyto znalosti většinu času postačí. Jak ale vytvořit překlad?

    Je nutné přidat do projektového souboru (s příponou .pro) následující:

    # "cs" je ISO 639 kód pro češtinu, "CZ" je ISO 3166 kód pro ČR
    TRANSLATIONS = calendar_cs_CZ.ts
    

    A v případě, že nechceme překlady ve výchozím kódování (Latin1), ale v UTF-8, tak ještě

    CODECFORTR = UTF-8

    Nyní, když spustíte program lupdate s připraveným .pro souborem jako argument, vygenerují (a později už jen aktualizují) se vám soubory, které jste zadali v .pro souboru do proměnné TRANSLATIONS.

    $ lupdate calendar.pro
    Updating 'calendar_cs_CZ.ts'...
    
        Found 1 source text(s) (1 new and 0 already existing)
    

    Tímto nám vznikl soubor calendar_cs_CZ.ts, což je jakési XML, které lze editovat pomocí grafického nástroje Qt Linguist. Spustíme si jej tedy a otevřeme v něm tento soubor (z příkazové řádky pomocí linguist calendar_cs_CZ.ts). Zvolíme jazyk, do kterého překládáme, a můžeme se do toho pustit. V případě tohoto ukázkového programu není příliš co překládat, takže přeložíme "Add" jako "Přidat", uložíme změny a tím naše překladatelská práce hasne, od toho jsou tu přece jiní :-)

    Posledním krokem je spuštění lrelease (opět s .pro souborem jako argument), což vygeneruje z .ts souborů binární soubory s příponou .qm, které pak program načítá.

    $ lrelease calendar.pro
    Updating '/home/dave/abcl/qt4-7/calendar/calendar_cs_CZ.qm'...
        Generated 1 translation(s) (1 finished and 0 unfinished)
    

    Teď, když spustíte program z adresáře, kde je soubor calendar_cs_CZ.qm, tak za předpokladu, že máte systémový jazyk nastavený na češtinu, se vám program spustí v češtině.

    Ukázkový program pro tento díl obsahuje kalendář (QCalendarWidget) a umožňuje ke každému dni napsat libovolný počet poznámek. Poznámky se ukládají do konfiguračního souboru přes objekt QSettings, jehož použití jsme si ukazovali již ve druhém díle.

    main.cpp: Zde je novinkou zavedení lokalizace. Vytvoříme si instanci objektu QTranslator, jehož metodou load() načteme soubor s překladem. Metodě předáváme název .qm souboru bez přípony. Jako druhý argument můžeme předat cestu k adresáři, kde se má soubor hledat. Načtenou lokalizaci poté zavedeme do programu metodou QCoreApplication::installTranslator() (nejjednoduššeji přes instanci QApplication).

    #include <QApplication>
    #include <QLocale>
    #include <QTextCodec>
    #include <QTranslator>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
    	QApplication app(argc, argv);
    	// nastavíme název programu a doménu pro QSettings
    	app.setApplicationName("calendar");
    	app.setOrganizationDomain("watzke.cz");
    
    	// kódování pro lokalizaci bude UTF-8
    	QTextCodec::setCodecForTr(QTextCodec::codecForName("utf8"));
    
    	QTranslator t;
    
    	/* načteme překlad podle aktuální locale ze souboru ve tvaru:
    	 *	název programu + podtržítko + jazyk_země
    	 * kde jazyk je dvoumístný kód jazyka (ISO 639) malými písmeny a
    	 * země je dvoumístný kód země (ISO 3166) velkými písmeny, např. cs_CZ
    	 */
    	t.load( app.applicationName() + "_" + QLocale::system().name() );
    
    	// a přiřadíme jej k této instanci programu
    	app.installTranslator(&t);
    
    	MainWindow win;
    	win.show();
    
    	return app.exec();
    }
    

    mainwidget.h: API.

    #ifndef MAINWIDGET_H
    #define MAINWIDGET_H
    
    #include <QWidget>
    #include <QSettings>
    
    class QCalendarWidget;
    class QLineEdit;
    class QListWidget;
    
    class MainWidget : public QWidget
    {
    	Q_OBJECT
    public:
    	MainWidget();
    
    private:
    	QSettings settings;
    
    	QCalendarWidget* calendar;
    	QLineEdit* lineEdit;
    	QListWidget* list;
    
    	QString getDate();
    
    private slots:
    	void addItem();
    	void removeItem();
    	void listItems();
    };
    
    #endif // MAINWIDGET_H
    

    mainwidget.cpp: Zde je novinkou použití tříd QDate a QDateTime. Slouží pro manipulaci s datem, respektive datem a časem. Mají například statické metody pro získání aktuálního data a umí jej různě formátovat.

    #include "mainwidget.h"
    
    #include <QAction>
    #include <QCalendarWidget>
    #include <QDateTime>
    #include <QHBoxLayout>
    #include <QLineEdit>
    #include <QListWidget>
    #include <QPushButton>
    #include <QVBoxLayout>
    
    MainWidget::MainWidget()
    {
    	// vytvoříme kalendář
    	calendar = new QCalendarWidget;
    	// nastavíme první den v týdnu na pondělí
    	calendar->setFirstDayOfWeek(Qt::Monday);
    	// skryjeme vertikální hlavičku s čísly týdnů
    	calendar->setVerticalHeaderFormat(QCalendarWidget::NoVerticalHeader);
    
    	// vytvoříme jednořádkový editor textu
    	lineEdit = new QLineEdit;
    	// a jednoduchý seznam,
    	list = new QListWidget;
    	// ve kterém lze vybrat v jednu chvíli jen jednu položku
    	list->setSelectionMode(QAbstractItemView::SingleSelection);
    	// a který má akci, jež se spustí při stisknutí klávesy Delete
    	QAction* removeShortcut = new QAction(list);
    	removeShortcut->setShortcut(QKeySequence("Delete"));
    	list->addAction(removeShortcut);
    
    	// tlačítko pro přidání položky do seznamu
    	QPushButton* addBtn = new QPushButton(tr("Add"));
    
    	QHBoxLayout* lineLayout = new QHBoxLayout;
    	lineLayout->addWidget(lineEdit);
    	lineLayout->addWidget(addBtn);
    
    	// vytvoříme vertikální rozložení
    	QVBoxLayout* layout = new QVBoxLayout(this);
    	layout->addWidget(calendar);
    	layout->addLayout(lineLayout);
    	layout->addWidget(list);
    
    	// propojíme ovládací prvky
    	connect(calendar, SIGNAL(selectionChanged()), this, SLOT(listItems()));
    	connect(lineEdit, SIGNAL(returnPressed()), this, SLOT(addItem()));
    	connect(addBtn, SIGNAL(clicked()), this, SLOT(addItem()));
    	connect(removeShortcut, SIGNAL(triggered()), this, SLOT(removeItem()));
    
    	// načteme položky pro výchozí (dnešní) datum po spuštění programu
    	listItems();
    }
    
    // přidá položku se zadaným textem k vybranému datu
    void MainWidget::addItem()
    {
    	// načteme text z textového pole
    	QString text = lineEdit->text();
    	// a pokud je prázdný, tak končíme
    	if(text.isEmpty())
    		return;
    
    	// získáme aktuální datum
    	QString date = getDate();
    	if(date.isEmpty())
    		return;
    
    	// získáme aktuální datum s časem
    	QDateTime datetime(QDateTime::currentDateTime());
    	// a přidáme jej na začátek řetězce
    	text.prepend(datetime.toString("dd.MM.yy@hh.mm: "));
    
    	// index přidávané položky (v nastavení)
    	QString index = "0";
    
    	// přepneme se v nastavení do sekce s dnešním datem
    	settings.beginGroup(date);
    
    	// pokud jsou zde již nějaké položky, nastavíme správný index (poslední + 1)
    	if(settings.childKeys().size())
    		index = QString::number(settings.childKeys().last().toInt() + 1, 10);
    
    	// uložíme položku do nastavení
    	settings.setValue(index, text);
    	// a nezapomeneme (!) vyskočit ze sekce s dnešním datem
    	settings.endGroup();
    
    	// nakonec přidáme položku i do seznamu
    	QListWidgetItem* item = new QListWidgetItem(text);
    	list->addItem(item);
    	list->setCurrentItem(item);
    
    	// a vyprázdníme textové pole
    	lineEdit->clear();
    }
    
    // odstraní vybranou položku
    void MainWidget::removeItem()
    {
    	//if(!list->count())
    	//      return;
    
    	// index vybrané položky v seznamu
    	int row = list->currentRow();
    
    	// pokud nebyla vybrána žádná položka, tak končíme
    	if(row < 0)
    		return;
    
    	QString date = getDate();
    	if(date.isEmpty())
    		return;
    
    	settings.beginGroup(date);
    
    	// index vybrané položky v nastavení
    	QString key = settings.childKeys().at(row);
    
    	// pokud odstraňujeme poslední položku, odstraníme i sekci daného data
    	if(settings.childKeys().size() == 1)
    		settings.remove("");
    	else
    		settings.remove(key);
    
    	settings.endGroup();
    
    	// nakonec odstraníme položku i ze seznamu
    	delete list->takeItem(row);
    }
    
    // načte položky k danému dni z nastavení do seznamu
    void MainWidget::listItems()
    {
    	// vyprázdníme seznam
    	list->clear();
    
    	QString date = getDate();
    	if(date.isEmpty())
    		return;
    
    	settings.beginGroup(date);
    
    	// postupně načteme do seznamu všechny položky v sekci daného data
    	foreach(QString key, settings.childKeys())
    		list->addItem(settings.value(key).toString());
    
    	settings.endGroup();
    
    	// a označíme
    	list->setCurrentRow(0);
    }
    
    // vrátí aktuální datum jako řetězec v ISO formátu (yyyy-MM-dd)
    QString MainWidget::getDate()
    {
    	QDate qdate = calendar->selectedDate();
    	if(qdate.isNull())
    		return QString();
    
    	return qdate.toString(Qt::ISODate);
    }
    

    Zdrojáky si můžete stáhnout v archívu calendar.tar.bz2.

    Qt 4 kalendář

    Data programu

    Často se stane, že je potřeba program dodávat s různými vlastními daty. Může jít například o ikony, obrázky nebo zvuky. Qt pro tuhle situaci má řešení, a to Resource System. Standardní přístup je ten, že se binární data, která program potřebuje, zakompilují do binárky programu. A jak to udělat?

    Musíme si (v adresáři s programem) vytvořit .qrc soubor, což je vlastně XML, ve kterém uvedeme všechny potřebné soubory. Máme dvě možnosti: Buď můžeme použít Qt Creator, v něm si do projektu přidat "resource file" a všechno si naklikat, nebo si tento soubor vytvořit ručně. Popíšu zde pouze ruční metodu, abych vysvětlil, co se vlastně ve skutečnosti děje. Náš ukázkový soubor resources.qrc bude vypadat následovně:

    <!DOCTYPE RCC><RCC version="1.0">
    <qresource>
    	<file>data/image.jpg</file>
    	<file alias="abcicon.png">data/icon.png</file>
    </qresource>
    </RCC>
    

    Do párového tagu file po jednom vložíme cesty ke všem souborům. Cesty jsou relativní k umístění .qrc souboru. Atribut alias umožňuje zadat alias, pod kterým bude daný soubor dostupný (viz níže).

    Nyní o tomto souboru dáme vědět qmake tím, že přidáme do .pro souboru tento řádek:

    RESOURCES += resources.qrc

    To je vše. K zakompilovaným souborům lze přistupovat zadáním relativní cesty za prefix :/. Třeba takto:

    QPixmap icon(":/abcicon.png");

    main.cpp: Ukázka načtení ikonky okna a obrázku. Program je tak jednoduchý, že můžeme udělat vše ve funkci main().

    #include <QApplication>
    #include <QIcon>
    #include <QLabel>
    
    int main(int argc, char *argv[])
    {
    	QApplication a(argc, argv);
    
    	QLabel w;
    	// nastavíme ikonu okna (favicon abclinuxu)
    	w.setWindowIcon(QIcon(":/abcicon.png"));
    	// nastavíme bílé pozadí
    	w.setPalette(QPalette(Qt::white));
    	w.setAutoFillBackground(true);
    	// načteme průhledný gif (logo abclinuxu)
    	w.setPixmap(QPixmap(":/data/image.gif"));
    	w.show();
    
    	return a.exec();
    }
    

    Zdrojáky si můžete stáhnout v archívu resources.tar.bz2.

    Qt 4 resources

    Závěr

    V příštím díle si mimo jiné povíme něco o stylování GUI pomocí CSS.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    29.5.2009 07:00 wix
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Na to kolik ti je..vsechna cest..prvni slusnej ceskej serial o qt..

    29.5.2009 08:31 trekker.dk | skóre: 71
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Tyhle hlášky "na to kolik ti je" fakt nechápu.
    Quando omni flunkus moritati
    David Watzke avatar 29.5.2009 09:23 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Já taky ne, ale snažím se to brát pozitivně :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    29.5.2009 13:38 Filip Jirsák | skóre: 66 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Dobře psát neumí člověk od narození, musí se to naučit. Stejně tak musí pochopit problematiku, o které píše, a musí ji být schopen srozumitelně vysvětlit. K tomu všemu je potřeba trénink, práce, čas. Pochybuju, že se David programováním s Qt a psaním článků zabývá už od 6 let, takže se dá celkem předpokládat, že – vzhledem ke svému věku – zvládl vše neobyčejně rychle a má nejspíš k psaní a k vysvětlování talent. Stačí si pro srovnání přečíst pár článků někde na internetu a zjistíte, že spousta lidí se nenaučila psát srozumitelně ani za desítky let.
    29.5.2009 15:08 wix
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    vystizne..nekdo pise 20 let a stoji to za h...clovek se snazi napsat kompliment a jeste ho pomalu vyhlasi:)

    29.5.2009 16:16 mirrec | blog: mirrec
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    asi tak :-D

    29.5.2009 11:15 petr_p | skóre: 58 | blog: pb
    Rozbalit Rozbalit vše Lokalizace Qt samotného

    Jak je udělána lokalizace samotného Qt? Jde mi o to, jestli se aplikace musí starat o načtení například /usr/share/qt4/translations/qt_cs.qm sama, nebo to za ni udělá knihovna sama. Viděl jsem totiž programy (pravda, bylo to Qt3), které si s sebou táhly qt_*.qm, což mi moc systémové nepřišlo.

    29.5.2009 11:41 mirec (Miroslav Bendik)
    Rozbalit Rozbalit vše Re: Lokalizace Qt samotného

    Funguje to tak isto ak v Qt 3.

    29.5.2009 11:16 zajca | skóre: 2 | blog: zajca
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Díky fakt super seriál.
    měl bych dotaz. jak mám docílit pohybu bitmap? umí to Qt nebo musím použít nějakou externí knihovnu? potřebuju hodit vedle sebe 10bitmap a vzájemě je prohazovat.
    dycky si říkám, proboha proč lidi píšete tak dlůhé blogy a pak neco začnu psat a nakonci si říkám k*rva to je dlůhé.
    29.5.2009 11:41 mirec (Miroslav Bendik)
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Nieco ako puzzle? Odporucam pozriet programik qtdemo. Je tam vela zaujimavych ukazok.

    29.5.2009 12:17 zajca | skóre: 2 | blog: zajca
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    puzzle ne, jde o grafickou ukázku řadícího algoritmu, jen aby se na obrazovce přehazovali čísla stejně jak to dělá algoritmus. Máme doporučené nějaké historické knihovny pro widle tak bych to chtěl udělat jinak :)
    dycky si říkám, proboha proč lidi píšete tak dlůhé blogy a pak neco začnu psat a nakonci si říkám k*rva to je dlůhé.
    29.5.2009 23:50 dragh
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Na niečo také by sa dal použiť Qt Animation Framework, ale na takú pomerne jednoduchú vec mi to pripadá trochu overkill. Potom jak tu už niekto spomínal v qtdemo je dosť všeliakých ukážok...

    29.5.2009 11:26 T.O.M. | skóre: 21 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Není mi jasná jedna věc: jestliže tvůj překlad obsahuje jen jeden záznam, jak je možné, že je lokalizovaný i samotný kalendář?
    Nechce se mi teď hledat, jak nejrychleji a dočasně přepnout systém do češtiny, takže jen hádám, že komponenta kalendáře je ve skutečnosti přímo součást KDE a tím pádem je lokalizovaná podle systému a ne jak si člověk nastaví v aplikaci...
    Nebo sis snad sám pro sebe lokalizoval Qt do češtiny?

    Do článku bych ještě přidal zmínku, že Qt jako takové obsahuje taky spoustu textu připraveného k lokalizaci (tlačítka, chybové hlášky, atd.), proto je vhodné v nových aplikacích nahrát qm soubor i pro samotné Qt knihovny. Česká lokalizace zatím není dostupná, ale slovenská ano. Jednoduše tak učiníme přidáním kódu:

    QTranslator qtTranslator;
    if (qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)))
        app.installTranslator(&qtTranslator);
    

    K tématu lokalizace bych už dodal jen, že je možné qm souborů loadnout libovolný počet, přičemž se vůbec nerozlišuje, který soubor přísluší k jaké části zdrojáku. Tzn. že uvnitř funkce tr (a jí podobných) se prochází seznam překladů od shora dolů dokud se nenarazí na první záznam, který je stejný jako řetězec předaný do tr. To představuje menší komplikaci v případě, kdy stejný text v jazyce programu (zpravidla anglický) chceme na různých místech přeložit jinak, např. Tlačítko "Set" přeložíme asi jako "Nastavit", kdežto třeba label "Set" před comboboxem třeba jako "Množina". Řešením je nastavit hodnotu i druhému argumentu funkce tr, samozřejmě pro jiný překlad jiný comment...

    Jinak všechna čest, jen tak dál! (... na to kolik ti je ;-) )

    29.5.2009 11:45 mirec (Miroslav Bendik)
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Toto je serial o Qt, nie KDE. V takom pripade su samozrejme nutne vlastne preklady (vacsinou nestaci prelozit len Yes, No ...). Ale zmienka o preklade samotneho Qt tu mohla byt. Inak suhlasim s tym, ze je to super serial.

    29.5.2009 12:17 T.O.M. | skóre: 21 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Myslel jsem to tak, že Qt samotné asi neimplementuje celý widget kalendáře, ale má jen nějaký wrapper okolo nativní komponenty systému. Kalendář tedy vypadá na každé platformě jinak, ale nevím, hned večer to vyzkouším na widlích...

    David Watzke avatar 29.5.2009 16:25 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    No, QCalendarWidget není součástí KDE, ale Qt a je to česky asi podle locale... popravdě nevím, kde tu češtinu vyhrabal :-)
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    Viliam Púčik avatar 29.5.2009 17:28 Viliam Púčik | skóre: 22 | blog: minimal
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Napriklad z /usr/share/qt/translations ;-)

    Apropo, pre staticky zostaveny Qt program sa hodi zakompilovat nielen preklady aplikacie, ale aj prislusne Qt preklady priamo do programu, napriklad i cez qresource system. Program tak bude na Vas "hovorit" pekne po slovensky (rozumej cesky). Velmi jednoduchy priklad:
    QTranslator translator;
    translator.load(":/translations/qt_sk");
    app.installTranslator(&translator);
    30.5.2009 12:47 Murry | skóre: 16 | Kroměříž, Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Dá se nějak docílit, že "půlka" aplikace mluví česky, "půlka" anglicky?
    Pro vysvětlení, např. server něco vypočítá a chce vrátit výsledek + text v jazyce, který používá klient. Když se připojí dva klienti, každý si navolí jiný jazyk...jak toto řešit?
    David Watzke avatar 30.5.2009 12:53 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Prostě nějaký řetězce nedáš do tr() a nebudeš je překládat, ne?
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    30.5.2009 13:44 T.O.M. | skóre: 21 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Tím asi nedosáhneš kýženého výsledku. Spíš bych to viděl tak, že klient kromě vstupních dat pošle i používaný jazyk, server si hned po navázání spojení natáhne lokalizaci (installTranslator) ve správném jazyce a po ukončení spojení lokalizaci zase odstraní (removeTranslator).
    Jen si nejsem jistý jak se to bude chovat, když se připojí více klientů současně, protože lokalizace je společná pro celou aplikaci...

    kralуk avatar 30.5.2009 15:26 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    No přinejhorším si napíšeš vlastní lokalizační systém ;-)
    Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
    2.6.2009 12:57 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Nebo použij něco normálního.

    Táto, ty de byl? V práci, já debil.
    Viliam Púčik avatar 2.6.2009 17:55 Viliam Púčik | skóre: 22 | blog: minimal
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Co ale v pripade, ked je potrebne mat v aplikacii sucasne natiahnutych viacero jazykov/prekladov? Dokaze gettext pouzivat viacero mo súborov naraz?
    3.6.2009 11:05 zde | skóre: 9 | blog: Linuch | Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Ja bych pro kazdeho klienta fork()oval, a v kazdem procesu pak nastavil jinou textdomain().

    Táto, ty de byl? V práci, já debil.
    3.6.2009 17:33 petr_p | skóre: 58 | blog: pb
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Víc katalogů mít můžete, ale jazyk se vybírá podle locale. Takže byste musel každou hlášku obalit zámkem.
    30.5.2009 15:46 Murry | skóre: 16 | Kroměříž, Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Takto to mám, klient = instance třídy si uloží jazyk, podle toho pak předkládá, nicméně, když chci poslat klientu přes klienta (druhého) nejede to. Potřeboval bych něco jako qApp.odTedFunkceTrJsouVJazyku(QString lang). Aby stejná třída, metoda mohla "mluvit" více jazyky. Nevíte jak na to?
    Viliam Púčik avatar 30.5.2009 22:14 Viliam Púčik | skóre: 22 | blog: minimal
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Nemam to sice odskusane, ale co takto pouzivat na strane servera viacero translatorov sucasne a klientovi prelozit textovu spravu do prislusneho jazyka cez QTranslator::translate, napriklad:

    Server:
    class Translator: public QObject {
    public:
            Translator(QObject *parent = NULL): QObject(parent) {
                    QTranslator *skTranslator = new QTranslator(this);
                    QTranslator *csTranslator = new QTranslator(this);
    
                    skTranslator->load(":/translations/qt_sk");
                    csTranslator->load(":/translations/qt_cs");
    
                    m_tableOfTranslators["sk"] = skTranslator;
                    m_tableOfTranslators["cs"] = csTranslator;
            }
            // vrati lokalizovanu spravu na zaklade jazyka lang
            QString translateForClient(const QString &message, const QString &lang) {
                    if (m_tableOfTranslators.contains(lang) == false) {
                            return message;
                    }
    
                    return m_tableOfTranslators[lang]->translate(message);
            }
    private:
            QHash<QString, QTranslator *> tableOfTranslators;
    };
    
    
    //...niekde v kode
            QString message = translator->translateForClient("%n file found", client->lang());
    
    31.5.2009 03:11 T.O.M. | skóre: 21 | blog: T.O.M.'s blog | Ostrava
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Nějak tak by to mohlo fungovat. Nedošlo mi, že QCoreApplication::translate volá QTranslator::translate pro každý nainstalovaný slovník...

    31.5.2009 13:38 Murry | skóre: 16 | Kroměříž, Brno
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    To je výborné, děkuji! Zkusím na nějakém podobném principu to předělat u mého projektu.
    30.5.2009 16:38 Unable
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Je to sice dotaz mimo článek, ale potřeboval bych program z Qt Creatoru nějak sestavit aby byl samostatně spustilný i jinde bez Qt Creatoru. Udělat prostě nejaký instalátor nebo spouštěcí soubor. Děkuji za odpověď.
    kralуk avatar 30.5.2009 17:35 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Qt apliakce nejsou závislé na Qt Creatoru, ale na qt knihovnách.
    Doporučuji přečíst Deploying Qt Applications.
    Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
    30.5.2009 18:20 Unable
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    Díky moc. To bude pravděpodobně to, co jsem hledal asi týden. Ještě jednou díky moc :)
    kralуk avatar 31.5.2009 14:33 kralуk | skóre: 29 | blog: Untitled
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)
    ;-)
    Abc fortunes  |  Blog  |  PHP v kostce: $a = 'z'; $a++; $a < 'z'  // vrátí true
    15.6.2009 15:33 Jan K. (Hoky) | skóre: 8
    Rozbalit Rozbalit vše Více klávesových zkratek na jednom tlačítku

    Je to trochu mimo téma článku, ale zajímalo by mě jestli je v Qt možné přiřadit jednomu tlačítku více klávesových zkratek. Pokud jsem to pochopil správně, tak je možné přiřadit pouze sekvenci kláves :-(.

    Viliam Púčik avatar 17.6.2009 21:01 Viliam Púčik | skóre: 22 | blog: minimal
    Rozbalit Rozbalit vše Re: Více klávesových zkratek na jednom tlačítku
    Drobny trik v podobe prepisania virtual void keyPressEvent(QKeyEvent * event) metody dialogu/okna by mohol pomoct, napriklad:
    void MainWindow::keyPressEvent(QKeyEvent * event) {
            switch (event->key()) {
                    case Qt::Key_C:
                    case Qt::Key_D:
                    case Qt::Key_E:
                            nejakaMetoda();
                            break;
                    default:
                            break;
            }
    }
    18.6.2009 14:54 Jan K. (Hoky) | skóre: 8
    Rozbalit Rozbalit vše Re: Více klávesových zkratek na jednom tlačítku

    Dekuji. Neni to sice uplne ono, ale je to moznost. V idealnim pripade bych potreboval, aby se pri stisku jakekoli z pridelenych klaves zamacklo tlacitko jako u klavesy, ktera je k tlacitku asociovana.

    18.6.2009 15:19 Jan K. (Hoky) | skóre: 8
    Rozbalit Rozbalit vše Re: Grafické programy v Qt 4 – 7 (lokalizace a data programu)

    Vyzkousel jsem si prepinani jazyka zmenou systemove promenne LANG, diky ktere muzu menit nacteny jazyk a obrazky z resources (pokud u prefixu nastavim jazyk). Existuje nejaka moznost jak prepinat jazyky za behu programu?

    Založit nové vláknoNahoru

    ISSN 1214-1267  
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.