Avatar billede kjeldsted Novice
06. januar 2010 - 17:05 Der 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];
}

fucntion funktion2()
{
include("strings.php");
echo $string[53];
}


Jeg vil altså hellere kunne gøre det således:

include("strings.php");
function funktion1()
{
echo $string[3];
}

fucntion funktion2()
{
echo $string[53];
}


Har uden held prøvet følgende:

global $string;
include("strings.php");


Håber der er nogle der kan hjælpe. På forhånd tak :)
Avatar billede Slettet bruger
06. januar 2010 - 17:10 #1
Benyt global inde i funktionen:

include("strings.php");
function funktion1()
{
global $string;
echo $string[3];
}

fucntion funktion2()
{
global $string;
echo $string[53];
}
Avatar billede kjeldsted Novice
06. januar 2010 - 17:12 #2
Hm. Tak for det.

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å :(
Avatar billede 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):


include("strings.php");
$_GLOBAL['string'] = $string;

function funktion1()
{
echo $_GLOBAL['string'][3];
}

fucntion funktion2()
{
echo $_GLOBAL['string'][53];
}
Avatar billede kjeldsted Novice
06. januar 2010 - 17:56 #4
$_GLOBAL ser umiddelbart ikke ud til at ville virke, desværre.
Men smid et svar.
Avatar billede kjeldsted Novice
06. januar 2010 - 18:02 #5
SÅ fandt jeg det jeg ville. Det var næsten korrekt det du skrev. Det virker med:

echo $GLOBALS['string'][12]
Avatar billede kjeldsted Novice
06. januar 2010 - 18:03 #6
Og så behøver jeg slet ikke linjen
$_GLOBAL['string'] = $string;
Avatar billede Slettet bruger
06. januar 2010 - 18:07 #7
@ kjeldsted: Jeg sidder selv og grubler over hvordan jeg kan gøre min app "multikulturel" uden at gøre den ulæselig for migselv...

Har vi fået den samme idé ?

Jeg vil også benytte et monster-array[

["Dansk", "Danish", "Dänisj", "dannervælsk"...
["Send" , "Sumbit", "Abschicken"....

Og så benytte det danske ord som nøgle, og en global sprogvariabel som index:

echo "<input type='submit' value='".getSprog("Send")."'>";

På den måde kan jeg stadig se hvad det handler om i sourcen : )
Genialt!
- eller er det, måske er der andre som har brændt nallerne på den metode ?
Avatar billede kjeldsted Novice
06. januar 2010 - 18:22 #8
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 :)
Avatar billede 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:

$string['Kodeord'] = "Password";
Avatar billede kjeldsted Novice
06. januar 2010 - 18:41 #10
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.
Avatar billede majbom Novice
06. januar 2010 - 20:09 #11
var det ikke nemmere (læs: mere overskueligt) med defines?

have en (eller flere) fil pr sprog hvor man definerer strengene:

lang_da.php

define('DANISH', 'Dansk');
define('BTN_SUBMIT', 'Send');
define('HEADER', 'Overskrift');


lang_en.php

define('DANISH', 'Danish');
define('BTN_SUBMIT', 'Send');
define('HEADER', 'Header');

og så includere filen der passer til det valgte sprog, og der hvor ordet skal stå skriver man:

DANISH, BTN_SUBMIT eller HEADER

?

det ser ud til at strukturen i #8 hurtigt bliver meget uoverskuelig - og om 2 uger har du ikke den fjerneste ide om hvad $string[213] er :)
Avatar billede jenz3n Nybegynder
06. januar 2010 - 22:31 #12
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.

class base {
    static $language = 'dk';
   
    static function t($message) {
        $messages = self::message();
        return isset($messages[self::$language][$message]) ? $messages[self::$language][$message] : $message;
    }
   
    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.
Avatar billede 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
Avatar billede 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" ?
Avatar billede jenz3n Nybegynder
06. januar 2010 - 23:40 #15
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.
Avatar billede jenz3n Nybegynder
06. januar 2010 - 23:42 #16
Jeg har rent faktisk lavet en brøler, den har dog ikke betydning, men for syns skyld bør funktionen hedde messages() og ikke message().
Avatar billede jenz3n Nybegynder
06. januar 2010 - 23:44 #17
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.
Avatar billede 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"!

Det ligner sgu en vinder : )
Avatar billede kjeldsted Novice
07. januar 2010 - 11:27 #19
@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' ;)
Avatar billede Slettet bruger
07. januar 2010 - 12:50 #20
Jamen det gør jeg så :)
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