Salve,
Sto realizzando un template engine in un contesto multilanguage.
Dispongo dei seguenti file:
- home.php
- home.html.tpl
- languages/en.php
- languages/it.php
- configurazione.php
- template.php
Per il momento analizziamo la parte dedicata alle lingue:
configurazione.php
Codice PHP:
<?php
//Lingua di default
$defaultlang = "it";
//Cartella dei file di lingua (relativa in base alla posizione del file di config)
$langpath = "languages";
//Iniziamo ad avviare le sessioni (toglietelo se già le avete aperte)
session_start();
//Se esiste la variabile di sessione 'lingua'
if (isset($_SESSION['lingua'])) {
//Se esiste il parametro WEB inviato tramite GET 'lang'
if(isset($_GET['lang'])) {
//Effettuiamo qualche aggiusto per eventuali hack...
$_GET['lang'] = str_replace("/","", trim(strtolower($_GET['lang'])));
//Se esiste il file di lingua corrispondente al parametro GET richiesto
if (is_file($langpath."/".$_GET['lang'].".php")) {
//Imposta la sessione 'lingua' con la lingua scelta
$_SESSION['lingua'] = $_GET['lang'];
//Altrimenti
} else {
//Imposta la sessione 'lingua' in quella di default
$_SESSION['lingua'] = $defaultlang;
}
}
//Altrimenti
} else {
//Imposta la sessione 'lingua' in quella di default
$_SESSION['lingua'] = $defaultlang;
}
//Finalmente includiamo il file di lingua giusto
include($langpath."/".$_SESSION['lingua'].".php");
?>
languages/it.php
Codice PHP:
<?
//Impostiamo data, ora e giorni della settimana, insomma tutto in italiano
setlocale(LC_ALL, "it_IT");
//Iniziamo quindi con i contenuti in italiano del sito
$trad['titolo'] = "BlaBlaBla";
$trad['autore'] = "Bla....";
?>
Ora il template:
template.php
Codice PHP:
<?
class sysTemplate
{
var $template;
function sysTemplate($ts=array(),$cache='d_cache.txt',$sec=3600,$tpl='tpl.html')
{
if(!$this->template=$this->r($cache,$sec))
{
(@file_exists($tpl))?$this->template=@file_get_contents($tpl):die('
Attenzione: Il file '.$tpl.' non è presente');
$this->parserT($ts,$cache);
}
}
function parserT($ts,$cache)
{
if(@count($ts)>0)
{
foreach($ts as $t=>$d)
{
$d=(@file_exists($d))?$this->getFile($d):$d;
$this->template=@str_replace('{'.$t.'}',$d,$this->template);
}
$this->buildCache($cache,$this->template);
}else{
die('Attenzione: impossibile eseguire il replace dei tags.');
}
}
function getFile($doc)
{
@ob_start();
include($doc);
$contenuto=@ob_get_contents();
@ob_end_clean();
return $contenuto;
}
function buildCache($cache,$contenuto)
{
$f=@fopen($cache,'w');
@fwrite($f,$contenuto);
@fclose($f);
}
function r($cache,$sec)
{
if(@file_exists($cache)&&@filemtime($cache)>(@time()-$sec))
{
return @file_get_contents($cache);
}
return false;
}
function show()
{
return $this->template;
}
}
?>
e i file:
home.php
Codice PHP:
<?php
//Recupero il valore di lang
$lang = $_GET['lang'];
//Se la variabile lang è nulla viene selezionata di default
//la lingua italiana (it)
if ($lang == FALSE)
{
$lang = "italiano";
}
//Includo il file di linguaggio interessato
require("languages/{$lang}.php");
includeLang('home');
//Aggiungo dei link per cambiare la lingua
echo "Scelta:
";
echo "[url='" . $_SERVER[']IT[/url] - ";
echo "[url='" . $_SERVER[']EN[/url]";
@require_once('template.php');
$temp=&new sysTemplate($ts,'cache.txt',0,'home.tpl.html');
echo $temp->show();
?>
e home.html.tpl
Codice PHP:
<html>
<head>
<title>{titolo}</title>
<meta
http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="style.css" />
</head>
<head>
<body>
<div id="autore">{autore}</div>
</body>
</html>
Purtroppo per quanto riguarda le lingue sono riuscito a risolvere in questo modo.
Ma nel momento in cui lo devo combinare con il template engine, ho dei problemi.
Vorrei ottenere che la pagina HOME.PHP ricevi la lingua da languages/IT.PHP e il template da HOME.HTML.TPL e che in quest'ultimo io possa utilizzare il {titolo} estrapolandolo dal file di lingua:
$trad['titolo'] = "BlaBlaBla";
Mentre invece questa cosa non avviene.. E mi stampa sempre {titolo} cosi come è scritto senza leggere nulla dal file di lingua.
Sono sicuro di aver sbagliato il template engine, e di non saperlo utilizzare per il mio scopo.
Potreste aiutarmi a delucidare i miei dubbi e fare luce sui miei errori sia in pratica (aiuto con esempio di codice) sia in logica (dal momento in cui non costruisco un sito web, ma voglio studiare e imparare tutto su questi affascinanti linguaggi di programmazione
)
Grazie infinite per tutto coloro che si accingeranno a leggere e "capire" il mio problema (spiegato malissimo ^-^')