Avatar billede bumle90 Nybegynder
20. maj 2004 - 17:45 Der 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
Avatar billede Slettet bruger
20. maj 2004 - 18:51 #1
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.
Avatar billede bumle90 Nybegynder
20. maj 2004 - 18:57 #2
Til spørgsmål 1:
hvilke attributter har man så i de enkelte sprogtabeller i databasen, og hvordan identificerer man hvor hvilke tekster skal stå?
Avatar billede bumle90 Nybegynder
20. maj 2004 - 19:01 #3
har du evt. eksempel?
Avatar billede Slettet bruger
20. maj 2004 - 19:07 #4
lad os sige din tabel ser sådan ud:

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.
Avatar billede bumle90 Nybegynder
20. maj 2004 - 19:15 #5
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
Avatar billede dennismp Nybegynder
20. maj 2004 - 20:07 #6
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 :-)
Avatar billede sukos Juniormester
20. maj 2004 - 22:15 #7
æ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
Avatar billede bumle90 Nybegynder
20. maj 2004 - 23:03 #8
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?
Avatar billede dennismp Nybegynder
20. maj 2004 - 23:39 #9
Ja, hvis det løser dit problem.

Umiddelbart er der mange måder at gøre det på. Mit forslag ville så være (hvis man tager udgangspunkt i dit pseudo)
$lang = 'eng';

require("lang/{$lang}.php");
<?php echo LANG_WELCOME_TITLE; ?>

Du kan også kigge på gettext()-metoden og se om det kan gøre det du ønsker.

Andre småting man skal huske på er fx at tal, dato osv skrives forskelligt.
Avatar billede dennismp Nybegynder
20. maj 2004 - 23:49 #10
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.
Avatar billede bumle90 Nybegynder
21. maj 2004 - 00:42 #11
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
Avatar billede dennismp Nybegynder
21. maj 2004 - 00:56 #12
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 :-) ).

*utestet
Avatar billede bumle90 Nybegynder
21. maj 2004 - 17:03 #13
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 :)
Avatar billede olebole Juniormester
21. maj 2004 - 17:16 #14
<ole>

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å  :)

/mvh
</bole>
Avatar billede bumle90 Nybegynder
21. maj 2004 - 17:25 #15
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... :)
Avatar billede hanshenp Nybegynder
21. maj 2004 - 18:03 #16
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 :-)
Avatar billede dennismp Nybegynder
21. maj 2004 - 18:19 #17
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")
Avatar billede bumle90 Nybegynder
21. maj 2004 - 18:33 #18
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?
Avatar billede bumle90 Nybegynder
21. maj 2004 - 20:05 #19
Avatar billede dennismp Nybegynder
21. maj 2004 - 20:22 #20
Jo. Jeg tror den er temmelig brugt til websites generelt. Har selv brugt den. Har intet at klage over :)
Avatar billede bumle90 Nybegynder
21. maj 2004 - 22:27 #21
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?
Avatar billede bumle90 Nybegynder
21. maj 2004 - 22:28 #22
håber det er okay jeg stiller alle de her begynderspørgsmål :)
Avatar billede dennismp Nybegynder
22. maj 2004 - 01:07 #23
Jeg kan ikke lide smarty, så jeg er ikke den rette at spørge til råds :) Jeg tror ikke smart har nogle features der specifik håndterer sprogstyring.
Avatar billede bumle90 Nybegynder
22. maj 2004 - 08:10 #24
okay, så du bruger et mvc pattern istedet?
Avatar billede dennismp Nybegynder
22. maj 2004 - 12:12 #25
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.

Læs evt: http://www.massassi.com/php/articles/template_engines/
Avatar billede coderdk Praktikant
22. maj 2004 - 15:14 #26
Der ér en standard måde at lave sådan noget på i php (og software generelt). Man bruger GNU Gettext - http://www.gnu.org/software/gettext/gettext.html
I PHP kig på: http://dk.php.net/manual/en/ref.gettext.php
For at rette po filerne, og generere mo filer: http://poedit.sf.net/
Det kræver dog lidt tilvænning.
Avatar billede bumle90 Nybegynder
25. maj 2004 - 17:19 #27
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?
Avatar billede dennismp Nybegynder
25. maj 2004 - 17:31 #28
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.
Avatar billede bumle90 Nybegynder
25. maj 2004 - 17:34 #29
oki...Hvordan er de usikre?
Der er huller i scriptsne så det er let at hacke webserveren eller hvordan?
Avatar billede dennismp Nybegynder
25. maj 2004 - 17:52 #30
http://msgs.securepoint.com/bugtraq/

Der kan du prøve at søge en gang..  Det ser ud til at Postnuke ikkke er nær så slem som phpnuke :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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