Wie eine mehrsprachige Website machen - Stack-Überlauf

Kurze Antwort: Es gibt keine kurze Antwort, da es eine Menge von Variablen zu berücksichtigen sind, und viel Arbeit zu tun. Damit.

Lange Antwort: Ich werde es so gut wie ich kann brechen, aber es ist keine „gut für alle“ Antwort auf eine Frage so breit wie bei Ihnen.

Zuerst Variablen der Aufgabe in der Hand:

Übersetzungen Quelle: wird Inhalt in jeder relevanten Sprache, die von Ihnen oder einem Mitarbeiter zur Verfügung gestellt? Oder einige Versionen durch Übersetzungssoftware aus einer Hand „Basis“ Sprache laufen? Der erste Ansatz erfordert viel zusätzliche Arbeit, den Inhalt zu produzieren, sondern liefert höhere Qualität der Ergebnisse als die zweite.

Sobald Sie die oben gut definiert haben, lassen Sie uns anfangen zu arbeiten. Dies sind die prominentesten Aufgaben, die Sie benötigen würde Griff zu tun:

Spracherkennung: der vernünftigste Ansatz ist es, einen GET-Parameter zu verwenden (so etwas wie lang = en-us auf der URL?). Auch könnten Sie einige Cookie und / oder IP-Geolocation verwenden zurück zu fallen, wenn eine URL ohne Sprache Argument angefordert wird. Auch, wenn Sie die Mittel haben, betrachten das Thema URL Verschönerungs (was besser aussieht: example.com/index.php?lang=en-us oder example.com/en-us/home?). Ich persönlich liebe die Macht ModRewrite gewährt meine .htaccess-Datei, aber das wird nur auf Apache betriebenen Servern arbeiten.

  • Für DB Inhalt, mein bester Ratschlag ist mit einigen festen Feld Namensmustern zu kommen und dabei bleiben. Zum Beispiel, hänge ich _en. _es. oder _ca für alle sprachabhängigen Felder meiner DB. Auf diese Weise kann ich den richtigen Inhalt mit Ausdrücken wie $ row [ „title_ $ lang“] zugreifen.
  • Für Dateien enthält, wieder eine Dateinamenskonvention ist der vernünftigste Ansatz. In meinem Fall habe ich Dateinamen mit .en.php enden. ca.htm. etc. Meine umfassen Anrufe dann sind aussehen ( "some-Dateiname. $ lang.php).
  • Von Zeit zu Zeit werden Sie kleine Stücke von Text aus Ihrem PHP-Code direkt spuckt werden (zum Beispiel, wenn die Beschriftung der Überschriften einer Tabelle). Sie können eine Include-Datei pro Sprache, die eine „Chunks“ Array mit den gleichen Tasten oder eine DB-Tabelle vorgeschlagen wie Geert verwenden. Der frühere Ansatz weniger Arbeit nimmt zu entwickeln, sollte die letztere weniger Arbeit nehmen zu halten (vor allem, wenn Sie nicht alleine arbeiten).
  • Nun, das ist alles, was ich mit jetzt herauskommen kann. Ich denke, Sie sollten genug haben die Ärmel hochziehen und an die Arbeit. Dann, wenn Sie eine Wand auf dem Weg getroffen, wieder mit spezifischen Fragen, und ich bin überzeugt, dass Sie spezifischere Antworten bekommen.

    Hoffe das hilft.

    Die Lösung, die ich immer verwenden ist eine Datenbanktabelle zu erstellen, mit allen möglichen Nachrichten. Für jede Nachricht verwende ich einen Code (Abkürzung) es nachzuschlagen. So zum Beispiel:

    usw., die Übersetzungen der Suche nach oben ist in der Regel schnell genug durch eine MySQL-Abfrage verwenden, aber Sie können auch alle Nachrichten in einem Array platzieren und sie in dem Speicher, wenn Ihre Skript Lasten laden. Anwender sollten immer in der Lage sein, die Sprache einzustellen sie es vorziehen, nicht blind auf die Sprache Header durch den Web-Browser eingestellt verlassen.

    Was passiert, wenn eine Zeichenfolge mit der ID „Titel“ auf jeder Seite anders zu sein braucht? Fügen Sie eine „Datei“ -Spalte an die DB. Dann auf jeder Seite, führen Sie SELECT * FROM. WHERE file = 'filename.php'. Schleife durch jede Ergebniszeile, fügen Sie dann die Übersetzungen Konstanten oder einem Array oder aber Sie Umgang mit Sprachen. Dies wird auch das „Potential für mehr als 100 SQL-Abfragen“ stoppen. - Luke Sheppard 8. September '16 um 12:21

    Ich bin jetzt ein sehr kleines CMS entwerfen, die mehrere Sprachen sein müssen.

    Aus diesem Grunde bin mit dem Ziel ich nicht den Design-Suffixe der Datenbanktabellen hinzugefügt, kann ich nicht (und will nicht) die Tabellennamen zu ändern oder sie dinamic Namen zugreifen, noch das Hinzufügen oder Entfernen von Feldern jedes Mal, wenn eine Sprache definiert oder entfernt werden .

    Ich würde Dateien auch nicht verwenden, nur weil ich Datenbanken mögen und sie sind leicht zu unterhalten muss.

    Und schließlich glaube ich, in zwei Arten von Übersetzungen:

    Daher mein Design hat folgende Ziele:

    • languajes Eine Tabelle mit den definierten Sprachen.
    • Eine einzelne Tabelle Übersetzungen, die alle Nachrichten haben wird, wie folgt:
      • [Pk] table_name der Name der Tabelle, die Inhalte übersetzt werden.
      • [Pk] field_name den Namen des Feldes, die Inhalte übersetzt werden.
      • [Pk] row_id die Zeile Identifikator für das Element, das übersetzt werden soll.
      • [Pk] Sprache die Sprache, die der Text übersetzt wird.
      • Text den übersetzten Text.

    Das bedeutet, dass die Tabellen, die Inhalte müssen in einem einsprachigen Szenario Felder, werden nun seinen Inhalt ungültig, weil es immer in der Übersetzung Tisch sein wird.

    Ein weiterer Ansatz, den ich von jetzt an studieren ist eine zusätzliche Tabelle für jede „übersetzbar Tabelle“ wie folgt zu erstellen:

    • any_translatable_table: Die Tabelle, die eine ihrer Felder übersetzen müssen
    • any_translatable_table_translations: Die Tabelle, wo die Übersetzungen gespeichert werden.
      • [Pk] field_name den Namen des Feldes, die Inhalte übersetzt werden.
      • [Pk] row_id die Zeile Identifikator für das Element, das übersetzt werden soll.
      • [Pk] Sprache die Sprache, die der Text übersetzt wird.
      • Text den übersetzten Text.

    Die zusätzliche Übersetzungstabelle pro „übersetzbar Tabelle“ wird zur gleichen Zeit, dass das Original erstellt werden.

    Und über die SQL querys, ist die Komplexität immer noch das gleiche: Der erste Ansatz muss den Tabellennamen in Übersetzungen Tabelle suchen, aber die zweiten kommt noch hinzu, die Endung „_translations“ am Tabellennamen.

    In Verbindung stehende Artikel