String als Variablenname bzw. arraykey?
Lukas.
- php
Hallo,
gibt es in php eine Funktion, mit der ich aus einem beliebigen String einen gültigen Variablennamen bzw. einen gültigen Arraykey basteln kann?
Hintergrund:
Ich würde gerne ein Script multilangual machen. Im Script sind Ausgaben über den echo-Befehl enthalten. Nicht schön, ist aber so. Nun ist meine Idee der Multilangualisierung folgende:
Ich implementiere eine Funktion myEcho, die die alle echo-Befehle ersetzt.
function myEcho($str) {
// $str soll in gültigen Arraykey gewandelt werden
$text = myFunction($str);
// Wenn Value zu Key in entsprechend eingestellter Sprache vorhanden, dann Ausgabe
if (!empty($lang[$text])) {
echo($lang[$text]);
// ansonsten Original ausgeben
} else {
echo($str);
}
return;
}
Ist mien erster Gedanke, wie ich aus der jetzt einsprachigen Webanwendung eine mehrsprachige machen würde. Ich bin gerne für andere Vorschläge offen. Wichtig wäre mir aber, dass ich erstmal "auf die Schnelle" aus meiner einsprachigen Anwendung mit einsprachigem Hintergrund eine einsprachige Anwendung mit potentiell mehrsprachigem Hintergrund machen kann.
Ich bin nicht sicher, ob ich das verständlich ausgedrückt habe. Wenn nicht, bitte sagen, dann versuch ichs nochmal.
Also habe ich quasi 2 Fragen:
L.
hab ich nicht verstanden. Du kannst jeden String als Array-Key benutzen.
$array['!"§$%&/()=?'] = 123;
var_dump($array);
array(1) {
["!"§$%&/()=?"]=>
int(123)
}
hab ich nicht verstanden. Du kannst jeden String als Array-Key benutzen.
$array['!"§$%&/()=?'] = 123; var_dump($array); array(1) { ["!"§$%&/()=?"]=> int(123) }
Oh, wußt ich gar nicht, danke.
Tach!
gibt es in php eine Funktion, mit der ich aus einem beliebigen String einen gültigen Variablennamen bzw. einen gültigen Arraykey basteln kann?
Jeder String ist als Array-Key verwendbar. Das Handbuch listet keine Ausnahmen. Integer-Zahlen in Strings werden allerdings in Integer umgewandelt.
Variablennamen sollte man nicht dynamisch anlegen lassen, dann gibts da auch kein Problem mit Schreibweisen. Zudem wäre nicht nur die Syntax zu beachten, sondern auch dass keine existierenden Variablen überschrieben werden. Also lass das lieber und nimm Arrays.
dedlfix.
Variablennamen sollte man nicht dynamisch anlegen lassen, dann gibts da auch kein Problem mit Schreibweisen. Zudem wäre nicht nur die Syntax zu beachten, sondern auch dass keine existierenden Variablen überschrieben werden. Also lass das lieber und nimm Arrays.
Einverstanden, danke.
Die Frage ist, ob Du damit wirklich weiterkommst. Man unterscheidet zwischen Internationalisierung und Lokalisierung.
Internationalisierung ist Schritt 1, da wird der Code so aufbereitet, dass er lokalisierbar ist. Es ist ja oftmals nicht nur mit den Echos getan. Was ist mit kulturspezifischen Dingen, was mit der Interpretation von Eingaben. Sowas darf nicht hardcoded sein.
Lokalisierung ist dann die Bereitstellung von speziellen Ressourcen für eine konkrete Region/Sprache (en-UK, de-CH...).
Du beabsichtigst, eine Lokalisierung durchzuführen, ohne vorher eine Internationalisierung durchgeführt zu haben. Kann man in einfachen Fällen machen...
Deine ECHOs sind in irgendeiner Sprache formuliert. Du willst den Text aus Sprache X automatisch auf die Übersetzung in Sprache Y mappen. Ein MD5 Hash als Ressourcen-ID ist eine Möglichkeit. Risiko ist, dass zwei Texte den gleichen Hash bekommen, aber das merkst Du beim Übersetzen und kannst dann in einen der beiden Texte eine kleine Änderung hineinpfuschen
Ich würde es aber lassen. Du musst ohnehin alle Texte heraussuchen und Übersetzungen bereitstellen. Es ist dann nicht SOO viel Arbeit, die Echos durch eine eigene Funktion localEcho zu ersetzen (siehe Clean Code Diskussion: myEcho ist ein schlechter Name) und ihr dann die Ressourcen-ID zu übergeben. Die ID kann ein String sein, der halbwegs sprechend ist, aber knapp und knackig formuliert. Ich finde es nicht so schlau, den Klartext irgendeiner Sprache als ID zu verwenden.
Rolf
Internationalisierung ist Schritt 1, da wird der Code so aufbereitet, dass er lokalisierbar ist. Es ist ja oftmals nicht nur mit den Echos getan. Was ist mit kulturspezifischen Dingen, was mit der Interpretation von Eingaben. Sowas darf nicht hardcoded sein.
Hm...
Ich würde es aber lassen. Du musst ohnehin alle Texte heraussuchen und Übersetzungen bereitstellen.
Das genau ist meine Befürchtung. Aber Du wirst recht damit behalten... leider. Nur, dann wirds zuviel Arbeit werden.
Es ist dann nicht SOO viel Arbeit, die Echos durch eine eigene Funktion localEcho zu ersetzen
Doch, ist es. Ein paarhundert Dateien php-Code sind da schon nach echos zu durchsuchen.
Ich denke, ich stell mein Vorhaben dann doch lieber nochmal zurück…
L.
Ein paar hundert - na das ist ja mal ein kleines Webchen...
echo durch localEcho() zu ersetzen kriegt man mit einer ordentlichen IDE vermutlich halbwegs automatisiert (Regex search+replace).
Du solltest das NICHT zurückstellen. Sondern einfach anfangen, und Script für Script, so wie Zeit ist, internationalisieren (sprich: echo "Hello World"; -> localEcho("#helloWorld");). Das Hash könnte eine ganz gute Idee sein, um zu markieren, dass hier eine lokalisierbare Ressource ausgegeben wird und kein konstanter String. Ob Du es bei Strings belässt oder besser mit define() arbeitest - hm...
Guck Dir auch mal den Thread von Malcolm Beck an, da ist das Handling von lokalisierbaren Ressouurcen und wie man das speichern kann ein Thema.
Rolf
Ein paar hundert - na das ist ja mal ein kleines Webchen...
Jau. In 15 Jahren kommt einiges zusammen 😉 (natürlich auch ein paar Dinge, die ich heute von vorneherein anders anlegen würde...oder die man einfach früher anders gemacht hat... aber bisher keine wirkliche Sackgasse.)
echo durch localEcho() zu ersetzen kriegt man mit einer ordentlichen IDE vermutlich halbwegs automatisiert (Regex search+replace).
Ok. Was die "echos" angeht. Dazu kommen aber noch Buttons, die PDF-Ausgaben, usw. Was auch dazu kommt, sind Konstrukte, die z.b. html-tags in den "echos" beinhalten. Das funktioniert zwar auch als Arraykeys, aber "schön ist anders". 😉
Du solltest das NICHT zurückstellen. Sondern einfach anfangen, und Script für Script, so wie Zeit ist, internationalisieren (sprich: echo "Hello World"; -> localEcho("#helloWorld");). Das Hash könnte eine ganz gute Idee sein, um zu markieren, dass hier eine lokalisierbare Ressource ausgegeben wird und kein konstanter String. Ob Du es bei Strings belässt oder besser mit define() arbeitest - hm...
Prinzipiell geb ich Dir recht, wäre da nicht auch ansonsten noch "script für script" viel zu tun. Z.B. der Umstieg auf PDO, den ich immer wieder nebenher vollziehe...
Guck Dir auch mal den Thread von Malcolm Beck an, da ist das Handling von lokalisierbaren Ressouurcen und wie man das speichern kann ein Thema.
Ich schau gerne rein, danke.
L.
Hallo Lukas.,
Es ist dann nicht SOO viel Arbeit, die Echos durch eine eigene Funktion localEcho zu ersetzen
Doch, ist es. Ein paarhundert Dateien php-Code sind da schon nach echos zu durchsuchen.
Vielleicht solltest du dich mal mit gettext beschäftigen, das kann deine php-Dateien automatisch nach Aufrufen wie _('To be translated...')
oder gettext('To be translated...')
durchsuchen und dann kannst du mit einem Editor jeweils Übersetzungen zu den (noch unübersetzen) übergebenen Strings eingeben.
Für mich klingt das sehr praktisch, ich habe allerdings bisher gettext noch nicht eingesetzt...
Gruß
Julius
Hallo Julius,
Visual Studio und NetBeans: Ctrl-Shift-F Eclipse: Ctrl+H
Rolf
Hallo Rolf,
Visual Studio und NetBeans: Ctrl-Shift-F Eclipse: Ctrl+H
Beziehst du sich darauf, dass man nach dem Auftreten der betreffenden Funktion gesucht und dann durch die gettext-Funktionen ersetzt werden sollen? Das könnte man auch besser über Refactor > Rename... (Eclipse) erledigen, oder übersehe ich da was?
Gruß
Julius
Hallo Julius,
wenn es eine Funktion ist, die Du umbenennst - ja, dann ist ein Refactoring-Tool in der IDE der bessere Weg.
Das echo Statement durch einen localEcho() Funktionsaufruf zu ersetzen geht mNn mit Refactoring-Features nicht.
Rolf
Hallo Rolf,
Das echo Statement durch einen localEcho() Funktionsaufruf zu ersetzen geht mNn mit Refactoring-Features nicht.
Achso. Ich war etwas verwirrt, worauf du dich bezogst, als ich gettext in Spiel brachte und du dann plötzlich mit der Suchen-Funktion im Editor kamst... Aber ja, was das Ersetzen angeht, hast wohl recht.
Als ich meinen ersten Beitrag in diesem Thread noch einmal gelesen habe, ist mir klar geworden, dass er missverständlich war. Was ich vorschlug, war folgendes:
Wenn man GNU gettext verwendet, kann man mit gettext den php-Quellcode einlesen, die Strings in der Ursprungssprache aus den Klammern extrahieren und dann mit einem speziellen Editor (z. B. Poedit) die einzelnen Strings übersetzen und die Übersetzungen schließlich später zusammen mit dem Programm ausliefern. Um das Ersetzen der Funktionsnamen mit einem Editor ging es mir erstmal gar nicht 😀 (um gettext einzusetzen, muss man den Quellcode natürlich noch einmal anfassen).
Gruß
Julius