lang
-määrite?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ä.
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.
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.
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:
http://www.jotain.example/en/foo.html
(englanninkielinen),
http://www.jotain.example/fi/foo.html
(suomenkielinen);
tätä vastaa tavallisesti käytännössä se, että kunkinkieliset
sivut ovat palvelimessa omana hakemistonaan
.html
(t. vast.) lähinnä
edeltävässä osassa on yhdysmerkki (tai muu välimerkki) ja kielikoodi, esim.
http://www.jotain.example/foo-en.html
ja
http://www.jotain.example/foo-fi.html
;
tätä vastaa tavallisesti käytännössä se, että erikieliset
sivut ovat palvelimessa samassa hakemistossa mutta erinimisinä
tiedostoina, systemaattisesti nimettyinä.
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.
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öasioita HTML:ssä käsittelee yleisellä tasolla kirjoitukseni Using national and special characters in HTML.
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.
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 %.
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.
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:
1.inx
, joka
sisältää kullakin rivillä kielikoodin, kaksoispisteen ja
sivun otsikon kyseisellä kielellä
head
-osaa,
otsikkoa, kielilinkkejä ja pääsivulle vievää linkkiä) on erillisessä
tiedostossa, joka on nimetty systematiikan
osa-
kieli.body
mukaan (esim. 1-fi.body
)
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.
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ä
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.</a>
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://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.
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