Käyttöliittymän lokalisointi. Juha Järvensivu 2008

Samankaltaiset tiedostot
Graafisen käyttöliittymän ohjelmointi Syksy 2013

TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Ohjelmointiharjoituksia Arduino-ympäristössä

QT framework. Juha Järvensivu 2007

QT tyylit. Juha Järvensivu 2008

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Qt perusteet. Juha-Matti Vanhatupa. (vanhan kurssin Graafisen käyttöliittymän ohjelmointi materiaalia)

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

8. Näppäimistöltä lukeminen 8.1

Voit käyttää tekemääsi ohjelmaa seuraavan viikon harjoituksissa, joten kopio työsi hedelmät talteen äläkä tuhoa niitä.

QT model view. Juha Järvensivu 2008

Ohjelmointi 1 C#, kevät 2013,

8. Näppäimistöltä lukeminen 8.1

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Apuja ohjelmointiin» Yleisiä virheitä

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

17. Javan omat luokat 17.1

FinFamily PostgreSQL installation ( ) FinFamily PostgreSQL

Ohjelmointi 1 Taulukot ja merkkijonot

Luento 5. Timo Savola. 28. huhtikuuta 2006

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

7. Näytölle tulostaminen 7.1

Kieliversiointityökalu Java-ohjelmistoon. Ohje

Taulukot. Jukka Harju, Jukka Juslin

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Tietorakenteet ja algoritmit

Metodien tekeminen Javalla

Scratchbox ja Maemo. Nokia 770 Internet Tablet-ohjelmistokehitys. Timo Savola. Movial Oy. FUUG:in kevätristeily

5. HelloWorld-ohjelma 5.1

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

BDD (behavior-driven development) suunnittelumenetelmän käyttö open source projektissa, case: SpecFlow/.NET.

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

13. Loogiset operaatiot 13.1

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Qt-käyttöliittymäkirjasto

ITKP102 Ohjelmointi 1 (6 op)

Tiedostonkäsittely ja asetusten tallentaminen. Graafisen käyttöliittymän ohjelmointi Luento 14

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Java-kielen perusteet

Salasanan vaihto uuteen / How to change password

9. Periytyminen Javassa 9.1

Maventa Connector Käyttöohje

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

12. Näppäimistöltä lukeminen 12.1

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Python-ohjelmointi Harjoitus 2

Valikot ja työkalupalkit. 2008

Harjoitustyö: virtuaalikone

JAVA on ohjelmointikieli, mikä on kieliopiltaan hyvin samankaltainen, jopa identtinen mm. C++

14. Hyvä ohjelmointitapa 14.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

.NET ajoympäristö. Juha Järvensivu 2007

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

11. Javan valintarakenteet 11.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Loppukurssin järjestelyt

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Loppukurssin järjestelyt C:n edistyneet piirteet

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Java-kielen perusteet

12. Javan toistorakenteet 12.1

17. Javan omat luokat 17.1

Harjoitus 3 (viikko 39)

Kielioppia: toisin kuin Javassa

Jypelin käyttöohjeet» Ruutukentän luominen

Graafisen käyttöliittymän ohjelmointi

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Dialogit. Juha Järvensivu 2008

12 Mallit (Templates)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

EMVHost Online SUBJECT: EMVHOST ONLINE CLIENT - AUTOMAATTISIIRROT COMPANY: EMVHost Online Client sovelluksen käyttöohje AUTHOR: DATE:

Lab SBS3.FARM_Hyper-V - Navigating a SharePoint site

ITKP102 Ohjelmointi 1 (6 op)

15. Ohjelmoinnin tekniikkaa 15.1

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Merkkijonon tutkiminen matches-metodilla

Tekstiviestipalvelun rajapintakuvaus

9. Periytyminen Javassa 9.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Tietorakenteet ja algoritmit

ITKP102 Ohjelmointi 1 (6 op)

Graafisen käyttöliittymän ohjelmointi Syksy 2013

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Luokan muodostimet (Constructors)

Transkriptio:

Käyttöliittymän lokalisointi Juha Järvensivu juha.jarvensivu@tut.fi 2008

Internatinalization Internationalization is the process of designing an application so that the user can run it using his or her cultural preferences without modifying or recompiling the code.

Lokalisoinnin painopisteitä Päiväys ja kellonaika Valuutta Kielet Puhelinnumerot ja osoitteet Mittayksiköt

Ongelmia Käyttöliittymään liitetyt tekstit ovat eri mittaisia eri kielillä kirjoitettuna Joissakin maissa luetaan vasemmalta oikealle Erikoismerkit esim ääkköset Kaikkialla ei ole käytössä sama kalenteri GregorianCalendar, JulianCalendar, JapaneseCalendar Päivämäärän formaatti ddmmyy, yymmdd Lukujen esittäminen desimaalipilkku vai -piste Merkkijonojen järjestäminen case-sensitive

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ä pitää välttää ohjelmassa ei saisi olla sekaisin esim suomen ja englannin kieltä

Yleisiä ohjeita lokalisointiin

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 suoraan resurssitiedostosta) Esim. // 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.wrap = true; Teksti joka jakaantuu usealle riville

5. Käytä painikkeissa ikoneita tekstin sijaan Ikonit voidaan toteuttaa vakiokokoisina UI-teksti voidaan näyttää esim tooltipvihjeenä

6. Noudata yhdenmukaista linjaa toimintojen nimeämisessä OK vs Ok File vs &File Entä jos samalla sanalla onkin useampi merkitys toisessa kielessä?

QT lokalisointi prosessi

Text engine 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 QLineEdit ja QLabel toimivat automaattisesti oikein kaikille QT:n tukemille kielille

Tekstin määrittäminen aplikaatiossa QCoreApplication::translate(CONTEXT, SOURCE_TEXT, COMMENT) Esim QCoreApplication::translate( Menu text, &File, text shown on file menu ) QObject::tr( &File ); CONTEXT = luokan nimi Ei aseta kommenttia

Projekti file (.pro) Lisää projekti-fileen 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 kielitoimistolle, joka tekee käännökset Qt Linguist ohjelmalla.

Ts-file 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 contekstin 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-filet binääri muotoon (qm-file) Sovellus käyttää lokalisoitua tekstiä qmfilestä, 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 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);

Dynaaminen translaatio void QWidget::changeEvent(QEvent *event) { if (e->type() == QEvent::LanguageChange) { titlelabel->settext(tr("document Title")); okpushbutton->settext(tr("&ok")); } else { QWidget::changeEvent(event); } }

QLocale Muuntaa numerojen ja niiden merkkijonomuotoisen esitystavan kahden kielen välillä QLocale egyptian(qlocale::arabic, QLocale::Egypt); QString s1 = egyptian.tostring(1.571429e+07, 'e'); QString s2 = egyptian.tostring(10); double d = egyptian.todouble(s1); int i = egyptian.toint(s2);

QLocale double d; QLocale::setDefault(QLocale::C); d = QString("1234,56").toDouble(&ok); // ok == false d = QString("1234.56").toDouble(&ok); // ok == true QLocale::setDefault(QLocale::German); d = QString("1234,56").toDouble(&ok); // ok == true d = QString("1234.56").toDouble(&ok); // ok == true

Päivämäärän ja ajan formaatti QDate, QTime, QDateTime QString QDate::toString(Qt::DateFormat df); Palauttaa lokalisoidun päivämäärän merkkijonona Käyttöjärjestelmän käyttämä formaatti Qt::SystemLocaleShortDate Qt::SystemLocaleLongDate QT:n application locale formaatti Qt::DefaultLocaleShortDate Qt::DefaultLocaleLongDate

Dynaaminen teksti void showprogress(int done, int total, const QString &currentfile) { } label.settext(tr("%1 of %2 files copied.\ncopying: %3").arg(done).arg(total).arg(currentFile));

Lähteet Qt Assistant - Internationalization with Qt