Step-by-step instructions for creating multi-language applications/fi
│
English (en) │
suomi (fi) │
Vaiheittaiset ohjeet monikielisten sovellusten luomiseen
Johdanto
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.
On mahdollista hypätä sisään. Mutta voi olla hyvä idea oppia jotain arkkitehtuurin taustalla olevista perusideoista. Siksi on hyvä lukemaan wiki-artikkeleita [[lokalisointi ja / tai käännökset i18n ohjelmille, jotka selittävät kohtauksen taustalla olevat perustekijät.
Aloittaminen
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.
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.
Muunnetaan tämä sovellus tukemaan muitakin kieliä.
Graafisen käyttöliittymän suunnittelu
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.
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.
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.
Osien päällekkäisyyden estämiseksi on käytettävä "ankkurointia" .
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.
Ota käännökset käyttöön
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ä".
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.
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.
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.
Esimerkkinä: Virheilmoituksen näyttäminen "File does not exist." ("Tiedostoa ei ole olemassa."). Älä kutsu kuten ShowMessage
aliohjelmaa näin
begin
ShowMessage('File does not exist.');
end;
</source>
mutta määritä teksti <code>resourcestring</code>:nä ja käytä sitä parametrina <code>ShowMessage</code> aliohjelman kutsussa :
<source>
resourcestring
SFileDoesNotExist = 'File does not exist.';
begin
ShowMessage(SFileDoesNotExist);
end;
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.
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 luetteloa kaikkien kielten koodeista.
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.
Käytä LCLTranslator käännösyksikköä (class TDefaultTranslator)
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.
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.
DefaultTranslator.pas
.Kääntäminen
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:
Tässä annetaan jotain vihjeitä poedit
käyttöön.
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 .
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.
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.
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
.
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ä.
Kielen vaihto
Mutta entä jos tietokone ei ole saksan kielinen? Tällöin voidaan käyttää Lazarus-käännösjärjestelmää vaihtamaan kieltä ajon aikana.
Ensinnäkin LCLTranslator
käännösyksikkö lukee komentorivin valitsimet --lang
tai -l
joka ohittaa automaattisen kielen tunnistamisen. Esimerkiksi
imgview.exe --lang de
avaa saksankielisen ohjelman käännöksen vaikkapa englanninkielisessä järjestelmässä.
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).
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].
OnClick
tapahtumien käsittelijässä on SetDefaultLang
jossa on kielikoodi parametrina, esim.
procedure TMainForm.MEnglishlanguageClick(Sender: TObject);
begin
SetDefaultLang('en');
end;
procedure TMainForm.MGermanLanguageClick(Sender: TObject);
begin
SetDefaultLang('de');
end;
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.
Tämän jälkeen voidaan klikata kielen valikkokohtaa ja sovelluskieli vaihtuu valitulle kielelle automaattisesti!
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.
LCL: n määrittelemät merkkijonot
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).
Tämä toimii, koska resourcestrings on tehty kaikista kielitiedostoista, joka löytyy kielikansiosta.
Muotoasetukset
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
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.
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 kielikoodeista. Tässä taulukossa "saksa" on LCID $407 ja "englanti" on LCID $409.
Siksi muokkataan OnClick tapahtumakäsittelijää kielen valinnan valikkokohtiin seuraavasti:
procedure TMainForm.MEnglishlanguageClick(Sender: TObject);
begin
SetDefaultLang('en');
GetLocaleFormatSettings($409, DefaultFormatSettings);
end;
procedure TMainForm.MGermanLanguageClick(Sender: TObject);
begin
SetDefaultLang('de');
GetLocaleFormatSettings($407, DefaultFormatSettings);
end;
Esittelyssä lisätään tilarivi projektiin ja näytetään päivämäärän, jolloin kuva luotiin:
procedure TMainForm.ShowPicDateTime;
var
dt: TDateTime;
begin
if LBFiles.ItemIndex = -1 then
Statusbar.SimpleText := ''
else begin
dt := FileDateToDateTime(FileAge(LBFiles.Items[LBFiles.ItemIndex]));
Statusbar.SimpleText := DateToStr(dt) + ' ' + TimeToStr(dt);
end;
end;
Tätä toimenpidettä kutsutaan tiedostoluetteloruudun OnSelectionChange
tapahtumakäsittelijältä:
procedure TMainForm.LBFilesSelectionChange(Sender: TObject; User: boolean);
begin
ShowPicDateTime;
end;
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
Valitettavasti tämä ratkaisu on voimassa vain Windowsille.
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.
Loppujen lopuksi tässä on opetusnäytön lopullinen kuvakaappaus: se näyttää kuvankatselusovelluksen saksaksi.