【问题标题】:codeigniter template engine including language parsercodeigniter 模板引擎,包括语言解析器
【发布时间】:2012-08-18 05:48:28
【问题描述】:

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

{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) 

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

【问题讨论】:

    标签: php codeigniter template-engine


    【解决方案1】:

    不幸的是,CI 的内置模板解析器类没有此功能。您可以在 sparks directory 中查看,有多个 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]);
        }
    }
    

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

    将它放在application/libraries/MY_Parser.php 下,CI 应该会选择它,无需更改控制器代码,如Extending Native Libraries 部分所述。

    【讨论】:

    • 完美答案!现在在我所有的项目中使用它
    • 如何修改正则表达式以忽略车把模板? {{#each element}}&lt;p&gt;{{name}}&lt;/p&gt;{{/each}}
    • @thiagobraga,只要您的车把块中没有{_,您就应该可以按原样使用该模式。
    • @complex857 对不起,忘了说,我已经完美地使用了你的课程一段时间了,语言翻译来自数据库。但我将 PHP 文件中的语言键修改为 {{i18n_text}}。现在我在视图文件的&lt;script&gt; 标记中使用Handlebars 模板,并且最近修改了{i18n_text} 的语言键以不与Handlebars 冲突,但是正则表达式在这两种情况下都不能正常工作。我认为您的想法很好,也许我将密钥更改为{_i18n_text} 以避免此错误。谢谢!
    • 我认为,如果您在组合中添加一些负面的前瞻/后视,您可以使其工作,例如:#(?!\})\{i18n_(?&lt;key&gt;[^\}]+)\}(?!\})# 应该只匹配{i18n_text},如果没有额外的{ } 在它周围 (more info here)。
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2016-09-04
    • 2014-09-19
    • 2018-02-08
    • 2012-12-30
    • 2018-11-09
    • 2013-01-31
    相关资源
    最近更新 更多