Frage

I Yü große Rahmen zu finden, und die Beispiel-Website mit yiic Shell erstellt ist ein guter Punkt zu beginnen ... aber es ist nicht das Thema der mehrsprachigen Websites nicht abdeckt, leider. Die docs deckt das Thema Kurznachricht zu übersetzen, aber nicht die mehrsprachigen Inhalte zu halten ...

Ich bin etwa auf einer Website zu arbeiten zu beginnen, die in mindestens zwei Sprachen sein müssen, und ich frage mich, was der beste Weg ist, Inhalte zu halten, für die ... Das Problem ist, dass der Inhalt intensiv mit gemeinsamen Elementen gemischt wird (wie eingebettete Videodateien).

Ich brauche zu vermeiden, diese commons Duplizieren ... bisher habe ich ein Array von Arrays zu Texten, die (in der Regel nicht mehr als 1-2 kurze Absätze), dann wurde die View-Datei nur den Text aus einem Array zu machen.

Nun möchte Ich mag zu halten es in Arrays zu vermeiden (was einige Aufmerksamkeit erfordert, wenn doppelte Zitate setzen „“ und ist unbequem im Allgemeinen ...).

Also, was ist der beste Weg, um diese kurze Absätze zu halten? Sollte ich sie in DB wie (id | msg_id | Sprache | Inhalt), und wählen sie dann durch msg_id & Sprache? Das verlangt von mir noch etwas msg_id ist und betten sie in View-Datei ...

erstellen

Gibt es eine empfohlene Paradigma für die Yü einige Lösungen hat?

Danke, Meter

War es hilfreich?

Lösung

Eine Yii-Anwendung verwendet standardmäßig yii :: t () -Methode für Textnachrichten zu übersetzen und es gibt 3 verschiedene Typen für Nachrichtenquellen:

  1. CPhpMessageSource . Übersetzungen als Schlüssel-Wert-Paare in einem PHP-Array gespeichert sind
  2. CGettextMessageSource : Übersetzungen werden gespeichert, wie GNU Gettext-Dateien. (PO-Dateien)
  3. CDbMessageSource . Nachricht Übersetzungen werden in Datenbanktabellen gespeichert

Wenn ich nicht falsch verstehen, Sie klassische Arrays für Übersetzungen verwenden. Ich empfehle Sie GetText und PO-Dateien mit Yü für die Übersetzung Operationen.

Sie können viele Informationen über die Übersetzung finden und i18n mit yii in dieser offiziellen Dokumentation Seite .

Andere Tipps

ist Gettext gut für die einfache Übersetzung, aber die Standard-PHP-Implementierung ist nicht Thread-sicher. Yü deshalb verwendet seine eigenen Entpacker, stieg dramatisch die Verarbeitungszeit im Vergleich zu PHP Arrays.

Da ich ein hohes Volumen, hohe Transaktions Website einrichten, war die Performance-Einbußen nicht akzeptabel. Auch von APC verwenden, könnten wir die PHP-Übersetzung die Leistung weiter cachen zu erhöhen.

Mein Ansatz war daher PHP Arrays zu verwenden, aber die Übersetzungen in einem DB für eine einfache Übersetzung zu halten, um die benötigten Dateien zu erzeugen, wenn die Übersetzungen geändert werden.

Die DB ist ähnlich wie diese:

TABLE Message            // stores source language, updated by script
 id INT UNSIGNED
 category VARCHAR(20)         // first argument to Yii::t()
 key TEXT                     // second argument to Yii::t()
 occurences TINYINT UNSIGNED  // number of times found in sources

TABLE MessageTranslation // stores target language, translated by human  
 id INT UNSIGNED
 language VARCHAR(3)          // ISO 639-1 or 639-3, as used by Yii
 messageId INT UNSIGNED       // foreign key on Message table
 value TEXT
 version VARCHAR(15)
 creationTime TIMESTAMP DEFAULT NOW()
 lastModifiedTime TIMESTAMP DEFAULT NULL
 lastModifiedUserId INT UNSIGNED

ich dann die CLI-Tool yiic 'message' modifizierten Befehl die gesammelten Zeichenketten in den DB-Dump.

http://www.yiiframework.com / wiki / 41 / how-to-extend-yiic-Shell-Befehle /

Einmal in der DB, ein einfaches CMS eingerichtet werden kann Übersetzer eine einfache Möglichkeit, gleichzeitig zu übersetzen und bei der Versionsverwaltung Informationen, Rückkehr zu älteren Versionen, die Überprüfung Qualität des Übersetzers, etc ...

Ein weiteres Skript, auch von yiic geändert, nimmt dann den DB-Informations und kompiliert es in PHP Arrays. Im Grunde einer Verknüpfung der beiden Tabellen für jede Sprache, dann einen Array bauen mit ‚Nachricht‘. ‚Schlüssel‘ und ‚MessageTranslation‘. ‚Wert‘ als (was sonst?) Schlüssel => Wert ... auf Datei von 'genannt Speichern Nachricht‘. 'Kategorie' in Ordnern nach Sprache angegeben.

Die erzeugten Dateien werden als normale geladen von Yü CPhpMessageSource.

Für Bilder, war dies so einfach wie sie in Ordnern mit der richtigen Sprache zur Verfügung gestellt und die App Sprache bekommen, wenn die Verknüpfung.

<img src="/images/<?php echo Yii::app()->language; ?>/help_button.png">

Beachten Sie, dass im wirklichen Leben, ich ein kleines Hilfsmethode schrieb das Land aus der Sprache Zeichenfolge abzustreifen, ‚en_us‘ sollte ‚en‘ sein.

Nun, ich denke, was hier zu tun ist, wie statische Text / Nachrichten auf der Seite und Yü löst es mit ziemlich gut übersetzen Yü. T () und Edigü Antwort ist für sie

prüfe ich die Post heraus FlexicaCMS über das Übersetzen von dynamischen Inhalten in der Datenbank, und letztlich, dass die nächste sein wird, nachdem Sie statischen Text / Mitteilung Problem zu lösen, und das ist ein wirklich guter Ansatz Yü Verhalten verwenden. Nicht sicher, ob FlexicaCMS Autoren zu ehrgeizig sind bei der Unterstützung der Übersetzung auf diese Weise, wie es die Übersetzung von Inhalten eine Rundum-Sorglos-Sache machen würde -. Wirklich toll

Eine Sache, die sie nicht zu erwähnen ist die URL der übersetzten Seite. Zum Beispiel your.site.com/fr/translated_article_title.html. Ich meine, die URL muss has / language_id / Teil darin, so dass es mit SEO helfen kann.

In Yii1 und Yii2 yii \ i18n \ GettextMessageSource nicht Yü perfekte Cache-Engine verwenden sowieso (Blick auf die Quelle), um die Last von PO oder MO-Dateien zu verbessern. Es ist nicht diese Dateien empfohlen, zu laden, indem PHP reinen Code (einschließlich yii \ i18n \ GettextMessageSource) (es ist so langsamer als PHP-Array idx): http: // mel. melaxis.com/devblog/2006/04/10/benchmarking-php-localization-is-gettext-fast-enough/

Allerdings PHP gettext ext für MO-Dateien ist ein paar schneller als Array Übersetzung php, weil es Cache verwendet, aber der negativer Punkt ist. Jede Änderung MO Neustart des Servers erfordert

Ich denke, die beste Lösung yii \ i18n \ GettextMessageSource in Ihrer eigenen Code-Bibliothek und fügen Sie die Cache-Fähigkeit zu GettextMessageSource zu erweitern wäre seine Leistung zu verbessern und Ihre erweiterte Version als Komponente verwendet werden.

protected function loadMessages($category, $language);

Nur nicht überprüfen MO Änderungsdatum in jeder Last gegen den Cache zu vergleichen, anstatt den Cache löschen, wenn der MO oder PO-Dateien geändert werden (es einen Zeitplan sein kann).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top