La traduction est faite par l'intermédiaire d'un Translator. Le traducteur est un objet et injectée par exemple dans un helper de vue, donc, si vous appelez ça helper de vue, il utilise le traducteur pour traduire vos chaînes. Pour répondre à cette question je suppose que vous avez configuré le traducteur tout de même que le squelette de l'application.
Le meilleur moyen est d'utiliser l'usine à injecter ce qu'une dépendance dans votre contrôleur. Le contrôleur de config:
namespace MyModule;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\I18n\Translator\Translator;
class FooController extends AbstractActionController
{
protected $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
}
Une alternative est de tirer le traducteur du responsable de service, dans votre action, mais c'est moins souple, moins vérifiables et plus difficile à maintenir:
public function fooAction()
{
$translator = $this->getServiceManager()->get('translator');
}
Dans les deux cas, vous pouvez utiliser $translator->translate('foo bar baz') de traduire vos chaînes.
La dernière version de zend framework 2 modifié la clé de traducteur à MVCTranslator. Ne fonctionne pas pour moi. J'ai l'erreur suivante: erreur fatale: Argument 1 passé à l'Application\Controller\CorrespondenciasController::__construct() doit être une instance de Zend\I18n\Traducteur\Traducteur, aucune donnée, appelé dans /home/inhotim/Trabalho/0-OPE/scape/Produção/Web/scape/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php sur la ligne 207 et définie dans /home/inhotim/Trabalho/0-OPE/scape/Produção/Web/scape/module/Application/src/Application/Controller/CorrespondenciasController.php sur la ligne 141 cela signifie que votre usine ne fonctionne pas. Vérifier le premier bloc de code dans ma réponse. si vous voulez dire ce bloc de code, ouais, j'ai une double vérification: 'controllers' => array( 'usines' => array( 'mon-controller' => function($sm) { $traducteur = $sm->getServiceLocator()->get('traducteur'); $controller = new MyModule\Controller\FooController de dollars (traducteur);} ) ), c'est la mienne: 'usines' => array( 'CorrespondenciasController' => function($sm) { $traducteur = $sm->getServiceLocator()->get('traducteur'); $controller = nouvelle Application\Controller\CorrespondenciasController de dollars (traducteur); } ) J'ai posté sur pastebin: pastebin.com/tD9gmZqY
<?php
namespace Application\Controller\Plugin;
use Zend\Mvc\Controller\Plugin\AbstractPlugin;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use Zend\I18n\Translator\Translator;
class Translate implements FactoryInterface
{
public function createService(ServiceLocatorInterface $serviceLocator)
{
$serviceLocator = $serviceLocator->getController()->getServiceLocator();
$serviceFactory = new TranslatorServiceFactory();
$translator = $serviceFactory->createService($serviceLocator);
return new TranslatorProxy($translator);
}
}
final class TranslatorProxy extends AbstractPlugin
{
private $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function __invoke($message, $textDomain = 'default', $locale = null)
{
return $this->translator->translate($message, $textDomain, $locale);
}
public function __call($method, $args)
{
return call_user_func_array([$this->translator, $method], $args);
}
public static function __callstatic($method, $args)
{
return call_user_func_array([$this->translator, $method], $args);
}
}
Comment ça marche?
Vous voyez, la ServiceLocator passé dans
usine dans l'espace de configuration controller_plugins, n'ont pas accès à l' Config service dans ServiceLocator dans le contrôleur. Si vous ne pouvez pas obtenir la configuration et créer le Translate de l'objet via TranslatorServiceFactory.
Au lieu de cela, vous pouvez accéder à la ServiceLocator assigné au contrôleur pour lesquels une aide a été invoquée, en tapant $serviceLocator->getController().
Bien sûr, $serviceLocator passé dans createService méthode est l'instance de Zend\Mvc\Controller\PluginManager.
Pourquoi proxy?
L'objet renvoyé par plugin usine a à mettre en œuvre
Zend\Mvc\Controller\Plugin\PluginInterface
qui est mis en œuvre de façon abstraite dans
Zend\Mvc\Controller\Plugin\AbstractPlugin
nous avons donc créé proxy objet de transférer tous les appels à partir de notre plugin pour le Translate objet.
Espère que ça a aidé!
J'ai publié un article dans mon propre blog.
C'est parfait et fonctionne centralisés. Merci @Athlan! Votre solution est très joli! Merci! Et vous êtes de Pologne 🙂 Ne fonctionne pas pour moi?Ce qu'il manque? 1 - je enregistrer le plugin dans model.config.php en vertu de l'Application du module. 2 - je crée translater.class en Application\Controller\Plugin. 4 - j'appelle le $this->translate('Bonjour',,NAMESPACE,$mylocale) dans un autre contrôleur.
Dans mon cas, fonctionne parfaitement cette solution:
namespace MyNS;
class MyCtrlr
{
protected $translator;
public function getTranslator()
{
if (!$this->translator)
{
$sm = $this->getServiceLocator();
$this->translator = $sm->get('translator');
}
return $this->translator;
}
public function myAction()
{
$sTrHello = $this->getTranslator()->translate('Hello');
/*
* More code here
*/
}
}
Un invokable est une classe qui peut être construit sans aucun argument. Depuis notre MyModule\Controller\FooController a maintenant un argument obligatoire, nous avons besoin de changer cela. Un usine est une classe qui crée des instances d'une autre classe. Nous allons maintenant créer un pour notre FooController. Nous allons modifier notre module.config.php fichier comme ceci:
Nous allons mettre en œuvre notre usine de classe, pour cela, créer un nouveau dossier dans \module\MyModule\src\MyModule\Usine et le nouveau fichier appelé FooControllerFactory.php:
<?php
namespace MyModule\Factory;
use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
use MyModule\Controller\FooController;
class FooControllerFactory implements FactoryInterface
{
public function __construct()
{}
/**
* Create service
*
* @param ServiceLocatorInterface $serviceLocator
*
* @return mixed
*/
public function createService(ServiceLocatorInterface $serviceLocator)
{
$realServiceLocator = $serviceLocator->getServiceLocator();
$translator = $realServiceLocator->get('translator');
return new FooController($translator);
}
}
Utilisons maintenant le $traducteur au sein de notre FooController. Pour cela, nous devons remplacer la valeur par défaut __contruct():
<?php
namespace MyModule\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Mvc\I18n\Translator;
class FooController extends AbstractActionController
{
protected $translator;
public function __construct(Translator $translator)
{
$this->translator = $translator;
}
public function FooAction()
{
...
$msg = $this->translator->translate('Blah blah blah');
...
}
}
La traduction est faite par l'intermédiaire d'un
Translator
. Le traducteur est un objet et injectée par exemple dans un helper de vue, donc, si vous appelez ça helper de vue, il utilise le traducteur pour traduire vos chaînes. Pour répondre à cette question je suppose que vous avez configuré le traducteur tout de même que le squelette de l'application.Le meilleur moyen est d'utiliser l'usine à injecter ce qu'une dépendance dans votre contrôleur. Le contrôleur de config:
Et le contrôleur lui-même:
Une alternative est de tirer le traducteur du responsable de service, dans votre action, mais c'est moins souple, moins vérifiables et plus difficile à maintenir:
Dans les deux cas, vous pouvez utiliser
$translator->translate('foo bar baz')
de traduire vos chaînes.MVCTranslator
.Ne fonctionne pas pour moi. J'ai l'erreur suivante: erreur fatale: Argument 1 passé à l'Application\Controller\CorrespondenciasController::__construct() doit être une instance de Zend\I18n\Traducteur\Traducteur, aucune donnée, appelé dans /home/inhotim/Trabalho/0-OPE/scape/Produção/Web/scape/vendor/zendframework/zend-servicemanager/src/AbstractPluginManager.php sur la ligne 207 et définie dans /home/inhotim/Trabalho/0-OPE/scape/Produção/Web/scape/module/Application/src/Application/Controller/CorrespondenciasController.php sur la ligne 141
cela signifie que votre usine ne fonctionne pas. Vérifier le premier bloc de code dans ma réponse.
si vous voulez dire ce bloc de code, ouais, j'ai une double vérification: 'controllers' => array( 'usines' => array( 'mon-controller' => function($sm) { $traducteur = $sm->getServiceLocator()->get('traducteur'); $controller = new MyModule\Controller\FooController de dollars (traducteur);} ) ), c'est la mienne: 'usines' => array( 'CorrespondenciasController' => function($sm) { $traducteur = $sm->getServiceLocator()->get('traducteur'); $controller = nouvelle Application\Controller\CorrespondenciasController de dollars (traducteur); } )
J'ai posté sur pastebin: pastebin.com/tD9gmZqY
OriginalL'auteur Jurian Sluiman
Si vous souhaitez utiliser le traducteur dans le contrôleur comme en vue, juste comme ça:
au lieu de laid:
vous pouvez également écrire le traduire plugin de contrôleur, tout comme helper de vue
Zend\I18n\View\Helper\Translate
.Bien sûr, vous pouvez appeler le plugin avec la même signature:
Il suffit de s'inscrire:
Et écrire plugin:
Comment ça marche?
Vous voyez, la
ServiceLocator
passé dansusine dans l'espace de configuration
controller_plugins
, n'ont pas accès à l'Config
service dansServiceLocator
dans le contrôleur. Si vous ne pouvez pas obtenir la configuration et créer leTranslate
de l'objet viaTranslatorServiceFactory
.Au lieu de cela, vous pouvez accéder à la
ServiceLocator
assigné au contrôleur pour lesquels une aide a été invoquée, en tapant$serviceLocator->getController()
.Bien sûr,
$serviceLocator
passé danscreateService
méthode est l'instance deZend\Mvc\Controller\PluginManager
.Pourquoi proxy?
L'objet renvoyé par plugin usine a à mettre en œuvre
qui est mis en œuvre de façon abstraite dans
nous avons donc créé proxy objet de transférer tous les appels à partir de notre plugin pour le
Translate
objet.Espère que ça a aidé!
J'ai publié un article dans mon propre blog.
Votre solution est très joli! Merci! Et vous êtes de Pologne 🙂
Ne fonctionne pas pour moi?Ce qu'il manque? 1 - je enregistrer le plugin dans model.config.php en vertu de l'Application du module. 2 - je crée translater.class en Application\Controller\Plugin. 4 - j'appelle le $this->translate('Bonjour',,NAMESPACE,$mylocale) dans un autre contrôleur.
OriginalL'auteur Athlan
Je pense qu'il y a une plus belle façon de le faire :
OriginalL'auteur Clawfire
OriginalL'auteur JRT
Dans mon cas, fonctionne parfaitement cette solution:
OriginalL'auteur Kunegunda Gburia-Furia
Un invokable est une classe qui peut être construit sans aucun argument. Depuis notre MyModule\Controller\FooController a maintenant un argument obligatoire, nous avons besoin de changer cela. Un usine est une classe qui crée des instances d'une autre classe. Nous allons maintenant créer un pour notre FooController. Nous allons modifier notre module.config.php fichier comme ceci:
Nous allons mettre en œuvre notre usine de classe, pour cela, créer un nouveau dossier dans \module\MyModule\src\MyModule\Usine et le nouveau fichier appelé FooControllerFactory.php:
Utilisons maintenant le $traducteur au sein de notre FooController. Pour cela, nous devons remplacer la valeur par défaut __contruct():
Dans mon cas, fonctionne très bien!!!
OriginalL'auteur Carles
Vous pouvez le faire de cette façon:
OriginalL'auteur Pervaiz Iqbal