В моем приложении ZF 1.11 я сохраняю свой переводчик в реестре следующим образом:
Zend_Registry::set('Zend_Translate', $translator);
Поэтому, по моему мнению, скрипты я могу получить доступ к переводчику следующим образом:
$this->translate('abc');
Есть ли какой-нибудь умный способ использовать этот вызов:
$this->_('abc');
Использование $ this-> translate загромождает взгляды, и многие люди привыкли видеть _ () в любом случае.
В то время как я в целом согласен с тем, что имена функций / методов должны быть значимыми, я также согласен с тем, что _()
для переводов является широко используемым стандартом и поэтому приемлемым.
Вы можете сделать это, добавив обертки к вашим промежуточным слоям. Например, следующее может сделать этот метод доступным для всех ваших контроллеров, полученных из MyProject_Controller_Action
:
class MyProject_Controller_Action extends Zend_Controller_Action { protected $translator; public function init() { $this->translator = Zend_Registry::get('Zend_Translate'); } /** * Translator wrapper * * @param string $string The string to be translated * @return string $translated The translated string */ protected function _($string) { $translated = $this->translator->translate($string); return $translated; } }
Конечно же, это можно сделать и с Zend_View
.
Отказ от ответственности: это не самая лучшая практика, чтобы загромождать ваш код прямыми вызовами в реестре. На самом деле это анти-шаблон, который следует заменить DI. Zend Framework 2
упростит нам работу с реестром. Этот код можно было бы улучшить, фактически введя объект трансляции в класс через конструктор.
Нет, не то, что я знаю. В любом случае есть несколько неявных вопросов, связанных с этим. Во-первых, вы должны всегда давать функции (и переменные, если на то пошло) значимые имена . Тем не менее, __()
не является значимым именем вообще. Наоборот, это не имеет никакого значения. Во-вторых, считается лучшей практикой префикс только private
и protected
функций (и, опять же, переменных, если на то пошло) с подчеркиванием.
Наконец, благодаря тому, как работают помощники вида zend view, вам в значительной степени придется сортировать «трюк» системы, чтобы найти ваш помощник вида, если он был назван __ (). Вы должны называть его чем-то вроде Zend_View_Helper___
и это не сработает. Не говоря уже о том, что это повлечет за собой необходимость называть ваш файл __.php
.
Полагаю, вы могли бы назвать своего помощника Zend_View_Helper_T
, и в этом случае вы могли бы перевести материал, используя $this->t($string);
(Я тестировал это, и он работает), но снова вы всегда должны использовать значащие имена .
редактировать
Не осознав, что вы хотели называть это изнутри контроллера до сих пор, я решил пересмотреть свой ответ и дать небольшую обратную связь о комментарии, который я получил от избирателя.
Трудно рекомендовать создать класс-оболочку для Zend_Controller_Action
в котором можно создать функцию _()
по следующей причине:
Тем не менее, решение markus было отличным от имени функции (по причинам, указанным ранее). Единственное, что я бы изменил, это вызов функции Zend_Registry::get()
в функции _()
. Если вы планируете вызывать эту функцию столько, сколько вы намекали, то что-то вроде этого может работать лучше:
class MyProject_Controller_Action extends Zend_Controller_Action { /** * the translator object * @var Zend_Translate */ protected $_translator; public function init() { $this->_translator = Zend_Registry::get('Zend_Translate'); } /** * note my new method name, you don't have to use it but I still * recommend it. the name is just a suggestion, if you prefer something * like _translate() or _trnslte() then by all means (although I don't * recommend abbreviations unless they're super obvious I guess). */ protected function _trans($string) { return $this->_translator->translate((string) $string); } }