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!

Assegnare una variabile costante ad una funzione in Javascript

Spesso mi è capitato di dover dichiarare un valore da utilizzare successivamente all’interno di una funzione, potrebbe poi esserci la necessità che tale valore possa essere utilizzato nuovamente nel momento in cui la funzione venga chiamata più volte.

Pensiamo ad esempio ad una funzione che fa da contatore e restituisce un ID differente ogni volta che viene chiamata, certo potremmo dichiarare una variabile globale ma ciò sicuramente “inquinerebbe” il namespace inutilmente.
Possiamo però dichiarare delle proprietà personalizzate della funzione:

contatore.id = 0;
function contatore() {
    return contatore.id++;
}

contatore(); // restituisce 0
contatore(); // restituisce 1
contatore(); // restituisce 2 .... ecc

Verificare il numero di argomenti passati ad una funzione in Javascript

Potremmo trovarci nella necessità di verificare se il numero di argomenti passati ad una funzione che abbiamo precedentemente dichiarato sia uguale al numero di argomenti che noi avevamo previsto per tale funzione.
In questo caso possiamo ricorrere all’oggetto arguments e alla sua proprietà callee che viene utilizzata per chiamare la funzione a cui arguments fa riferimento:

function verificaArguments(args) {
    var parametri_passati = args.length,
        parametri_previsti = args.callee.length;
    if (parametri_passati != parametri_previsti) {
        throw new Error("Numero di argomenti passari errato; Previsti: " + parametri_previsti + ", parametri passati " + parametri_passati);
    }
}

Tale funzione può essere utilizzata in modo semplicissimo:

function somma(a,b) {
    verificaArguments(arguments); // Se i parametri passati sono diversi lancerà un'eccezione come previsto
    return a + b;
}

Creare un effetto parallasse con le trasformazioni CSS 3d e jQuery

Il parallasse è un effetto ottico che fa sembrare che un oggetto si sposti cambiando il nostro punto di vista, questo è dettato dal fatto che l’oggetto è più vicino a noi rispetto allo sfondo e di conseguenza si sposterà più velocemente di quest’ultimo.
Creare un effetto parallax basilare con javascript/jquery è più semplice di quel che si potrebbe pensare:

///////////////////
//  PARALLASSI  ///
///////////////////
//  Per il funzionamento dello script è sufficiente assegnare agli
//  elementi che devono scrollare due "custom data":
//  data-type="vertical_parallax"
//  data-speed="1"
//  Impostando data-speed a "1" lo scorrimento sarà alla stessa velocità
//  della pagina; sono contemplati anche valori negativi o decimali.

//  Dichiarazione delle variabili
var win = $(window);              
$('[data-type="vertical_parallax"]').each(function(){

    //  Dichiarazione delle variabili
    var elm = $(this);
   
    //  Gestione dell'evento on scroll        
    win.on('scroll', function() {    

        //  Trasformo il valore di "speed" moltiplicandolo per la distanza
        //  dal top della finestra;              
        var position = -(win.scrollTop() * elm.data('speed'))/10,

        //  Assemblo la stringa per la proprietà CSS
            vertical_translate = 'translate3d(0,' + position + 'px, 0px)';

        //  Assegno all'elemento la nuova posizione
        elm.css({
            WebkitTransform : vertical_translate,
            MoxTransform : vertical_translate,
            transform : vertical_translate
        });

    }); // Fine Window scroll
}); // Fine each elements

Come commentato all’interno del codice per funzionare è sufficiente assegnare due attributi custom all’elemento che vogliamo che abbia l’effetto:

<div data-speed="1.8" data-type="vertical_parallax">
    <img src="/img/immagine.png">
</div>

Ed il gioco è fatto.

È possibile ottenere questo effetto anche in altri modi, utilizzando altre proprità CSS ma, sfruttando transform3d sfrutteremo la GPU e lo scorrimento e il movimento saranno estremamente più fluidi!
NB: Ricordo che è necessario avere incluso jQuery perchè il codice funzioni

Scoprire se una mail è valida in PHP

Ci sono molti modi per scoprire se un input contiene un’e-mail sintatticamente valida ma, a mio avviso, quello più leggibile e chiaro è:

$email = "matt@lessons.com";
$not_email = "matt@lesson";
echo filter_var($email, FILTER_VALIDATE_EMAIL); // true
echo filter_var($not_email, FILTER_VALIDATE_EMAIL); // false