Sign in Join
Wiki copytemporary

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.

OldNewLine
11# Vaiheittaiset ohjeet monikielisten sovellusten luomiseen
22
33## Johdanto
44
55Sovellusten 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.
66
77On 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.
88
99## Aloittaminen
1010
1111Ennen 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.
1212
13-<figure>
14-<img src="imgviewer_orig.png" title="imgviewer_orig.png" />
15-<figcaption>imgviewer_orig.png</figcaption>
16-</figure>
13+![](/wiki-images/0/0f/Imgviewer_orig.png)
1714
1815Ensin 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.
1916
2017Muunnetaan tämä sovellus tukemaan muitakin kieliä.
2118
2219## Graafisen käyttöliittymän suunnittelu
2320
2421Graafisen 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.
2522
2623GUI-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.
2724
2825Jos 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.
2926
3027Osien päällekkäisyyden estämiseksi on käytettävä [[Anchor Sides|"ankkurointia"]] .
3128
3229Tekstikentä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.
3330
3431## Ota käännökset käyttöön
3532
3633Kää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ä".
3734
3835Merkkaa 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.
3936
40-<figure>
41-<img src="enable_i18n.png" title="enable_i18n.png" />
42-<figcaption>enable_i18n.png</figcaption>
43-</figure>
37+![](/wiki-images/3/31/Enable_i18n.png)
4438
4539Pidä 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.
4640
4741Kun 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.
4842
4943Esimerkkinä: Virheilmoituksen näyttäminen "File does not exist." ("Tiedostoa ei ole olemassa."). Älä kutsu kuten `ShowMessage` aliohjelmaa näin
5044
5145``` pascal
5246begin
5347 ShowMessage('File does not exist.');
5448end;
5549</source>
5650mutta määritä teksti <code>resourcestring</code>:nä ja käytä sitä parametrina <code>ShowMessage</code> aliohjelman kutsussa :
5751<source>
5852resourcestring
5953 SFileDoesNotExist = 'File does not exist.';
6054begin
6155 ShowMessage(SFileDoesNotExist);
6256end;
6357```
6458
6559Imgview 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.
6660
6761Toinen 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.
6862
6963On 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.
7064
7165## Käytä LCLTranslator käännösyksikköä (class TDefaultTranslator)
7266
7367Toistaiseksi 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.
7468
7569On 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.
7670
77-<figure>
78-<img src="LCLTranslator.png" title="LCLTranslator.png" />
79-<figcaption>LCLTranslator.png</figcaption>
80-</figure>
71+![](/wiki-images/1/1e/LCLTranslator.png)
8172
8273> **Note:** Lazarus-versiot, joka on vanhempia kuin 1.4 tämä toiminnallisuus sijaitsee käännösyksikössä `DefaultTranslator.pas`.
8374
8475## Kääntäminen
8576
8677Kää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:
8778
8879- [poedit](http://sourceforge.net/projects/poedit/)
8980- [POEditor](https://poeditor.com/) tai
9081- [Better PO Editor](http://sourceforge.net/projects/betterpoeditor/).
9182
9283Tässä annetaan jotain vihjeitä `poedit` käyttöön.
9384
9485Asenna 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 .
9586
9687`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.
9788
98-<figure>
99-<img src="poedit.png" title="poedit.png" />
100-<figcaption>poedit.png</figcaption>
101-</figure>
89+![](/wiki-images/d/dc/Poedit.png)
10290
10391Samalla 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.
10492
105-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 <span class="kbd">Ctrl</span>+<span class="kbd">B</span>, joka kopioi suoraan resurssiarvot käännösmuistioon. Tallenna nimellä `imgview.en.po`.
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`.
10694
10795Alustuksessa `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ä.
10896
10997## Kielen vaihto
11098
11199Mutta entä jos tietokone ei ole saksan kielinen? Tällöin voidaan käyttää Lazarus-käännösjärjestelmää vaihtamaan kieltä ajon aikana.
112100
113101Ensinnäkin `LCLTranslator` käännösyksikkö lukee komentorivin valitsimet `--lang` tai `-l` joka ohittaa automaattisen kielen tunnistamisen. Esimerkiksi
114102
115103``` pascal
116104 imgview.exe --lang de
117105```
118106
119107avaa saksankielisen ohjelman käännöksen vaikkapa englanninkielisessä järjestelmässä.
120108
121109Tietenkin, 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).
122110
123111Aluksi 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.
124112
125113``` pascal
126114procedure TMainForm.MEnglishlanguageClick(Sender: TObject);
127115begin
128116 SetDefaultLang('en');
129117end;
130118
131119procedure TMainForm.MGermanLanguageClick(Sender: TObject);
132120begin
133121 SetDefaultLang('de');
134122end;
135123```
136124
137125Tietenkin voidaan käyttää hienostuneempaa koodia, joka määrittää löytyneiden tiedostojen nimien kielikoodit ja luo valikkokohteet käytettävissä olevien käännösten mukaan.
138126
139127Tämän jälkeen voidaan klikata kielen valikkokohtaa ja sovelluskieli vaihtuu valitulle kielelle automaattisesti!
140128
141129Jos 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.
142130
143131## LCL: n määrittelemät merkkijonot
144132
145133Tä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).
146134
147135Tämä toimii, koska resourcestrings on tehty kaikista kielitiedostoista, joka löytyy kielikansiosta.
148136
149137## Muotoasetukset
150138
151139Monikielisiä 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
152140
153141Lazaruksessa tietue (record) `TFormatSettings` kerää tähän liittyen kaikki mahdolliset tiedot. `DefaultSettings` käytetään vakiomuotoisissa muunnosrutiineissa, kuten StrToDate, DateToStr, StrToFloat tai FloatToStr jne.
154142
155143Windowsissa 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:
156144
157145``` pascal
158146procedure TMainForm.MEnglishlanguageClick(Sender: TObject);
159147begin
160148 SetDefaultLang('en');
161149 GetLocaleFormatSettings($409, DefaultFormatSettings);
162150end;
163151
164152procedure TMainForm.MGermanLanguageClick(Sender: TObject);
165153begin
166154 SetDefaultLang('de');
167155 GetLocaleFormatSettings($407, DefaultFormatSettings);
168156end;
169157```
170158
171159Esittelyssä lisätään tilarivi projektiin ja näytetään päivämäärän, jolloin kuva luotiin:
172160
173161``` pascal
174162procedure TMainForm.ShowPicDateTime;
175163var
176164 dt: TDateTime;
177165begin
178166 if LBFiles.ItemIndex = -1 then
179167 Statusbar.SimpleText := ''
180168 else begin
181169 dt := FileDateToDateTime(FileAge(LBFiles.Items[LBFiles.ItemIndex]));
182170 Statusbar.SimpleText := DateToStr(dt) + ' ' + TimeToStr(dt);
183171 end;
184172end;
185173```
186174
187175Tätä toimenpidettä kutsutaan tiedostoluetteloruudun `OnSelectionChange` tapahtumakäsittelijältä:
188176
189177``` pascal
190178procedure TMainForm.LBFilesSelectionChange(Sender: TObject; User: boolean);
191179begin
192180 ShowPicDateTime;
193181end;
194182```
195183
196184Kää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
197185
198186Valitettavasti tämä ratkaisu on voimassa vain Windowsille.
199187
200188Vaikka 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.
201189
202190Loppujen lopuksi tässä on opetusnäytön lopullinen kuvakaappaus: se näyttää kuvankatselusovelluksen saksaksi.
203191
204192![](/wiki-images/0/0b/Imgviewer_de.png).
205193
206194## Katso myös
207195
208196- [[Localization]]
209197- [[Translations / i18n / localizations for programs]]
210198
211199---
212200*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).*

Back to history