Gå til innhold

ASP: Solid måte å finne den besøkendes foretrukne språk


Anbefalte innlegg

Jeg er ute etter en måte å finne det foretrukne språket til webbesøkeren.

 

Ved å bruke request.serverVariables("HTTP_ACCEPT_LANGUAGE") så får man i svar f.eks. "no" (norwegian), "en-gb" (english-great britain), "en-us" (english-united states), osv., men det er ikke anbefalt å benytte seg av denne metoden alene.

 

Jeg har også sett på javascript-variabelen navigator.browserLanguage, men jeg vil helst unngå klientside-script.

 

Jeg skal nemlig rute surferen til ulike URL-er avhengig av hvilket språk han/hun foretrekker. Jeg skal selvsagt holde muligheten åpen for brukeren å overstyre forslaget, i tilfelle scriptet ikke treffer riktig.

 

Er det noen som kan dytte meg i retning av et ASP-script som finner riktig språk med stor sannsynlighet?

 

 

stian

Lenke til kommentar
Videoannonse
Annonse
Det første jeg tenker på er å bruke landet IP-kommer fra som primær valg, men dersom HTTP_ACCEPT_LANGUAGE er satt til noe annet bruker du istedet den.

 

En ting er jo å lokalisere brukeren geografisk. Ved å bruke IP-adressen til dette finner man det ut med ca 99% nøyaktighet. En annen sak er hvilket språk brukeren bruker. Det er mange områder som har flere offisielle språk, f.eks. Canada (engelsk og fransk), Sveits (tysk, fransk og italiensk) og Belgia (nederlandsk, fransk og tysk).

 

Slik jeg tenker hadde det mest ideelle vært å først sjekket HTTP-headeren, og så browser-språket. Men uten å bruke klientside-script. Går det an?

 

 

-s

Lenke til kommentar
Vil ikke de to siste være det samme?

 

Kanskje det, gitt... Jeg begynte å se på disse tingene nå i kveld, så jeg er litt på tynn is.

 

Etter å ha lest denne artikkelen (http://www.w3.org/International/questions/qa-accept-lang-locales) en gang til, så tror jeg kanskje at jeg kan bruke bare HTTP-headeren allikevel. :)

 

Slik, f.eks:

if len(request.querystring("lang")) > 1 then
' 1. prioritet: querystring
langCode = left(request.querystring("lang"), 2)
session("lang") = langCode
elseif len(session("lang")) > 1 then
' 2. prioritet: session-variabel
langCode = left(session("lang"), 2)
else
' 3. prioritet: HTTP-header
langCode = left(request.serverVariables("HTTP_ACCEPT_LANGUAGE"), 2)
end if

select case langCode
case "no" lang = "Velkommen, norske besøker!"
case "en" lang = "Welcome, English visitor!"
case else lang = "Velkommen, default-language-speaking visitor!"
end select

 

if-nøstet her muliggjør at brukeren kan overstyre HTTP-headeren og velge språk selv ved å klikke på en link som sender en språkkode til querystring-variabelen "lang" som deretter lagres i en session-variabel. I "select case langCode" er det kanskje mest hensiktsmessig å referere til ulike include-filer som inneholder nettstedets språk-variabler.

 

 

Jeg tar gjerne imot tilbakemeldinger på løsningen min! :)

 

 

stian

Endret av stiansa
Lenke til kommentar

Hva gjør du da med denne headeren, dersom du ikke har "da" inne?

Accept-Language: da, en-gb;q=0.8, en;q=0.7

...som etter definisjonen betyr "I prefer Danish, but will accept British English and other types of English."

 

Det kan være flere språk angitt i accept-language headeren.

 

En annen ting: du tar left(.., 2). Er du 100% sikker på at alle språk er definert med to bokstaver?

Lenke til kommentar
Hva gjør du da med denne headeren, dersom du ikke har "da" inne?

Accept-Language: da, en-gb;q=0.8, en;q=0.7

...som etter definisjonen betyr "I prefer Danish, but will accept British English and other types of English."

Det kan være flere språk angitt i accept-language headeren.

Jeg var ikke klar over at accept-language kunne inneholde en kommaseparert liste. Men det er jo enkelt å putte det inn i en array, og starte fra toppen og bruke første språk man har inne.

 

En annen ting: du tar left(.., 2). Er du 100% sikker på at alle språk er definert med to bokstaver?

Jeg har ikke sett noen eksempler på at det brukes mer enn to tegn for å referere til et språk. Se her, f.eks.: http://www.loc.gov/standards/iso639-2/php/code_list.php. Jeg går ut ifra at det er ISO 639-1 som brukes, og ikke ISO 639-2. Hvis man skal ta høyde for at brukeren har flere språk definert i sin accept-language, så kan jeg jo selvsagt ikke bruke left() der.

 

 

stian

Lenke til kommentar
Spørsmålet er om du skal ha nynorsk og bokmål også da :p at du må lese 2-5 bokstaver (avhengig av om det er angitt dialekt).

 

no-nb og no-nn, eller om det bare er no

 

Nei, jeg holder meg til hovedspråket, tenker jeg. :)

 

 

-s

Lenke til kommentar

Nå kommer du med enkle løsninger her, synes jeg :p

 

Men tilbake til flere språk. I f.eks Operaen min sender jeg language slik:

 

nb-NO, nb;q=0.9, no-NO;q=0.8, no;q=0.7, en;q=0.6

 

(Dette er jo SÅ mye enkere i .net: string[] Request.UserLanguages)

Lenke til kommentar
  • 2 måneder senere...

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...