Hallo Leute,
ich hab mal wieder ein Problem und zwar möchte ich meine eigene Lokalisierungsmethode schreiben. Ich muss für eine Anwendung die gesamten Lokalisierungsdaten in einer Datei pro Sprache packen. Diese Daten will ich dann über eine Klasse laden. Wo muss ich die Klasse platzieren oder wo aufrufen das ich ein Objekt davon habe? Bisher mache ich das in /protected/views/layout/main.php am Anfang, aber irgendwie hab ich das gefühl das das nicht richtig sein kann.
Es gibt in Yii ja die Methode t die man überall aufrufen kann. Wie kann ich diese genau überschreiben? Oder was mir eigentlich noch lieber währe, wie kann ich Methoden wie dieses t() genau schreiben so das ich sie über Yii::xyz aufrufen kann, ich hab mir nämlich eine Klasse geschrieben die das oben beschreibene alles schon kann und wunderbar macht aber leider kann ich meine Lokalisierungsdaten nicht in den Modellen verwenden um die Beschreibungen der Felder damit anzupassen.
Wäre klasse wenn ihr ne Idee hättet wie ich meine Probleme lösen könnte :-D
Grüße
Martin
Page 1 of 1
Überschreiben von Yii::t()
#2
Posted 04 June 2009 - 05:51 AM
Hi,
warum möchtest du deine Übersetzungsfunktion unbedingt mit Yii::xyz() aufrufen? Yii ist sehr flexibel, wenn es darum geht, andere Libraries oder eigenen Code mit einzubinden. Wenn dein Übersetzungsscript als Klasse vorliegt (die mit dem Dateinamen übereinstimmt), kannst du einfach eine Zeile zum import-Abschnitt in deiner Konfiguration hinzufügen. Sobald du die Klasse dann zum ersten mal verwendest, wird sie automatisch geladen.
Wenn es um einzelne Funktionen in einer Datei geht, ist es am einfachsten, die nötige Datei in der index.php mit require() einzubinden.
warum möchtest du deine Übersetzungsfunktion unbedingt mit Yii::xyz() aufrufen? Yii ist sehr flexibel, wenn es darum geht, andere Libraries oder eigenen Code mit einzubinden. Wenn dein Übersetzungsscript als Klasse vorliegt (die mit dem Dateinamen übereinstimmt), kannst du einfach eine Zeile zum import-Abschnitt in deiner Konfiguration hinzufügen. Sobald du die Klasse dann zum ersten mal verwendest, wird sie automatisch geladen.
Wenn es um einzelne Funktionen in einer Datei geht, ist es am einfachsten, die nötige Datei in der index.php mit require() einzubinden.
#3
Posted 04 June 2009 - 10:14 AM
Ich bin jetzt so weit das es eigentlich klappen sollte mit dem t(); hab die Dateien auch so konfiguriert. Leider ist alles was in den views und den models ist nicht übersetztbar. Navigation und so geht wunderbar aber leider geht es in den views nicht wenn ich die sprache ausgeben lasse (Yii::app()->language) dann ist es in den views und in den Models immer eine andere als in der Navigation drei Zeilen weiter oben. Versteh das nicht.
#4
Posted 05 June 2009 - 02:03 AM
Könnte mir jemand erklären wo und wie ich wann die standardsprache festlege und wie ich es dann bewerbstelligen kann die sprache umzustellen? Muss ich die sprache in jemdem controller neu laden? Hab da grad echt massive Probleme wenn mir jemand helfen würde würde ich mich freuen.
Grüße
Martin
Grüße
Martin
#5
Posted 05 June 2009 - 05:11 AM
1. Setze sourceLanguage in der Konfig auf die Quellsprache deiner Anwendung
Das führt dazu, dass alle Systemnachrichten in dieser Sprache ausgegeben werden.
2. Setze die Zielsprache der Anwendung mit language
Das geschieht normalerweise irgendwo im Code. Wie in diesem Cookbook-Artikel beschrieben, kann man das in einem Basiscontroller platzieren. Alle deine Controller müssen dann von diesem Basiscontroller abgeleitet werden, nicht mehr von CController:
Dieser Code prüft auf $_POST['lang'] und speichert bzw. liest die aktuelle Sprache in bzw. aus der Session. Im View braucht man noch irgendwo ein Dropdown zur Auswahl (evlt. direkt im layout, damit es auf allen Seiten angezeigt wird):
Das ganze kann man je nach Bedarf auch ganz anders lösen, z.B. mit einem eigenen Widget.
3. Erstelle die Nachrichtenquellen
Standardmäßig verwendet Yii CPhpMessageSource und sucht nach Übersetzungsdateien in protected/messages/en/kategorieX.php (für Sprache 'en' und Kategorie 'kategorieX'). Diese Datei kann man mit yiic automatisch erzeugen lassen. Dazu braucht man aber eine weitere Konfigurationsdatei:
Wichtig ist hier evtl. der Wert translator. Hier gibt man an, wie die Funktion heisst, die man zum Übersetzen verwendet. Nur so kann yiic die zu übersetzenden Nachrichten finden.
Um die Nachrichtenquellen zu erzeugen ruft man dann diesen Befehl auf:
Jetzt finden sich unter protected/messages/... die vorgefertigten Übersetzungsdateien. Hier muss dann Begriff für Begriff übersetzt werden.
Danach ist man dann aber endlich fertig und die Sprachumschaltung läuft sauber.
Das führt dazu, dass alle Systemnachrichten in dieser Sprache ausgegeben werden.
<?php return array( // ... 'sourceLanguage'=>'de' // ... );
2. Setze die Zielsprache der Anwendung mit language
Das geschieht normalerweise irgendwo im Code. Wie in diesem Cookbook-Artikel beschrieben, kann man das in einem Basiscontroller platzieren. Alle deine Controller müssen dann von diesem Basiscontroller abgeleitet werden, nicht mehr von CController:
<?php class BaseController extends CController{ public function init(){ parent::init(); $app = Yii::app(); // Nur gültige Sprachen erlaubt! if (isset($_POST['lang']) && in_array($_POST['lang'],array('en','de','fr')) ) { $app->language = $_POST['lang']; $app->session['lang'] = $app->language; } else if (isset($app->session['lang'])) { $app->language = $app->session['lang']; } } }
Dieser Code prüft auf $_POST['lang'] und speichert bzw. liest die aktuelle Sprache in bzw. aus der Session. Im View braucht man noch irgendwo ein Dropdown zur Auswahl (evlt. direkt im layout, damit es auf allen Seiten angezeigt wird):
<?php echo CHtml::form() ?> <?php echo CHtml::dropDownList('lang', Yii::app()->language, array( 'de' => 'Deutsch', 'en' => 'Englisch','fr'=>'Französisch'), array('submit' => '')) ?> <?php echo CHtml::endForm() ?>
Das ganze kann man je nach Bedarf auch ganz anders lösen, z.B. mit einem eigenen Widget.
3. Erstelle die Nachrichtenquellen
Standardmäßig verwendet Yii CPhpMessageSource und sucht nach Übersetzungsdateien in protected/messages/en/kategorieX.php (für Sprache 'en' und Kategorie 'kategorieX'). Diese Datei kann man mit yiic automatisch erzeugen lassen. Dazu braucht man aber eine weitere Konfigurationsdatei:
<?php return array( 'sourcePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'messagePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'messages', 'languages'=>array('en','fr'), 'fileTypes'=>array('php'), 'exclude'=>array( '/runtime'), 'translator'=>'Yii::t' );
Wichtig ist hier evtl. der Wert translator. Hier gibt man an, wie die Funktion heisst, die man zum Übersetzen verwendet. Nur so kann yiic die zu übersetzenden Nachrichten finden.
Um die Nachrichtenquellen zu erzeugen ruft man dann diesen Befehl auf:
cd protected; ./yiic message config/messages.php
Jetzt finden sich unter protected/messages/... die vorgefertigten Übersetzungsdateien. Hier muss dann Begriff für Begriff übersetzt werden.
Danach ist man dann aber endlich fertig und die Sprachumschaltung läuft sauber.
#6
Posted 06 June 2009 - 12:49 PM
Das ist echt Wahnsinn, danke.
Das heißt praktisch das ich jetzt erst meine ganze Anwendung schreibe aber jedes mal wenn es dann um eine Übersetzung oder eben was das in mehreren sprachen vorhanden ist, mach ich das mit Yii::t(). Am Ende lass ich dann yiic drüberlaufen und übersetz mir nur noch die Dateien die das ausspuckt. Hammer, das ist ein Konzept über das vorher einer mal nachgedacht hat.
Was hälst du davon deine Anleitung ins Cookbook aufzunehmen? So gut wie hier ist das nirgendwo erklärt und ich bin sicher nicht der einzige der die Probleme hat.
Grüße
Das heißt praktisch das ich jetzt erst meine ganze Anwendung schreibe aber jedes mal wenn es dann um eine Übersetzung oder eben was das in mehreren sprachen vorhanden ist, mach ich das mit Yii::t(). Am Ende lass ich dann yiic drüberlaufen und übersetz mir nur noch die Dateien die das ausspuckt. Hammer, das ist ein Konzept über das vorher einer mal nachgedacht hat.
Was hälst du davon deine Anleitung ins Cookbook aufzunehmen? So gut wie hier ist das nirgendwo erklärt und ich bin sicher nicht der einzige der die Probleme hat.
Grüße
Share this topic:
Page 1 of 1