我在我的项目中使用 PHPTAL,除了我想使用它的 i18n 服务之外,我几乎可以在所有情况下成功实现它。我经常收到错误“调用非对象上的成员函数”
我已经尝试搜索网络论坛等,但没有找到任何解决方案,如果有人可以帮助我,我将不胜感激。
我在我的项目中使用 PHPTAL,除了我想使用它的 i18n 服务之外,我几乎可以在所有情况下成功实现它。我经常收到错误“调用非对象上的成员函数”
我已经尝试搜索网络论坛等,但没有找到任何解决方案,如果有人可以帮助我,我将不胜感激。
没有人回答我的问题真是令人失望,所以在这里我终于有了解决方案并回答了我自己的问题。
默认情况下,PHPTAL 没有设置翻译器来将您的文本从一种语言翻译成另一种语言。所以你必须自己做。下面有一些步骤可以做到这一点。. .
步骤 1.创建一个新的 php 文件(例如MyTranslator.php)并生成一个新类,例如PHPTAL_MyTranslator并将其存储在 PHPTAL 文件夹中。此类将实现接口PHPTAL_TranslationService。这个接口有五个功能,但我们关心的功能只有translate。因此,只需为其余函数添加声明并为 translate 函数编写代码。我在我的案例中编写和使用的课程是:
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类的构造函数。向该函数添加一行,如下所示。. . . .
前
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')) {
............
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:attributes和i18n:translate属性正常工作。
干杯...