Fehler beim Übersetzung mit Yii:t()

Guten Morgen erst mal,

und zwar habe ich gerade einen seltsamen Fehler entdeckt, in so fern das ein Fehler ist. ich bin diesem Post gefolgt und habe alles entsprechend umgesetzt, es haut auch wunderbar funktioniert. Nur bin ich dann auf ein recht lustiges Problem gestoßen, wobei ich erst mal etwas Code zeigen will. Bitte die Dateien beachten!

[code=views/site/contact.php]…

<?php echo Yii::t('contact', 'blub'); ?>

…[/code]

[code=messages/de/contact.php]<?php

return array (

  // …

  'blub' => 'deutsch',

  // …

);

?>[/code]

[code=messages/en/contact.php]<?php

return array (

  // …

  'blub' => 'englisch',

  // …

);

?>[/code]

Soweit, so gut. Nun sollte man doch meinen, dass Yii einmal das Wort deutsch und einmal das Wort englisch liefert, je nachdem welche Sprache ich selektiere, aber Pustekuchen. englisch wird mir geliefert, aber deutsch nicht. Ist das so gewollt?

Etwas habe ich gerade noch heraus gefunden: Sobald Sonderzeichen, wie ä, ö ,ü oder / etc. im Text vorhanden sind und die Dateien unterschiedliche Zeichensätze haben (UTF-8 vs. Ansi), dann klappt die Übersetzung teilweise auch nicht.

Dies hat aber direkt nichts mit dem oben beschriebenen Problem zu tun.

ich würde die sourceLanguage englisch lassen und stattdessen language auf de setzen, um dann mit Yii::t() immer die englischen Keys anzusprechen

Es ist eigentlich egal, wie ich das mache! Sinnvoll wäre es, wenn ich nur einen Platzhalter definiere und dann die entsprechende Übersetzung geladen wird. Und genau das passiert ja nicht zu 100%! Dann weiß ich nur nicht, warum auch eine entsprechende Übersetzungsdatei angelegt wird.

Ähm ich glaube du verwendet Yii::t() etwas Falsch. Ich habe in meiner Anwendung keine Deutsche Datei mit Texten, nur die Fremden Sprachen. Du gibst einen Text folgendermaßen aus:

<?php echo Yii::t('Index', 'Deutscher Text'); ?>

nach dem durchlaufen der Message Methode erhälst du dann eine Datei in der dann ein Array enthalten ist das folgendermaßen aussieht:



<?php


return array (


  'Deutscher Text' => 'Englischer Text',


  'Registrierung' => 'Register',


  'Willkommen zurück {vorname}!' => 'Welcome back {vorname}!',


);


?>


Alles auf der rechten Seite musst du manuell eingeben bzw. eben übersetzen. Die Deutschen Texte sind alle in der Anwendung enthalten.

Hm… okay, d.h. abhängig von der sourceLanguage, die ich in der main.php definiere sollte ich die deutschen Meldungen im Quellcode verwenden und die anderen Texte entsprechend übersetzen?

Das hier hat mich dann nur etwas in die Irre geführt:

cd protected;


./yiic message config/messages.php

Da es mir auch für die deutschen Texte die Message-Dateien erstellt. Diese kann ich dann ja aber getrost löschen, oder?

Das kommt daher, weil du vermutlich in config/messages.php unter languages auch de mit stehen hast. Da deine Quelldateien aber eh schon deutsch sind (sourceLanguage=de), sucht Yii nicht nach deutschen Übersetzungen sondern verwendet direkt den Ursprungstext.

hmm, sollte man da auf getAttributeLabel etc. verzichten?

ich finde es nur sehr mühsam, quer im projekt die texte zu pflegen.

(da ich mehr als 30 controller habe und an diesen stellen auch hinweistexte, fehlermeldungen etc. haben)

was ist bei einer textänderung in deutsch, wenn die sprachdatei für deutsch nicht generiert wird?

-> fange ich dann an, und suche die stelle im quelltext?

finde die lösung bis jetzt noch nicht ganz optimal…

Du kannst Yii::t() auch innerhalb von attributeLabels() verwenden:


    public function attributeLabels() {

         return array(

             'Email' => Yii::t('forms','Your email address'),

             'FirstName' => Yii::t('forms','First name'),

 

Damit nicht alle zu übersetzenden Sachen in der selben Datei landen, kannst du auch noch unterschiedliche Kategorien beim Aufruf von t() verwenden. So wird das relativ übersichtlich.