20. maj 2004 - 17:45Der er
28 kommentarer og 2 løsninger
sprogstyring i php
Jeg har ikke lavet så meget i php, men skal til at lave en større side. Jeg har grundlæggende 2 spørgsmål. 1. Er der nogen form for intelligent sprog-styring i php? Altså dvs. en let måde at skifte fra fx. eng. til dansk uden at skulle ændre en masse i sin kode. Fx. noget med at gemme teksten på siden i txt filer, der så blir hentet ind hvorefter man så bare kan skifte txt-filen ud for at skifte sproget.
Spørgsmål 2 er om der er en smart måde at adskille logik og design. Altså fx. hvor man lissom i JSP har logikken i beans og designet på selve siden, og implementerer selve logikken på siden vha. et tag der referer til en bean. I DOTNET er det opbygget på samme måde, bortset fra at det her hedder controller istedet for beans. Findes der en lignenede funktionalitet i PHP mvh. Bumle90
1) Hvis du skal lave et større site, skal du nok alligevel bruge noget MySQL database. Her kunne du jo så lave tabeller der indeholder sidens tekst. Hver tabel hedder så bare det enkelte sprog, og alt efter hvilket sprog brugeren har valgt, henter den fra den enkelte database.
2) Du kan bruge to filer til dit design. En fil ved navn header.php og en footer.php header.php smider du alt dit design der skal være inden teksten. og footer.php smider du alt hvad der skal være efter din tekst. På den måde har du to filer med design, og en fil der henter data fra din MySQL database, hvis du benytter metoden fra spørgsmål 1.
tabel: dansk felter: id | navn | overskrift | tekst
tabel: engelsk felter: id | navn | overskrift | tekst
På din side når brugeren lander på siden, er det jo f.eks. dansk som standart sprog. For at tjekke hvilken tabel i databasen der skal hentes fra bruger man så f.eks:
if(!isset($_GET[language])) { // Der er ikke valgt noget sprog. Vi henter fra den danske tabel. $query = mysql_query("SELECT * FROM dansk WHERE...... } else { // ellers henter vi fra den tabel, som har det sprog der er bedt om. $query = mysql_query("SELECT * FROM $_GET[language] WHERE...... }
Hvis du har arbejdet en lille smule med php før, kender du sikkert metoden $_GET Måden du så holder styr på hvilket sprog der skal bruges er på dine links.
<a href="foo.php">dansk</a> <- vil give dansk sprog på den sider der er bedt om. <a href="foo.php?language=engelsk">Engelsk</a> <- vil give engelsk sprog.
En anden måde ville måske også være at bruge sessions. Prøv at søge i PHP kategorien her på eksperten. Spørgsmålet har været oppe og vende flere gange før.
oki, ja det er jeg med på...Men så får man jo så et "resultset" frem....Hvordan finder jeg så ud af hvor jeg skal skrive de enkelte tupler? Bestemte sætninger skal jo være bestemte steder på siden
Afhængig af site størrelse, vil jeg nok benytte define() - da det nok er sjældent du ændre i teksten (forhold til antal gange de bliver vist).
fx.
lang/da.php lang/en.php
og der står så noget i stil med lang/da.php: define("LANG_WELCOME_TITLE", "Velkommen til min hjemmeside"); eller i lang/en.php: define("LANG_WELCOME_TITLE", "Welcome to my homepage");
Nogle gange er det nemmere at holde det simpelt :-)
æhh, der er jo også noget med at tjekke hvilke lang browseren pr. default bruger, og på den måde hente den ene eller anden fil (table i mysql), men præcis kode i PHP kender jeg ikke lige p.t.!
Apache kan f.eks. hente forskellige filer, alt efter browser-lang!!!!!!!!!
Men ellers, (efter tjek af browser-lang), netop at bruge mysql til at hente sproget, altså, er der ikke en cookie, (eller session), så er default lang dansk
I DB har du så
forside forside_eng forside_spansk
Alt efter hvilken cookie (session) som er sat, henter du fra den table
Ja det er jeg altsammen med på. Men jeg er interresseret i logikken i det. Altså hvordan jeg bygger det logisk pænt op. er det noget med at jeg i selve php scriptet skriver hvis jeg fx. vil have skrevet overskiften ud: Først øverst en variabel der der indikerer hvilket sprog vi skal ha. Lad os kalde den $lang="eng";
og så længere nede skriver jeg hvis jeg har det gemt i filer. Et sprog for hver fil: <h1><?echo(getlinefromfile($lang,1))?></h1> og længere nede har jeg et afsnit om fx. priser <div><?echo(getlinefromfile($lang,3))?></div
det er skrevet ret pseudoagtigt, det ved jeg godt...Men er det ideen?
Jeg har set flere projekter der gør det via databaser og via filer. Det er vist en smagssag - der er ikke rigtig een måde at gøre det på (jeg har ihvertfald ikke fundet den endnu).
Du kunne også lave en klasse som håndtere det.
fx: $l = new Language('da');
og så hver gang du ønsker at skrive tekst ud, så bruge print $l->('WELCOME');
Nogle har også gjort det sådan at fx at man giver en textstring med som argument.. fx
print l('Welcome to my homepage');
Funktionen l() kigger så om stringen er oversat til noget andet på det valgte sprog (fx hvis jeg vælger dansk, så ser den om den ved hvordan teksten så skal se ud på dansk).. Jeg er ikke vild med denne løsning, men det er en mulighed. Hvis man siger, at du ikke har oversat noget tekst, så kan du altid vise den engelske tekst.
puuha, den der gettext() ser godt nok ret omfattende ud. Spørgsmålet er om det virkelig er så godt at det kan betale sig at sætte sig ind i det?
Efter at have læst jeres gode indlæg har jeg også selv siddet og tænkt lidt over et muligt design. Ret simpelt opbygget, men jeg tror det har de ting der skal bruges. Løsningen er baseret på mysql database indeholdende 4 tabeller til sprogkontrollen. Disse er følgende: 1. ID(autonummerering),TYPE(tekst,ord),NAVN 2. SPROG,CHARSET 3. ID,OVERSÆTTELSE,SPROG (Denne tabel er til ord. Dvs. samme ord forkommer flere gange i forskellige sprog 4. ID,OVERSÆTTELSE,SPROG (Denne tabel er til tekster. Dvs. samme tekst forkommer flere gange i forskellige sprog
Jeg har altså 4 tabeller (Ovenstående). På php siden skal der så laves en funktion der hedder fx. feth(). fetch() skal modtage (navn,sprog,type). lave opslag i database og retunere den fundne oversættelse som en strang der blot skrives direkte på siden. Finder fetch() ikke noget resultat skal den blot retunere ordet på éngelsk eller andet standard sprog. Grunden til jeg vil have 2 forskellige tabeller til hhv. tekst og ord er fordi jeg vil gemme ord i typen VARCHAR og tekst i typen BLOB. Derfor er det lidt svært at gemme dem i samme attribut. Så logik i fetch skal altså finde ud af om der skal joines med tekst eller ord tabellen, alt efter hvilken type brugeren ønsker. Grunden til at jeg vil lave det hele på den her måde er også at det så vil være muligt for fx. en administrator at oprette nye sprog og ord som der kan lægges i databasen. Hvad synes i om den ide? Er det en god og fleksibel løsning?, og har i evt. forbedringer og forslag? Hilsen Bumle90
Pas på med at tro at du kan oversæt ord. Det er nogle ord du kan, men langt fra alle. Der er mange lande der fx. har forskellig endelser alt efter tid / kønnet på det ord de henviser til. Hvad ved jeg :-).
Lad mig se.. Jeg vil nok lave 2 tabeller. 1: language: id(auto), sprog (default,da,en..), charset 2) language_item (id(auto),language_id, name, value));
Så vil den fetch lave en sql i stil med
SELECT i.value, i.sprog FROM language l, language_item i WHERE l.id = l.language_id AND i.sprog in ('default','da') AND i.name = 'WELCOME' ORDER BY sprog='da', sprog='default' LIMIT 1
Så vil den vælge den danske tekst hvis den findes, ellers den engelske.
(beklager at jeg har rodet "sprog" sammen med alle de engelske navn :-) ).
Cypermann skrev tidligere til mit spg. 2 følgende: Du kan bruge to filer til dit design. En fil ved navn header.php og en footer.php header.php smider du alt dit design der skal være inden teksten. og footer.php smider du alt hvad der skal være efter din tekst. På den måde har du to filer med design, og en fil der henter data fra din MySQL database, hvis du benytter metoden fra spørgsmål 1.
Er det standard måden at gøre det på? Jeg er nemlig ikke helt med. Man kan jo ikke bare sige at header skal have alt design inden tekst, og footer alt design efter tekst. Der kommer jo en masse tekst på siden løbende. Så skal man have en masse headere og footere for hver side....Gir ikke helt mening synes jeg. Jeg har nok ikke forstået det korrekt, men jeg kunne godt tænke mig et lille eksempel hvis det var muligt :)
Hvordan sitet bygges op, kommer helt anpå, hvilken type site, du laver. Eksperten er næsten helt sikkert opbygget på den måde - computerworld.dk ligeså. Faktisk er det den mest brugte måde at opbygge større sites på :)
Det gir jo 50000000 sider selv til et lillebitte site så med alle de headers og footers. Det kan da ikke passe. Er det ikke muligtat lave et lille hurtigt eksempel på hvordan det er. Jeg tror ikke jeg helt har forstået princippet i det nemlig... :)
Ved ikke lige hvilken metode du omtaler olebole, men er lutter ører (er meget interesseret i håndteringen af større webopgaver)
Måden jeg ville løse problemet med flere sprog, er ved at lave en klasse til at håndtere sprog opgaverne, denne klasse skal tage en landekode som argument.
$lang = new lang("dk");
Dernæst skal den have en metode til at hente en side på det angivne sprog - jeg ville vælge en database tabelopbygning med en reference-tabel(derved opnås en enkelt variabel sat i querystring)
$lang->getSite(id);
Tabelopbygningen vil jeg ikke komme videre ind på, håber i har fået pointen, ved godt at dennises indlæg berør lidt de samme ting, syntes dog at mit var af en smule relevans :-)
bumle90: Der er ikke nogen standard måde at gøre det på. Det er derfor du får så mange forslag.
Du kan sagents have een sprogfil pr side. Du kan også have een stor sprogfil for hele sitet.. Eller grupper siderne op i sammenhørende dele, således at fx. alle forum-sider bruger samme sprogfil.
Der er mange måder. Du skal bare bestemme dig :-)
Ang. spørgsmål 2: (som egenlig hænger tæt sammen med spmgs1) så findes der en masse template-engines, der kan hjælpe dig. bTemplate brugte jeg en overgang. Nogle er vilde med Smarty, XSL, osv - andre bruger slet ikke templates (men har bare php-filer der laver designet adskildt fra "koden")
Jeg søgte også lidt på google, bl.a. efter MVC patterns og fandt denne side. http://www.phppatterns.com/ Det synes jeg umiddelbart ser meget fornuftigt ud. Er det noiget i kender til?
Okay, nu har jeg siddet og læst lidt om smarty, og det virker faktisk lige som det jeg vil have. Det er vel egentlig php's svar på jsp's funktionalitet med beans og .net's svar på controllers. Og det er jo skidefedt. Det er jo så bare ret omfattende at sætte sig ind i, men det er jo bare som det er. Det må man tage sig lidt tid til så :) Mit spørgsmål er så bare hvordan smarty forholder sig til sprogstyring? Er det understøttet som standard, og let at bruge, eller skal man selv implementere sin sprogstyring? I så fald vil det være let at bruge min tidligere beskrevne databaseløsning sammen med smarty?
Du kan sagents bruge smarty til viewer i mvc. Det ene udelukker ikke det andet.
*Mit* problem emd smarty er at den er stor og tung, og i sidste ende ikke kan gøre noget, man ikke kan i php. Hvorfor bruge php til at parse "smarty" så så udføres? Hvorfor ikke bruge php direkte? Det er jo meget hurtigere, bedre dokumenteret, bedre supporteret etc.
Hvad med Postnuke. Det understøtter både sprog og det hele. Det er jo bare at sætte det op, ændre i koden/styleshetsne og så har man en fin side. Kan det betale sig at bruge postnuke, eller er der noget jeg ikke ved omkring det som gør det dårligt at bruge?
coderdk: Det er ikke en standard indenfor web udvikling. Har faktisk ikke set det I brug endnu - men det er da en løsning. Men du har ret i at den bliver meget tit i software generelt :)
PostNuke og PHPNuke har (haft?) temmelig dårlig sikkerhed. Der er utallige huller i de produkter. Jeg tror det er hovedsageligt PHPNuke så det kan godt være PostNuke er hurtigere til at få rettet dem (de er trods alt også meget brugt) og er et ok produkt.
Der kan du prøve at søge en gang.. Det ser ud til at Postnuke ikkke er nær så slem som phpnuke :)
Synes godt om
Ny brugerNybegynder
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.