• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

Flash Messenger - Übersetzung

thenouse

New member
Hallo zusammen,

Ich nutze das FlashMessenger plugin bereits um Nachrichten (erfolgreich, nicht erfolgreich) anzuzeigen. Zum Beispiel nach einem Loggin.

Was mir jedoch noch Probleme bereitet, ist die Übersetzung der Nachrichten, die ich dem FlashMessenger zuweise und auf der jeweils nächten aufzurufenden Seite anzeige.

Kannst ihr mir einen Lösungsweg verraten, wie ich das bewerkstelligen kann? Vielleicht hast auch jemand einen Link dazu für mich. Ich habe schon wirklich viel im Netz gesucht, jedoch keine Lösung gefunden.
Bisher dachte ich, das ich die Messages einfach über translate() übersetzen kann und dann meine übersetzten Strings in den jeweiligen PO-Sprachfiles hinterlege. So wie ich auch statischen Text in der View übersetze.

Ist das der richtige Weg, oder liege ich da völlig falsch?

Gruss Thomas
 

Kaiuwe

Super-Moderator
Ich habe schon wirklich viel im Netz gesucht, jedoch keine Lösung gefunden.
Warum schaust du nicht einfach auf deine Festplatte oder nutzt deine IDE? Die Lösung liegt damit direkt vor dir.


Bisher dachte ich, das ich die Messages einfach über translate() übersetzen kann und dann meine übersetzten Strings in den jeweiligen PO-Sprachfiles hinterlege. So wie ich auch statischen Text in der View übersetze.
Alles überflüssig!

Da der „FlashMessenger“-Helfer die Klasse „Zend\I18n\View\Helper \AbstractTranslatorHelper“ verwendet, stehen dir die Methoden „setTranslator“ und „setTranslatorTextDomain“ zur Verfügung. Mehr brauchst du nicht.

(Im Netz findest du natürlich auch diese Angaben.)
 

thenouse

New member
Hi Kai,


Vielleicht habe ich da noch eine Verständnislücke.
Also ich habe bisher das FlashMessenger Controller Plugin genutzt um in einer Action entsprechend Nachrichten zu setzten...

Dann übergebe ich im Controller (falls es Messages gibt) die Messgages per return['messages'] an die View. Ich verstehe nun nicht ganz, wie die Nachricht, die ich auf English im Controller gesetzt habe nun übersetze, sofern zb. meine Locale-Variable "de" ist. Ich kann wie du oben erwähnt hast, den Translator setzen. Aber wie kann ich denn nun einfach meinem Translator (oder dem FlashMessenger?) sagen welches File er nun für die Message zur übersetzung nehmen soll?

Ich erstehe das ehrlich gesagt noch nicht so ganz. Bei den Texten, die ich in der View übersetze, habe ich das Schlüsselwort translate. Über einen PO-Files Editor lese ich nun die view files ein und sage dem Editor, das alle string die zuvor das transalte Schlüsselwort besitzen, erkennt werden sollen, damit ich die èbersetzungen vornehmen kann.

Wie mache ich das nun aber mit den Messages im Flashmessenger? Genauer mit den Messages, die im return array in der "messages" variable stehen?

Gruss Thomas
 

Kaiuwe

Super-Moderator
Aber wie kann ich denn nun einfach meinem Translator (oder dem FlashMessenger?) sagen welches File er nun für die Message zur übersetzung nehmen soll?
Per „setTranslatorTextDomain“.

Bei den Texten, die ich in der View übersetze, habe ich das Schlüsselwort translate.
Du musst nicht extra „translate“ aufrufen, dass macht der „FlashMessenger“ von ganz alleine.

Die Schlüsselworte werden als Nachrichten dem „FlashMessenger“-Kontroller-Plugin übergeben. Dann übergibst du den Translator an den „FlashMessenger“-View-Helfer und sagst noch, per „setTranslatorTextDomain“, wo dieser suchen muss.

Genauer mit den Messages, die im return array in der "messages" variable stehen?
Du musst nicht alles selber lösen, ansonsten bräuchtest du auch kein Framework. ;) Die Funktionalität der Übersetzung ist bereits durch die Klasse „Zend\I18n\View\Helper \AbstractTranslatorHelper“ vorhanden.
 
Zuletzt bearbeitet:

thenouse

New member
Hi Kai, vielen Dank für deine Antwort.

Ich habe das auch so versucht. Leider ohne Erfolg. Ich zeige dir und den anderen mal ein paar Codeausschnitte, vielleicht sieht der ein oder andere ja meinen Denk-Fehler.

In einem Controller in einer Action setzte ich die messages:

PHP:
// \Zend\Mvc\Controller\Plugin\FlashMessenger
$this->flashMessenger()->addMessage(
                    'Hello from Test'
            );
danach wird eine Action eines anderern Controllers aufgerufen und die Messages an die View übergeben:

PHP:
$viewmodel->setVariable('messages', $this->flashMessenger()->getMessages());
In der View mache ich dann folgendes:

PHP:
$translator = new Zend\I18n\Translator\Translator();


<?php $translator->addTranslationFile('phparray',
             './module/TestModule/language/de_DE.php')?>
// zum Testen
<?php echo $translator->translate('Hello From Test', __NAMESPACE__)?>
<?php $this->flashmessenger()->setTranslator($translator)?>

<?php foreach ($this->messages as $message): ?>

<div class="alert alert-login">
<button class="close" type="button" data-dismiss="alert">×</button>
<?php echo $message?>

</div>
<?php endforeach ?>
Leider komme ich damit nicht weiter, da der Text nicht übersetzt wird. Das TestModule besitzt den Ordner "language" und das File "de_DE.php"

das "de_DE.php"-File sieht folgendermassen aus:

PHP:
return array(
    "Hello From Test" => 'Hallo vom Test', 
);


Gruss Thomas
 

Kaiuwe

Super-Moderator
danach wird eine Action eines anderern Controllers aufgerufen und die Messages an die View übergeben:
Wieso mehrere Kontroller-Aktionen???

PHP:
$viewmodel->setVariable('messages', $this->flashMessenger()->getMessages());
Wenn du die „FlashMessenger“-Nachrichten selbst weitergibst, dann raubst du die Daseinsberechtigung für den „FlashMessenger“.

Du musst nichts übergeben, sondern einfach nur im View-Skript eine Ausgabe machen:
PHP:
echo $this->flashMessenger()->render();
Ansonsten bräuchtest du gar nicht den „FlashMessenger“.
 

thenouse

New member
Hi Kai,

zwei Aktionen, weil ich von der einen zur anderen navigiere, zwei Dinge überprüfe und falls diese nicht vorhanden sind, gehts zurück zur ersten Aktion und die view wird angezeigt mit entsprechender Fehlermeldung. (hier ist kein Formular oder ähnliches vorhaden...)

Ich habe meinen Code nun so angepasst und die Fehlermeldung(en) wird (werden) auch ausgeben. Jedoch immernoch nur auf Englisch.

nochmals der Code in der View:

$translator = new Zend\I18n\Translator\Translator();
<?php $translator->addTranslationFile('phparray',
'./module/SurveyMedia/language/de_DE.php')?>
<?php $this->flashmessenger()->setTranslator($translator) ?>
<?php echo $this->flashMessenger()->render(); ?>
Und der Fehler:
[h=3]Zend\I18n\Exception\InvalidArgumentException[/h]
Expected an array, but received integer
Das passiert beim Aufruf der render()-Methode des flashmessenger-plugins.

liegt das an meinen Sprachfiles oder an etwas anderem?
 

Kaiuwe

Super-Moderator
zwei Aktionen, weil ich von der einen zur anderen navigiere, zwei Dinge überprüfe und falls diese nicht vorhanden sind, gehts zurück zur ersten Aktion und die view wird angezeigt mit entsprechender Fehlermeldung. (hier ist kein Formular oder ähnliches vorhaden...)
Führe die Prüfung direkt in der entsprechenden Aktion aus oder überhaupt nicht im Kontroller, dann musst du auch nicht von Aktion zu Aktion springen. Denn das ist (in der Regel) immer überflüssig oder gar falsch.

Und der Fehler:
[h=3]Zend\I18n\Exception\InvalidArgumentException[/h]
Wo ist der Stack-Trace?
 

thenouse

New member
Hi,

der Stack-Trace:

#0 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\I18n\Translator\Translator.php(698): Zend\I18n\Translator\Loader\PhpArray->load('en_US', './module/TestModule...')
#1 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\I18n\Translator\Translator.php(570): Zend\I18n\Translator\Translator->loadMessagesFromFiles('default', 'en_US')
#2 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\I18n\Translator\Translator.php(438): Zend\I18n\Translator\Translator->loadMessages('default', 'en_US')
#3 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\I18n\Translator\Translator.php(354): Zend\I18n\Translator\Translator->getTranslatedMessage('Hello From Test', 'en_US', 'default')
#4 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\Helper\FlashMessenger.php(129): Zend\I18n\Translator\Translator->translate('Hello From Test', 'default')
#5 [internal function]: Zend\View\Helper\FlashMessenger->Zend\View\Helper\{closure}('You need to add...', 0)
#6 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\Helper\FlashMessenger.php(132): array_walk_recursive(Array, Object(Closure))
#7 C:\xampp\htdocs\test_sprache\module\TestModule\view\test-module\test-module\index.phtml(37): Zend\View\Helper\FlashMessenger->render()
#8 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\Renderer\PhpRenderer.php(507): include('C:\xampp\htdocs...')
#9 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\View.php(205): Zend\View\Renderer\PhpRenderer->render(Object(Zend\View\Model\ViewModel))
#10 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\View.php(233): Zend\View\View->render(Object(Zend\View\Model\ViewModel))
#11 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\View\View.php(198): Zend\View\View->renderChildren(Object(Zend\View\Model\ViewModel))
#12 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\Mvc\View\Http\DefaultRenderingStrategy.php(102): Zend\View\View->render(Object(Zend\View\Model\ViewModel))
#13 [internal function]: Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent))
#14 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(468): call_user_func(Array, Object(Zend\Mvc\MvcEvent))
#15 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\EventManager\EventManager.php(207): Zend\EventManager\EventManager->triggerListeners('render', Object(Zend\Mvc\MvcEvent), Array)
#16 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\Mvc\Application.php(347): Zend\EventManager\EventManager->trigger('render', Object(Zend\Mvc\MvcEvent))
#17 C:\xampp\htdocs\test_sprache\vendor\zendframework\zendframework\library\Zend\Mvc\Application.php(322): Zend\Mvc\Application->completeRequest(Object(Zend\Mvc\MvcEvent))
#18 C:\xampp\htdocs\test_sprache\public\index.php(15): Zend\Mvc\Application->run()
#19 {main}
 

thenouse

New member
okay. Dann werde ich mal nachsehen wo sich der Schreibfehler versteckt. Vielen Dank schonmal soweit für deine Hilfe
 

thenouse

New member
Okay, ich habe den Fehler gefunden. Ich hatte vergessen im Sprachfile die PHP-Tags zu setzen.

Vielen Dank Kai, hast mir wirklich sehr geholfen!
 

Kaiuwe

Super-Moderator
Auch wenn es bereits läuft, solltest du die Erzeugung des Translators und die Zuweisung der Übersetzungsdatei nicht im View-Skript ausführen.
PHP:
<?php
$translator = new Zend\I18n\Translator\Translator();
$translator->addTranslationFile('phparray',
'./module/SurveyMedia/language/de_DE.php')?>
<?php $this->flashmessenger()->setTranslator($translator) ?>
Mal ein schnelles Beispiel für eine Modul-Klasse:
PHP:
namespace Foo;

use Zend\ModuleManager\Feature\ViewHelperProviderInterface;

class Module implements ViewHelperProviderInterface
{
   /**
     * Expected to return \Zend\ServiceManager\Config object or array to
     * seed such an object.
     *
     * @return array|\Zend\ServiceManager\Config
     */
    public function getViewHelperConfig()
    {
        return array(
            'factories' => array(
                'flashMessenger' => function ($sm) {
                    $helper = new FlashMessenger();

                    // Formatierung für die Ausgabe
                    $helper->setMessageOpenFormat('<p%s>');
                    $helper->setMessageCloseString('</p>');
                    $helper->setMessageSeparatorString('<br>');

                    …

                    // Translator setzen
                    $helper->setTranslator($translator);

                    return $helper;
                },
            ),
        );
    }
}
Oder du erstellst eine eigene „Factory“-Klasse um den Helfer zu erzeugen.
 

thenouse

New member
Hallo Kai,
vielen Dank für deinen weiteren Hinweis. Ich werde mich daran halten. Dazu hätte ich nun jedoch noch eine Frage, wenn ich nun mehrere Sprach-Files habe, dann müsste ich diese ja theoretisch alle einzeln über addTranslationFile() hinzufügen. Sehe ich es richtig, das ich mit

'translation_file_patterns' => array (
array (
'type' => 'gettext',
'base_dir' => __DIR__ . '/../language',
'pattern' => '%s.mo',
'text_domain' => __NAMESPACE__
)
nur noch auf dem Translator die Locale dynamisch setzen muss um entsprechend die Übersetzungen zu erhalten?

//EDIT: weiter hätte ich noch die Frage, wie ich eine Nachricht dem FlashMessenger hinzufügen kann, in welcher ein Teil der Nachricht später durch eine Variable ersetzt werden soll?
Beispiel: ("Der Benutzername %xy% wird bereits verwendet")
In meinem Controller würde das nun so aussehen:
$this->flashMessenger ()->addMessage ( 'Der Benutzername ''' . $user->getUsername() . '" wird bereits verwendet' );

das kann ja aber nicht funktionieren. Jedoch komme ich auch nicht drauf wie es funktionieren kann.

In den Übersetzungsdateien von Zend für zb. Zend_Validate habe ich gesehen, das die Strings so aufgebaut sind (daher auch mein Beispiel oben):

"The input is not between '%min%' and '%max%', inclusively" => "Der Eingabewert ist nicht zwischen '%min%' und '%max%', inklusive diesen Werten",

Hat mir hier jemand nochmals ein wenig Hilfe?


Gruss Thomas
 
Zuletzt bearbeitet:
Oben