2017-03-02 4 views
0

J'ai Zend Framework 3 Application avec le traducteur de travail en utilisant des fichiers po.zf3 modifier les paramètres régionaux en fonction de la sélection de l'utilisateur

Je l'ai configuré comme ça dans mon \ config \ global.php fichier:

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

Quand je change la valeur de la « locale », il fonctionne bien et trouve le fichier .po approprié. Je dois pouvoir définir les paramètres régionaux en fonction de la valeur d'un profil utilisateur enregistrée dans la base de données.

J'ai vérifié la documentation d'ici http://zendframework.github.io/zend-i18n/translation/ et le tutoriel d'ici https://docs.zendframework.com/tutorials/i18n/ mais ils mentionnent simplement la méthode setLocale() sans explication ni exemple. Il ya un fil similaire ici Zend framework 2 : How to set locale globaly? mais c'est pour ZF2 et il ne fournit pas de solution de travail juste quelques suggestions. Pour résumer ma question - comment et où dois-je utiliser la méthode setLocale() afin qu'il soit efficace dans l'ensemble de l'application et $this->translate($message) dans tous les fichiers de vue utilisera les nouveaux paramètres régionaux plutôt que ceux par défaut utilisés dans le fichier de configuration?

Répondre

0

Vous avez juste besoin de définir les paramètres régionaux PHP. Pour ce faire, utilisez \Locale::setDefault('en-GB');.

Jetez un oeil à SlmLocale, ce fichier spécifique est l'endroit où c'est fait.


Bien que cela soit la meilleure façon, vous pouvez également utiliser la fonction setLocale sur le MvcTranslator je suppose. Pour cela, vous devez remplacer l'usine existante par votre propre usine, en décorant l'usine d'origine.

Si vous regardez le ConfigProvider file in zend-mvc-i18n, vous pouvez voir que les alias et les usines sont utilisés ici pour créer le traducteur MVC. Ensuite, vous pouvez voir comment l'usine en question fonctionne, il crée essentiellement un traducteur de décoration, comme stated in the doc.

Par défaut, le gestionnaire de services fournit toujours la même instance (service partagé), tout comme un singleton. Ce que nous allons donc faire est remplacer cette configuration (c'est-à-dire assurez-vous que votre propre module est après le Zend\Mvc\I18n dans modules.config.php). Ensuite, dans la configuration du module, nous pouvons fournir notre propre traducteur.

Notre traducteur se compose essentiellement du traducteur de la documentation, sur lequel le setLocale est appelé. Pour ce faire, nous pouvons utiliser un delegator.

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

Et puis le 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; 
    } 
} 

Ce serait une façon de le faire (vous obtenez le conteneur dans cette usine, de sorte que vous pouvez obtenir des données utilisateur probablement). Une autre solution consiste à utiliser le système d'événements et à déclarer uniquement les paramètres régionaux dans le programme d'écoute d'événement, dans lequel vous récupérez vos informations utilisateur.

+0

Merci Thomas, cela fonctionne vraiment, je vais essayer avec l'usine aussi, mais j'apprécierai de l'aide avec elle.Je pense qu'il sera plus cohérent d'utiliser les outils du framework quand il y en a. Je donnerai la chance à quelqu'un d'autre de suggérer quelque chose d'autre et si personne ne rentre, je marquerai votre réponse comme «acceptée». Merci encore une fois, – Ivomasterche

+0

Je viens de mettre à jour la réponse un peu ... C'est un peu long IMO, et probablement un peu confus à un moment donné, s'il vous plaît demander plus de détails si nécessaire. –

+0

Merci encore une fois. Je pense avoir l'idée - nous sommes "envelopper" le service de traducteur avec ce délégant, qui devrait être appelé (et définira les paramètres régionaux) chaque fois que '$ this-> translate ($ msg)' est appelé? Malheureusement, je ne peux pas le faire fonctionner, j'ai ajouté la configuration au module.config.php du module Application, et j'ai créé la classe TranslatorFactory dans le fichier /Application/src/Factory/TranslatorFactory.php est-ce tout? – Ivomasterche