Hvordan ser din XML-fil ud efter du har oprettet den nye tekst?
Mht. det med sprognavn, transporterer browseren typisk en liste med brugerens foretrukne sprogvalg, denne liste findes via Request-headeren HTTP_ACCEPT_LANGUAGE (som kan hentes via Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")) og er oplagt at tage udgangspunkt i. Indholdet af denne kunne f.eks. se således ud:
da-DK,da;q=0.8,en-US;q=0.6,en;q=0.4
Jeg er ikke 100% inde i, hvordan denne skal tolkes, men en oplagt tolkning ville da være, at det er en prioriteret liste over de sprog som brugeren foretrækker (dvs. har sat op i sin browser), hvor ovenstående ville betyde flg. prioritering:
1. da-DK (med en implicit q-værdi på 1,0)
2. da (med en q-værdi på 0,8)
3. en-US (med en q-værdi på 0,6)
4. en (med en q-værdi på 0,4)
q=<tal> angiver, såvidt jeg kan tolke, den faktiske prioritering af den enkelte sprogkode. Jo højere q-værdi, desto højere prioritet, så man bør nok sortere listen efter q-værdien og ikke bare antage at listen er sorteret når man aflæser den.
Anyway! Med listen i hånden kan man jo starte med at splitte den ved komma og dermed få et array svarende til nedenstående definition:
array("da-DK", "da;q=0.8", "en-US;q=0.6", "en;q=0.4")
Dette array kan så undersøges for, om der skulle være nogle af den listede sprog, som understøttes af dit system. Hvis der ikke er, har du jo nok en holdning til, hvilket af dine understøttede sprog, der skal benyttes som standard...
Sprogkoden for det sprog der vælges, kan du så gemme i en cookie, så den kan benyttes næste gang brugeren ønsker, at få vist en side på dit site. Ligeledes er det så muligt for brugeren at vælge et andet sprog end det dit site tolker sig frem til på grundlag af browserens sprogopsætning.
Jeg forestiller mig noget i stil med følgende implementering til at håndtere sprogvalget:
' Find det sprog som brugeren helst vil bruge (jf. browseropsætningen)
' eller benyt det første forekommende sprog i sprogfilen.
function GetPreferredLanguage(supportedLangs)
dim browserLangs, selectedLang, arrLang, lng, code
browserLangs = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE") & ""
' som standard så vælg det første i listen af understøttede sprog
selectedLang = split(supportedLangs, ",")(0)
if browserLangs <> "" then
arrLang = split(browserLangs, ",")
for each lng in arrLang
if len(lng) > 0 then
code = split(lng, ";")(0)
if instr("," & supportedLangs & ",", "," & code & ",") > 0 then
selectedLang = code
exit for
end if
end if
next
end if
GetPreferredLanguage = selectedLang
end function
' Find de sprog som sprogfilen understøtter.
' Tilføjes nye sprog i sprogfilen, vil denne funktion
' automatisk inkludere disse i listen
function GetSupportedLanguages()
dim xdoc, xlngs, xlng, tmp
set xdoc = GetDocument()
set xlngs = xdoc.selectNodes("//Language")
tmp = ""
for each xlng in xlngs
if len(tmp) > 0 then tmp = tmp & ","
tmp = tmp & xlng.getAttribute("code")
next
GetSupportedLanguages = tmp
end function
' Undersøg om lng er i listen med understøttede sprog
function IsSupportedLanguage(lng)
dim SupportedLangs
SupportedLangs = "," & GetSupportedLanguages() & ","
IsSupportedLanguage = instr(SupportedLangs, "," & lng & ",") > 0
end function
' Hent det sprog som brugeren foretrækker eller find et
' der passer til det der foretrækkes jf. browseropsætningen
function GetLanguage()
dim prefLang
prefLang = request.Cookies("lang") & ""
if prefLang = "" or not IsSupportedLanguage(prefLang) then
prefLang = GetPreferredLanguage(GetSupportedLanguages())
Response.Cookies("lang") = prefLang
end if
GetLanguage = prefLang
end function
' Sæt sprogvalget (hvis brugeren f.eks. vælger noget andet end
' det sprog som sitet selv har afledt at brugeren skal benytte)
sub SetLanguage(lang)
if lang <> "" and IsSupportedLanguage(lang) then
Response.Cookies("lang") = lang
else
Response.Cookies("lang").Expires = dateadd("d", -1, now)
end if
end sub
Du kan nu oprette en global variabel som holder det aktuelle sprogvalg og så kalde Translate med denne variabel i stedet for en konstant sprogkode. Dette kunne f.eks. se således ud:
dim curLang
curLang = GetLanguage()
Kaldet til Translate ville så se således ud:
<%=Translate(1002, curLang)%>
En optimering kunne være at fjerne den ekstra parameter fra Translate-funktionen og blot lægge referencen til curLang ind i Translate-funktionen i stedet for at skulle bære den med alle steder hvor Translate kaldes. I så fald ville Translate se således ud:
function Translate(id)
dim xdoc, xtxt, xpath
dim txt
set xdoc = GetDocument()
xpath = "//Language[@code='" & curLang & "']" & _
"/Languagetext[@id='" & id & "']"
set xtxt = xdoc.selectSingleNode(xpath)
if not xtxt is nothing then
txt = xtxt.text
else
txt = ""
end if
Translate = txt
end function
Kaldet til Translate ville herefter se således ud:
<%=Translate(1002)%>