2017-03-02 1 views
0

Ich habe Zend Framework 3 Anwendung mit funktionierenden Übersetzer mit Po-Dateien.zf3 Gebietsschema ändern je nach Benutzerauswahl

Ich habe es so konfiguriert ist, in meiner \ config \ global.php Datei:

'translator' => [ 
    'locale' => 'en_US', 
    'translation_file_patterns' => [ 
     [ 
      'type'  => 'gettext', 
      'base_dir' => getcwd() . '/data/language/', 
      'pattern' => '/%s/general.mo', 
     ], 
    ], 
], 

Wenn ich den Wert des „locale“ ändern funktioniert ok und findet die richtige .po-Datei. Ich muss in der Lage sein, das Gebietsschema abhängig vom Wert eines Benutzerprofils einzustellen, das in der Datenbank gespeichert wird.

Ich habe die Dokumentation von hier http://zendframework.github.io/zend-i18n/translation/ und das Tutorial von hier https://docs.zendframework.com/tutorials/i18n/ überprüft, aber sie erwähnen nur die setLocale() -Methode ohne Erklärung oder Beispiel. Es gibt ähnliche Thread hier Zend framework 2 : How to set locale globaly? aber es ist für ZF2 und es bietet keine funktionierende Lösung nur einige Vorschläge.

Um meine Frage zusammenzufassen - wie und wo sollte ich die setLocale() -Methode verwenden, so dass es in der gesamten Anwendung wirksam wäre und $this->translate($message) in allen Ansichtsdateien das neue Gebietsschema stattdessen das Standardgebietsschema in der Konfigurationsdatei verwendet?

Antwort

0

Sie müssen nur das PHP-Gebietsschema festlegen. Verwenden Sie dazu \Locale::setDefault('en-GB');.

Werfen Sie einen Blick auf SlmLocale, diese bestimmte Datei ist, wo es fertig ist.


Während das der einfachste Weg war, konnte man auch die setLocale Funktion auf dem MvcTranslator verwenden, denke ich. Dafür müssten Sie die bestehende Fabrik mit Ihrer eigenen Fabrik überschreiben und daher die Originalfabrik schmücken.

Wenn Sie sich die ConfigProvider file in zend-mvc-i18n ansehen, können Sie sehen, dass Aliase und Factories hier verwendet werden, um den MVC-Übersetzer zu erstellen. Dann können Sie sehen, wie die betreffende Fabrik funktioniert, sie erstellt im Grunde einen verzierten Übersetzer, wie stated in the doc.

Standardmäßig ist der Service-Manager bieten immer die gleiche Instanz (Shared Service), wie ein Singleton.

Wir werden daher diese Konfiguration überschreiben (dh stellen Sie sicher, dass Ihr eigenes Modul nach Zend\Mvc\I18n in modules.config.php ist). In der Modulkonfiguration können wir dann einen eigenen Übersetzer bereitstellen.

Unser Übersetzer besteht im Wesentlichen aus dem Übersetzer aus der Dokumentation, auf dem der setLocale heißt. Um dies zu tun, können wir eine delegator verwenden.

return [ 
    'factories' => [ 
     TranslatorInterface::class => TranslatorServiceFactory::class, 
    ], 
    'delegators' => [ 
     TranslatorInterface::class => [ 
      \Application\Factory\TranslatorFactory::class, 
     ], 
    ], 
]; 

Und dann die TranslatorFactory:

use Interop\Container\ContainerInterface; 
use Zend\ServiceManager\Factory\DelegatorFactoryInterface; 

class TranslatorFactory implements DelegatorFactoryInterface 
{ 
    public function __invoke(ContainerInterface $container, $name, callable $callback, array $options = null) 
    { 
     $translator = call_user_func($callback); 
     $translator->setLocale('en-GB'); 
     return $translator; 
    } 
} 

, dass ein Weg, es zu tun wäre (Sie den Container in dieser Fabrik zu bekommen, so dass Sie wahrscheinlich einige Benutzerdaten erhalten könnte).


Eine andere Lösung ist es, das Event-System zu verwenden, und nur das Gebietsschema in den Ereignis-Listener erklären, wo Sie Ihre Benutzerdaten abzurufen.

+0

Danke Thomas, das funktioniert wirklich, ich werde es auch mit der Fabrik versuchen, aber ich werde einige Hilfe mit ihm zu schätzen wissen.Ich denke, es wird konsequenter sein, Framework-Tools zu verwenden, wenn es solche gibt. Ich werde eine Chance geben, dass jemand anderes etwas anderes vorschlägt und wenn niemand reinkommt, werde ich deine Antwort als "akzeptiert" markieren. Nochmals vielen Dank, – Ivomasterche

+0

Ich habe nur die Antwort ein wenig aktualisiert ... Das ist ein bisschen lang IMO, und wahrscheinlich ein bisschen verwirrend irgendwann, bitte fragen Sie weitere Details, wenn nötig. –

+0

Nochmals vielen Dank. Ich denke, dass ich die Idee habe - wir "wickeln" den Übersetzer-Service mit diesem Delegator, der jedes Mal aufgerufen werden muss (und ein Gebietsschema setzt), wenn $ this-> translate ($ msg) 'aufgerufen wird? Leider kann ich es nicht funktionieren, ich habe die Konfiguration zu der module.config.php des Application-Moduls hinzugefügt, und ich habe die TranslatorFactory-Klasse in /Application/src/Factory/TranslatorFactory.php Datei erstellt, ist das alles? – Ivomasterche

Verwandte Themen