Ich habe seit einigen Monaten mit dieser Frage zu kämpfen, aber ich war noch nicht in einer Situation, in der ich vorher alle möglichen Optionen ausloten musste. Im Moment ist es an der Zeit, die Möglichkeiten kennenzulernen und meine persönliche Präferenz für meine bevorstehenden Projekte zu entwickeln.
Lassen Sie mich zunächst die Situation skizzieren, nach der ich suche
Ich bin dabei, ein Content-Management-System zu aktualisieren / neu zu entwickeln, das ich seit einiger Zeit verwende. Ich bin jedoch der Meinung, dass die Mehrsprachigkeit eine große Verbesserung dieses Systems darstellt. Vorher habe ich keine Frameworks verwendet, aber ich werde Laraval4 für das kommende Projekt verwenden. Laravel scheint die beste Wahl für eine sauberere Art zu sein, PHP zu codieren. Sidenote: Laraval4 should be no factor in your answer
. Ich suche nach allgemeinen Übersetzungsmethoden, die plattform- / rahmenunabhängig sind.
Was soll übersetzt werden?
Da das von mir gesuchte System so benutzerfreundlich wie möglich sein muss, sollte sich die Methode zur Verwaltung der Übersetzung im CMS befinden. Es sollte nicht erforderlich sein, eine FTP-Verbindung zu starten, um Übersetzungsdateien oder analysierte HTML- / PHP-Vorlagen zu ändern.
Darüber hinaus suche ich nach dem einfachsten Weg, mehrere Datenbanktabellen zu übersetzen, ohne dass zusätzliche Tabellen erstellt werden müssen.
Was habe ich mir ausgedacht?
Da ich schon selbst gesucht, gelesen und versucht habe. Ich habe einige Möglichkeiten. Aber ich habe immer noch nicht das Gefühl, eine Best-Practice-Methode für das erreicht zu haben, was ich wirklich suche. Im Moment habe ich mir das ausgedacht, aber diese Methode hat auch Nebenwirkungen.
- PHP-analysierte Vorlagen : Das Vorlagensystem sollte von PHP analysiert werden. Auf diese Weise kann ich die übersetzten Parameter in den HTML-Code einfügen, ohne die Vorlagen öffnen und ändern zu müssen. Außerdem gibt mir PHP-analysierte Vorlagen die Möglichkeit, 1 Vorlage für die gesamte Website zu haben, anstatt für jede Sprache (die ich zuvor hatte) einen Unterordner zu haben. Die Methode, um dieses Ziel zu erreichen, kann entweder Smarty, TemplatePower, Laravel's Blade oder ein anderer Vorlagenparser sein. Wie gesagt, dies sollte unabhängig von der schriftlichen Lösung sein.
- Datenbankgesteuert : Vielleicht muss ich das nicht noch einmal erwähnen. Die Lösung sollte jedoch datenbankgesteuert sein. Das CMS soll objektorientiert und MVC sein, daher müsste ich mir eine logische Datenstruktur für die Zeichenfolgen überlegen. Da meine Vorlagen strukturiert wären: templates / Controller / View.php wäre diese Struktur vielleicht am sinnvollsten :
Controller.View.parameter
. Die Datenbanktabelle hätte diese Felder lange mit einemvalue
Feld. Innerhalb der Vorlagen könnten wir eine Sortiermethode wie verwendenecho __('Controller.View.welcome', array('name', 'Joshua'))
und der Parameter enthältWelcome, :name
. So ist das ErgebnisWelcome, Joshua
. Dies scheint ein guter Weg zu sein, da die Parameter wie: name für den Editor leicht zu verstehen sind. - Geringe Datenbanklast : Natürlich würde das obige System eine Last der Datenbanklast verursachen, wenn diese Zeichenfolgen unterwegs geladen werden. Daher würde ich ein Caching-System benötigen, das die Sprachdateien neu rendert, sobald sie in der Verwaltungsumgebung bearbeitet / gespeichert werden. Da Dateien generiert werden, ist auch ein gutes Dateisystemlayout erforderlich. Ich denke, wir können mit
languages/en_EN/Controller/View.php
oder .ini gehen, was auch immer am besten zu Ihnen passt. Vielleicht wird eine .ini am Ende sogar schneller analysiert. Diese Form sollte die Daten in der enthaltenformat parameter=value;
. Ich denke, dies ist der beste Weg, dies zu tun, da jede gerenderte Ansicht eine eigene Sprachdatei enthalten kann, falls vorhanden. Sprachparameter sollten dann in eine bestimmte Ansicht und nicht in einem globalen Bereich geladen werden, um zu verhindern, dass sich Parameter gegenseitig überschreiben. - Übersetzung der Datenbanktabelle : Dies ist in der Tat das, worüber ich mir am meisten Sorgen mache. Ich suche nach einer Möglichkeit, Übersetzungen von Nachrichten / Seiten / etc. Zu erstellen. schnellstens. Es ist eine Option, zwei Tabellen für jedes Modul zu haben (zum Beispiel
News
undNews_translations
), aber es scheint zu viel Arbeit zu sein, um ein gutes System zu erhalten. Eines der Dinge , die ich mit aufkam basiert auf einemdata versioning
System , das ich schrieb: Es gibt eine Datenbank Tabellenname istTranslations
, hat diese Tabelle eine einzigartige Kombination auslanguage
,tablename
undprimarykey
. Zum Beispiel: en_En / News / 1 (Bezieht sich auf die englische Version der Nachricht mit ID = 1). Diese Methode hat jedoch zwei große Nachteile: Erstens wird diese Tabelle mit vielen Daten in der Datenbank ziemlich lang, und zweitens wäre es eine verdammt große Aufgabe, dieses Setup zum Durchsuchen der Tabelle zu verwenden. Zum Beispiel wäre die Suche nach dem SEO-Slug des Artikels eine Volltextsuche, die ziemlich dumm ist. Aber auf der anderen Seite: Es ist eine schnelle Möglichkeit, sehr schnell übersetzbare Inhalte in jeder Tabelle zu erstellen, aber ich glaube nicht, dass dieser Profi die Nachteile überwiegt. - Front-End-Arbeit : Auch das Front-End würde einige Überlegungen erfordern. Natürlich würden wir die verfügbaren Sprachen in einer Datenbank speichern und die benötigten Sprachen (de) aktivieren. Auf diese Weise kann das Skript ein Dropdown-Menü zur Auswahl einer Sprache erstellen und das Back-End kann automatisch entscheiden, welche Übersetzungen mit dem CMS vorgenommen werden können. Die ausgewählte Sprache (z. B. en_EN) wird dann verwendet, wenn die Sprachdatei für eine Ansicht abgerufen oder die richtige Übersetzung für ein Inhaltselement auf der Website abgerufen wird.
Da sind sie also. Meine bisherigen Ideen. Sie enthalten noch nicht einmal Lokalisierungsoptionen für Daten usw., aber da mein Server PHP5.3.2 + unterstützt, ist es am besten, die intl-Erweiterung zu verwenden, wie hier erläutert: http://devzone.zend.com/1500/internationalization-in -php-53 / - aber dies wäre in jedem späteren Entwicklungsstadion von Nutzen. Im Moment geht es hauptsächlich darum, wie Sie die besten Methoden für die Übersetzung von Inhalten auf einer Website anwenden können.
Abgesehen von allem, was ich hier erklärt habe, habe ich noch eine andere Sache, die ich noch nicht entschieden habe. Es sieht nach einer einfachen Frage aus, aber tatsächlich hat es mir Kopfschmerzen bereitet:
URL-Übersetzung? Sollen wir das tun oder nicht? und auf welche Weise?
Also .. wenn ich diese URL habe: http://www.domain.com/about-us
und Englisch ist meine Standardsprache. Sollte diese URL übersetzt werden, http://www.domain.com/over-ons
wenn ich Niederländisch als meine Sprache wähle? Oder sollten wir den einfachen Weg gehen und einfach den Inhalt der Seite ändern, die unter sichtbar ist /about
. Das Letzte scheint keine gültige Option zu sein, da dadurch mehrere Versionen derselben URL generiert werden. Diese Indizierung des Inhalts schlägt fehl.
Eine andere Option ist http://www.domain.com/nl/about-us
stattdessen. Dadurch wird für jeden Inhalt mindestens eine eindeutige URL generiert. Außerdem wäre es beispielsweise einfacher, in eine andere Sprache zu wechseln, http://www.domain.com/en/about-us
und die angegebene URL ist sowohl für Google- als auch für Human-Besucher leichter zu verstehen. Was machen wir mit dieser Option mit den Standardsprachen? Sollte die Standardsprache die standardmäßig ausgewählte Sprache entfernen? Weiterleiten http://www.domain.com/en/about-us
an http://www.domain.com/about-us
... In meinen Augen ist dies die beste Lösung, denn wenn das CMS nur für eine Sprache eingerichtet ist, muss diese Sprachidentifikation nicht in der URL enthalten sein.
Eine dritte Option ist eine Kombination aus beiden Optionen: Verwenden der "sprachidentifikationslosen" -URL ( http://www.domain.com/about-us
) für die Hauptsprache. Und verwenden Sie eine URL mit einem übersetzten SEO-Slug für Subsprachen: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Ich hoffe, meine Frage bringt deine Köpfe zum Knacken, sie haben meine auf jeden Fall geknackt! Es hat mir schon geholfen, die Dinge hier als Frage zu klären. Hat mir die Möglichkeit gegeben, die Methoden zu überprüfen, die ich zuvor verwendet habe, und die Idee, die ich für mein bevorstehendes CMS habe.
Ich möchte mich bereits bei Ihnen dafür bedanken, dass Sie sich die Zeit genommen haben, diesen Text zu lesen!
// Edit #1
::
Ich habe vergessen zu erwähnen: Die Funktion __ () ist ein Alias zum Übersetzen einer bestimmten Zeichenfolge. Innerhalb dieser Methode sollte es offensichtlich eine Art Fallback-Methode geben, bei der der Standardtext geladen wird, wenn noch keine Übersetzungen verfügbar sind. Wenn die Übersetzung fehlt, sollte sie entweder eingefügt oder die Übersetzungsdatei neu generiert werden.