QimenMedlem sedan juni 20015 009 inlägg Hej,
När jag har byggt system som ska ha flerspråksstöd har jag alltid gjort det med hjälp av filer som jag haft arrayer i och sedan inkluderat dem. Men efter att haft en diskussion på irc (ja även här på wF för ett tag sedan med) så ska det tydligen bli smidigare om man lagrar detta i en databas.
Jag satt igårkväll och skulle börja skissa upp tabeller men det blev tvärstopp. Hur bör man bygga upp det? :q
Man bygger ju inte på kolumner och man vill ju ha varje språk som en rad. Låt säga att jag har en sida med 5 stycken olika texter som ska finnas på 2 olika språk. Men jag kan ju inte utgå från att det är 5 stycken på varje sida. Hur ska jag då bygga upp det? :)
erkaMedlem sedan dec. 19996 522 inlägg Du kan ju göra det något i stil med
tbl_Pages
-PageId
-Created
-Massa andra info, exempelvis visibleOnWeb, vem som skapat den osv
tbl_Languages
-LanguageId
-Description
tbl_PageTexts
-PageTextId
-PageId
-LanguageId
-Content
Ska du ha sorteringsordning på dina textstycken kan du ju bygga in det. Tex på att göra följande. Normalisera vidare tbl_PageTexts på PageTextId
Red, exempelvis:
tbl_Pages
-PageId (PK)
-Created
tbl_Languages
-LanguageId (PK)
-Description
tbl_PageText
-PageTextId (PK)
-PageId
-SortOrder
tbl_PageTextContent
-PageTextId (PK)
-LanguageId (PK)
-Content
spangoMedlem sedan juni 20008 205 inlägg Normalt brukar flerspråksstöd vara filbaserade... och då gör man vanligen så att filen med texterna heter något med språkkoden (t.ex. lang_en.foo för engelska och lang_sv.foo för svenska). Sen har varje fras en nyckel och ett värde, där nycklarna ser likadana ut för alla filer och värdena innehåller fraserna på lämpligt språk. T.ex.:
[i]lang_en.foo[/i]
greeting.welcome = Welcome!
greeting.text = This is Qimen's cool webpage!!!
[i]lang_sv.foo[/i]
greeting.welcome = Välkommen!
greeting.text = Det här är Qimens balla hemsida!!!
... och sedan när man ska presentera texten för användaren är det bara att ladda rätt fil, och använda lämplig nyckel för att plocka fram texten. Pseudokod:
<%
phrases = VoodooMagicLanguageSupport("lang_" + languageCode + ".foo")
%>
<h1><%= phrases.get("greeting.welcome") %></h1>
<p><%= phrases.get("greeting.text") %></p>
Skulle du direkt överföra det till en databas antar jag att du skulle ha tre kolumner, dels vilket språk det är, dels frasens nyckel, och frasen. Vill du optimera upp det lite kan du ju slänga på en nyckel som binder det till en specifik sida så du inte behöver hämta mer än nödvändigt.
erkaMedlem sedan dec. 19996 522 inlägg Det jag gjort ovan spango :)
Personligen tycker jag att det nästan är smidigare att använda xml-filer och inte multilingual sådana.
spangoMedlem sedan juni 20008 205 inlägg
erka skrev:
Det jag gjort ovan spango :)
Jo, precis, men du han posta medan jag satt och skrev, du vet. Jag går motvilligt med på att du pwnade mig :)
F.ö. är jag rörande överens med dig ang. att man bör ha språkfiler och inget annat.
erkaMedlem sedan dec. 19996 522 inlägg spango :)
Japp, dock enda gången jag föredrar språkstödet i db är om det är ett CMS baserat helt och hållet på information i en db som ska ha stöd för flera språk (alltså siten CMS:et hanterar). Då brukar jag ha en blandning, en del konstanter som hanteras av en constantmanager och xml-fil, samt all sidinformation i databasen.
QimenMedlem sedan juni 20015 009 inlägg Så som jag kör nu är identiskt med spangos sätt. Kanske ska fortsätta ha det på det sättet då. Känns nästan onödigt att ha det i db, blir ju en del databasanrop. Finns det överhuvudtaget något man tjänar på att ha det i db?
En liten snabbfråga gällande spangos sätt, vad händer om en text inte är översatt? Som nu har jag först inkluderat orginalspråket (ex. en) och sedan det språk som ska användas. Så finns inte en i det språk man vill använda så kommer värdet från engelskan att användas. :)
BrimbaMedlem sedan dec. 19995 875 inlägg
Finns det överhuvudtaget något man tjänar på att ha det i db?
Om du har många och långa texter kan det vara en fördel att ha dessa i databasen eftersom xml-filen annars kan bli stor och därmed tar det lång tid att processa den. Men när du arbetar mot en databas är det mycket viktigt att du använder dig av en cache som uppdateras efter givna intervaller eller varje gång du uppdaterar någon post i databasen.
QimenMedlem sedan juni 20015 009 inlägg
Brimba skrev:
Om du har många och långa texter kan det vara en fördel att ha dessa i databasen eftersom xml-filen annars kan bli stor och därmed tar det lång tid att processa den. Men när du arbetar mot en databas är det mycket viktigt att du använder dig av en cache som uppdateras efter givna intervaller eller varje gång du uppdaterar någon post i databasen.
Att lagra det i xml-filer tror jag vi kan utesluta då det handlar om en del stora texter. Men att cacha datan från databasen vet jag inte riktigt hur bra det går med php. Får ta och kolla upp det. :)
spangoMedlem sedan juni 20008 205 inlägg XML är ju f.ö. inte det enda sättet man kan lagra saker på i filer, och XML-parsers är ju inte direkt kända för att vara snabba av sig, vilket ligger i deras natur. Jag tycker nästan att XML är overkill för språkfiler, det är ju en baggis att göra ett eget hack som kräver en spottstyver av processorkraften som det tar att tugga sig igenom en XML-fil om det inte redan finns någon färdig (har inte PHP någon funktion för att läsa INI-filer, t.ex.?).
QimenMedlem sedan juni 20015 009 inlägg
spango skrev:
XML är ju f.ö. inte det enda sättet man kan lagra saker på i filer, och XML-parsers är ju inte direkt kända för att vara snabba av sig, vilket ligger i deras natur. Jag tycker nästan att XML är overkill för språkfiler, det är ju en baggis att göra ett eget hack som kräver en spottstyver av processorkraften som det tar att tugga sig igenom en XML-fil om det inte redan finns någon färdig (har inte PHP någon funktion för att läsa INI-filer, t.ex.?).
Exakt. xml är lite för segt. Just nu kör jag med ini-filer till konfigurationen men att köra det som språkfiler går nog inget vidare då phps iniparser får problem med längre rader där ' och " uppstår. :)
BrimbaMedlem sedan dec. 19995 875 inlägg Bygg en egen cachefunktion. Kan exempelvis vara så enkelt som att du lagrar allt i en xml-fil och varje gång du uppdaterar den så genererar den x antal kataloger (ett för varje språk). Däri lägger den x antal textfiler, varje textfil innehåller endast den text som du skall hämta. Bör bli ganska effektivt. Namnet på textfilen kan ju vara samma som för det id/nyckel-värde som du sätter på den aktuella texten som du även refererar till när du hämtar ut värdet.
spangoMedlem sedan juni 20008 205 inlägg En fil för varje fras? Måttligt effektivt. Bättre då att skippa XML helt och hållet och köra på ett enklare, effektivare format...
OveRRidEMedlem sedan feb. 200112 078 inlägg Om man nu skall bygga någon typ av cache, varför inte göra det som en ordentlig cache som bygger sig själv?
spango's modell är ju inte helt fel, under förutsättning att man siktar på att undivka att slå mot sin smällfeta XML-fil hela tiden, lämpligtvis genom att vid varje "riktigt" uppslag generera en cache'ad version som lagras på annat valfritt ställe. Kanske någon slags grupperad XML struktur som eftersträvar applikationen/frasstrukturen, där man slår ut datat i mindre delar?
QimenMedlem sedan juni 20015 009 inlägg Byggde en egen cache-klass som cache:ar bestämda databasdelar. Själva språkhanteringen fortsätter jag köra med min variant av spangos sätt. Dvs man delar upp datan på lämpligt sätt och sparar i filer. Sedan inkluderar man rätt fil vid rätt tillfälle osv. :)
BrimbaMedlem sedan dec. 19995 875 inlägg
En fil för varje fras? Måttligt effektivt.
Här menar jag inte xml, utan endast texten som skall visas ligger i filen. Det kan vara effektivt om man inte ser någon annan lösning. Förmodligen mer effektivt än att ha ett xml-dokument med en fras per nod.
spangoMedlem sedan juni 20008 205 inlägg Jo, jag förstod det, men fil-IO är något man ska försöka undvika så mycket som möjligt. Har man tjugo fraser på en sida blir det rätt mycket öppnande och stängande...