Creare un sito multilingua in PHP

Per gestire un sito multilingua nei CMS spesso ci vengono in aiuto i plugin ma nel caso di siti molto semplici e con poche pagine potremmo anche pensare di non avere la necessità di creare un pannello back-end e quindi di ritrovarci a dover gestire più lingue.
Creare molti files separati probabilmente è la prima idea che potrebbe venirci in mente ma, francamente, non è certo la migliore!
Il concetto alla base è molto semplice: sfruttare un array in PHP che contenga le varie parole o i testi che dovranno essere inseriti all’interno del sito; ciascuna lingua avrà un array con lo stesso nome che conterrà i testi localizzati e includeremo solo quello della lingua desiderata.
Vediamo come:

<?php
// la lingua può essere selezionata passando un valore in GET all'attributo 'lang'
// rileviamo se esiste un parametro get per 'lang' e lo assegniamo alla variabile $lang
if(isSet($_GET['lang'])) {
    $lang = $_GET['lang'];
// in caso contrario rileviamo la lingua preferita del browser dell'utente
// e la assegniamo alla variabile
} else {
    $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
}

// Verifichiamo se il valore di $lang corrisponde ad una delle lingue
// di cui il nostro sito dispone e assegnamo il valore corretto alla varibile
// impostando come default l'inglese per far si che internazionalmente
// venga visualizzato l'inglese
switch ($lang){
    case 'it':
        $lang = 'it';
        break;
    case 'en':
        $lang = 'en';
        break;        
    default:
        $lang = 'en';
        break;
}
// includiamo il file contenente l'array con le traduzioni corrispondente
// alla lingua ricavata qui sopra
require_once 'lang/lang.'.htmlspecialchars($lang).'.php';

Com’è facile intuire dal codice nella nostra ‘index.php’ ora abbiamo a disposizione un codice identificativo di una lingua non solamente scelta dall’utente ma persino rilevata in automatico dalle preferenze del browser; ora non ci resta che creare gli array contenenti le traduzioni e poi integrarle nell’HTML, iniziamo con l’italiano:

<?php
/*
------------------
Language: Italian
------------------
*/

 
$lang = array();

$lang['PAGE_TITLE'] = "Sito Multilingua";
$lang['PAGE_HEADER'] = "Questo &egrave; un sito multilingua!";

Salviamo il file all’interno della cartella “lang” nominandolo “lang.it.php” e creaiamo quello per l’inglese:

<?php
/*
------------------
Language: English
------------------
*/

 
$lang = array();

$lang['PAGE_TITLE'] = "Multilanguage Website";
$lang['PAGE_HEADER'] = "This is a multilanguage website!";

Salviamo anche questo file all’interno della cartella “lang” nominandolo “lang.en.php” e procediamo infine ad inserire le variabili nell’index (sotto al codice PHP mostrato all’inizio dell’articolo)

<!-- codice all'inizio dell'articolo -->
<!DOCTYPE html>
<html>
<head>
    <title><?php echo $lang['PAGE_TITLE']; ?></title>
    <meta charset="utf-8">
    <meta name="robots" content="index, follow" />
</head>
<body>
    <h1><?php echo $lang['PAGE_HEADER']; ?>
</body>

</html>

Come avete visto nel sorgente dell’index è possibile tradurre anche i vari tag all’interno dell’head permettendoci così di ottimizzare anche la SEO del nostro sito, lo step successivo potrebbe essere quello di ottimizzare l’URL per renderlo più user-friendly utilizzando il la mod_rewrite del file .htaccess.
Ed ecco concluso il nostro sito multi-lingua!
Possiamo ovviamente gestire quanti testi e lingue desideriamo (nel limite del buon senso) ed aggiungerli agli array.
Ci sono molte strade per sviluppare un sito multi-lingua questa è sicuramente tra le più immediate anche se probabilmente ce ne sarebbero di più corrette come ad esempio l’utilizzo dell’estensione PHP gettext che utilizza i files .po e .mo oppure, banalmente, l’utilizzo di un database per archiviare le varie lingue ma per siti di piccole dimensioni la soluzione sopra spiegata funziona egregiamente!

Generare un file CSS con PHP

Mi è capitato, di recente, di dover passare dei parametri da PHP a CSS; Nello specifico, dopo aver creato un pannello di controllo per le opzioni di un tema wordpress ho avuto la necessità di dare la possibilità di modificare lo schema colori direttamente da wordpress utilizzando un colorpicker.
Ho analizzato le possibili soluzioni e quella più comoda sarebbe stata incorporare il CSS direttamente nell’head del file comprendendolo tra i due tag <style></style> ma, così facendo avrei generato una query in più ad ogni refresh della pagina.
La conclusione è stata quella di generare/aggiornare un file CSS ogni qual volta venisse salvato nel Database il valore del colorpicker:

<?php
function kldg_make_stylesheet( $url, $file_name, $output_name ) {
    ob_start(); // Attivo il buffering output
    require($url . $file_name); // Genera il CSS
    $css = ob_get_clean(); // Ottieni il CSS dal buffer
    file_put_contents($url . $output_name, $css, LOCK_EX); // Salva il CSS
}

// chiamo la funzione passando i parametri del file che voglio generare
kldg_make_stylesheet('css/', 'stylesheet.php', 'style.css');

Il file ‘css/stylesheet.php’ poi potrà contenere un codice di questo tipo:

<?php header("Content-type: text/css");  $main_color = '#f00';  ?>
body {
background-color: <?php echo $main_color ?>;
}

Chiudere un file in PHP

Per chiudere un file precedentemente aperto con fopen() in PHP possiamo utilizzare il metodo fclose():

$file = '/percorso/di/file.txt';
$handle = fopen($file, r);
fclose($handle);

Di seguito modalità di apertura dei file del metodo fopen() e relativa descrizione:

Modo Descrizione
‘r’ Apre il file in sola lettura e posiziona il puntatore all’inizio del file.
‘r+’ Apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file.
‘w’ Apre il file in sola scrittura, posiziona il puntatore all’inizio del file e ne cancella tutto il contenuto. Se il file non esiste viene creato.
‘w+’ Apre il file in lettura e scrittura, posiziona il puntatore all’inizio del file e ne cancella tutto il contenuto. Se il file non esiste viene creato.
‘a’ Apre il file in sola scrittura e posiziona il puntatore alla fine del file. Se il file non esiste viene creato.
‘a+’ Apre il file in lettura e scrittura e posiziona il puntatore alla fine del file. Se il file non esiste viene creato.
‘x’ Crea e apre il file in sola scrittura e posiziona il puntatore all’inizio del file. Se il file esiste già il metodo fopen() ritornerà FALSE e genererà un errore E_WARNING.
‘x+’ Crea e apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file. Se il file esiste già il metodo fopen() ritornerà FALSE e genererà un errore E_WARNING.
‘c’ Apre il file in sola scrittura e posiziona il puntatore all’inizio del file mantenendone il contenuto (l’opposto di w). Se il file non esiste viene creato.
‘c+’ Apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file mantenendone il contenuto (l’opposto di w+). Se il file non esiste viene creato.

Aprire un file locale o remoto in PHP

Se volessimo aprire un file, che sia in locale o in remoto, con PHP potremmo utilizzare il metodo fopen():

$file = '/percorso/di/file.txt';
$handle = fopen($file, r+);
fclose($handle);

Il metodo fopen() accetta vari parametri ma, tipicamente, vengono specificati i primi due: il primo, com’è facilmente intuibile è l’indirizzo del file; il secondo è il metodo con il quale viene aperto il file:

Modo Descrizione
‘r’ Apre il file in sola lettura e posiziona il puntatore all’inizio del file.
‘r+’ Apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file.
‘w’ Apre il file in sola scrittura, posiziona il puntatore all’inizio del file e ne cancella tutto il contenuto. Se il file non esiste viene creato.
‘w+’ Apre il file in lettura e scrittura, posiziona il puntatore all’inizio del file e ne cancella tutto il contenuto. Se il file non esiste viene creato.
‘a’ Apre il file in sola scrittura e posiziona il puntatore alla fine del file. Se il file non esiste viene creato.
‘a+’ Apre il file in lettura e scrittura e posiziona il puntatore alla fine del file. Se il file non esiste viene creato.
‘x’ Crea e apre il file in sola scrittura e posiziona il puntatore all’inizio del file. Se il file esiste già il metodo fopen() ritornerà FALSE e genererà un errore E_WARNING.
‘x+’ Crea e apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file. Se il file esiste già il metodo fopen() ritornerà FALSE e genererà un errore E_WARNING.
‘c’ Apre il file in sola scrittura e posiziona il puntatore all’inizio del file mantenendone il contenuto (l’opposto di w). Se il file non esiste viene creato.
‘c+’ Apre il file in lettura e scrittura e posiziona il puntatore all’inizio del file mantenendone il contenuto (l’opposto di w+). Se il file non esiste viene creato.