Tekniikoita monikielisiä Web-sivustoja varten:
Huomautuksia

Sisältö:

Käännösten tuottaminen

Erikielisten sivujen tuottamisessa voidaan ehkä jossain määrin käyttää automaattisia käännösohjelmia, ks. kirjoitustani Translation-friendly authoring, mutta käännöstyön on kuitenkin syytä olla työnsä osaavan kääntäjän vastuulla. Parasta on, jos kääntäjä myös tuntee HTML-kielen perusteet, jolloin hän voi tuottaa käännöksen suoraan HTML-dokumentteina. Tällöin voidaan esim. antaa kääntäjälle käännettävä aineisto HTML-muodossa, ja hän korvaa tekstit toisilla jättäen HTML-merkkauksen (yleensä) ennalleen.

Toinen vaihtoehto on antaa kääntäjälle teksti joko pelkkänä tekstitiedostona tai siinä muodossa, kuin jokin Web-selain sen näyttää, esimerkiksi paperille tulostettuna. Jälkimmäisessä tapauksessa kääntäjä voi ehkä päätellä jotain siitä, miten eri tekstit näkyvät. Toisaalta HTML-merkkaus voisi kertoa paremmin, mikä on dokumentin tarkoitettu rakenne, jolla voi olla merkitystä käännösvalinnoissa. Joka tapauksessa jos kääntäjä toimittaa vain kääntämänsä tekstin, jonkun muun täytyy saattaa se HTML-muotoon, käytännössä yhdistämällä teksti ja HTML-merkkaus, eikä tätä voi tehdä tuntematta edes jossain määrin kyseistä kieltä.

Käännös vai väännös?

Sivun erikieliset versiot saattavat olla "puhtaita käännöksiä" toisistaan, käytännössä yleensä siten, että yksi niistä on alkuperäinen ja muut on käännetty siitä. "Puhdas käännös" sisältää alkuperäisen dokumentin sisällöltään ja muodoltaan tarkoin alkuperäistä vastaavana; asia vain ilmaistaan eri kielellä. Tämä sisältää esimerkiksi sen, että käännös sisältää myös samat asiavirheet, viittaukset paikallisiin (esim. vain Suomea koskeviin) seikkoihin jne.

Puhdas käännös ei useinkaan ole tarkoituksenmukainen. Toisaalta ei ole asianmukaista, että kielivalintamekanismin kautta jaellaan keskenään aivan erisisältöisiä versioita, joilla ei yhteistä ole juuri muuta kuin aihepiiri. Rajanveto on vaikeaa.

Kielivalintamekanismin kuvaus ei ainakaan edellytä, että versiot ovat toistensa tarkkoja vastineita. Päinvastoin siihen liittyy "laatuarvoja" ja sellainen mahdollisuus, että kielivalinta päätyy niiden takia valitsemaan kahdesta kielestä sellaisen, joka on käyttäjän preferensseissä myöhempänä, koska se on "laadukkaampi". Esimerkkinä voisi olla tilanne, jossa käyttäjä osaa saksaa hiukan paremmin kuin ranskaa ja on määritellyt kielipreferenssissä tämän mukaisesti ja palvelimessa on samasta dokumenteista saksankielinen versio ja sitä huomattavasti ajantasaisempi tai laajempi versio. Käytännössä tällaiset tilanteet lienevät harvinaisia muun muassa siitä syystä, että yleensä selaimet eivät anna käyttäjän kovinkaan hyvin kontrolloida kieliin liittyviä "laatuarvoja" vaan vain kielten järjestystä.

Paikallistamisen eli lokalisoinnin suhteen on syytä olla varovainen. Kirjoitettaessa esimerkiksi englanninkielistä versiota suomenkielisestä jutusta ei pidä ilman muuta olettaa, että kaikki viittaukset Suomen erityisoloihin on poistettava tai korvattava kansainvälisemmillä. Onhan täysin mahdollista, että juttua lukee Suomessa asuva tai muuten Suomen tilanteesta kiinnostunut lukija.

Kerro, mitä kullakin kielellä on tarjolla

Monikielisessä sivustossa on ratkaisevan tärkeää kertoa, mitä todella on tarjolla eri kielillä. Jos esimerkiksi sivusto on valtaosaltaan suomeksi mutta sisältää muutamien sivujen englanninkielisiä versioita, on syytä tehdä hyvin selväksi englanninkielisessä versiossa, että englanninkielinen tarjonta on vain pieni osa siitä, mitä on tarjolla suomeksi. Muutoin vierailija, joka osaa molempia kieliä mutta paremmin englantia, ei ehkä koskaan saa todellista hyötyä sivustosta.

Enimmäkseen riittää esittää sellainen tieto kunkinkielisellä pääsivulla. Mutta jos sivustossa on esimerkiksi uutissivu niin, että osa uutisartikkeleista on saatavilla myös englanniksi, olisi harhaanjohtavaa sisällyttää englanninkieliseen uutissivuun vain ne artikkelit. Sen sijaan kyseisen uutissivun tulisi ainakin sanoa, että muitakin uutisia on saatavilla suomeksi. Sivu voisi myös sisältää linkit niihin suomenkielisiin uutisiin, joita ei ole käännetty, englanninkielisten uutisten seassa. Parasta olisi, jos sellaisten uutisten otsikot käännettäisiin englanniksi ja niihin vain liitettäisiin selkeä tieto siitä, että linkki johtaa suomenkieliseen uutistekstiin.

Versioiden nimeäminen

Erikielisten versioiden nimeämiskäytännön Web-osoitteiden (URLien) mielessä on käytännön syistä kuten sivujen luonnin ja ylläpidon takia on usein parasta olla systemaattinen, mutta tämä voidaan toteuttaa eri tavoin. Menetelmä voi olla esimerkiksi jompikumpi seuraavista:

Molemmissa menetelmissä ongelmana on, että "varsinaisen nimen" (esimerkissä foo) on syytä olla sellainen, että se on ymmärrettävissä kohtalaisen kansainvälisesti. Tämä onnistuu luontevasti silloin, kun tällaiseksi osaksi sopii luontevasti jokin yleisesti tunnettu lyhenne taikka kansainvälisen sanan osa - mutta nämä ovat periaatteessa poikkeustilanteita. Muissa tapauksissa osoitteet voivat näyttää aika oudoilta; jokin katsaus-en näyttää oudolta sille, joka ei osaa suomea. Vaikka käyttäjien ei pitäisikään yleensä joutua tulkitsemaan ja käyttelemään URLeja, sellaiseen kuitenkin usein joudutaan. Eräs periaatteellinen vaihtoehto on, että erikielisten versioiden osoitteet ovat toisistaan täysin riippumattomia, esim. loppuosa katsaus.html, review.html jne., mutta tällöin toteutus ja ylläpito mutkistuu etenkin kielivalintamekanismin osalta.

Käytännössä tilanne on useimmiten sellainen, että eri versioiden URLit määräytyvät niiden tiedostonnimien perusteella, jotka niille on annettu. Tavallisesti URLin loppuosa viimeisen vinoviivan jäljessä vastaa tiedostonnimeä. Periaatteessa toki URLilla ja tiedostonnimellä ei tarvitse olla mitään tekemistä keskenään.

Merkistöasiat

Tässä sivustossa ei käsitellä merkistöongelmia, joita aiheeseen väistämättä liittyy ainakin silloin, kun mukana on kieliä, joita ei kirjoiteta latinalaisin aakkosin. Tämä rajaus johtuu lähinnä siitä, että aihepiirit ovat mutkikkaita ja siksi asia on syytä jakaa hallittavissa oleviin osiin, eli käsitellä yksi aihe kerrallaan. Käytännön syynä on lisäksi se, että Suomessa monikielisen sivuston kielinä ovat tavallisimmin suomi, ruotsi, englanti ja mahdollisesti muut sellaiset kielet, joita voidaan kirjoittaa ISO Latin 1 -merkistöä käyttäen, jolloin monikielisyys ei tuo mukanaan sellaisia merkistöongelmia, joita ei olisi jo suomeksi kirjoitettaessa.

Merkistöasioita HTML:ssä käsittelee yleisellä tasolla kirjoitukseni Using national and special characters in HTML.

Entä lang-määrite?

Tarkastelun ulkopuolelle on tässä jätetty lang-määrite, jolla HTML-merkkauksessa voidaan ilmoittaa käytetty kieli. Kuvaus sen taustalla olevista ideoista sekä teknisistä menettelyistä on HTML-spesifikaation luvussa Language information and text direction. Valitettavasti vain selainten ja muiden ohjelmien tuki tälle määritteelle on lähinnä olematon. Tosin tilanne on paranemaan päin; ks. erillistä dokumenttia kielimerkkauksesta.

On syytä korostaa, että HTML-dokumentissa olevan lang-määritteen, vaikka se asetettaisiin koko dokumentille (<html lang="...">), ei ole tarkoitus vaikuttaa HTTP-tason kielivalintamekanismiin. Eikä se vaikuta. Mekanismiin ei dokumentin sisältö, ei tekstisisältö eikä HTML-merkkaus, vaikuta mitään.

Kieli ja maa

Yllättävän usein sivuntekijät yrittävät saada selville, mistä maasta käyttäjä on, ja sen perusteella ohjata hänet määrätynkieliselle sivulle. Sen lisäksi, että maata ei ole mahdollista saada mitenkään luotettavasti selville millään automatiikalla (mm. .com-, .org- yms. osoitteiden yleisyyden takia), koko ajatus on virheellinen. Maasta ei voi päätellä kieltä (eikä toisinpäin). Kielen arvailu maan perusteella on tällaisissa yhteyksissä hyödytöntä, jopa haitallista. Jos suomenruotsalainen sellaisen ohjailun takia ohjautuu suomenkieliselle sivulle, vaikka ruotsinkielinenkin olisi olemassa, niin on merkityksetöntä, vaikka arvauksen oikeaan osumisen todennäköisyys olisi ollut yli 90 %.

Kielipreferenssit ja JavaScript

JavaScript-kielessä voidaan eräin ehdoin saada selville selaimen kieli. Tämä on kuitenkin lähes aina hyödytöntä, eikä sillä ole tekemistä käyttäjän kielipreferenssien kanssa. Kysehän on vain selaimen käyttöliittymän kielestä, siis siitä, mitä kieltä valikot, virheilmoitukset yms. ovat.

Erittäin yleisesti ihmiset käyttävät englanninkielisiä versioita selaimista, koska muita ei ole tarjolla tai muut on käännetty surkeasti ja sekavasti. Selaimen yksinkertainen käyttö ei edellytä paljoakaan sen kielen osaamista, jota selaimen käyttöliittymä käyttää, koska niin suuri osa perustoiminnoista voidaan tehdä kuvapainikkeilla tai muilla yksinkertaisilla tavoilla, joissa riittää muutaman sanan sanavarasto.

Ei ole mitään periaatteellista syytä, miksi JavaScriptin kaltaisella kielellä ei voisi lukea kielipreferenssiasetuksiakin. Mutta näyttää siltä, että sellaista mahdollisuutta ei toistaiseksi ole. (Tosin Netscapessä ns. signed script voi lukea kielipreferenssejä; mutta tällöin selain kysyy käyttäjältä lupaa, jolloin samalla vaivalla voisi tehdä selaimesta riippumattoman dialogin kielivalintaa varten.) Sen hyödyllisyys olisi suhteellisen rajallinen, mutta se mahdollistaisi tietysti JavaScriptillä generoitavien tekstien tuottamisen eri kielillä kielipreferenssien mukaan.

Työkaluista

Monikielisen sivuston luominen ja ylläpito muodostuu hankalaksi ilman siihen sopivia työkaluja, vaikka itse kieliversioiden tekemisen ja ylläpito olisikin hoidossa. Tässä ei paneuduta tähän tärkeään ongelmaan kuin aivan pinnallisesti esittämällä eräs ratkaisu pienehkön sivuston tilanteeseen.

Tämä sivusto on, erinäisten kokeilujen jälkeen, tehty seuraavasti:

Kieliasetusten käyttö CGI-skripteissä

CGI-skripteissä on mahdollista käyttää hyväksi selaimen lähettämiä kielipreferenssejä. Protokollan mukaisen Accept-Language-otsakkeen arvo ilmenee CGI-skriptille ympäristömuuttujana HTTP_ACCEPT_LANGUAGE (joka on kirjoitettava näin, siis suuraakkosia käyttäen).

Kyseisen muuttujan arvo sisältää protokollan mukaan joukon pilkulla erotettuja osia, joista kukin koostuu kielikoodista ja sitä mahdollisesti seuraavasta q-arvon määrittelystä. Tämän purkaminen osiinsa on melko helppoa esimerkiksi Perlillä kirjoitetussa CGI-skriptissä, käyttäen split-funktiota osiin jakamiseen. Seuraava koodiesimerkki tekee tämän ja laskee muuttujaan $preferred sen kielikoodin, joka vastaa preferenssien mukaan ensisijaista kieltä. Tässä asetetaan englanti oletuskieleksi, joka oletetaan ensisijaiseksi, jos selain ei lähetä mitään preferenssejä.

$accept = $ENV{'HTTP_ACCEPT_LANGUAGE'};
@prefs = split(/,/,$accept);
$preferred = 'en';
$prefq = 0;
foreach $pref(@prefs) {
   if($pref =~ /(.*);q=(.*)/ ) {
      $lang=$1; $qval=$2; }
   else {
      $lang=$pref; $qval= 1; }
   if($qval > $prefq) {
      $preferred = $lang; $prefq = $qval; }}

Tulosta voidaan käyttää esimerkiksi indeksoimaan hajautetta (hash), jonka alkioina on kielestä riippuvia merkkijonoja. Jos esimerkiksi haluaisimme, että Perlillä kirjoitettu CGI-skripti, tuottaessaan dynaamisesti HTML-dokumenttia, kirjoittaa joko suomen- tai englanninkielisiä tekstejä, voisimme kirjoittaa sellaiset tekstit hajautteen arvoiksi ja poimia siitä oikeankielisen tekstin tähän tapaan:

$gen{'en'} = 'Report generated at ';
$gen{'fi'} = 'Raportin luontihetki: ';
 - -
print "<div>$gen{$preferred} $now.</div>";

Näin on tehty esimerkiksi yksinkertainen Perl-ohjelma, joka tulostaa selaimen kieliasetukset; se toteuttaa (kohdassa Kielivalinta selaimessa jo mainitun) pikku palvelun, joka näyttää kieliasetukset.

Viittaaminen sivun määrättyyn kohtaan

Linkillä voidaan viitata paitsi sivuun myös johonkin erityiseen kohtaan sivulla. Tämä edellyttää, että sivulla, johon viitataan, on tämän mahdollistava muotoa <a name="nimi">tekstiä</a> oleva rakenne. Sellainen rakenne on yleensä suotavaa liittää ainakin jokaiseen otsikkotekstiin. Tässä nimi on sinänsä vain sivun tekijän valitsema merkkijono, joka toimii kohdan tunnisteena. Käytännössä se kuitenkin tulee joissakin tilanteissa käyttäjän näkyviin.

Monikielisten sivustojen kannalta on huomattava, että jos halutaan voida viitata tällaisiin kohtiin, on erikielisissä versioissa syytä käyttää samoja tunnisteita. Tällöin voidaan muualta viitata kyseisiin kohtiin käyttäen sentapaisia osoitteita kuin
http://www.cs.tut.fi/~jkorpela/multi/8.html#prod
missä siis osa #prod on sivun geneerisen osoitteen perässä. Tällöin asioiden pitäisi toimia siitä riippumatta, millaiseksi kyseinen geneerinen osoite kääntyy kielivalintamekanismin kautta.

Lisätietoja

Alan Flavellin dokumentti Language Negotiation Notes on ehdottomasti lukemisen arvoinen jokaiselle, joka on kiinnostunut kielivalintamekanismista. Samoin on sivu Dan's Web Tips: Languages.


2008-05-26 Jukka K. Korpela