Premessa: dico BILINGUE e non multilingue per semplicità, perché documentandomi ho scoperto che realizzare un sito con molte lingue è un'impresa assai complicata, specie quando si devono supportare lingue molto diverse tra loro. Quindi parlo di un sito di 2, 3 o 4 lingue al massimo, tutte abbastanza simili tra loro.
La questione è la seguente: qual è il miglior modo di gestire un sito bilingue in PHP?
Ovviamente non cerco una risposta secca, perché non c'è. Le possibilità sono tante, ma sarei curioso anche di sapere quali sono le vostre esperienze in merito.
Una possibile soluzione che posso dire di aver sperimentato è quella di creare 2 directory, ad esempio /IT e /EN, mettendoci dentro i file di testo nella rispettiva lingua. Questi verranno poi caricati dinamicamente con include(), file_get_contents() o quello che volete voi. Per esperienza posso dire che non è un bel modo di gestire la cosa, o perlomeno non il migliore. Può andar bene finché si tratta di un sitarello di dieci - quindici pagine, ma se sono centinaia la cosa comincia ad essere molto pesante da gestire.
Sto cercando soluzioni nuove, dinamiche, flessibili e scalabili. Meglio se orientate agli oggetti.
Qualcuno usa classi Template personalizzate, facendo cose di questo genere:
Codice PHP:
// Avvio la sessione e carico il template
session_start();
$_SESSION['language'] = 'IT'; // oppure 'EN', o 'FR' ecc...
Template::load( '<page_name>', $_SESSION['language'] );
// Dove il metodo `load()` potrebbe essere qualcosa del genere:
public function load( $page_name, $language ) {
// Costruisco il path relativo al template
$file_handle = fopen( PATH_TO_TEMPLATES . $language . "/" . $page_name );
// Eccetera eccetera... questo è solo un esempio.
}
Ma il mio dubbio più grande è: se ho delle variabili all'interno delle stringhe, come mi devo comportare?!
In questo caso l'unica soluzione efficace che mi viene in mente è di usare i placeholder. Per esempio:
Codice PHP:
$string->IT = "Hai concluso %1 sondaggi su %2";
$string->EN = "You have completed %1 out of %2 surveys";
$string->ES = "Tú has completado %1 de %2 encuentas";
// Dove chiaramente %1 e %2 vengono sostituiti da variabili
Ma cose del genere in PHP non esistono, o almeno non che io sappia.
Quali sono, quindi, le "best practices" da seguire quando si devono supportare più lingue?
Ho sentito parlare di Smarty, mi farebbe piacere sentire il parere di chi lo conosce.
Ringrazio in anticipo per l'aiuto.