8

テンプレートパーサーによって書き換えられるビュー内で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); 

これは私にはかなりばかげているようです。テンプレートパーサークラスは、定義されたlanguage_keysの拡張を自動的にサポートする必要があると思います。おそらく、区切り文字の2番目のセットを使用することによって:

[register]
[userid]
[password] 

または、アンダースコアなどの特定のインジケーターを使用することもできます。

{_register}
{_userid}
{_password} 

または、おそらくGetTextスタイル:

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

私が探している機能が実際に利用可能で、私がそれを見逃したかどうか誰かに教えてもらえますか?そうでなければ、私の提案は合理的だと思われますか、それとももっと良い代替案がありますか?

4

1 に答える 1

6

残念ながら、CIの組み込みテンプレートパーサークラスにはこの機能がありません。あなたはsparksディレクトリを見回すことができます、このようなものを作成するために微調整することができるsmartyまたはtwigのような多数のテンプレートエンジンを統合する複数のsparksがあります。

また、次のようにクラスを拡張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 に答える