Creare e gestire un sito multilingua (testo dinamico)

Libri accostati con titoli di varie lingue

Un sito multilingua, per essere efficiente, può appoggiarsi a un database, in modo da permettere all’utente stesso di modificare i propri testi (1)

Nello scorso articolo abbiamo visto come impostare il codice per tradurre un sito in multilingua. Il codice permetteva di tradurre il sito in una o più lingue facendo riferimento a pochi file fisici da modificare.
In quell’esempio la connessione al database ci serviva soltanto per estrarre la lingua di default da far comparire e non era indispensabile: l’estrazione poteva essere sostituita facilmente da un controllo manuale del get. Ma in quel caso avevamo a che fare con del testo statico.

Come dobbiamo comportarci, invece, con il testo dinamico? Per intenderci, mi riferisco ai campi di database estratti e quindi stampati a video, che devono essere tradotti in base alla lingua scelta.
Esistono, come sempre, diversi approcci per arrivare alla soluzione: ve ne propongo uno elementare, che si rifà all’articolo precedente. Consiglio quindi di riguardarlo e di scaricarvi lo script, perché le basi usate saranno le stesse. In particolare tenete presente:
– la tabella “lingua”, che contiene i prefissi delle lingue usate nel sito
– la creazione della costante LANG, che contiene il prefisso della lingua corrente

In fondo vedremo inoltre un metodo più elegante per gestire la lingua. In base all’indirizzo IP dell’utente, ricaveremo lo Stato di provenienza e, di conseguenza, la sua lingua.

Gestione dei campi nel database

Una volta ottenuta la costante LANG, l’estrazione dal database avviene con lo stesso concetto dei testi statici. L’unica differenza è che qui non abbiamo un file fisico da importare (nessun “lingua_it.php” o “lingua_en.php”): per ogni lingua, dovremo invece creare un campo aggiuntivo del testo voluto.
Se per esempio abbiamo un campo chiamato “descrizione_it” e nel sito dobbiamo gestire anche la lingua inglese, dovremo affiancargli anche il campo “descrizione_en” che conterrà la dovuta traduzione.


Mettiamo, per esempio, di dover estrarre il record con id=1 dalla tabella. Per stampare a video la descrizione nella lingua corrente basta aggiungergli il prefisso della costante:

1
2
3
$query=mysql_query("SELECT * FROM tabella WHERE id=1", DB);
$row=mysql_fetch_array($query);
echo $row["descrizione_".LANG];

Un sistema alternativo: estrarre il prefisso della lingua in base all’IP dell’utente

Poniamo il caso che il sito non abbia link per il cambio della lingua. Alcuni clienti più esigenti, infatti, potrebbero richiedere di estrarre la lingua voluta in base allo Stato di provenienza dell’utente.
Per fortuna esiste un sistema per farlo, e cioè analizzando l’IP di provenienza dell’utente (sempre se l’IP dell’utente non è schermato, per esempio attraverso l’uso di proxy).
Nota: lo script di base è stato preso tempo fa e non ricordo la fonte. Se qualcuno volesse rivendicarlo “come proprio”, me lo faccia sapere che provvederò a segnalarlo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$v="";
$v=(!empty($_SERVER['REMOTE_ADDR']))?$_SERVER['REMOTE_ADDR'] :((!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? $_SERVER['HTTP_X_FORWARDED_FOR']: @getenv('REMOTE_ADDR'));
if(isset($_SERVER['HTTP_CLIENT_IP']))
	$v=$_SERVER['HTTP_CLIENT_IP'];
$ip_cal=htmlspecialchars($v,ENT_QUOTES);
$ip=sprintf("%u",ip2long($ip_cal));

$sq="SELECT country_code, country_name FROM ip2c WHERE ".$ip." BETWEEN begin_ip_num AND end_ip_num";

$r=mysql_query($sq);

if(mysql_num_rows($r)!=0){
	$risposta=mysql_fetch_array($r);
	define("LANG", strtolower($risposta['country_code']));
}else
	define("LANG","it");

Non dovete modificare niente di questo codice, a eccezione della lingua di default (che nel nostro caso è l’italiano, impostato nell’else).
Naturalmente in questo caso sarà estratto un prefisso diverso per ogni Stato di provenienza. Se volete gestire soltanto due lingue, per esempio l’inglese e l’italiano facendo in modo che qualsiasi utente estero abbia la lingua inglese, dovrete modificare lo script in questo modo:

1
2
3
4
5
6
7
8
if(mysql_num_rows($r)!=0){
	$risposta=mysql_fetch_array($r);
	if(strtolower($risposta['country_code'])!=="it")
		define("LANG", "en");
	else
		define("LANG","it");
}else
	define("LANG","it");

Nel vostro database dovrete avere una tabella chiamata “ip2c” contenente l’elenco dei vari Stati, a cui è associato un range di indirizzo ip e il prefisso della lingua da usare. Trovate il dump della tabella nello script da scaricare.

Copyright immagini

(1) http://traduzioniegiappone.wordpress.com/2011/03/09/sul-perche-studiare-le-lingue/

Etichette:, , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *