PHPTAL i18n Вызов функции-члена для необъектной ошибки - PullRequest
2 голосов
/ 25 февраля 2010

Я использую PHPTAL в своем проекте, я могу успешно реализовать его почти во всех случаях, кроме случаев, когда я хочу использовать его сервисы i18n. Я постоянно получаю сообщения об ошибках "Вызов функции-члена для необъекта"

Я пробовал искать в сетевых форумах и т. Д., Но не нашел никакого решения, буду очень признателен, если кто-нибудь мне поможет.

1 Ответ

4 голосов
/ 07 марта 2010

От всей души разочаровывает, что никто не ответил на мой вопрос, поэтому здесь я наконец-то нашел решение и отвечаю на свой вопрос.

По умолчанию PHPTAL не устанавливает переводчик для перевода вашего текста с одного языка на другой. Так что вы должны сделать это самостоятельно. Ниже приведены некоторые шаги, чтобы сделать это. , .

Шаг 1. Создайте новый файл php (например, MyTranslator.php ) и сгенерируйте новый класс, например PHPTAL_MyTranslator , и сохраните его в папке PHPTAL , Этот класс будет реализовывать интерфейс PHPTAL_TranslationService . В этом интерфейсе пять функций, но наша задача - translate . Так что просто добавьте объявление для остальных функций и напишите код для функции перевода. Класс, который я написал и использовал в моем случае:

<pre><code>class PHPTAL_MyTranslator implements PHPTAL_TranslationService { /** * current execution context */ protected $_context = null; /** * @param string (name of the language) * @return string (language you've just set) * * This method sets translation language. * Name of the language is a dir name where you keep your translation files */ public function setLanguage() { } public function __construct( $context ) { $this->_context = $context; } /** * @param string (translation file name) * @return void * * You can separate translations in several files, and use only when needed. * Use this method to specify witch translation file you want to * use for current controller. */ public function useDomain( $domain ) { } /** * Set an interpolation var. * Replace all ${key}s with values in translated strings. */ public function setVar( $key, $value ) { } /** * Translate a text and interpolate variables. */ public function translate( $key, $htmlescape=true ) { $value = $key; if( empty( $value ) ) { return $key; } while( preg_match( '/\${(.*?)\}/sm', $value, $m ) ) { list( $src, $var ) = $m; if( !array_key_exists( $var, $this->_context ) ) { $err = sprintf( 'Interpolation error, var "%s" not set', $var ); throw new Exception( $err ); } $value = str_replace( $src, $this->_context->$var, $value ); } return gettext( $value ); } /** * Not implemented yet, default encoding is used */ public function setEncoding( $encoding ) { } }

Шаг 2. Теперь откройте файл PHPTAL.php и измените конструктор класса PHPTAL . Добавьте строку к этой функции, как показано ниже. , , , .

До

<pre><code>public function __construct($path=false) { $this->_path = $path; $this->_globalContext = new StdClass(); $this->_context = new PHPTAL_Context(); $this->_context->setGlobal($this->_globalContext); if (function_exists('sys_get_temp_dir')) { ............

После

<pre><code>public function __construct($path=false) { $this->_path = $path; $this->_globalContext = new StdClass(); $this->_context = new PHPTAL_Context(); $this->_context->setGlobal($this->_globalContext); //Set translator here $this->setTranslator( new PHPTAL_MyTranslator( $this->_context ) ); if (function_exists('sys_get_temp_dir')) { .............

Эти два простых шага приведут к правильной работе атрибутов i18n: , а также i18n: translate .

Ура ...

...