php4 / Hompegage in 5 Sprachen
Knoppers
- datenbank
0 jo0 Sönke Tesch0 Knoppers0 AlexBausW0 Knoppers
0 Sönke Tesch
0 Thomas Schmieder
0 Thomas Schmieder
Guten Morgen,
ich möchte eine Frage stellen, die ich vor ein paar Tagen schon einmal gestellt hatte,auf die aber niemand so recht eine Antwort hatte, deswegen werde ich sie mal umformulieren:
Also meine Seite soll 5-sprachig sein.Momentan speichere ich Wörter für Überschriften, Wörter in Tabellen,etc in einen Datei "translation.php" ab. Diese Datei für Englisch sieht so aus:
$apple="appple";
$banane="banana";
$joghurt="yogurt";
etc ...
Nun möchte ich aber alles datenbankbasierend haben ...
Ich dachte an so eine Tabelle
wort | de | uk | fr | es | it
--------------------------------------------
apfel Apfel | apple | ... | ... | ...
banane Banane | banana | ... | ... | ...
Ich möchte die Tabelle dann einmal einlesen und alle Begriffe als assoziatives Array haben:
$transl['apfel']="apple";
$transl['banane']="banana";
Mit welche mysql Anweisung kann ich das machen?
Vielen Dank für jegliche Hilfe oder Rat?
Knoppers
Ich dachte an so eine Tabelle
wort | de | uk | fr | es | it
apfel Apfel | apple | ... | ... | ...
banane Banane | banana | ... | ... | ...
ist eigentlich ganz einfach. wie du das machst, ist es vielleicht ein bisschen umständlich, oder ich habs nicht kapiert ;-)
select * from tabelle_texte where sprache ='$sprache';
das $sprache soll der user selbst setzen, via formular zb. dann schleifast du die variable zb in einem hidden field immer mit und die seite erscheint in der ausgewählten sprache.
per default kannst du ja die seite zb auf deutsch setzen, in dem du abfrägst:
if (!isset(§_post['$sprache']));
{
$sprache = "de";
}
hoffe, ich konnte dir helfen!
wort | de | uk | fr | es | it
apfel Apfel | apple | ... | ... | ...
banane Banane | banana | ... | ... | ...
select * from tabelle_texte where sprache ='$sprache';
Das mit der Sprache ist kein problem.
Problem ist nur das sql statement.
Wenn ich ein SELECT * mache habe ich ja alle Sprachen im dem Array.
Wie gesagt ich möchte ein Assoziatives Array haben:
$tranl['apfel']="apple";
etc ...
Wie bekomme ich ein Array mit der gesamten Linken Spalte als index?
Danke
Wie gesagt ich möchte ein Assoziatives Array haben:
$tranl['apfel']="apple";
select wort, de from tabelle;
dann bekommst du die ersten beiden spalten und kannst sie in das array packen.
deine tabelle sieht irgendwie seltsam aus. welche datanbank benutzt du denn?
jo
wort | de | uk | fr | es | it
apfel Apfel | apple | ... | ... | ...
banane Banane | banana | ... | ... | ...Ich möchte die Tabelle dann einmal einlesen und alle Begriffe als assoziatives Array haben:
$transl['apfel']="apple";
$transl['banane']="banana";Mit welche mysql Anweisung kann ich das machen?
Also, Du möchtest den Index (wort=>"apfel") und dazu das passende Wort ("apple", wenn Sprache "uk" ist) haben:
select wort,uk from monster_übersetzungen
"uk" ersetzt Du durch die jeweils gewünschte Sprache.
Beim Auslesen des Ergebnisses mußt Du dann lediglich die Werte entsprechend anwenden:
while ($daten=mysql_fetch_row($ergebnis))
$transe[$daten[0]]=$daten[1];
Vielleicht im nachhinein bei eventueller Code-Wartung etwas weniger verwirrend:
select wort,uk as übesetzung from monster_übersetzungen
while ($daten=mysql_fetch_assoc($ergebnis))
$transe[$daten["wort"]]=$daten["übersetzung"];
Die Benutzung von $daten["wort"] finde ich persönlich etwas übersichtlicher bzw. erklärender als $daten[0]. Außerdem geht bei Änderungen an der SQL-Klausel nicht gleich die Datenauswertung den Bach runter.
Gruß,
soenk.e
Vielleicht im nachhinein bei eventueller Code-Wartung etwas weniger verwirrend:
select wort,uk as übesetzung from monster_übersetzungen
while ($daten=mysql_fetch_assoc($ergebnis))
$transe[$daten["wort"]]=$daten["übersetzung"];
Danke für die Antort/Hilfe.
Noch eine Frage:
$daten ist doch schon ein assoziatives Array in diesem Fall. Oder sehe ich das falsch? Könnte ich dann nicht einfach das Array $daten auf meiner Seite verwenden?
Nur mal so ein Beispiel, vorausgesetzt Englisch ist ausgewählt:
echo "He was eating an ".$daten['apfel'];
Die Zeile
$transe[$daten["wort"]]=$daten["übersetzung"];
benötigeich doch garnicht,oder?!?!
Knoppers.
Hallo,
[...]
while ($daten=mysql_fetch_assoc($ergebnis))
$transe[$daten["wort"]]=$daten["übersetzung"];Danke für die Antort/Hilfe.
Noch eine Frage:
$daten ist doch schon ein assoziatives Array in diesem Fall. Oder sehe ich das falsch? Könnte ich dann nicht einfach das Array $daten auf meiner Seite verwenden?
Nein, da Du mit mysql_fetch_assoc() nur eine einzige Ergebniszeile ausliest.
Nur mal so ein Beispiel, vorausgesetzt Englisch ist ausgewählt:
echo "He was eating an ".$daten['apfel'];
'apfel' ist aber nicht der Index, sonder der Wert. Die Spaltennamen werden zum Index ('wort', 'uk').
Die Zeile
$transe[$daten["wort"]]=$daten["übersetzung"];
benötigeich doch garnicht,oder?!?!
Doch, weil Du eben die Werte der Spalte "sprache" den Werten der Spalte 'wort' zuordnen willst.
Gruß Alex
Super,
dann erst mal Danke für die nette Hilfe ...
Knoppers
select wort,uk as übesetzung from monster_übersetzungen
»»
while ($daten=mysql_fetch_assoc($ergebnis))
$transe[$daten["wort"]]=$daten["übersetzung"];
$daten ist doch schon ein assoziatives Array in diesem Fall. Oder sehe ich das falsch? Könnte ich dann nicht einfach das Array $daten auf meiner Seite verwenden?
echo "He was eating an ".$daten['apfel'];
Nein, mysql_fetch_*() liefert immer nur _eine_ Zeile aus dem select-Ergebnis, und zwar (bei mysql_fetch_assoc bzw. _array) mit den Spaltennamen (!) als Indizes. Du bekommst in der Schleife oben also nacheinander:
1. Durchlauf: $daten["wort"]="apfel"; $daten["übersetzung"]="apple";
2. Durchlauf: $daten["wort"]="banane"; $daten["übersetzung"]="banana";
usw.
Um wie von Dir gewünscht den deutschen Namen als Index im Feld zu bekommen, muß das $transe-Feld her:
$transe[$daten["wort"]]=$daten["übersetzung"];
Aus dem Eintrag in $daten["wort"] wird also der Index, der dazu gehörende Wert kommt aus $daten["übersetzung"]. Nach der ersten $daten-Beispielzeile sieht es dann so aus:
$transe["apfel"] ="apple";
Gruß,
soenk.e
Guten Abend
wortweise wird man das wohl kaum machen können, sondern nur Abschnittsweise.
Jeder (Text-)Abschnitt bekommt dann einen Datensatz. Unnormalisiert enthält er jetzt ein Feld vom Typ Text pro Sprache. Die Felder heißen sinnvollerweise so, wie die Sprache.
In der PHP-Seite wird jetzt immer nur die Funktion aufgerufen für die Ermittlung des Textes mit der Textnummer:
echo text(12234,LANG);
Language ist als Konstante gesetzt.
Das von der Funktion aufgerufene sql-query wird dann wie folgt aussehen:
$sql="Select ".LANG." as FELD from <table> where ID=$id;
Die Antwort zur Weiterverarbeitung steht damit also immer in FELD und du hast nur die Daten von der DB abzufordern, die Du brauchst.
Wenn Du das Seitenweise organisierst, also pro Webseite einen Hauptschlüssel für Deine Sprach-Items vergibst, dann kannst Du die Abfrage für die ganze Seite in einem SQL-erledigen.
Ich würde dann in einen table für Seiten-Angaben und einen für die einzelelmente aufteilen. Die Abfrage lauft dann immer über die Seitennummer in der Elementdatei.
Table ELEMENTE
ID_Element bigint index unique primary
ID_Seite bigint
ID_Sprache bigint
Element text
CSS text Verpackter CSS-String des elementes
$sql = "select element, CSS from ELEMENTE where ID_Seite = $IDseite and ID_Sprache = $IDsprache";
Dann brauchst Du nur noch die Schleife durchflitzen zu lassen
while ($element = mysql_fetch_assoc($res))
{
echo "<div ID="ID".$$element["ID_Element"]."" style="".$element["CSS"]."">\n"
echo $element["Element"]."\n";
echo "/div>\n";
}
Konnte ich mich so einigermaßen verständlich machen? Hilft Dir das weiter?
Liebe Grüße aus http://www.braunschweig.de
Tom
Hallo,
wie wirst Du das dann für Arabisch, Chinesisch, Kyrillisch, Japanisch etc machen?
Liebe Grüße aus http://www.braunschweig.de
Tom