Tosproget integration

En af fordelene ved at være en mindre virksomhed er, at det er nemt at omsætte ideer fra tanke til handling.

I et tidligere blogindlæg, hvor jeg spurgte, hvordan vi kan forbedre vores produkt og platform, kom der rigtig mange gode ideer på bordet i den efterfølgende debat - og en af dem var en, vi i forvejen havde på tegnebrættet.

Der mangler simpelthen en internetudbyder på det danske marked, der adresserer de kunder, som ikke taler dansk, eller ikke føler sig hjemme i sproget.

Den seneste uges tid har vi derfor arbejdet på at oversætte vores website og selvbetjeningsplatform til flere sprog. Vi starter med engelsk, da det vil hjælpe størstedelen af de kunder, der ikke taler dansk.

Selv tyskere og franskmænd taler engelsk nu, så selv om det kunne være fedt at kunne tilbyde en Internetverbindung mit großer Upload-Geschwindigkeit, er det nice to have og ikke need to have. Desuden taler alle vores kundesupportere dansk og engelsk.

Målgruppen

Vores målgruppe med dette projekt er ikke udlændinge bosat i udlandet, men ikke-dansktalende personer, der opholder sig i Danmark. Derfor kan vi ikke genkende vores målgruppe på IP-adresse, og desuden er GeoIP en grundlæggende dårlig ide.

Til gengæld er der en god chance for, at vi kan se det på browserens sprogindstillinger. En browser vil, hvis den er konfigureret rigtigt, give webserveren en liste over foretrukne sprog i prioriteret rækkefølge.

Denne liste findes i HTTP-headeren Accept-Language, som på min browser ser således ud:

Accept-Language:da,en;q=0.8,en-US;q=0.6,sv;q=0.4

Her afslører min browser, at jeg foretrækker sprogene dansk, engelsk, amerikansk og svensk i nævnte rækkefølge.

Vi forudsætter, at danskere, færinger, svenskere og nordmænd foretrækker dansk, da det for de to sidstnævnte grupper minder meget om deres eget sprog. Alle andre får den engelske version.

Valg af framework

Vores website er skrevet i PHP. Når man skal oversætte et website, bliver det hurtigt fristende at gemme alle tekster i et multidimensionelt array a'la dette:

<?php
 
$lang['da']['header'] = 'Billigt internet med høj upload-hastighed';
$lang['en']['header'] = 'Inexpensive broadband with high upload speed';

Herefter vil det være simpelt at referere til sine tekster i HTML'en:

<h1><?= $lang[$language]['header'] ?></h1>

Det virker på alle webhoteller i alle versioner af PHP, og det er nemt at gennemskue. Men det har en række ulemper:

  • Bruger meget hukommelse og unødvendig CPU
  • Specialtegn i teksterne kan nemt skabe syntax-fejl, hvis man er uopmærksom
  • Man skal have kendskab til PHP for at kunne tilføje tekster
  • Dynamisk valgte flertalsformer af ord kræver grimme hacks

Som i så mange andre tilfælde findes der en hurtig løsning og en rigtig løsning. Den rigtige løsning er at anvende PHP's gettext-funktioner.

Gettext er et modent og gennemtestet system, der er integreret i stort set alle programmeringssprog. Det henter de oversatte tekster fra binære filer og tilbyder derfor en signifikat bedre performance end vores hjemmebryggede array.

Selve teksterne er separeret fra programmeringssproget og kan derfor let oversættes af eksterne oversættere i dertil indrettede editorer uden risiko for fatale syntax-fejl i det færdige program.

Derudover tillader gettext, at man foretager en delvis oversættelse af sit program - originalsprogets tekst er vores lookup key, og hvis der ikke findes en oversættelse til det ønskede sprog, anvendes originalsprogets tekst i stedet.

Ulemper ved gettext

Der er dog også en række ulemper ved gettext i PHP, herunder:

  • De anvendte sprog skal være installeret på serveren
  • Apache skal genstartes, når en ny oversættelse uploades til webserveren, da den gamle er cached

Vi vurderer dog, at fordelene overskygger ulemperne, så vores løsning er baseret på gettext. På de relevante sider inkluderer vi en header-fil, hvor vi sætter sproget for den pågældende side:

$language = 'da';
if(isset($_GET['lang']) && $_GET['lang'] == 'en'){
 
    $language = 'en_US.UTF8';
 
    if(!putenv('LANG='.$language)){
        die("Could not set env LANG=$language");
    }
    if(!setlocale(LC_ALL, $language)){
        die("Could not set locale $language");
    }
 
    $domain = 'messages';
    $folder = '../Locale';
    $encoding = 'UTF-8';
 
    bindtextdomain($domain, $folder);
    bind_textdomain_codeset($domain, $encoding);
    textdomain($domain);
}

Vores engelske sprogfiler ligger i mappen ../Locale/en_US/LC_MESSAGES/. Sprogfilerne består af messages.po, som er vores klartekst-fil, og messages.mo, som er den kompilerede, binære fil, der anvendes af PHP's gettext-funktion.

I PHP er gettext-funktionen aliased til _ (underscore), hvilket betyder, at begge kommandoer betyder det samme:

<h1><?= gettext('Billigt internet med høj upload-hastighed') ?></h1>
 
<h1><?= _('Billigt internet med høj upload-hastighed') ?></h1>

Det kræver derfor ikke meget ekstra kode at indbygge support for flere sprog i websitet.

Hvad gør vi herfra?

Nu har vi foreløbig fået oversat størstedelen af vores statiske tekster på websitet. Vi har også gjort det muligt for den enkelte kunde at gemme sin sprog-præference i databasen, så vi kan anvende det korrekte sprog, når vi genererer fakturaer, sender mails m.v.

Vi mangler dog at implementere flere sprog på de enkelte produkter i databasen, og vi mangler at forholde os til Googles indeksering af vores website - det skulle nødig være sådan, at Google kun får den engelske version.

Når det er på plads, vil man kunne bestille en internetforbindelse hos Kviknet uden at kunne et eneste ord på dansk.

Yoel Caspersens billede
Yoel Caspersen er direktør hos Kviknet, har en baggrund som udvikler og har gennem en længere årrække beskæftiget sig med udvikling af hostede PBX-løsninger, internetbutikker og software til online video- og tv-distribution. Dagbog-bloggen er en stafetblog for iværksættere.

Kommentarer (11)

Ivan Skytte Jørgensen

På flersprogssiderne bør i have links til de specifikke sprogversioner. Det giver to fordele:
1: Nogle gange er browserens sprogindstillinger forkerte. Så skal folk have mulighed for at let vælge et andet sprog (uden at logge ind).
2: Webcrawlere vil følge linkene til de andre sprog og dermed vil søgning på både "billig bredbånd", "affordable broadband" og "günstiges Breitband" giv hits.

Sørg også for at webserveren svarer med "Vary: Accept-Language" så evt. caches ved at der er varianter. Om de så rent faktisk bruger det er en anden sag, men så har du i hvert fald gjort din del korrekt.

Yoel Caspersen Blogger

På flersprogssiderne bør i have links til de specifikke sprogversioner. Det giver to fordele:

Du har helt ret, og det skal også gøres inden vi går helt i luften med det.

Sørg også for at webserveren svarer med "Vary: Accept-Language" så evt. caches ved at der er varianter.

Vi har i vores .htaccess-fil opsat pæne URL'er, der samtidig er sprog-afhængige - dvs. den danske side:

https://www.kviknet.dk/kontakt

har en engelsk ækvivalent:

https://www.kviknet.dk/en/contact

Det burde umiddelbart sikre, at der ikke er nogen problemer med caching. Vi regner dog med, at serveren stadig skal sende følgende HTTP-header til klienten:

Content-Language: da

Er der andre headers, man bør sende med?

Henning Wangerin

Vi har i vores .htaccess-fil opsat pæne URL'er, der samtidig er sprog-afhængige - dvs. den danske side:

https://www.kviknet.dk/kontakt

har en engelsk ækvivalent:

https://www.kviknet.dk/en/contact

Vil det sige at I ikke har noget automatisk valg af sprog?
Udover evt på forsiden?

Men derimod en dansk, engelsk .... etc version af jeres side?

Det ville selvfølgelig gøre det nemmer at kunne skifte direkte mellem de forskelle sprog - en af de ting jeg hader ved flersprogede sider er at vil man skifte sprog, havner man som oftests på forsiden og skal til at finde den rigtige side igen.

Yoel Caspersen Blogger

Vil det sige at I ikke har noget automatisk valg af sprog?
Udover evt på forsiden?

Men derimod en dansk, engelsk .... etc version af jeres side?

Vi har, set fra browserens perspektiv, to udgaver af websitet - en dansk på https://www.kviknet.dk/ og en engelsk på https://www.kviknet.dk/en/

At de ligger på samme domæne har den positive bi-effekt at de samme cookies er tilgængelige både på dansk og på engelsk - herunder fx session cookies.

Vi har ikke aktiveret funktionen endnu, men planen er, at brugeren skal redirectes til den rigtige version af en side, hvis han lander på en side med det "forkerte sprog" og der ikke er sat en cookie, der fortæller, at brugeren aktivt har valgt et andet sprog. Dette gælder uanset om det er forsiden eller en underside, brugeren lander på. Vi kan ikke forvente at vores brugere tager hoveddøren ;-)

Det skal selvfølgelig laves, så det tager højde for crawlere, der ikke kan forventes at understøtte cookies...

Ivan Skytte Jørgensen

Vi regner dog med, at serveren stadig skal sende følgende HTTP-header til klienten:

Content-Language: da

Er der andre headers, man bør sende med?

Muligvis en HTML eller HTTP "link" header med rel="alternate" og hreflang="en" (kan ikke skrive eksemplet da forummet afviser det). Der var engang at firefox mm. viste de links i "go" menuen,men nu bruges det vist kun af søgemaskiner. Alternativt kan du lægge sproginformation i jeres sitemap.

Yoel Caspersen Blogger

Og så har de en tysker med efternavnet Nietzsche på holdet, hvilket må siges at være en fordel, når man arbejder med tekster ;-)

Det ser smart ud, og virker umiddelbart billigt. Har du personlige erfaringer med deres system?

Log ind eller opret en konto for at skrive kommentarer