TIE-11300 Tietotekniikan vaihtuva-alainen kurssi Graafisen käyttöliittymän ohjelmointi Syksy 2013 Luento 11 Käyttöliittymän lokalisointi Juha-Matti Vanhatupa
Sisältö Lokalisoinnin haasteita Käännöksen käyttöönotto
Termejä Internationalisointi on tuotteiden sovittamista potentiaaliseen käyttöön periaatteessa missä tahansa. Tuotteesta tehdään siis sellainen, että kieli- ja kulttuuritaustoiltaan erilaiset ihmiset pystyvät hyödyntämään sitä vaivatta. lokalisointi tarkoittaa erityispiirteiden lisäämistä tietyssä määrätyssä kohteessa tapahtuvaa käyttöä varten.
Lokalisoinnin painopisteitä Päiväys ja kellonaika Valuutta Kielet Puhelinnumerot ja osoitteet Mittayksiköt
Haasteita Käyttöliittymään liitetyt tekstit ovat eri mittaisia eri kielillä kirjoitettuna Joissakin maissa luetaan vasemmalta oikealle Erikoismerkit esim ääkköset (Kalenterit) Päivämäärän formaatti ddmmyy, yymmdd Lukujen esittäminen desimaalipilkku vai -piste
Ratkaisuja Jaetaan käyttöliittymä kulttuuri-neutraaliin osaan ja lokalisoitavaan osaan Suuri osa ohjelmasta toimii suoraan kaikissa kulttuureissa Tallennetaan kulttuurisidonnaiset osat resurssitiedostoihin Uuden kulttuurin tukeminen ei vaadi muutoksia lähdekooditasolla
Kielen valinta Mitä kieltä ohjelma käyttää Voiko käyttäjä valita käytettävän kielen ohjelman asetuksista? Valitaanko kieli jo ohjelman asennusvaiheessa? Valitseeko ohjelma käytettävän kielen automaattisesti käyttöjärjestelmän kielen perusteella? Kaksikielisyyttä tulee välttää ohjelmassa ei saa olla sekaisin esim. suomen ja englannin kieltä
1. Mieti minkälaista lokalisointia ohjelmalta mahdollisesti vaaditaan - Lokalisointi yleensä huomattavasti yksinkertaisempaa sukulaiskielille LTR vs RTL
2. Toteuta ohjelmaan tuki lokalisoinnille vaikka lokalisointia ei olisi tarkoitus heti tehdäkään - Vähäinenkin tuki helpottaa huomattavasti lokalisoinnin toteutusta jälkikäteen
3. Määrittele ohjelman merkkijonot omassa tiedostossaan (tai lue Esim. suoraan resurssitiedostosta) // Translations const String STR_BUTTON_OK = OK ; const String STR_BUTTON_CANCEL = Cancel ; const String STR_FILE_MENU = &File ; const String STR_FILE_ERROR = File cannot be read. ;
4. Suunnittele dialogin layout siten, että käännösteksteille jää riittävästi tilaa - Rivitä pitkät UI-tekstit label = Teksti joka jakaantuu usealle riville label.setwordwrap(true);
5. Noudata yhdenmukaista linjaa - OK vs Ok toimintojen nimeämisessä - File vs &File - Entä jos samalla sanalla onkin useampi merkitys toisessa kielessä?
Qt:n kielituki QT:n sisään rakennettu tuki useille eri kielille All East Asian languages (Chinese, Japanese and Korean) All Western languages (using Latin script) Arabic Cyrillic languages (Russian, Ukrainian, etc.) Greek Hebrew Thai and Lao All scripts in Unicode 4.0 that do not require special processing
QT:n lokalisointiprosessin vaiheet 1. Määritellään tekstit lokalisoituviksi (translate-funktio) 2. Määritellään tuetut kielet projekti-filessä (.pro) 3. Generoidaan ts-tiedostot (lupdate) 4. Tehdään varsinainen käännös (Linguist) 5. Generoidaan valmiit binäärit (lrelease) 6. Otetaan käännös käyttöön aplikaatiossa (QTranslate)
tr() -funktio Merkitsee merkkijonon käännöskohteeksi (translation target) Koska tr funktiota yleensä kutsutaan QObject:n aliluokassa sitä voidaan kutsua suoraan, mutta myös QPushButton::tr("&Quit") tai QObject::tr("&Quit") toimivat Merkkijonot tunnistetaan isäntäkomponentin avulla
tr() -funktio Kaksi samaa merkkijonoa samassa komponentissa voidaan erottaa käyttäen tr() funktion toista parametriä rbc = new QRadioButton(tr("Enabled", "Color frame"),this); rbh = new QRadioButton(tr("Enabled", "Hue frame"),this);
Projektitiedoston muutokset Lisää projekti-tiedostoon(.pro) tarvittavat kielet TRANSLATIONS += arrowpad_en.ts TRANSLATIONS += arrowpad_fi.ts
lupdate - komento Käyttö: lupdate myproject.pro Etsii projektin koodeista käännettävät tekstit ja luo/päivittää translaatio tiedostot (ts-filet). Generoidut ts-filet annetaan kääntäjälle, joka tekee käännökset Qt Linguist ohjelmalla.
Ts-tiedosto XML-tiedosto, joka sisältää käännettävät tekstit <!DOCTYPE TS><TS> <context> <name>menu text </name> <message> <source> &File </source> <translation type="unfinished"></translation> </message> <comment> text shown on file menu </comment> </context> </TS>
Käännöksen tekeminen QtLinguist ohjelmalla Onko kääntäjällä ajettava ohjelma käytössä vai pitääkö käännös tehdä annetun kontekstin ja optionaalisen kommentin varassa?
Käännöksen tekeminen
Target locale Voidaan määrittää ts-filessä <!DOCTYPE TS><TS version="1.1" language="fi"> Jos ei ole määritetty, niin liguist yrittää arvata kielen tiedoston nimestä myapp_fi.ts
lrelease - komento Käyttö: lrelease myproject.pro Muuntaa xml-muotoiset ts-tiedostot binääri muotoon (qm-file) Sovellus käyttää lokalisoitua tekstiä qm-filestä, jos sellainen löytyy lrelease hyväksyy vain ne merkkijonot, jotka ovat tyyppiä finished.
Translaation käyttöönotto int main(int argc, char *argv[]) { QApplication app(argc, argv); QTranslator translator; translator.load("hellotr_la"); app.installtranslator(&translator); QPushButton hello(qpushbutton::tr("hello world!")); hello.resize(100, 30); hello.show(); return app.exec(); }
Translaation käyttöönotto (vaihtoehto 2) int main(int argc, char *argv[]) { } QApplication app(argc, argv); QString locale = QLocale::system().name(); QTranslator translator; translator.load(qstring("arrowpad_") + locale); app.installtranslator(&translator);