PHP翻译和模板引擎



我正在开发我的新CMS,并尝试创建模板引擎。我添加了翻译系统,但效果不好。这是我的模板类:

    <?php
class Template {
    private $vars = array();
    public function assign($key, $value){
        $this->vars[$key] = $value;
    }
    public function render($template_name){
        $path = 'templates/default/'.$template_name.'.html';
        if(file_exists($path)){
            $contents = file_get_contents($path);
            foreach($this->vars as $key => $value){
                $contents = preg_replace('/['.$key.']/', $value, $contents);
            }
            $site_theme = 'default';
            $contents = preg_replace('/<!-- if (.*) -->/', '<?php if($1) : ?>', $contents);
            $contents = preg_replace('/<!-- else -->/', '<?php else : ?>', $contents);
            $contents = preg_replace('/<!-- endif -->/', '<?php endif; ?>', $contents);
            $contents = preg_replace('/<!-- include:(.*) -->/', '<?php include "templates/$site_theme/$1"; ?>', $contents);
            $contents = preg_replace('/<!-- is_logged -->/', '<?php logged() ? include "templates/'.$site_theme.'/logged.html" : logged(); ?>', $contents);
            $contents = preg_replace('/<!-- not_logged -->/', '<?php logged() ? : include "templates/'.$site_theme.'/unlogged.html"; ?>', $contents);
            eval(' ?> '.$contents. ' <?php '); 
        } else {
            // What if i told you template don't exist?
            exit('<h1>Template path don't exist. </h1>');
        }
    }
}
?>

索引:

<?php
        $template = new Template;
    $template->assign('lang_title', $lang['cat_categories']);
    $template->render('index');
?>

翻译文件:

<?php
$lang['db_connect_failed']      = 'Unable connect to database';

$lang['cat_categories']     = 'Categories';
?>

这就是我的问题:当我在templates/default/index.html文件中添加[variable]时,一切都正常,它显示了需要显示的内容。但是,当我在模板中添加include文件时,例如:templates/default/inc/header.html,并且在该文件中添加我的变量,它不起作用。我将该文件包含在我的index.html中,该文件使用PHP或我修改的html注释位于父文件夹中,但它不起作用。我想在包含的文件中添加[lang_translate],或者在页眉或索引中添加$lang['cat_categories'](即使在index.html中也不起作用),以显示翻译。

所有文件路径都正常工作。我现在能做什么?

然后这样做可能会奏效:

// function names migt differ. Check output buffering on php.net
Ob_start();
include index.html;
$contents = ob_get_clean();

现在内容也将具有头文件。顺便说一句,我建议你使用模板引擎。对某人创建的未知模板文件使用eval可能有风险。

最新更新