我没有看到任何机制在视图中引用将由模板分析器重写的language_key。现在,我的视图包含如下字符串:
{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);
这对我来说似乎很愚蠢。我认为Template Parser类应该自动支持任何已定义的language_keys的扩展。也许通过使用第二组分隔符:
[register]
[userid]
[password]
或者可能使用某个指标,如下划线:
{_register}
{_userid}
{_password}
或者也许是GetText风格:
_(register)
_(userid)
_(password)
有人可以告诉我,我正在寻找的功能是否实际可用,我只是错过了它?否则,我的建议看起来是否合理,或者是否有更好的替代想法?
答案 0 :(得分:6)
不幸的是,CI内置的模板解析器类没有此功能。您可以在sparks directory中查看,有多个火花集成了许多模板引擎,如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应该选择它,不需要更改控制器代码,如Extending Native Libraries部分所述。