4

ビューの代わりにコントローラで文字列を翻訳する方法はありますか?

今、私のコントローラーで、次のような文字列を渡すと:

public function indexAction() {
    return array('message' => 'example message');
}

index.phtml で翻訳されます

<?php print $this->translate($message);?>

うまく動作しますが、poeditor はコントローラ ファイルから文字列を見つけることができません

次のようなものを使用できればクールだと思います:

public function indexAction() {
    return array('message' => $view->translate('example message'));
}

コントローラーで

助けてくれてありがとう

4

3 に答える 3

4

ビューのプラグインマネージャーを使用してトランスレーターヘルパーにアクセスしないでください。すでにここで説明したように、翻訳者をつかんでください。

その投稿のコピー/貼り付け:

翻訳はを介して行われTranslatorます。トランスレータはオブジェクトであり、たとえばビューヘルパーに挿入されるため、そのビューヘルパーを呼び出すと、トランスレータを使用して文字列が変換されます。この回答では、スケルトンアプリケーションとまったく同じようにトランスレータを構成したと仮定します。

最良の方法は、ファクトリを使用して、これを依存関係としてコントローラに注入することです。コントローラの設定:

'controllers' => array(
  'factories' => array(
    'my-controller' => function($sm) {
      $translator = $sm->getServiceLocator()->get('translator');
      $controller = new MyModule\Controller\FooController($translator);
    }
  )
)

そしてコントローラー自体:

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;
  }
}

別の方法は、アクションでサービスマネージャーから翻訳者を引き抜くことですが、これは柔軟性が低く、テスト可能性が低く、保守が困難です。

public function fooAction()
{
  $translator = $this->getServiceManager()->get('translator');
}

どちらの場合も$translator->translate('foo bar baz')、文字列の翻訳に使用できます。

于 2013-01-10T18:14:13.020 に答える
3

そのために、単純なプラグインを使用します。次に、コントローラーで $this->translate('example message'); を実行できます。

class Translate extends AbstractPlugin {

    private $translator;

    public function __construct(PluginManager $pm) {
        $this->translator = $pm->getServiceLocator()->get('Translator');        
    }

    public function __invoke($message, $textDomain = 'default', $locale = null) {
        return $this->translator->translate($message, $textDomain, $locale);
    }

}
于 2013-04-09T13:29:41.303 に答える