22 Stimmen

PHP-Lokalisierung Best Practices? gettext?

Wir sind dabei, unsere Website international zu gestalten und mehrere Sprachen zuzulassen.

Ich habe in php's "gettext" jedoch, wenn ich es richtig verstehe, sehe ich einen großen Fehler:

Wenn meine Webseite, sagen wir mal, "Hello World" als statischen Text enthält. Ich kann die Zeichenkette als <?php echo gettext("Hello World"); ?> erzeugen Sie die po/mo-Dateien mit einem Tool. Dann würde ich die Datei einem Übersetzer zur Bearbeitung geben.

Ein paar Tage später wollen wir den Text in Englisch ändern, so dass er "Hello Small World" lautet? Ändere ich den Wert in gettext? Erstelle ich eine englische PO-Datei und ändere ihn dort? Wenn Sie den gettext ändern, wird er als neue Zeichenkette betrachtet und Sie verlieren sofort die aktuelle Übersetzung ...

Ich habe den Eindruck, dass der Inhalt der php-Datei nach und nach überall veralteten Text enthält. Oder man müsste den Übersetzern sagen: "Wenn Sie Hello World sehen, übersetzen Sie stattdessen Hello Small World".

Ich weiß nicht, ich bin verwirrt.

In anderen Programmiersprachen habe ich gesehen, dass sie Schlüsselwörter verwenden wie web.home.featured.HelloWorld .

Wie kann man Übersetzungen in PHP am besten handhaben?

Danke

16voto

tplaner Punkte 8205

Im Grunde haben Sie Ihre eigene Frage gestellt und beantwortet. Die Antwort könnte einfach darin bestehen, dass Sie die Funktionsweise von PO-Dateien etwas besser verstehen.

In der PO-Datei haben Sie eine msgid und eine msgstr. Die msgid ist der Wert, der in der PHP-Datei je nach Lokalisierung durch die msgstr ersetzt wird.

Jetzt können Sie diese msgid's machen, was Sie wollen, Sie können sie sehr gut machen:

<?php echo _("web.home.featured.HelloWorld"); ?>

Und dann würden Sie diese Zeichenfolge im Quelltext nie wieder anfassen, sondern nur über die PO-Dateien bearbeiten.

Die Antwort auf Ihre Frage lautet also, dass Sie die gettext-Werte zu Bezeichnern für das machen, was die Zeichenkette aussagen soll, wobei die Übersetzer in der Regel den Text der Standard-Sprachdateien als Grundlage für die Konvertierung verwenden, nicht den Bezeichner selbst.

Ich hoffe, das ist klar.

9voto

Tim Punkte 7558

Ich weiß, dass eine Antwort angenommen wurde, und die obige Antwort ist gut. Aber es gibt noch ein weiteres Problem bei der Verwendung von dauerhaften maschinenähnlichen Schlüsseln wie thing.stuff.widget bei der Arbeit mit Gettext.

Die Verwendung von permanenten Schlüsseln ist zwar ein besserer Ansatz für die Entwicklung, aber Gettext ist nicht für diese Arbeitsweise ausgelegt, was Ihre Arbeit erschweren kann. Arbeitsablauf .

Wenn Sie einem Übersetzer eine PO-Datei mit Schlüsseln anstelle des Ausgangstextes vorlegen, weiß er möglicherweise nicht, wie das Englische lauten soll. Sie müssten ihm also eine zweite Datei mit den Übersetzungen der Ausgangssprache zum Vergleich vorlegen. Das ist zwar nicht das Ende der Welt, aber es ist für sie umständlicher und entspricht nicht dem Konzept von Gettext. (eckiger Pflock, rundes Loch usw.)

Ich denke, PO ist als Dateiformat für Übersetzungen in PHP völlig in Ordnung und besonders empfehlenswert, wenn Sie nicht mit einem Framework arbeiten, das ein gutes l10n-Modul hat, aber das bedeutet nicht, dass es gut für den Workflow und Ihren Übersetzungsprozess ist.

Ich schlage Ihnen einen Arbeitsablauf vor, bei dem Ihre Programmierer mit festen Schlüsseln arbeiten, Ihre Übersetzer mit Wörtern, und Sie am Ende eine MO-Datei erhalten. Werfen Sie einen Blick auf Lokomotive für eine Lösung dieses Problems.

Alternativ können Sie auch ein anderes Zwischendateiformat verwenden, das die Verwendung von Schlüsseln und Wörtern erlaubt. TMX ist ein Beispiel. Wenn Sie Gettext dennoch zur Laufzeit verwenden möchten, können Sie die Dateien konvertieren .

7voto

ZZ Coder Punkte 72742

Derzeit habe ich mit demselben Problem zu kämpfen. Die gängige Praxis bei gettext ist es, den englischen Text als Schlüssel zu verwenden. Kürzlich hat unser Redakteur eine ganze Reihe englischer Texte geändert (andere Sprachen werden kaum berührt), so dass wir den gesamten Quellcode aller PO-Dateien ändern müssen.

Wir wechseln zu einem neutralen Schlüssel. Da wir bereits einige Websites auf Java haben. Wir werden das gleiche Format für Eigenschaftsnamen verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X