• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Mehrsprachigkeit

T!P-TOP

Mitglied
Guten Abend,

ich suche derzeit nach der "besten" Möglichkeit, um mein CMS zu internationalisieren.

Mir sind folgende 3 Varianten bekannt:
- gettext
- Konstanten, wobei für jede Sprache eine eigene PHP-Datei angelegt wird, in der die Konstanten definiert sind
- Über Datenbank in Sprachmodule unterteilen

Die erste Variante funktioniert ja leider nicht immer auf jeden Webserver. Die 2 Variante gefällt mir persönlich nicht sonderlich, da Konstanten in einem globalen Gültikeitsbereich liegen. Am meisten sagt mir die die Datenbankvariante zu.

Wie würdet Ihr das Ganze am Besten angehen?


Grüße
 
Werbung:
Ich würde Gettext nehmen mit einem Fallback auf ein Sprach array.
Das Array kannst du, wenn kein gettext vorhanden, aus der .po datei erstellen.
Dann musst du dir nur noch überlegen wie du die Funktionsaufrufe machst.
 
Werbung:
Ohne das du dazu sagst was für eine Datenbank du verwenden würdest gehe ich einfach mal davon aus das du eine Relationale Datenbank verwenden würdest und das ist alles andere als performant. Selbst wenn du auf die Idee kommst immer nur die Texte zu laden die du brauchst musst du immer noch jedes mal eine Abfrage abschicken.

Es kann einfach nichts schneller sein als ein Array mit key value paaren. Wenn man dann noch dazu fähig ist so etwas wie memcache zu verwenden ist es meiner Meinung nach das Optimum.

Und für Gettext spricht das es viele Tools gibt mit dem Übersetzer die Dateien übersetzen können.
 
Der Vorteil bei der Datenbank ist, dass man Texte problemlos bearbeiten kann, während das Bearbeiten einer PHP-Datei mit vielen Arrays problematisch werden kann, wenn man das Programm das selbst machen lassen will; vor allem, wenn jemand meint, er könnte die Datei per Hand bearbeiten und fügt zum Beispiel statt CRLF nur ein LF ein oder er benutzt statt die beim Parsen benötigten Doublequotes Singlequotes.

Bei der Entscheidung sollte man sowas auch in Betracht ziehen.
 
Werbung:
Ich würde Gettext nehmen mit einem Fallback auf ein Sprach array.
Das Array kannst du, wenn kein gettext vorhanden, aus der .po datei erstellen.
Dann musst du dir nur noch überlegen wie du die Funktionsaufrufe machst.

Nur gettext kommt nicht in Frage, aber diese Callback wäre mir zu umständlich. Was mach ich denn mit _("bla bla bla");? So müsste ich bei jeder Textpassage wo diese Funktion aufgerufen wird prüfen, ob gettext läuft - wenn nicht, die angeforderte .po Datei in ein Array umwandeln und anschließend ein bestimmtes Element daraus ausgeben. Ich kann mir nicht vorstellen, dass das perfomanter ist.

Es kann einfach nichts schneller sein als ein Array mit key value paaren. Wenn man dann noch dazu fähig ist so etwas wie memcache zu verwenden ist es meiner Meinung nach das Optimum.
Ja, die Lösung finde ich auch nicht schlecht.

Wäre für paar weitere Vorschläge sehr dankbar - bzw. ein paar Meinungen zur Datenbank- und zur Arrayvariante (pro & contra). :-)



Grüße
 
gettext! Ich würde heutzutage gar nicht mehr auf die Idee kommen etwas anderes zu benutzen.

Ich kann deinen Einwurf auch nicht verstehen. Wenn du _('bla bla') schreibst, wird 'bla bla' ausgegeben, es sei denn es existiert in der aktuell benutzen Sprache eine Übersetzung dazu.

Dazu gibt es eine Reihe von Tools, die alles automatisch machen, wie z.b. alle Aufrufe finden, automatisch Vorlagen für eine Sprache erstellen und mit denen du die Übersetzung bearbeiten kannst. Insofern sind alle hier genannten Nachteil hinfällig. Und das einlesen einer Textdatei, ist immer schneller als das Abfragen einer Datenbank.
 
Werbung:
PHP:
Ich kann deinen Einwurf auch nicht verstehen. Wenn du _('bla bla')  schreibst, wird 'bla bla' ausgegeben, es sei denn es existiert in der  aktuell benutzen Sprache eine Übersetzung dazu.

Ich verstehe das Momentan nicht wirklich. Funktioniert gettext denn standardmäßig auf jeden Webserver? Wenn nicht, gibt es eine Möglichkeit, Gettext auf jedem Webserver korrekt zum laufen zu bringen, ohne jeglich PHP-Konifgurationsvariablen abzuändern?
 
Willst Du denn nur die Bedienoberfläche mehrsprachig machen oder soll es auch möglich sein, die eigentlichen Inhalte in mehreren Sprachen zu pflegen?
Sollen auch Datumsformate, Dezimaltrennzeichen und andere Symbolkonventionen automatisch umgestellt werden?
Ich würd' erstmal planen, was da passieren soll und dann würd' ich mir Gedanken über die Art der Datenspeicherung machen. Wenn das von vorneherein intelligent aufgebaut ist, dann sollte es für den Mechanismus prinzipiell wurscht sein, ob er seine Daten aus einer DB oder aus einer Textdatei holt.
Es kann nur dann sinnvolle Aussagen über eine Systemgeschwindigkeit geben, wenn alle beteiligten Elemente bekannt sind.

Eine Ferrari ist schneller als ein Traktor. Aber nicht auf einem verschlammten Feldweg, nur auf einer gletten, festen Straße.
 
Gettext gehört zu Standarddistribution von PHP, muss aber explizit mit hinein übersetzt werden. Zend_Translate_Adapter_Gettext hingegen ist eine pure PHP-Implementation von Gettext, funktioniert so immer, und ist somit multi-threading-fähig. Vielleicht sieht du's dir mal an.
 
Werbung:
Gettext gehört zu Standarddistribution von PHP, muss aber explizit mit hinein übersetzt werden. Zend_Translate_Adapter_Gettext hingegen ist eine pure PHP-Implementation von Gettext, funktioniert so immer, und ist somit multi-threading-fähig. Vielleicht sieht du's dir mal an.

na das hört sich mal gut an :) Vielen Dank.
 
Da Wordpress mit den Funktionen _(), __() arbeitet und ich bei noch keiner WP Installation Probleme festellen konnte, vermute ich, dass gettext i.d.R. installiert sein sollte - ich kann mich aber auch täuschen, da ich mich mit PHP Interna nicht auskenne.
 
Werbung:
Zend_Translate_Adapter_Gettext hingegen ist eine pure PHP-Implementation von Gettext, funktioniert so immer, und ist somit multi-threading-fähig.
Laut Doku aber keine wirklich performante Lösung ...


Hab mich jetzt doch für gettext entschieden und fürn Fall, dass die Gettext Funktionen nicht vorhanden sind, setze ich als Fallback das PHP gettext Script von Danilo Segan ein.
 
Werbung:

Soll eine eher langsamere Variante sein. Die Array- und Gettext Variante sind jedenfalls um einiges schneller - habe da 2 oder 3 Benchmarks gefunden, in denen das ersichtlich war.


Ich überlege mir gerade, welche Art von Messages ich angeben sollte. Soll ich da eher Keywords in Camle Case Schreibweise (zB: T_("menuFirstErrorMsg")) oder gleich die Message in sinnvollen Englisch-Sätzen übergeben? Immerhin wird bei einem nicht gefundenen Locale dann die angeforderte Message ausgegeben, sprich zB: menuFirstErrorMsg - darunter kann man sich wohl kaum was vorstellen - in dem Fall wäre es wohl besser, wenn man gleich eine sinnvolle Message ausgibt und diese halt in Englisch. Allerdings würde ich für Englisch gerne eine eigene .mo Datei anlegen, damit man nicht im PHP Code rumwühlen muss, um Textphrasen zu ändern - diese en_EN.mo wäre aber überflüssig, wenn ich gleich T_("This Name is already used by another menu.") schreibe.

Wie würdet denn Ihr das ganze angehen?
 
Das stimmt schon, aber du sollst Gettext ja zum Arbeiten nehmen und die Daten cachen damit es schnell bleibt…
Nicht versuchen Designentscheidungen nur von der Geschwindigkeit abhängig zu machen.
 
Zurück
Oben