[ASP] Taal library implementeren

Pagina: 1
Acties:

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 22-08 12:42

Altaphista

1. check manual, 2. ask

Topicstarter
Op dit moment ben ik aan het kijken wat de beste manier is om een taal library voor een webapplicatie te implementeren. Het hoeft niet per se onderhoudbaar te zijn. Verder vind ik de snelheid van het laden en (in)lezen belangrijk. Ik gebruik ASP+IIS.

Tot nu toe zie ik de volgende manieren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. language file dat wordt ingeladen en dat via een functie de gewenste string retourneert
   + overzichtlijk
   + makkelijk wijzigen
   - groot bestand
2. language file dat wordt ingeladen en bestaat uit een array 
    (vb. NL: language(0) = "hoi" en language(1) = "hallo")
   + hmmm..  ?
   - onoverzichtelijk
   - moeilijk onderhoudbaar
3. Database
   + makkelijk onderhoudbaar
   + overzichtelijk
   - veel query's op database (hoeft niet per se, maar dan moet dit 
      met een omweg worden opgelost, wat het weer onoverzichtelijk maakt)
4. XML en XSL
   - heb ik op deze manier (nog) geen ervaring mee...
5. ....

Welk effect heeft bijv. een groot bestand inladen (kan groeien tot een paar duizend regels) op de performance, en wat zou een slimme oplossing zijn? Het moet snel en overzichtelijk zijn, maar ik wil ook geen vijftig language files eraan over houden :) ...

Je gaat het pas zien als je het doorhebt.


  • JohanDM
  • Registratie: Augustus 2002
  • Laatst online: 16-07-2021

JohanDM

Optimist

Als je optie 4. goed uitwerkt, kom je een heel eind:
Neem nu volgend XML document
XML:
1
2
3
4
5
6
7
8
9
10
<labels>
  <label id="Hoofd1">
     <text lang="nl">Hoofding 1</text>
     <text lang="en">Heading 1</text>
  </label>
  <label id="Hoofd2">
     <text lang="nl">Hoofding 2</text>
     <text lang="en">Heading 2</text>
  </label>
</labels>

Als je dit vanuit global.asa in een freethreaded XML DOM in een Application("LabelsXml") variabele steekt, kun je eenvoudig met XPath queries de tekst in de juiste taal ophalen.
ASP:
1
2
3
<H1>
<%=Application("LabelsXml").selectSingleNode("/labels/label[id='Hoofd1']/text[lang='" & strTaal & "']")%>
</H1>

Volgens mij is dit heel eenvoudig om te werken tot enkele functies in een include pagina.

"Two things are infinite: the universe and stupidity. And the former I'm not so sure about." -- Albert Einstein


  • TweakersOnly
  • Registratie: September 2000
  • Laatst online: 00:43
Ik heb zelf ook een beetje gestoeid met languagefiles en ik heb een andere manier gekozen:

In een algemene file "variabelen.asp" definieer ik alle variabelen. Vervolgens heb ik voor elke taalmodule een apart bestand gemaakt, bijvoorbeeld "English.asp" en "Nederlands.asp". In deze bestanden geef ik de variabelen in eenn bepaalde waarde.

Op de inlogpagina van mijn site ga ik kijken in de directory waar de bestanden zijn geplaatst en toon alle talen, in dit geval Nederlands en Engels.

Als de medewerker inlogt, zet ik de taalinstelling vast in een Sessie-variabele.

Vervolgens heb ik een functie getLanguage geschreven. Deze functie heeft als input een van de variabelen in "Variabelen.asp". Als output heeft de functie de waarde van de variabele in het taalbestand dat vastgelegd is door middel van de sessievariabele.

't Klinkt misschien erg moeilijk maar het werkt wel goed en redelijk snel.

Voordeel van de bovenstaande methode is dat taaluitbreiding redelijk eenvoudig is. Je maakt een nieuw asp bestand aan, bv "Francais.asp", en geeft aan de in de "variabelen.asp" gedefinieerde variabelen een waarde. That's it.

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
Ik gebruik weleens een combo tussen 2 en 3. Je zet alle data netjes in de database, bij het inloggen zet je bij kleine sites de gehele inhoud in de sessie, in een associatieve array. In de database staan alle teksten:
code:
1
2
3
4
5
6
id(alleen voor delete acties e.d.)
keyword(bijvoorbeeld "loginsucces")
language(nl/be/fr etcetera, in grotere projecten 
                staan de talen in een aparte db 
                met een hoop instellingen)
value(de echte tekst.)


Ik heb een functie gemaakt met een aantal opties, mag de source helaas niet geven, waaronder de manier waarop de gegevens opgehaald worden. De functie word aangeroepen met als argument het keyword. Dit kan zijn in één keer of per item. Als het in één keer is maak ik gewoon een associatieve array aan: keyword-value.

Indien gekozen is voor per keer wordt de waarde steeds opgehaald uit de db(gaat heel erg snel met mysql omdat het zo'n eenvoudige queries zijn.) en in de array gezet. Steeds controleer ik of de waarde nog niet in de array staat. Als dit zo is haal ik deze op anders hergebruik ik de waarde in de array.

edit: nog even wat gezocht:
[rml][ technisch ontwerp] meertalige versie website[/rml]
[rml][ Alg] Generiek multi-language systeem[/rml]

[ Voor 13% gewijzigd door djluc op 19-07-2003 14:12 . Reden: layout verpest :) ]


  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 22-08 12:42

Altaphista

1. check manual, 2. ask

Topicstarter
djluc schreef op 19 July 2003 @ 14:05:
Ik gebruik weleens een combo tussen 2 en 3. Je zet alle data netjes in de database, bij het inloggen zet je bij kleine sites de gehele inhoud in de sessie, in een associatieve array.
*knip*
ok, maar dit is geen kleine site :) . Stel ik moet een kleine 100 taalitems hebben per pagina, dan is het toch niet handig om in de sessie op te slaan, maar het lijkt mij ook niet slim om dan 100 keer een "select omschrijving from ... where taal = .." te doen. Ik dacht zelf (in de eerste instantie) aan de oplossing om een taalbestand (voor nederlands een Nederlands.asp oid) te includen en dan via een functie de string op te halen. Het wordt dan zoiets:
Language file:
ASP:
1
2
3
Function selectTaalItem(pagina, item)
  'met if of select voor de pagina het item retourneren
End Function

in een pagina:
HTML:
1
2
3
<!-- #include file="nederlands.asp" -->

<h1><%= selectTaalItem("index", "h1") %></h1>


Dit leek me wel handig en overzichtelijk tegelijkertijd, maar... dit vraagt volgens mij te veel van de server.

Waar ik verder ook aan dacht is het eenmalig inladen in de geheugen van de server (in application_load ofzo ) eventueel uit een database (ivm onderhoudbaarheid) en dan via een functie (de functie zoekt de juiste item) deze uit de Application te halen. Dit heeft iig geen extra requests per sessie.

Je gaat het pas zien als je het doorhebt.


  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
ok, maar dit is geen kleine site . Stel ik moet een kleine 100 taalitems hebben per pagina, dan is het toch niet handig om in de sessie op te slaan, maar het lijkt mij ook niet slim om dan 100 keer een "select omschrijving from ... where taal = .." te doen.
Dat is bij mij dan ook een optie, je kunt kiezen tussen het in één keer ophalen van de waarden, of per waarde ophalen.

Ik weet verder niet veel af van de performance verschillen in ASP tussen een tekstbestanden en een database. Maar voor de onderhoudbaarheid(mogen de gebruikers instellingen maken?) lijkt een database mij een betere keuze.

Heb je de XML, XSL mogelijkheden al grondig bekeken? In de topics in mijn vorige post worden die namelijk heel positief gezien.
Pagina: 1