2

我在我的项目中使用 PHPTAL,除了我想使用它的 i18n 服务之外,我几乎可以在所有情况下成功实现它。我经常收到错误“调用非对象上的成员函数”

我已经尝试搜索网络论坛等,但没有找到任何解决方案,如果有人可以帮助我,我将不胜感激。

4

1 回答 1

4

没有人回答我的问题真是令人失望,所以在这里我终于有了解决方案并回答了我自己的问题。

默认情况下,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:attributesi18n:translate属性正常工作。

干杯...

于 2010-03-07T03:32:36.537 回答