8

我没有看到任何机制来引用将由模板解析器重写的视图中的语言键。现在,我的视图包含如下字符串:

{register}
{userid}
{password} 

我希望将这些替换为语言定义中的匹配字符串,就好像我在视图中完成了一样:

   <?=$this->lang->line('register')?>
   <?=$this->lang->line('userid')?>
   <?=$this->lang->line('password')?> 

但是,我没有看到任何自动支持这一点的机制。所以,我在控制器中这样做:

$data = array(
'userid' => $this->lang->line('userid'),
'password' => $this->lang->line('password'),
'register' => $this->lang->line('register')
);
$this->parser->parse('register', $data); 

这对我来说似乎很愚蠢。我认为模板解析器类应该自动支持任何定义的语言键的扩展。也许通过使用第二组分隔符:

[register]
[userid]
[password] 

或者也许通过使用某个指标,如下划线:

{_register}
{_userid}
{_password} 

或者也许是 GetText 样式:

_(register)
_(userid)
_(password) 

有人可以告诉我我正在寻找的功能是否真的可用而我只是错过了它?否则,我的建议是否合理,或者是否有更好的替代想法?

4

1 回答 1

6

不幸的是 CI 的内置模板解析器类没有这个功能。您可以在sparks 目录中查看,有多个 spark 集成了许多模板引擎,如 smarty 或 twig,可以调整以创建类似的东西。

此外,您可以尝试扩展CI_Parser类为您执行此操作,如下所示:

<?php

class MY_Parser extends CI_Parser {

    const LANG_REPLACE_REGEXP = '!\{_\s*(?<key>[^\}]+)\}!';
    public $CI = null;

    public function parse($template, $data, $return = FALSE) {
        $this->CI = get_instance();
        $template = $this->CI->load->view($template, $data, TRUE);
        $template = $this->replace_lang_keys($template);

        return $this->_parse($template, $data, $return);
    }

    protected function replace_lang_keys($template) {
        return preg_replace_callback(self::LANG_REPLACE_REGEXP, array($this, 'replace_lang_key'), $template);
    }

    protected function replace_lang_key($key) {
        return $this->CI->lang->line($key[1]);
    }
}

这将{_ password}用什么替换类似的部分$this->lang->line('password')。可以针对您喜欢的版本调整模式。

把它放在下面application/libraries/MY_Parser.php,CI 应该会选择它,不需要更改控制器代码,如扩展本机库部分中所述。

于 2012-08-18T19:38:43.040 回答