application - scope : gibts sowas in PHP ?
kaepten
- php
Hallo Forum
Im Rahmen meiner Mersprachen-Problematik von weiter unten ergibt sich mir noch folgende Frage:
Ich habe bereits früher einmal mit ASP eine Mehrsprachige Site aufgebaut und dort war es mir möglich die Sprachen als Array in einem Applikations-Bereich abzulegen. Das heisst ungefähr, jeder Benutzer greift auf dasselbe Array zu. Das Array wurde also im global.asa erstellt und hatte globale (applikationsweite) Gültigkeit.
Die "tieferen/kurzlebigeren" Stufen wäre dann ja der Session-Scope, dann der Page-Scope (Session-Bereich, Seiten-Bereich).
Vielen Dank für Antworten
kaepten
Oh kaepten mein kaepten
Im Rahmen meiner Mersprachen-Problematik von weiter unten ergibt sich mir noch folgende Frage:
Ich habe bereits früher einmal mit ASP eine Mehrsprachige Site aufgebaut und dort war es mir möglich die Sprachen als Array in einem Applikations-Bereich abzulegen. Das heisst ungefähr, jeder Benutzer greift auf dasselbe Array zu. Das Array wurde also im global.asa erstellt und hatte globale (applikationsweite) Gültigkeit.
Die "tieferen/kurzlebigeren" Stufen wäre dann ja der Session-Scope, dann der Page-Scope (Session-Bereich, Seiten-Bereich).
Ich gestehe kein blassen Schimmer.
Selbst deine Frage bereitet mir Kopfschmerzen.
Aber du kannst ja mal ein paar PHP-GURUS befragen.
Hier 2 gute Seiten, mit entsprechenden Foren:
oder schau mal in dieser Newsgroup nach
de.comp.lang.php
dort ist immer ein Held des PHP bereit Fragen zu beantworten.
Ich muß hier leider aussetzen.
Salut,
Christoph
Hallo!
Was spricht dagegen, den Array nicht als Array, sondern in einer txt-Datei zu speichern, und dann jedesmal daraus den Array zu erstellen, oder Du arbeitest mit Session, machst das einmal am Anfang, und speicherst den Array dann in der Session.
Oder Du könntest den Array in der Datei deutsch.lang speichern, und diese dann überall mit include()(oder besser mit include_once()) einbinden, oder auch das mit Sessions kombinieren, da weiß ich aber nicht was besser ist. Ich denke nicht, das Du sowas wie Sessionvariablen für eine ganze Applikation speichern kannst. Aber wie hast Du das denn bei ASP eingebunden und wie hast Du den Array in der .asa Datei gespeichert? Ich denke genau so wie in einer Normalen asp-Datei, oder? Dann wird ASP ja auch nix anders machen, als diese Datei einzubinden, bei PHP müßtest Du das Einbinden halt manuell machen.
Aber
<?
if($lang=="de"){
include("deutsch.lang");}
elseif($lang=="en"){
include("englisch.lang");}
?>
am Anfang jeder Datei sollte Dich wohl nicht überfordern, oder?
Grüße
Andreas
Hoi Andreas
Aber wie hast Du das denn bei ASP eingebunden und wie hast Du den Array in der .asa Datei gespeichert? Ich denke genau so wie in einer Normalen asp-Datei, oder? Dann wird ASP ja auch nix anders machen, als diese Datei einzubinden, bei PHP müßtest Du das Einbinden halt manuell machen.
Nein das funtzt anders, Du musst Dir das so vorstellen: Die Apllikation, das ist eingentlich der Server bzw. die aktuelle Site. Wird der Server gestartet, dann arbeitet er das global.asa ab. Objekte etc. die darin initialisiert werden stehen dann für alle Seitenaufrufe gleichermassen zur Verfügung! Jede Seite greift dann exakt auf dasselbe Objekt/Array zu. Es ist nur einmal vorhanden. Das hat nichts mit einbinden oder so zu tun, eher mit einer "Session" auf alleroberster ebene.
Aber
<?
if($lang=="de"){
include("deutsch.lang");}
elseif($lang=="en"){
include("englisch.lang");}
?>
am Anfang jeder Datei sollte Dich wohl nicht überfordern, oder?
Ich weiss nicht!? Bei dieser Hitze ist jeder Tastenanschlag Überfordernd ;-)
Danke für die Antwort
kaepten
Hallo!
Nein das funtzt anders, Du musst Dir das so vorstellen: Die Apllikation, das ist eingentlich der Server bzw. die aktuelle Site. Wird der Server gestartet, dann arbeitet er das global.asa ab. Objekte etc. die darin initialisiert werden stehen dann für alle Seitenaufrufe gleichermassen zur Verfügung! Jede Seite greift dann exakt auf dasselbe Objekt/Array zu. Es ist nur einmal vorhanden. Das hat nichts mit einbinden oder so zu tun, eher mit einer "Session" auf alleroberster ebene.
Versteh das nicht ganz. Was steht jetzt genau in dem Sprachenarray? ist das ein Array oder für jede Sprache extra? Und ist der Für jede Seite gleich? Das kann ja nicht sein, Du brauchst ja überall andere Wörter! Wie bindest Du das denn in ASP ein? An welche Stelle und wie unterscheidest Du nach Sprache? Und wie bindest Du das in das eigentliche Dokument ein? Wie würde bei in ASP das folgende PHP-Script in de/en aussehen:
<?
echo "Hallo Welt";
?>
Vielleicht hilft Dir hier http://pear.php.net/manual/de/, da gibt es ein paar Sachen, z.B. HTML-Templates, vielleicht könntest Du das dazu verwenden?
Ich denke für sowas gibt es noch keine vorhandenen Automatismen, das müßtest Du Dir halt selbst schreiben, oder auf ein bestehendes Projekt zurückgreifen, vielleicht was mit Packages, aber damit kenn ich mich nicht aus, außerdem weiß ich noch nicht so genau, wie es funktionieren soll!
Grüße
Andreas
Hoi
Versteh das nicht ganz. Was steht jetzt genau in dem Sprachenarray? ist das ein Array oder für jede Sprache extra? Und ist der Für jede Seite gleich? Das kann ja nicht sein, Du brauchst ja überall andere Wörter! Wie bindest Du das denn in ASP ein? An welche Stelle und wie unterscheidest Du nach Sprache? Und wie bindest Du das in das eigentliche Dokument ein? Wie würde bei in ASP das folgende PHP-Script in de/en aussehen:
<?
echo "Hallo Welt";
?>
Also:
' global.asa
'Lade Text Strings in Mehrdim.Array
sSQL= "select Item,StringValue_EN,StringValue_FR,StringValue_IT,StringValue_DE from Strings Order by Item"
Set rs = conn.Execute(sSQL)
aStrings =rs.GetRows
application("aStrings") = aStrings
rs.Close
' functionLib.asp --> wird auf der Seite inkludet
Function LoadString(ByVal stringnum, ByVal Lang)
...
Select Case Ucase(Lang)
Case "EN"
iLangPos = 1
Case "DE"
iLangPos = 4
Case "FR"
iLangPos = 2
Case "IT"
iLangPos = 3
Case Else
iLangPos = 4
End Select
LoadString = trim(aStrings(iLangPos,stringnum))
...
End Function
Vielleicht hilft Dir hier http://pear.php.net/manual/de/, da gibt es ein paar Sachen, z.B. HTML-Templates, vielleicht könntest Du das dazu verwenden?
Ich denke für sowas gibt es noch keine vorhandenen Automatismen, das müßtest Du Dir halt selbst schreiben, oder auf ein bestehendes Projekt zurückgreifen, vielleicht was mit Packages, aber damit kenn ich mich nicht aus, außerdem weiß ich noch nicht so genau, wie es funktionieren soll!
Grüße
Andreas
Hallo!
Nunja, so wie ich das sehe, ist ja meine Lösung gar nicht sooo weit entfernt davon, oder?
Du erstellst Dir das Script sprachen.inc, darin dann einfach den Sprachenarray, genau so wie in ASP erstellen. Was hat das eigentlich mit SQL zu tun? Liest Du das immer aus einer DB aus?
Du machst einfach alles was Du in der global.asa machst, in der sprachen.inc. Diese bindest Du dann in eine functionLib.php ein, hast also im Prinzip den Array jetzt in deser Datei stehen, dann auch so eine Funktion machen, und entsprechend mit case innerhalb einer Funktion abfragen.
Wenn Du jetzt diese functionLib.php in ein PHP-Script einbindest, kannst Du auf diese Funktion zurückgreifen, uind Dir entspechende Werte aus dem Array holen. Wobei ich das alles recht kompliziert finde, vielleicht habe ich da auch was falsch verstanden.
Ich würde einfach direkt in den Scripten auf den Array zurückgreifen, naja.
Viele Grüße
Andreas
Hoi
Versteh das nicht ganz. Was steht jetzt genau in dem Sprachenarray? ist das ein Array oder für jede Sprache extra? Und ist der Für jede Seite gleich? Das kann ja nicht sein, Du brauchst ja überall andere Wörter! Wie bindest Du das denn in ASP ein? An welche Stelle und wie unterscheidest Du nach Sprache? Und wie bindest Du das in das eigentliche Dokument ein? Wie würde bei in ASP das folgende PHP-Script in de/en aussehen:
<?
echo "Hallo Welt";
?>
' globla.asa
'Load Text Strings for Labels aus DB
sSQL= "select Item,StringValue_EN,StringValue_FR,StringValue_IT,StringValue_DE from Strings Order by Item"
Set rs = conn.Execute(sSQL)
aStrings =rs.GetRows
application("aStrings") = aStrings
rs.Close
'function-lib welches auf jeder Seite inkludet wird
Function LoadString(ByVal stringnum, ByVal Lang)
...
Select Case Ucase(Lang)
Case "EN"
iLangPos = 1
Case "DE"
iLangPos = 4
Case "FR"
iLangPos = 2
Case "IT"
iLangPos = 3
Case Else
iLangPos = 4
End Select
LoadString = trim(aStrings(iLangPos,stringnum))
...
End Function
'Seite mit Sprachabhängigen Texten
...
const lblHalloWelt = 2
sLang=trim(request("lang")) '(oder woher auch immer)
...
<%=LoadString(lblHalloWelt,sLang)%> --> Das wäre Dein:
<?
echo "Hallo Welt";
?>
Alles klar? Der "Trick" wie Du siehst ist das Mehrdimensinale Array aStrings. Das wird _einmal_ abgefüllt und steht dann jeder Seite zur Verfügung.
kaepten
Hallo!
Hatt ich wohl was übersehen.
'Seite mit Sprachabhängigen Texten
...
const lblHalloWelt = 2
sLang=trim(request("lang")) '(oder woher auch immer)
...
<%=LoadString(lblHalloWelt,sLang)%> --> Das wäre Dein:
<?
echo "Hallo Welt";
?>
Den mehrdimensionalen Array kann man ja genau so in PHP erstellen. z.B. wenn die Daten in einer DB stehen, würde ich mir ein Eingabeformular basteln, und jedesmal wenn die Tabelle geändert wird, gleichzeitig den Array in der Datei 'sprachen_arrray.php' neu erstellen.
Dann bräuchtest Du ein 2. Script, 'sprachen_funktion.php'
<?
// Datei 'sprachen_funktion.php':
function mehrprachig(text,Sprache){
include ("sprachen_arrray.php");
// $array_sprachen ist der Name des Mehrdimensionalen Arrays in 'sprachen_arrray.php', genau wie in 'global.asa'
return $array_sprachen[$text][$Sprache];
}
?>
Hallo Welt sähe dann so aus:
<?
include ("sprachen_funktion.php");
$sprache = "DE";
// würde ich lieber in einer Session Speichern,oder über die Links übergeben
echo mehrsprachig("lblHalloWelt",$sprache);
?>
so in etwa sollte es gehen, sicher geht das noch schöner, aber geht jetzt nur ums Prinzip!
Evtl. würde ich es ohne die Funktion machen, nur muß dann jedesmal der kpl. Array geladen werden, ich weiß nicht genau, wei ish cdas auswirkt:
<?
include ("sprachen_arrray.php");
$sprache = "DE";
echo $array_sprachen["lblHalloWelt"][$sprache];
?>
Alles klar? Der "Trick" wie Du siehst ist das Mehrdimensinale Array aStrings. Das wird _einmal_ abgefüllt und steht dann jeder Seite zur Verfügung.
Ja, aber ich würde den Array lieber direkt beim schreiben neu füllen und fest speichern!
viele Leute hier kennen sich mit PHP deutlich besser aus als ich, vielleicht haben dei ja ein bessere Idee, oder sagen was zu meinem Vorschlag, interessiert mich nämlich sehr, würde mich daher auch sehr freuen, wenn Du mal am Ende Deine Lösung postest!
Viele Grüße
Andreas
PS: Man könnte es in der Tat noch verinfachen, wenn man die Sprachangabe erst in der Funktion ermittelt, dann würd ein
echo mehrsprachig("lblHalloWelt");
reichen, wäre sehr schön wie ich finde ;-)
Hoi
Hatt ich wohl was übersehen.
Ich hatte ausversehen zu früh gepostet... (Habe den Selfbrowser noch nicht so im Griff)
so in etwa sollte es gehen, sicher geht das noch schöner, aber geht jetzt nur ums Prinzip!
Ja es geht ums Prinzip, ich denke in der Tat dass ich genau das machen muss (mit PHP)
Evtl. würde ich es ohne die Funktion machen, nur muß dann jedesmal der kpl. Array geladen werden, ich weiß nicht genau, wei ish cdas auswirkt:
Das ist dann ja eigentlich Detail. Ich habe im ASP Beispiel auch noch viel Code weggelassen der besagten Funktion. Die Funktion hatte natürlich noch eine "Fall-Back" Funktion, falls ein Text nicht gefunden wird etc. etc.
viele Leute hier kennen sich mit PHP deutlich besser aus als ich, vielleicht haben dei ja ein bessere Idee, oder sagen was zu meinem Vorschlag, interessiert mich nämlich sehr, würde mich daher auch sehr freuen, wenn Du mal am Ende Deine Lösung postest!
*lach* also ich habe nicht das Gefühl dass es hier "bessere" PHP Kenner gibt. Sonst hätte die ein Konzept auf Lager gehabt!? ;-)
Ich werde Dich auf dem Laufenden halte welche Lösung ich verwenden werde. Schade ist wirklich, dass PHP keinen sog. Application-Scope hat, der hätte es vereinfacht und man hätte nicht mit Inkludes arbeiten müssen. (Dieser App.Scope ist übrigens auch bei JSP vorhanden)
Gruss
kaepten
Hallo!
Ich hatte noch 2 Ideen.
1. Würde ich in der DB-Tabelle 2 weitere Felder einfügen, nämlich den Dateinamen und den Timestamp.
Der Dateiname ist dann dazu gut, dass Du nicht nur einen Sprachen-Array hast, sondern für jede Seite einen, damit wäre das Problem mit den vielen unnötig geladenen Daten vom Tisch! Für eine index.php hättest Du dann eine index.lang oder so, darin steht dann der Array mit den Daten, die in der Spalte Dateiname 'index.php' enthalten.
Beim Einbinden des Arrays in der entsprechenden Funktion kannst Du Dich dann auf diesen beschränken.
So schön das beim Ausgeben der Daten ist, so doof ist das beim Eingeben. Da brachst Du dann ein Script, welches Dir die Array-Dateien erstellt, was aber mit der Dateinamen-Spalte gar nicht so schwierig sein dürfte.
Dieses Script sucht sich z.B. alle Datensätze mit 'index.php' und schreibt diese in den Sprachen_array in die Datei index.lang, usw. Du könntest natürlich auch testen, wann die index.lang zuletzt verändert wurde, udn anhand des Timestamps nur bestimmte Werte in dem Array aktualisieren, naja. Vielleicht könnte man für die Aktualisiewrung ja alles in einen Array leiteten, und das später wieder trennen... viele Möglichkeiten.
So ein Script könnte auch täglich per Cron laufen, so kannst Du sichergehen, das alle Texte wenigstens Tagesaktuell sind.
Außerdem würde ich ein Eingabeformular schreiben, welches am Ende nicht nur die Einträge in der DB vornimmt, sondern direkt den entsprechenden Array aktualisiert, oder neu schreibt, oder wie auch immer.
2. Sache die ich mir überlegt habe, man könnte ja mit mod_rewrite ein Unterverzeichnis /de/ simulieren! Du läßt alles beim alten, schreibst nur eine entsprechende Rule in die .htaccess und schwupp könntest Du in PHP mit
if(strstr($SCRIPT_URI,"/de/")) {$sprache = "DE";}
die Sprache ermitteln. Darauf greifst Du in der Funktion zurück, und schon reicht ein Aufruf wie
<? echo mehrsprachig("hallowelt"); ?>
Das hatte ich mir jetzt mal so überlegt, und das sollte ja recht performant und einfach sein!
Viele Grüße
Andreas
PS: Habe den anderen Thread erst später entdeckt ;-)