06. januar 2010 - 17:05Der er
19 kommentarer og 1 løsning
Benyt includede strenge i flere funktioner.
Hej alle.
Jeg har en .php fil der indeholder et Array med en masse tekst strenge, hvor den kalder et bestem array alt efter hvilket sprog man har valgt at vise siden i.
Denne fil bliver included (include("strings.php"); i en anden .php fil, der indeholder en masse funktioner. Jeg ønsker at kunne benytte indholdet af dette array i samtlige funktioner. Dog kan jeg kun få den til at hente indholdet af arrayet ved at include filen inde i HVER funktion, hvilket jeg gerne vil undgå. Hvordan gør jeg det?
Hvis jeg ikke lige var forstålig nok, er jeg pt. nødt til at gøre sådan:
function funktion1() { include("strings.php"); echo $string[3]; }
Havde nu håbet jeg kunne slippe for at skulle tilføje en linje i hver eneste funktion. Men hvis det ikke kan være anderledes må det jo være sådan, så :(
Synes godt om
Slettet bruger
06. januar 2010 - 17:21#3
Du kan evt. benytte $_GLOBAL til at gemme din $string i (Det er ikke testet, men det skulle være en mulig approach):
Bortset fra at mit eget system er blevet ulæseligt i php koden, hvis ikke jeg holder tungen lige i munden. Pt. kører jeg på id'er, således at mine strenge er som følger:
$string[0] = "Der er noget galt. Prøv igen, eller kontakt webmaster."; $string[1] = "Log ind"; $string[2] = "Brugernavn"; $string[3] = "Password"; $string[4] = "Vælg venligst et sprog";
hvor jeg jo så enten definere ovenstående, den engelske version eller den tyske alt efter hvad den cookie der gemmer sprog information er sat til.
Så tror ikke vi helt har fået den samme ide. Men din idé lyder da faktisk ikke helt dum :)
Synes godt om
Slettet bruger
06. januar 2010 - 18:31#9
Og så vælger du hvilken sprog-fil der skal "includes" afhængig af sprog-cookien ?
- Ja... en fil pr. sprog vil gøre det lettere at "sende ud" så det kan blive oversat af en indfødt...
Måske kombinationen: En fil pr. sprog, men med den danske term som index:
Jeg har nu alle sprog liggende i én fil. Men som du selv skriver kan man jo let bytte mine forvirrende tal ud med beskrivelser. Kommer an på hvad man selv helst vil.
I stedet for at benytte ID numre som nøgler, så brug de engelske tekster, hvis du vil undgå at miste overblikket. I længden er det en ret dårlig løsning, med et array til så mange beskeder, men alt andet bliver hurtigt kompliceret. Jeg ville foreslå en funktion til at oversætte med, du undgår ikke blot at gemme ting i GLOBAL (bad practice), men samtidig sikrer du at du til enhver tid kan udskifte din "tolk" med en ny, hvis du får behov for at skalere.
static function message() { return array( 'dk' => array( 'Please fix all errors' => 'Ret venligst alle fejl', ), 'de' => array( 'Please fix all errors' => 'Bitte beheben alle Eingabefehler', ), ); } }
echo base::t('Please fix all errors') . '<br />'; echo base::t('This one does not exists') . '<br />'; base::$language = 'de'; echo base::t('Please fix all errors') . '<br />';
Prøv denne kode, så kan du se hvordan man undervejs kan skifte sprog, automatisk bruge en fallback o.s.v. Den største fordel er naturligvis at du til enhver tid kan splitte den op i flere filer, eller ændre måden hvorpå du henter dine oversættelser.
Synes godt om
Slettet bruger
06. januar 2010 - 22:51#13
Jeg lægger et svar som requested.. Så kan du selv vælge, om du vil benytte det, eller én af de andre løsninger..
/1
Synes godt om
Slettet bruger
06. januar 2010 - 23:32#14
Det ser godt ud jenz3n - Lean, mean version af min ide i #7 - men er grundideen holdbar i alle tilfælde ? Du foreslår engelsk som "grundstammen" (index) så det eliminerer æøå-problemer, men hvad med andre "specielle" tegn - er der ingen grænser for hvor "specielt" et array-index kan være ? Hvad med f.eks... "When ready, 'hit' <return> & pray" ?
Jeg skal indrømme at jeg ikke er helt sikker, men så vidt jeg ved er array nøglerne blot strings, og de kan altså indeholde hvad som helst. Flere større frameworks håndterer problemet på netop denne måde, så jeg går ud fra den er holdbar. Ønsker man alligevel at holde sine beskeder rene for tegn, så er det jo ikke værre end at man opretter en engelsk sprog fil, og så undlader specialtegnene i nøglen. Den helt store fordel ved min version er at den er 100% skalérbar. Alle ændringer sker indenfor klassen, og man slipper for noget usikkert find'n'replace. Eksempelvis kan man lynhurtigt lave det med database lookups, eller hente det hele fra filer.
En af de oplagte forbedringer kunne være at tillade: base::t('Some message about {name} thing',array('name' => $_POST['name'])); De forskellige oversættelser benytter så "{name}" som en variabel og den kan så blive erstattet i "t" funktionen.
Synes godt om
Slettet bruger
07. januar 2010 - 00:02#18
Ja, dén tænkte jeg også på, men sprang over gærdet lavpraktisk: base::t('Some message about') . " $name " . base::t('thing') - men du har jo ret, og en cool fleksibel løsning med et array til "erstatningerne"!
@kvadratrodenaf1 Hvis du vil belønnes for at have givet svaret på mit spørgsmål, vil det være en fordel hvis du også klikker på 'Svar' ;)
Synes godt om
Slettet bruger
07. januar 2010 - 12:50#20
Jamen det gør jeg så :)
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.