Überschreiben von Yii::t()

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 :smiley:

Grüße

Martin

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.

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.

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

1. Setze sourceLanguage in der Konfig auf die Quellsprache deiner Anwendung

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.

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