Avatar billede WebHost Nybegynder
02. juni 2012 - 20:01 Der er 21 kommentarer og
1 løsning

asp og xml languages

Hej jeg sider med et minder problem da jeg er ved at lave et system hvor jeg skal lave en sprogfil og har den iden at jeg vil lave den i xml

<Languages>
    <Language code='da' name='Dansk'>
        <Languagetext id='1001'>Brugernavn</Languagetext>
    </Language>
    <Language code='en' name='English'>
        <Languagetext id='1001'>Username</Languagetext>
    </Language>
</Languages>

Ide er at jeg via en function kan hente data

Jeg skal angive da og 1001 så skal jeg få Brugernavn
Avatar billede softspot Forsker
02. juni 2012 - 23:08 #1
Hvad er spørgsmålet...?
Avatar billede WebHost Nybegynder
02. juni 2012 - 23:17 #2
spørgsmålet er hvordan jeg træk de data ud fra min xml fil ?
jeg er ikke meget stært i xml
Avatar billede softspot Forsker
02. juni 2012 - 23:42 #3
Det kunne være noget i stil med dette (helt utestet, så det kan være der lige skal justeres lidt på funktionens kode):

function Translate(id, lng)
  dim xdoc, xtxt, xpath
  dim txt
 
  set xdoc = Server.CreateObject("MSXML2.XMLDOMDocument")
  call xdoc.Load(AbsolutStiTilSprogfil)

  xpath = "//Language[@code=" & lng & "]" & _
          "/Languagetext[@id=" & id & "]"

  set xtxt = xdoc.documentElement.selectSingleNode(xpath)
  if not xtxt is nothing then
    txt = xtxt.text
  else
    txt = ""
  end if

  Translate = txt
end function

AbsolutStiTilSprogfil er en variabel som indeholder den absolutte sti til XML-filen (eller en konstant du indsætter i stedet for variablen), f.eks. c:\inetpub\sprog\fil.xml

Funktionen kaldes, der hvor teksten skal indsættes, således:

<%=Translate("da", 1001)%>

Du skal være opmærksom på, at forekomster af < og > i teksterne, kan ødelægge strukturen af din sprogfil. Derfor bør du overveje at lægge teskterne i data-elementer, så dette problem ikke opstår. Prøv dog først at få ovenstående til at fungere, inden du kaster dig ud i denne øvelse... :-)
Avatar billede softspot Forsker
02. juni 2012 - 23:49 #4
OK, koden til demonstration af kaldet var nok ikke helt tænkt færdig. Det skulle naturligvis se således ud:

<%=Translate(1001, "da")%>
Avatar billede softspot Forsker
03. juni 2012 - 00:16 #5
Jeg har lige lavet en version som rent faktisk er testet lidt. Der var nogle småfejl i ovenstående, samt en potentiel performance-flaskehals i.o.m. Translate-funktionen skulle læse XML-filen hver gang. Denne version sørger for caching i Application-objektet, så alle brugere kan få nytte af den samme sprogfil og den dermed kun skal indlæses én gang. Koden ser ud som følger:

<%
dim AbsolutStiTilSprogfil

AbsolutStiTilSprogfil = Server.MapPath("sprog.xml")

function GetDocument()
  dim xdoc

  on error resume next
  set xdoc = Application("lang_doc")
  on error goto 0

  if isEmpty(xdoc) then
    set xdoc = Server.CreateObject("MSXML2.FreeThreadedDOMDocument")
    call xdoc.Load(AbsolutStiTilSprogfil)
    set Application("lang_doc") = xdoc
  end if

  set GetDocument = xdoc
end function

function Translate(id, lng)
  dim xdoc, xtxt, xpath
  dim txt

  set xdoc = GetDocument()

  xpath = "//Language[@code='" & lng & "']" & _
          "/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


%>
<!DOCTYPE html>
<html>
<head>
  <title>Demo af sproghåndtering via en XML-fil i ASP</title>
</head>

<body>

<h3>Brugernavn på de forskellige sprog:</h3>

Dansk: <%=Translate(1001,"da")%><br>
Engelsk: <%=Translate(1001,"en")%><br>

<h3>Ukendt tekst-id på de forskellige sprog:</h3>

Dansk: <%=Translate(1002,"da")%><br>
Engelsk: <%=Translate(1002,"en")%><br>

</body>
</html>
Avatar billede WebHost Nybegynder
03. juni 2012 - 12:28 #6
Jeg takker og bukker.. det var lige som jeg ønsket
mit næste problem bliver kun at hente sprognavn du har ikke også en løsning der ?
Avatar billede WebHost Nybegynder
03. juni 2012 - 12:33 #7
Æv fejl fundet..

Når jeg oprette
<Languagetext id='1002'>Adgangskode</Languagetext>

under Dansk og English

så få jeg dem ikke frem
Avatar billede softspot Forsker
03. juni 2012 - 21:30 #8
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)%>
Avatar billede WebHost Nybegynder
04. juni 2012 - 10:56 #9
Jeg har skreve den lidt om selv og fåde den til at virker men jeg kan godt lide de nye ider du er komme med..

XML:
<Languages>
    <Language code='da' name='Dansk'>
        <Languagetext id='username'>Brugernavn</Languagetext>
        <Languagetext id='userpass'>Adgangskode</Languagetext>
    </Language>
    <Language code='en' name='English'>
        <Languagetext id='username'>Username</Languagetext>
        <Languagetext id='userpass'>Password</Languagetext>
    </Language>
    <Language code='sv' name='Svensk'>
        <Languagetext id='username'>Anvandarnamn</Languagetext>
        <Languagetext id='userpass'>Losenord</Languagetext>
    </Language>

</Languages>


asp:
<%
    function GetLanguage(DataID,Contry)
        dim xdoc
        on error resume next
        Set xdoc = CreateObject("MSXML.DOMDocument")
        xdoc.Async = False
        xdoc.Load(Server.MapPath("languages.xml"))
        set xtxt = xdoc.selectSingleNode("//Language[@code='" & Contry & "']/Languagetext[@id='" & DataID & "']")
        if not xtxt is nothing then
            GetLanguage = xtxt.text
        else
            GetLanguage = "N/A"
        end if
        set xtxt = Nothing
        set xdoc = Nothing
    end function

        Response.write "Dansk : " & GetLanguage(1001,"da")
%>

mit enste problem med denne her er at den ikke kan lide æøå öä i xml
Avatar billede softspot Forsker
04. juni 2012 - 11:40 #10
De funktioner og input jeg postede i sidste omgang, var egentlig ment som tilføjelser til det du allerede havde fået tidligere. Det eneste jeg foreslog var en ændring af måden Translate kaldes på, da det er overflødigt at transportere sprogvalget fra alle de funktionskald der skal foretages på en side, når sproget typisk altid vil være det samme for hele siden og dermed fra alle kald til Translate...

Hvis du skal have specialkarakterer til at fungere, vil jeg anbefale at du benytter UTF-8 som encoding til din XML-fil og dine sider. Dette betyder helt konkret, at du skal gemme dine projektfiler med UTF-8 encoding og markere dem som værende encoded med UTF-8. Dette gøres således for XML-filen:

<?xml version='1.0' encoding="utf-8' ?>
<Languages>
...
</Languages>

Det HTML du sender til klienten, skal også sendes utf-8 encoded og dette signaleres f.eks. ved at indsætte et metatag med i head-sektionen af din html, som angiver content-type og charset:

<meta charset="utf-8">

Det er vigtigt, at alle filer i dit projekt gemmes utf-8 encoded.
Avatar billede softspot Forsker
07. juni 2012 - 15:16 #11
Hvordan går det med dette?
Avatar billede softspot Forsker
13. juni 2012 - 13:45 #12
Er du kommet videre?
Avatar billede WebHost Nybegynder
17. juni 2012 - 10:43 #13
Hej igen

undskyld jeg ikke har svare men der har være lidt travlt på hjemme fronten.. men tilbage igen..
Avatar billede WebHost Nybegynder
17. juni 2012 - 11:00 #14
Jeg kan slet ikke få den til at virker med <?xml version='1.0' encoding="utf-8' ?> i xml
Avatar billede softspot Forsker
17. juni 2012 - 15:57 #15
Jeg kan også der er sneget sig et anførselstegn ind ifm. encoding-atributten. Prøv med denne version i stedet:

<?xml version='1.0' encoding='utf-8' ?>
Avatar billede WebHost Nybegynder
17. juni 2012 - 20:52 #16
Nu brokker den sige ikke over fil men den vil ikke læse ÆØÅ
Avatar billede softspot Forsker
17. juni 2012 - 22:55 #17
Jeg gætter på, at det er fordi du ikke har gemt filen i utf-8 encoding...
Avatar billede WebHost Nybegynder
18. juni 2012 - 09:17 #18
Ja ups det var hvis en lille fejl 40 fra min side..
nu får jeg næste å frem men den skrver kun &#65533;
Avatar billede softspot Forsker
18. juni 2012 - 09:26 #19
Hvordan udskriver du dine tekster (vis noget konkret kode)?
Avatar billede WebHost Nybegynder
12. august 2014 - 11:32 #20
Hej softspot

Det var min fejl min xml fil var ikke UTF-8 har haft stor glæde af din hjælp så hvis du smider et svar så få vi lukket denne tråd..
Avatar billede softspot Forsker
12. august 2014 - 13:29 #21
Velbekomme :)
Avatar billede WebHost Nybegynder
12. august 2014 - 13:48 #22
Det er da mig der takker. undskyld den lidt lange svar tid..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester