Jag har tidigare lyckats med att göra en app i C#, för att kunna göra asp-sidorna flerspåkiga. Gör en tabell med räknare, språk-id, sid-id, text-id och text. Typ: Hej Göran, tack för snabbt svar. Jag har en tabell för språken och en tabell för sidorna, men ingen av dessa behövs för att det ska fungera. De används mest i administrationen. Varför har både sid- och text-id? Varför inte bara ha en identifierare för varje text, se bara till så att det är en vettig struktur och tänk på att använda generella texter där det går. Tex identifieraren "General\text\submit" betyder Submit på engelska och... ja du fattar. Sid-id är för att man inte ska behöva hämta alla texter som finns i hela tabellen, utan bara de texter som ska vara på just den sidan. Du har väl inte tänkt göra ett databasanrop för varje gån en sida körs i webservern??? Eller ännu värre, ett anrop för varje text??? Jag gör ett databasanrop som hämtar texterna för varje sida som visas. Precis som jag skrev ovan, man läser ut dem i application_onstart och lägger i en hashtable. Då slipper du accessa db för varje sida som visas och det minne som används för att lagra det blir minimalt. Man måste ju göra en avvägning hur man ska använda resurserna. Just arbetsminne är en av resurserna som är begränsade, och det kan ha väldigt negativ inverkan på prestanda ifall man använder för mycket. Jag har nu kommit så här långt. Har du funderat över språkstödet HTML 4 och XHTML 1 har? Det ger dig många möjligheter att kuna koda din sida i olika språk. Nej det har jag inte, det jag pysslar med nu gäller "vanlig" asp. Ja, det ser vettigt ut. För ett par år sedan så la jag ut en exempelapplikation i ASP för detta på PlanetSourceCode, http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=7131&lngWId=4 Tack för förslag och tankegångar, allt fungerar kanon just nu.Hur bör databasen läggas upp?
Jag har nu upptäckt, att jag använde mig av fel teknik, jag gjorde en massa include-filer, som innehöll variablerna med det översatta texterna.
Nu försöker jag igen, men tänkte att jag skulle göra det med en databas, men hur bör jag bygga upp databasen för att det skall bli effektivt?
Man måste ju tänka på att mappstrukturen kan variera ganska så kraftigt, och att alla filnamnen inte är unika.
Bra förslag motages med förtjusning.Sv: Hur bör databasen läggas upp?
PageTextId int, räknare
LanguageId int
PageId int
TextId int
PageText varchar(500)
När du ska visa en sida så hämtar du alla texter som har det valda språket och PageId för sidan. Använd GetRows för att läsa in datat i en array så kan du enkelt leta rätt på en text med ett visst TextId.Sv: Hur bör databasen läggas upp?
Jag är nog lite konfundersam över dit svar.
>PageTextId int, räknare
>LanguageId int
>PageId int
>TextId int
>PageText varchar(500)
PageTextId den är jag på det klara med
LanguageId borde väl vara kopplat till en annan tabell för att få med flera språk?
PageId int är väll det som skall göra sidan unik, men jag förstår nog inte hur, är det tänkt att ha ett "märke" på varje sida?
PageText här är det väll tänkt att texten skall in men jag tror inte att det fungera heller.
Som jag har tänkt (jag bygger just nu appen i C#) så skall jag markera ett text-stycke, detta skall då in i databasen.
Om jag förklarar hur jag gjorde när jag använde include filer.
På varje sida så includerades en unik fil.
Html filerna döptes om till asp. Den rena texten replacades med ett variabelnamn + ett löpnummer (multilanguage_1, multilanguage_2 osv)
I includefilen så fanns variablerna;
multilanguage_1 = "Hej och välkommen",
multilanguage_2 = "Kul att se er" osv
Riktigt på det sättet kan jag ju inte resonera när det gäller databas, och det är därför som jag ställer frågan.Sv: Hur bör databasen läggas upp?
Bestäm nummer på sidorna, som du använder när du hämtar texterna från databasen. Det är PageId.
Ifall du sätter nummer 1 på sidan, svenska är språk 1 och engelska är språk 2, så ligger texterna så här i databasen:
LanguageId, PageId, TextId, PageText
1, 1, 1, 'Hej och välkommen'
1, 1, 2, 'Kul att se er'
2, 1, 1, 'Hello and welcome'
2, 1, 2, 'Nice to see you'Sv: Hur bör databasen läggas upp?
Läs sedan upp det varje språk i en hastable där id är key och texten value. Lägg sedan varje språks hashtable i an övergripande hastable som du lägger i en applikations variabel.
Då kan ett anrop för att få ut en text se ut så här GetText("SE", "General\text\submit") och funktionen gettext:
if app("myhash").contains(strLang) then
Dim ht as hashtable = app(strLang)
if ht.contains(strText) then
return ht(strtext)
else
return defaulttext....
end if
else
return defaulttext....
end ifSv: Hur bör databasen läggas upp?
Sv: Hur bör databasen läggas upp?
Göran Andersson = jobbat på söder vid slussen???Sv: Hur bör databasen läggas upp?
Hur hade du annars tänkt att hämta texterna?
Nej, jag har inte jobbat på Söder vid slussen. Jag har inte bott i Stockholm på 25 år.Sv: Hur bör databasen läggas upp?
Ett sätt som har använts i flera olika projekt och där db-access minskar samtidigt som man slipper beroende av att texter skall höra till en viss sida. Det enda de har är sin egen unika identifierare och så finns det självklart ett antal generella texter(dumt att lagra texten "OK", "Submit" mm för varje sida som finns när de används överallt). Just nu har vi 4 språk med >1500 texter i varje språk.
Trodde att du var en gammal jobbarpolare som har samma namn som du först, sorry. Sv: Hur bör databasen läggas upp?
Ifall man har en dedikerad server för webbplatsen så kan det ju klart löna sig att lägga texterna i minnet, men om man trängs med andra sajter på samma server så bör man nog vara lite försiktigare med att låsa upp resurser permanent.
Min sida är ju inte lika stor, den har ju bara två språk och sammanlagt lite drygt 1000 texter, eftersom artiklar och liknande ligger i egna tabeller...Sv: Hur bör databasen läggas upp?
Jag har två tabeller
t_lang
lang_id räknare
shortLang text text (för t ex sv,gb osv)
Lang lang (för hela namnet Sverige England osv)
t_pageSidor
PageID räknare
LangID int
TextId int
PageText PM (vet ju aldrig hur lång texten skall vara, kan vara fel och enbart ha den tell text(250))
Då skulle ju en SQL (tagit den direkt ifrån en fråga i Access) kunna se ut så här:
SELECT t_pageSidor.PageID, t_pageSidor.LangID, t_pageSidor.TextId, t_pageSidor.PageText, t_lang.shortLang
FROM t_lang INNER JOIN t_pageSidor ON t_lang.lang_id = t_pageSidor.LangID
WHERE t_pageSidor.TextId=1 AND t_lang.shortLang="se";
Verkar detta vettigt?Sv: Hur bör databasen läggas upp?
Sv: Hur bör databasen läggas upp?
Tycker du annars att det ser vetigt ut?Sv: Hur bör databasen läggas upp?
Hämta ut alla texterna för sidan, sorterade på TextID, så är det enkelt att hitta i datat:
SELECT t_pageSidor.PageID, t_pageSidor.LangID, t_pageSidor.TextId, t_pageSidor.PageText, t_lang.shortLang
FROM t_lang INNER JOIN t_pageSidor ON t_lang.lang_id = t_pageSidor.LangID
WHERE t_pageSidor.PageID=42 AND t_lang.shortLang="se"
ORDER BY t_pageSidor.TextIDSv: Hur bör databasen läggas upp?
Den har ungefär det upplägg som ni diskuterat här.
Du kanske kan få lite mer idéer och hjälp från den.
/pD
www.pdc.se
www.pdc.se/blog
www.patrik-dahlen.nuSv: Hur bör databasen läggas upp?