Hallo liebe Comunety ich hätte da mal ein paar fragen
wie ich es am besten anstelle eine mehrsprachige webseite
zu schreiben wie es google, youtube und co. vormacht.
PHP Code:
http://www.youtube.com/?hl=de
http://www.google.com/?hl=de
In dieser art stelle ich mir das ganze vor zu beachten ist das ich nichts statisches habe ich habe eine reine dynamische Webseite also mit switch lade ich den content.
Bitte beachtet das ich kein noob bin also wäre nett wenn ihr Posts wie "Google it, Google ist dein Freund, Let me google it for you"
sein lassen könntet.
Paar versuche habe ich schon gestartet ...
PHP Code:
<?php switch ($_GET['hl']) { case 'de': include realpath('./language/lang.german.php'); break;
case 'en': include realpath('./language/lang.german.php'); break; } ?>
ich möchte das ganze gern in einem cookie abspeichern...
Es gibt 2 Varianten, wie ich das gerne (je nach Art der Website) löse:
Aber zuerst einmal allgemein wie man die Sprache des Users bekommt, dazu benutze ich gerne eine Mischung aus Cookie bzw. Request-Parameter und Browser-Erkennung:
PHP Code:
$lang=$_REQUEST['language']; if ($lang=="") { $lang=$_SERVER['HTTP_ACCEPT_LANGUAGE']; if (strlen($lang)>2) $lang=substr ($lang,0,2); } elseif (strlen($lang)>2) $lang=substr ($lang,0,2); if ($lang="") $lang="en";
Dadurch kannst du die Websiten auch unterschiedlich gestalten, je nachdem welche Sprache sie sind, vielleicht gibt es für deutschsprachige User ja andere Angebote als für englischsprachige.
Welche dieser 2 Methoden man nimmt ist Geschmackssache ich bevorzuge die 1. auch wenn diese von der Geschwindigkeit her langsamer ist, sie gefällt mir trotzdem besser.
Du könntest dir anschauen, wie es in größeren Frameworks realisiert wurde und dich davon inspirieren lassen (damit meine ich nicht die eigentliche Umsetzung, sondern mehr die Features / API):
Es gibt 2 Varianten, wie ich das gerne (je nach Art der Website) löse:
Aber zuerst einmal allgemein wie man die Sprache des Users bekommt, dazu benutze ich gerne eine Mischung aus Cookie bzw. Request-Parameter und Browser-Erkennung:
PHP Code:
$lang=$_REQUEST['language']; if ($lang=="") { $lang=$_SERVER['HTTP_ACCEPT_LANGUAGE']; if (strlen($lang)>2) $lang=substr ($lang,0,2); } elseif (strlen($lang)>2) $lang=substr ($lang,0,2); if ($lang="") $lang="en";
Dadurch kannst du die Websiten auch unterschiedlich gestalten, je nachdem welche Sprache sie sind, vielleicht gibt es für deutschsprachige User ja andere Angebote als für englischsprachige.
Welche dieser 2 Methoden man nimmt ist Geschmackssache ich bevorzuge die 1. auch wenn diese von der Geschwindigkeit her langsamer ist, sie gefällt mir trotzdem besser.
Genau so was kompliziertes suche ich C(:
würdest du da genauer drauf eingehen ? (wie ich das am besten einbinden kann)
Ich versteh jz durch diesen Script das er sich die sprache vom Browser holt und wenn die antwort von $_SERVER['HTTP_ACCEPT_LANGUAGE'] größer als 2 ist soll er die kürzen auf zwei stellen sollte er keine antwort bekommen ist die sprache automatisch englisch.. und ja array das versteht jeder xD
Geschwindigkeit her langsamer ist
Da handelt es sich nur im Micro Sekunden ^^ das dürfte nicht das prob sein
Genau so was kompliziertes suche ich C(:
würdest du da genauer drauf eingehen ? (wie ich das am besten einbinden kann)
Ich versteh jz durch diesen Script das er sich die sprache vom Browser holt und wenn die antwort von $_SERVER['HTTP_ACCEPT_LANGUAGE'] größer als 2 ist soll er die kürzen auf zwei stellen sollte er keine antwort bekommen ist die sprache automatisch englisch.. und ja array das versteht jeder xD
Geschwindigkeit her langsamer ist
Da handelt es sich nur im Micro Sekunden ^^ das dürfte nicht das prob sein
du hast ne Variable zugeteilt oder seh ich da etwas falsch
Hatte jetzt nichts genaueres gefunden in deinem Profil ist ziemlich leer xD
Naja kompliziert ist das jetzt nicht wirklich.
Ich habe dem Array $_LANGUAGE mit dem index "home" einen Wert zugewiesen, das ist genau dasselbe wie dein Code.
Das ist bei einer relativ großen Seite und bei vielen kleinen Übersetzungen mehr als ein paar Microsekunden, bei Spielen wäre diese Methode wohl eher eine, die man nicht bevorzugen sollte, da sie eben mehr CPU frisst, dafür aber genau dasselbe leistet. Aber ich denke solche Probleme hast du nicht, deswegen nimm was dir lieber ist.
Genauer darauf eingehen? Hmm ich wüsste nicht wie, eigentlich ist alles schon gesagt und erklärt. Ich könnte es dir zwar theoretisch einmal an einen deiner Skripts zeigen wie das geht, aber meine Zeit ist leider sehr begrenzt, also entweder versuchst du mich zu bestechen oder du fragst einfach mal die anderen netten User hier bzw. erklärst wo genau dein Problem ist.
Dadurch kannst du die Websiten auch unterschiedlich gestalten, je nachdem welche Sprache sie sind, vielleicht gibt es für deutschsprachige User ja andere Angebote als für englischsprachige.
Welche dieser 2 Methoden man nimmt ist Geschmackssache ich bevorzuge die 1. auch wenn diese von der Geschwindigkeit her langsamer ist, sie gefällt mir trotzdem besser.
Schlechte Idee, niemals Input vom Browser einfach so einbauen.
Schlechte Idee, niemals Input vom Browser einfach so einbauen.
Ich sehe darin kein Problem, wenn im ordner html nichts anderes als die HTML-Dateien sind und da die Variable eh auf 2 Buchstaben beschränkt ist, sehe ich da auch kein Sicherheitsproblem. Es könnte nur Probleme geben, wenn man eine Sprache hat, die nicht unterstützt wird, da muss man dann halt noch eine Validierung einbauen, der verfügbaren Sprachen, aber sonst sehe ich darin kein Sicherheitsproblem oder übersehe ich da etwas?
// Angeben des Pfads der Übersetzungstabellen bindtextdomain("test", "./locale"); textdomain("test");
/* ... Viel Code ... */
// Die Übersetzung wird nun in ./locale/de_DE/LC_MESSAGES/test.mo gesucht // Entweder gettext($string); oder _($string); für die Übersetzung benutzen echo gettext("Welcome to my PHP-Application"); echo _("Welcome to my PHP-Application");
// Auch Singular und Plural Unterscheidung ist mithilfe der Funktion ngettext($singular, $plural, $n); möglich // Hierfür wird im Nachhinein sprintf genutzt um die Mengenangaben in der jeweiligen Übersetzung an der richtigen Stelle auszugeben // %d für DWORD $anzahl = 100; echo sprintf(ngettext("%d Item", "%d Items", $anzahl), $anzahl); // Ausgabe // 100 Items bzw. die Übersetzung $anzahl = 1; echo sprintf(ngettext("%d Item", "%d Items", $anzahl), $anzahl); // Ausgabe // 1 Item bzw. die Übersetzung ?>
Fehlerbehandlung wenn zum Beispiel die gesetzte Sprache nicht existiert, solltest du selber hinkriegen.
Die .po Sprachdateien generierst bzw. editierst du mit dem Programm Poedit, welches auch nach Einstellung die .mo Datei automatisch beim Speichern erstellt.
Der oben angegebene Code (!)MUSS(!) vor der Benutzung der Funktionen sowie deren Alias und ausgeführt werden, dass heißt also am besten an den Start der PHP Applikation.
// Angeben des Pfads der Übersetzungstabellen bindtextdomain("test", "./locale"); textdomain("test"); ?>
Ordner Locale erstellen
Unterordner de_DE für die Sprache de_DE erstellen
Unterordner LC_MESSAGES erstellen
Das heißt die Ordnerstruktur sieht nun folgendermaßen aus:
Locale
de_DE
LC_MESSAGES
Beispiel für Ordnerstruktur bei mehreren Sprachen
Locale
de_DE
LC_MESSAGES
en_US
LC_MESSAGES
...
LC_MESSAGES
Weiter gehts!
Poedit starten
Datei
Neuer Katalog...
Name
Beschreibung
Beispiel
Projektname und -version:
Name der Domain, Version wird nicht benötigt
Test
Übersetzerteam
Name des Übersetzerteams
E-Mail-Adresse des Übersetzerteams
E-Mail des Übersetzerteams
Sprache
Die Sprache der .po Datei
German
Zeichensatz
Zeichensatz der .po Datei, ich empfehle UTF-8
UTF-8
Zeichensatz des Quellcodes
Der Zeichensatz deiner PHP Dateien, ich empfehle UTF-8
UTF-8
Pluralformen
Manche Sprachen haben mehrere Pluralformen, aber bei den meisten reicht das Beispiel welches das Singular nur für die Zahl 1 definiert
nplurals=2; plural=n == 1 ? 0 : 1;
So jetzt oben im Reiter auf Quell-Pfade klicken. Poedit durchsucht automatisch deinen Sourcecode nach Funktionen welche beim Reiter Schlüsselwörter aus Quelltexten definiert werden - dazu aber später mehr. Die Parameter der definierten Funktionen werden ausgewertet und der Text wird in den Katalog zur Übersetzung freigegeben.
Standardpfad relativ zum Pfad des Katalogs (.po Datei)
Pfade zum Sourcecode in welchem die Funktionen , , , usw... benutzt werden.
Diese Schlüsselwörter (Funktionsnamen) benutzen, um übersetzbare Zeichenketten in Quelldateien zu erkennen.
Ich habe hier , , definiert.
So jetzt nur noch auf OK klicken und der Katalog wurde erstellt.
Jetzt sollte man das automatische Erstellen der .mo Datei in den Einstellungen von Poedit aktivieren [Spoiler, siehe Unten].
Hat man das getan, kann man dem Katalog die zu übersetzenden Texte aus dem Sourcecode zuweisen.
Oben im Menü auf Katalog
Aus Quelltexten aktualisieren
Jetzt sollte sich ein neues Fenster öffnen
Mit OK bestätigen und die Texte werden dem Katalog hinzugefügt.
Jetzt kann man mit dem Übersetzen beginnen.
Die ersten beide Bilder zeigen die Übersetzung von Singular und Plural.
Dabei ist zu beachten die Parameter in der Anzahl genau so oft zu verwenden wie im Quelltext, falls das nicht zutrifft wird man von Poedit darauf hingewiesen und es wird (!)NICHTS(!) gespeichert.
Das dritte Bild ist eine ganz normale Textübersetzung.
Ist man nun mit dem Übersetzen fertig oder hat nach einer gewissen Zeit keine Lust mehr klickt man oben in der Toolbar auf speichern.
Du übersiehst etwas. Man kann aus dem Pfad ausbrechen. Gut, bei zwei Buchstaben sollte das nicht viele Probleme bereiten, aber am besten gar nicht erst damit anfangen.
Lieber ein Aaray mit Dateien und die Sprache als Index.
Bitte beachtet das ich kein noob bin also wäre nett wenn ihr Posts wie "Google it, Google ist dein Freund, Let me google it for you"
sein lassen könntet.
Und dann kannst du dir nicht vorstellen wie ein Multilinguales System realisiert wird? Und stimmt, nur Noobs informieren sich per Google über Probleme, die hier in diesem und in tausend anderen Foren schon weitere tausendmal behandelt, und geklärt wurden. Echte Profis erstellen noch den Tausendundersten Thread gell
Quote:
Es gibt 2 Varianten, wie ich das gerne (je nach Art der Website) löse:
Aber zuerst einmal allgemein wie man die Sprache des Users bekommt, dazu benutze ich gerne eine Mischung aus Cookie bzw. Request-Parameter und Browser-Erkennung:
Leider sind beide von dir vorgestellten Beispiele nicht empfehlenswert. Die erste Variante ist zwar wenn man es aus rein theoretischer Sicht betrachtet in Ordnung, allerdings ist das Codebeispiel das du geliefert hast nicht gerade das Gelbe vom Ei. Die $_REQUEST Superglobale ist längst veraltet und sollte nichtmehr verwendet werden, Sprachen werden meistens (nicht immer aber meistens) nicht durch zwei Zeichen definiert sondern durch fünf (de_DE, en_US, en_EN) da viele Sprachen zwar auf dem ersten Blick die selben sind, sich aber trotzdem unterscheiden (Wie in meiner Aufzählung amerikanisches und britisches Englisch), was wiederrum dein Argument bezüglich das akzeptieren ungefilterter Nutzereingaben negiert. Wiegesagt, du kannst es so machen, ist allerdings wenn du auf gewisse Dialekte (wie im Beispiel USA, und Großbritanien) achten möchtest eher unüblich. Wenn ich mich nicht irre ist das sogar genau das was HTTP_ACCEPT_LANGUAGE beinhaltet.
Quote:
Dadurch kannst du die Websiten auch unterschiedlich gestalten, je nachdem welche Sprache sie sind, vielleicht gibt es für deutschsprachige User ja andere Angebote als für englischsprachige.
Mal von der Tatsache abgesehen das es vollkommener Humbug ist soetwas direkt per verschiedenen Viewfiles zu machen, anstelle per PHP die verwendete Sprache abzufragen müsstest du bei dieser Variante jedesmal wenn du eine kleine Änderung im Layout vornehmen wollen würdest zwei Dateien editieren.
PHP Code:
$_LANGUAGE['home']="Willkommen liebe User";
Was denkst du was der Grund ist wieso man üblicherweise Variablen per Underscore oder Camel-Case definiert, und nicht im Format $_FOOBAR? Superglobalen wie $_POST, $_GET oder $_REQUEST sind von PHP vordefinierte Variablen, und extra so exotisch benannt damit kein Konflikt in deinem Script entsteht. Stell dir vor PHP führt irgendwann eine Superglobale namens $_LANGUAGE ein. Was passiert? Alle deine Scripte werden nutzlos, deine Arbeit war Umsonst, und eventuelle Kunden (falls den welche hast, oder in Zukunft haben wirst, falls du beruflich in diese Richtung gehen willst) sind tierisch angepisst. Wenn du deine Variablen so benennen möchtest dann achte darauf das es Phrasen sind bei denen es vollkommen außer Frage steht das sie jemals belegt werden (den $_LANGUAGE liegt in meinen Augen absolut im Rahmen des möglichen), verwende zwei Unterstriche, oder benenne solche Variablen einfach anders.
Quote:
Ich persönlich finde Arrays für Multi-Language ist kein guter Stil.
Dann nimm halt ne stdClass PHP bietet leider nicht viele Alternativen, ich finde Arrays auch nicht schön, ist aber einfach und relativ effektiv.
[B] BF3 Multi Language Key 01/25/2012 - Steam Trading - 3 Replies Biete hier meinen Battlefield 3 Multi Language (keine RU Key) Standard Version zum verkauf an.
Ich nehme PSC,E Gold oder WoW Gold auf Eredar-Horde an.
Bei Interesse stehe ich euch in Skype zu verfügung.Einfach pn oder post
[B] BF3 Multi Language Key 01/22/2012 - Steam Trading - 0 Replies Biete hier meinen Battlefield 3 Multi Language (keine RU Key) Standard Version zum verkauf an.
Ich nehme PSC,Überweisung oder WoW Gold auf Eredar-Horde an.
Bei Interesse stehe ich euch in Skype zu verfügung.Einfach pn oder post
[B] BF3 Multi Language Key 01/01/2012 - Metin2 Trading - 1 Replies Biete BF3 Multi Language KEy. Ich werde ihn über Teamviewer aktivieren damit es keine Probleme gibt.
Ich suche eine PSC oder Wow Game Time.
[B] BF3 Multi Language Key 01/01/2012 - Origin Trading - 1 Replies Biete BF3 Multi Language KEy. Ich werde ihn über Teamviewer aktivieren damit es keine Probleme gibt.
Ich suche eine PSC oder Wow Game Time.