Step-by-step instructions for creating multi-language applications/fi: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | # Vaiheittaiset ohjeet monikielisten sovellusten luomiseen | |
| 2 | 2 | ||
| 3 | 3 | ## Johdanto | |
| 4 | 4 | ||
| 5 | 5 | Sovellusten laatiminen useille kielille voi olla mysteeri - kunnes sitä kokeilee. Kokeilun jälkeen voidaan huomata, että se on hämmästyttävän yksinkertaista, kun ottaa nämä ensimmäiset askeleet. | |
| 6 | 6 | ||
| 7 | 7 | On mahdollista hypätä sisään. Mutta voi olla hyvä idea oppia jotain arkkitehtuurin taustalla olevista perusideoista. Siksi on hyvä lukemaan wiki-artikkeleita [[[[Localization|lokalisointi]] ja / tai [[Translations / i18n / localizations for programs|käännökset i18n ohjelmille]], jotka selittävät kohtauksen taustalla olevat perustekijät. | |
| 8 | 8 | ||
| 9 | 9 | ## Aloittaminen | |
| 10 | 10 | ||
| 11 | 11 | Ennen kuin aloitetaan niin pitää mainita, että tämä opetusohjelma on alunperin kirjoitettu Lazarus 1.2 -versioon ja on nyt päivitetty versioon 1.4. Täällä on joitain muistiinpanoja ja täällä tunnistaa versioiden väliset erot. | |
| 12 | 12 | ||
| 13 | - | ||
| 14 | - | ||
| 15 | - | ||
| 16 | - | ||
| 13 | + |  | |
| 17 | 14 | ||
| 18 | 15 | Ensin tarvitaan sovellus, joka halutaan kääntää. Lazaruksen mukana on kansio (hakemisto) `examples\imgviewer` jota voidaan käyttää esim. tässä. Jos halutaan säilyttää alkuperäinen versio niin kopioi koko projektikansion erilliseen hakemistoon, esim. `imgviewer_multilanguage`. Avaa Lazaruksessa projektitiedosto `imgview.lpi` ja suorita se. Joloin nähdään tyypillinen sovellus. Sovelluksessa on valikko ja joitain hallintatoimintoja tiedostojen luetteloimiseksi ja valitun kuvan näyttämiseksi. | |
| 19 | 16 | ||
| 20 | 17 | Muunnetaan tämä sovellus tukemaan muitakin kieliä. | |
| 21 | 18 | ||
| 22 | 19 | ## Graafisen käyttöliittymän suunnittelu | |
| 23 | 20 | ||
| 24 | 21 | Graafisen käyttöliittymän suunnittelussa on huomioitava, että merkkijonolla on eri pituus jokaisella kielellä. Siksi kaikkien komponenttien *Autosize*- ominaisuuden on oltava *True* . On normaalia odottaa, että joillakin kielillä merkkijono voi olla noin 50% pidempi, mutta jopa 200% ei ole kovin epätavallinen. | |
| 25 | 22 | ||
| 26 | 23 | GUI-mittasuhteissa on otettava huomioon laitteen näyttö, jossa sovellus suoritetaan. Tietokoneessa, jossa lomake ei ole skrollattavissa, se ei saa olla suurempi kuin 1024 x 600 pikseliä (10 "netbook-näyttö), mikä tarkoittaa, että jos käytetään vain yhden rivin merkkijonoja, niiden on sovitettava oikein 700x600 pikselin lomakkeelle. Kun lomake laajenee 1024x600 pikseliin niin se riittänee muillekin kielille. | |
| 27 | 24 | ||
| 28 | 25 | Jos käytetään useita pystysuoraan sijoitettuja painikkeita ja niiden odotetaan olevan yhtä leveitä, niiden lisäksi *Autosize = True* ja *.Constraints.MinWidth* on asetettava riittävän suuri arvo. | |
| 29 | 26 | ||
| 30 | 27 | Osien päällekkäisyyden estämiseksi on käytettävä [[Anchor Sides|"ankkurointia"]] . | |
| 31 | 28 | ||
| 32 | 29 | Tekstikentät ([[TLabel]]) sijoitetaan usein kontrollien vasemmalle puolelle, johon ne viittaavat. Tällöin on ryhdyttävä varotoimiin, jotta ne eivät pääse konrollien sekaan, jos ne tulevat liian pitkiksi. Yksi vaihtoehto olisi sallia useiden rivien tekstikentät asettamalla niiden WordWrap-ominaisuus arvoon true (ja AutoSize arvoon false). Vaihtoehtoisesti yksiriviset tekstikentät voidaan sijoittaa kontrollien yläpuolelle. | |
| 33 | 30 | ||
| 34 | 31 | ## Ota käännökset käyttöön | |
| 35 | 32 | ||
| 36 | 33 | Käännös edellyttää vain yhtä muutosta projektiin. Se löytyy projektin asetuksista nimikkeellä "i18n". Outo sana, vai mitä? Se on lyhenne sanasta "internationalization" (kansainvälistäminen) ja se tarkoittaa "18 kirjainta i: n ja n: n välillä". | |
| 37 | 34 | ||
| 38 | 35 | Merkkaa valintaruutu `Salli kansainvälistäminen` (`Enable i18n`). Tämä aktivoi `Kansainvälisyysasetukset`(`i18n Options` ). Anna `PO-kirjoitushakemisto` (`PO Output Directory`) (Jona suositellaan käyttämään joko **locale** tai **languages** hakemistoa jolloin myöhemmin se löytyisi automaattisesti). Tämä on kansio (tai hakemisto), johon käännetyt tekstit sisältävät tiedostot tallennetaan. Kuten myöhemmin näet, käännöstiedostossa on tiedostolaajennus .po. Valitaan käytettäväksi kansioksi `languages`. Huomaa, että tämä kansio on suhteessa kansioon, jossa on ns. exe-tiedosto. Muista säilyttää tämä rakenne, jos halutaan kopioida EXE: n muualle. | |
| 39 | 36 | ||
| 40 | - | ||
| 41 | - | ||
| 42 | - | ||
| 43 | - | ||
| 37 | + |  | |
| 44 | 38 | ||
| 45 | 39 | Pidä valintaruutu `Luo tai päivitä .po-tiedosto, kun lfm-tiedosto talletetaan` (`Create/update .po file when saving a lfm file`) valittuna. Tämä päivittää käännös "master" -tiedoston aina, kun tallennat. | |
| 46 | 40 | ||
| 47 | 41 | Kun projekti käännetään uudelleen, projektikansioon tulee kaksi muutosta: Aluksi on uusi tiedosto, joka on .rst-tiedostoloppuinen . Tämä tiedostotyyppi kerää yksikössä ilmoitetut resurssimerkkijonot. Resurssimerkkijonot ovat käännöstoiminnon avaintekijöitä: kun haluat merkkijonon käännettäväksi, määritä kaikki tekstit `resourcestring`-osioon, ei muualle koodiin, eikä [[Const]]-osioon. | |
| 48 | 42 | ||
| 49 | 43 | Esimerkkinä: Virheilmoituksen näyttäminen "File does not exist." ("Tiedostoa ei ole olemassa."). Älä kutsu kuten `ShowMessage` aliohjelmaa näin | |
| 50 | 44 | ||
| 51 | 45 | ``` pascal | |
| 52 | 46 | begin | |
| 53 | 47 | ShowMessage('File does not exist.'); | |
| 54 | 48 | end; | |
| 55 | 49 | </source> | |
| 56 | 50 | mutta määritä teksti <code>resourcestring</code>:nä ja käytä sitä parametrina <code>ShowMessage</code> aliohjelman kutsussa : | |
| 57 | 51 | <source> | |
| 58 | 52 | resourcestring | |
| 59 | 53 | SFileDoesNotExist = 'File does not exist.'; | |
| 60 | 54 | begin | |
| 61 | 55 | ShowMessage(SFileDoesNotExist); | |
| 62 | 56 | end; | |
| 63 | 57 | ``` | |
| 64 | 58 | ||
| 65 | 59 | Imgview esimerkkiprojektissa on neljä resourcestring määrittelyä käännösyksikön frmmain toteutusosan alussa. Suuremmassa projektissa on tavallista kerätä kaikki resurssit erilliseen käännösyksikköön; Tällöin voidaan käyttää samoja merkkijonoja muilla lomakkeilla ja käännösyksiköissä ja välttää yksiköiden ristiinviittausta tällä tavoin. | |
| 66 | 60 | ||
| 67 | 61 | Toinen muutos projektista on uusi kansio "languages". Se sisältää tiedoston `imgview.po`. Lazarus on luonut tämän tiedoston automaattisesti ja sisältää resourcestrings-muodossa valmiiksi käännettäväksi. Luodaksesi saksankielisen käännöksen kyseisestä tiedostosta luo kopio ja nimeä se `imgview.de.po` . "de" on käännösjärjestelmässä "saksankielinen" kielikoodi, joten voit käyttää "en" englanniksi, "fi" "suomeksi" jne. Katso esim. [www.science.co.il/Language/Locale-codes.asp](http://www.science.co.il/Language/Locale-codes.asp) luetteloa kaikkien kielten koodeista. | |
| 68 | 62 | ||
| 69 | 63 | On mahdollista avata tiedosto `imgview.de.po` ja lisätä sinne käännöksiä suoraan. Mutta on vielä yksinkertaisempi tapa, kuten myöhemmin näemme. Ennen kuin näin tehdään, niin tehdään toinen muutos demo-projektiin. | |
| 70 | 64 | ||
| 71 | 65 | ## Käytä LCLTranslator käännösyksikköä (class TDefaultTranslator) | |
| 72 | 66 | ||
| 73 | 67 | Toistaiseksi po-tiedostot sisältävät vain resursseja, jotka on nimenomaisesti julistettu sellaisiksi. Sovelluksess on kuitenkin monia muita merkkijonoja, joita ei ole vielä käsitelty, kuten koko valikko ja alavalikot, tekstikentissä tai luetteloissa olevat tekstit jne. | |
| 74 | 68 | ||
| 75 | 69 | On erittäin helppo tapa sisällyttää käyttöliittymän merkkijonot käännösjärjestelmään: Lisätään käännösyksikkö `LCLTranslator` vain päälomakkeen uses-lauseeseen . Kun projekti kootaan tämän muutoksen jälkeen, löytyvät kaikki merkkijonot po-tiedostosta. | |
| 76 | 70 | ||
| 77 | - | ||
| 78 | - | ||
| 79 | - | ||
| 80 | - | ||
| 71 | + |  | |
| 81 | 72 | ||
| 82 | 73 | > **Note:** Lazarus-versiot, joka on vanhempia kuin 1.4 tämä toiminnallisuus sijaitsee käännösyksikössä `DefaultTranslator.pas`. | |
| 83 | 74 | ||
| 84 | 75 | ## Kääntäminen | |
| 85 | 76 | ||
| 86 | 77 | Käännökselle voisimme muokata po-tiedostoja suoraan käyttämällä tavallista tekstieditoria. Mutta moni käyttää halukkaammin erillistä ohjelmaa, joka on optimoitu tähän tarkoitukseen. Tälläisiä ohjelmia ovat: | |
| 87 | 78 | ||
| 88 | 79 | - [poedit](http://sourceforge.net/projects/poedit/) | |
| 89 | 80 | - [POEditor](https://poeditor.com/) tai | |
| 90 | 81 | - [Better PO Editor](http://sourceforge.net/projects/betterpoeditor/). | |
| 91 | 82 | ||
| 92 | 83 | Tässä annetaan jotain vihjeitä `poedit` käyttöön. | |
| 93 | 84 | ||
| 94 | 85 | Asenna ohjelma. Jos et ole aikaisemmin tehnyt, kopioi `imgviewer.po` ja nimeä se `imgviewer.de.po` (kun halutaan tehdä saksankielinen versio). Avaa `imgviewer.de.po` poedit-ohjelmassa . | |
| 95 | 86 | ||
| 96 | 87 | `Poedit` näyttää luettelon kaikista resourcestrings: eksplisiittisesti määritelty ja ne jotka on otettu DefaultTranslator:lla LCL-konrolleilta. Valitse merkkijono ja kirjoita sen käännös alempaan muistioon. Käy läpi kaikki tekstit. Tallenna. Ennen tallennusta avaa sitten valikkokohta "Catalog" / "Properties" ja tarkista, onko "Charset" UTF-8 - poedit joskus unohtaa tämän oikean asetuksen. | |
| 97 | 88 | ||
| 98 | - | ||
| 99 | - | ||
| 100 | - | ||
| 101 | - | ||
| 89 | + |  | |
| 102 | 90 | ||
| 103 | 91 | Samalla tavalla voit lisätä muita kieliä: avata `poedit`-ohjelmassa sovelluksen .po-tiedosto, lisätä käännökset ja tallentaa ne vastaavaan kielikoodiin ennen po-tiedostonlopunlaajennusta. | |
| 104 | 92 | ||
| 105 | - | ||
| 93 | + | Koska testisovellus on englanninkielinen, on erittäin helppoa luoda englanninkielinen käännöstiedosto: imgview.po : n lataamisen jälkeen poedit , valitse jokainen merkkijono ja paina `Ctrl`+`B`, joka kopioi suoraan resurssiarvot käännösmuistioon. Tallenna nimellä `imgview.en.po`. | |
| 106 | 94 | ||
| 107 | 95 | Alustuksessa `DefaultTranslator` hakee nykyisen järjestelmän kieliasetusta. Siksi, jos työskennellään saksankielisen tietokoneen kanssa, demo-projekti tulee nyt automaattisesti saksaksi. Oletuskielen havaitseminen ja resurssijonojen korvaaminen vastaavasta po-tiedostosta on suoritettu Lazaruksen käännössysteemillä. | |
| 108 | 96 | ||
| 109 | 97 | ## Kielen vaihto | |
| 110 | 98 | ||
| 111 | 99 | Mutta entä jos tietokone ei ole saksan kielinen? Tällöin voidaan käyttää Lazarus-käännösjärjestelmää vaihtamaan kieltä ajon aikana. | |
| 112 | 100 | ||
| 113 | 101 | Ensinnäkin `LCLTranslator` käännösyksikkö lukee komentorivin valitsimet `--lang` tai `-l` joka ohittaa automaattisen kielen tunnistamisen. Esimerkiksi | |
| 114 | 102 | ||
| 115 | 103 | ``` pascal | |
| 116 | 104 | imgview.exe --lang de | |
| 117 | 105 | ``` | |
| 118 | 106 | ||
| 119 | 107 | avaa saksankielisen ohjelman käännöksen vaikkapa englanninkielisessä järjestelmässä. | |
| 120 | 108 | ||
| 121 | 109 | Tietenkin, kielten vaihtaminen ajon aikana olisi vieläkin mukavampaa. Aikaisemmin tämä ei ollut mahdollista (Lazarus ennen versiota 1.2). Mutta se ei ole ongelma nykyisissä Lazarus-versiossa, jossa LCLTranslator tarjoaa menettelyn SetDefaultLang vaihtaa kieliä käyttäjän pyynnöstä. (Jälleen: "Käytä" käännösyksikköä DefaultTranslator LCLTranslator sijaan Lazarus 1.2.x: n tapauksessa). | |
| 122 | 110 | ||
| 123 | 111 | Aluksi tarvitaan jonkin verran hallintaa käyttöliittymässä vaihtaa kieliä. Entä uusi valikkokohta "Kieli" ja alavalikko, joka sisältää käytettävissä olevat kielet? Päämuodon valikon suunnittelija lisää uuden kohdan "Kielet" ja tyhjän alivalikon. Sitten, kustakin käytettävissä olevasta kielestä, lisää vastaavan kielen nimi alavalikkoon.Tietenkin voit myös näyttää lippukuvakkeen jokaiselle kielelle - ilmaiset lippukuvakkeet ovat saatavilla [1](http://www.famfamfam.com/lab/icons/flags/). `OnClick` tapahtumien käsittelijässä on `SetDefaultLang` jossa on kielikoodi parametrina, esim. | |
| 124 | 112 | ||
| 125 | 113 | ``` pascal | |
| 126 | 114 | procedure TMainForm.MEnglishlanguageClick(Sender: TObject); | |
| 127 | 115 | begin | |
| 128 | 116 | SetDefaultLang('en'); | |
| 129 | 117 | end; | |
| 130 | 118 | ||
| 131 | 119 | procedure TMainForm.MGermanLanguageClick(Sender: TObject); | |
| 132 | 120 | begin | |
| 133 | 121 | SetDefaultLang('de'); | |
| 134 | 122 | end; | |
| 135 | 123 | ``` | |
| 136 | 124 | ||
| 137 | 125 | Tietenkin voidaan käyttää hienostuneempaa koodia, joka määrittää löytyneiden tiedostojen nimien kielikoodit ja luo valikkokohteet käytettävissä olevien käännösten mukaan. | |
| 138 | 126 | ||
| 139 | 127 | Tämän jälkeen voidaan klikata kielen valikkokohtaa ja sovelluskieli vaihtuu valitulle kielelle automaattisesti! | |
| 140 | 128 | ||
| 141 | 129 | Jos huomataan, että uusi valikkokohta "Kielet" ja sen alavalikosta ei ole käännetty. Tämä johtuu siitä, että nämä ovat uusia käännöksiä, jotka puuttuvat käännetyistä po-tiedostoista. Avaa käännetyt tiedostot poedit ja lisää uusiin merkkijonoihin liittyvät käännökset. Kaikki aiemmat käännökset ovat edelleen olemassa. Tallenna ja kaikki asetettu. | |
| 142 | 130 | ||
| 143 | 131 | ## LCL: n määrittelemät merkkijonot | |
| 144 | 132 | ||
| 145 | 133 | Tässä on yksi ajatus hienosäätöä varten: LCL: n määrittelemät, standardi-valintaikkunoissa tai viestiruutuissa käytetyt virheviestit eivät ole vielä kääntyneet. Niiden kääntäminen on erittäin helppoa: niiden käännöstiedostot löytyvät Lazarus-asennuksen hakemistosta `lcl/languages` ; ne on nimetty `lclstrconsts.*.po` . Valitse ne käännökset, joita käytät sovelluksessa ja kopioi ne projektin kielikansioon. (Lisää käännösyksikkö *lclstrconsts* `uses` lausekkeeseen, joka viittaa johonkin näistä merkkijonoista). | |
| 146 | 134 | ||
| 147 | 135 | Tämä toimii, koska resourcestrings on tehty kaikista kielitiedostoista, joka löytyy kielikansiosta. | |
| 148 | 136 | ||
| 149 | 137 | ## Muotoasetukset | |
| 150 | 138 | ||
| 151 | 139 | Monikielisiä sovelluksia luotaessa käännökset ei ole ainoa tehtävä. Toinen asia on, että erilaiset muotoasetukset voivat muuttua maasta toiseen. Muotoasetukset - ne määrittävät päivämäärän ja kellonajan muotoilun, kuukausi- ja päivien nimet, desimaali- tai tuhanneterotin jne. TFormatSettings jne | |
| 152 | 140 | ||
| 153 | 141 | Lazaruksessa tietue (record) `TFormatSettings` kerää tähän liittyen kaikki mahdolliset tiedot. `DefaultSettings` käytetään vakiomuotoisissa muunnosrutiineissa, kuten StrToDate, DateToStr, StrToFloat tai FloatToStr jne. | |
| 154 | 142 | ||
| 155 | 143 | Windowsissa on olemassa aliohjelma (procedure) `GetLocaleFormatSettings` käännösyksikössä `sysutils` joka palauttaa `TFormatSettings` annetulle maalle. Parametri `LCID` määrittää kielikoodin Windowsissa. Muunnostaulukko löytyy [[Language Codes|kielikoodeista]]. Tässä taulukossa "saksa" on LCID \$407 ja "englanti" on LCID \$409. Siksi muokkataan OnClick tapahtumakäsittelijää kielen valinnan valikkokohtiin seuraavasti: | |
| 156 | 144 | ||
| 157 | 145 | ``` pascal | |
| 158 | 146 | procedure TMainForm.MEnglishlanguageClick(Sender: TObject); | |
| 159 | 147 | begin | |
| 160 | 148 | SetDefaultLang('en'); | |
| 161 | 149 | GetLocaleFormatSettings($409, DefaultFormatSettings); | |
| 162 | 150 | end; | |
| 163 | 151 | ||
| 164 | 152 | procedure TMainForm.MGermanLanguageClick(Sender: TObject); | |
| 165 | 153 | begin | |
| 166 | 154 | SetDefaultLang('de'); | |
| 167 | 155 | GetLocaleFormatSettings($407, DefaultFormatSettings); | |
| 168 | 156 | end; | |
| 169 | 157 | ``` | |
| 170 | 158 | ||
| 171 | 159 | Esittelyssä lisätään tilarivi projektiin ja näytetään päivämäärän, jolloin kuva luotiin: | |
| 172 | 160 | ||
| 173 | 161 | ``` pascal | |
| 174 | 162 | procedure TMainForm.ShowPicDateTime; | |
| 175 | 163 | var | |
| 176 | 164 | dt: TDateTime; | |
| 177 | 165 | begin | |
| 178 | 166 | if LBFiles.ItemIndex = -1 then | |
| 179 | 167 | Statusbar.SimpleText := '' | |
| 180 | 168 | else begin | |
| 181 | 169 | dt := FileDateToDateTime(FileAge(LBFiles.Items[LBFiles.ItemIndex])); | |
| 182 | 170 | Statusbar.SimpleText := DateToStr(dt) + ' ' + TimeToStr(dt); | |
| 183 | 171 | end; | |
| 184 | 172 | end; | |
| 185 | 173 | ``` | |
| 186 | 174 | ||
| 187 | 175 | Tätä toimenpidettä kutsutaan tiedostoluetteloruudun `OnSelectionChange` tapahtumakäsittelijältä: | |
| 188 | 176 | ||
| 189 | 177 | ``` pascal | |
| 190 | 178 | procedure TMainForm.LBFilesSelectionChange(Sender: TObject; User: boolean); | |
| 191 | 179 | begin | |
| 192 | 180 | ShowPicDateTime; | |
| 193 | 181 | end; | |
| 194 | 182 | ``` | |
| 195 | 183 | ||
| 196 | 184 | Käännä ohjelma uudelleen ja lataa joitain kuvia. Niin nähdään että päivämäärämuoto muuttuu, kun kieltä vaihdetaan ja toinen kuva on valittu | |
| 197 | 185 | ||
| 198 | 186 | Valitettavasti tämä ratkaisu on voimassa vain Windowsille. | |
| 199 | 187 | ||
| 200 | 188 | Vaikka joitain lokalisointiin liittyviä kysymyksiä (esim. Oikealta vasemmalle -tilaan, lajittelujärjestystä) ei ole tässä käsitelty niin toivotaan, että tämä opetusohjelma kattoi tärkeimmät näkökohdat ja on ainakin hyvä aloittelijalle. | |
| 201 | 189 | ||
| 202 | 190 | Loppujen lopuksi tässä on opetusnäytön lopullinen kuvakaappaus: se näyttää kuvankatselusovelluksen saksaksi. | |
| 203 | 191 | ||
| 204 | 192 | . | |
| 205 | 193 | ||
| 206 | 194 | ## Katso myös | |
| 207 | 195 | ||
| 208 | 196 | - [[Localization]] | |
| 209 | 197 | - [[Translations / i18n / localizations for programs]] | |
| 210 | 198 | ||
| 211 | 199 | --- | |
| 212 | 200 | *From the Free Pascal wiki, page "Step-by-step instructions for creating multi-language applications/fi", as it stood on 2020-02-27 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
