Sito multilingua: Come indirizzare l’utente automaticamente?
In questo articolo vedremo come implementare una funzionalità molto semplice e che risponde a questa domanda: in un sito multilingua, come posso indirizzare automaticamente il visitatore al giusto sito?
L’operazione come ho detto è semplice e per implementarla svilupperemo uno script facilmente configurabile e adatto alle più svariate situazioni. Sei pronto?
Scenario: sito multilingua
Il nostro ipotetico sito sarà in tre lingue: italiano, inglese e tedesco. Lo script che svilupperemo sarà l’index.php della directory radice del webserver. I tre sottositi saranno invece contenuti nelle cartelle italiano, english, deutsch.

Quello che dovrà fare il nostro index.php è capire quale sia la lingua del visitatore e reindirizzarlo alla cartella corrispondente.
Rilevare il linguaggio
La variabile superglobale $_SERVER["HTTP_ACCEPT_LANGUAGE"] contiene una stringa con delle informazioni relative alla lingua impostata sul browser del visitatore e sarà qualcosa del genere:
it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
Per quello che dobbiamo fare, ci interessano i primi due caratteri di questa stringa che saranno:
- it per l’italiano;
- en per l’inglese;
- de per il tedesco.
Utilizziamo dunque la funzione substr() per isolare questi primi due caratteri:
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
Definire le associazioni
Dichiariamo ora un array associativo nel quale metteremo in relazione le possibili stringhe ottenute con le corrispondenti cartelle
$lang_config = array( "it" => "italiano/", "en" => "english/", "de" => "deutsch/", "default" => "italiano/");
Ho inserito anche una chiave denominata “default”. Come avrai capito indica la cartella da caricare nel caso in cui il visitatore abbia impostato una lingua non supportata dal nostro sito.
Trovare la giusta cartella
A questo punto, per trovare la giusta cartella, non ci resta che vedere se la stringa che abbiamo rilevato all’inizio (it, en, …) è presente come indice dell’array tramite la funzione array_key_exists(). Se lo è, la cartella sarà il valore di quell’indice; in caso contrario utilizzeremo il valore dell’indice “default”.
if(array_key_exists($lang, $lang_config))
{
$location = $lang_config[$lang];
}
else
{
$location = $lang_config['default'];
}
Ed ora non ci resta che reindirizzare:
header('Location: ' . $location);
Ed ecco lo script completo:
<?php
$lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$lang_config = array( "it" => "italiano/",
"en" => "english/",
"de" => "deutsch/",
"default" => "italiano/");
if(array_key_exists($lang, $lang_config))
{
$location = $lang_config[$lang];
}
else
{
$location = $lang_config['default'];
}
header('Location: ' . $location);
?>
Conclusione
Come hai visto, con poche righe di codice, abbiamo potuto sviluppare uno script di facile configurazione ed utilizzo per reindirizzare correttamente i visitatori in un sito multilingua.
Ti è già capitato di dover sviluppare siti del genere? Che soluzioni hai implementato?
37 commenti
Trackback e pingback
-
Articoli della settimana 15/01/2012 | Saverio Gravagnola
[...] Sito multilingua: Come indirizzare l’utente automaticamente? (Your Inspiration Web) [...]




Ciao Maurizio e ben tornato anche a te.
Non credevo che fosse così semplice reindirizzare un sito in base alla lingua, lo proverò sicuramente nel prossimo progetto.
Una domanda, ma per i testi? Crei una versione separata per ogni lingua o esiste un modo per recuperarli dinamicamente usando la stessa struttura xhtml/css?
Bhe, io concordo con te, il metodo descritto da Maurizio è estremamente semplice, ma è anche estremamente confusionario.
Ti rispondo intanto alla domanda: Con questo metodo, bisogna creare una copia del sito in ogni lingua.
Ed ecco perchè è estremamente confusionario. Immagina un sito di 50 pagine nelle 5 lingue principali. Significa 250 pagine da modificare ogni volta. Roba da matti :D
Esiste un metodo (in php, quindi esistono infiniti metodi) per farlo in modo da utilizzare un solo sito e molte lingue.
Io per esempio uso i cookie per salvarmi la lingua scelta dall’utente, nel caso non ne scelga una prendo quella di default del browser. Poi con dei file .ini mi estraggo tutte le stringhe statiche del sito tradotte in lingua e a questo punto, con una apposita classe, traduco tutto.
E’ molto molto più funzionale, ma ovviamente per chi è alle prime armi, risulta abbastanza complicato e quindi il metodo che ha descritto Maurizio risulta il migliore!
Ottimo articolo comunque, ho combattuto molto tempo prima di arrivare a questa soluzione agli albori!
Ciao Tiziano, ciao Nicola.
Il problema delle diverse versioni linguistiche del sito é complesso e che può trovare diverse soluzioni a dipendenza del caso specifico.
Se pensate a YIW, la versione inglese e quella italiana sono su due installazioni distinte di wp.
L’esempio da me portato é un esempio di base e fa ovviamente riferimento ad un ipotetico sito semplicissimo e tendenzialmente statico.
E’ chiaro che nel caso di siti di una certa complessità vanno valutate le possibili soluzioni per rendere agevole il lavoro di traduzione di nuovi contenuti.
Una soluzione potrebbe essere ad esempio l’utilizzo di file di linguaggio (.po).
Ma in ogni caso il principo non cambia. Il senso era mostrare come rilevare automaticamente la lingua dell’utente; poi le decisioni successive, una volta ottenuto questo dato, dovranno essere ovviamente adattate al contesto.
I file .po non li conoscevo :S Vedrò di informarmi, personalmente uso i file ini con parse_ini_file() per ottenere velocemente un array ordinato (e anche multidimensionale)
In realtà è una logica funzionale anche per cms complessi, dipende da come è effettivamente configurato l’applicativo.
Ad esempio con Magento si possono impostare url diverse in base alle store view (visualizzazioni in lingua) facendo comunque riferimento alla stessa installazione.
Per quanto riguarda il formato ad esempio Magento usa i csv, separando i testi in files diversi che vengono caricati in base alle necesitá.
Grazie dell’articolo Maurizio!
Funziona sempre con $_SERVER["HTTP_ACCEPT_LANGUAGE"] ho alle volte su certi server hai avuto problemi?
Se non ricordo male in un vecchio progetto multilingua ho dovuto fare i salti mortali per rilevare questa benedetta lingua…
Che tipo di server era? perché non so se su IIS ad esempio funziona nello stesso modo. io mi riferisco sempre ad apahe
Articolo molto interessante. Mi ha ricordato un’altra questione analoga, quella di impostare in modo automatico una valuta su un ecommerce in base al luogo da cui proviene l’utente. Avevo avuto qualche difficoltà, infatti l’unico modo che avevo trovato era quello di “decodificare” l’ip del client dell’utente, e per fare questo c’era un sito web che offriva grauititamente questo servizio, restituendo una stringa xml, solo che non l’ho trovato molto affidabile. C’è forse qualche metodo piu semplice che mi sfugge?
Non è affidabile perchè decodificando l’ip trovi la posizione del provider e non dell’utente se non sbaglio.
Se decodifico il mio ip, risulta che mi trovo a foggia poichè il mio provider è li, mentre io sono a Lucera.
Comunque ai fini della valuta foggia o lucera sempre euro sono.
@Daniele. E’ sempre più raro trovare ecommerce dove si vende in diverse valute. Questo perché dal punto di vista gestionale é una complicazione immane.
Inoltre, con i sitemi di pagamento online come paypal, viene mostrato l’importo con il corrispondente nella valuta dell’utente.
In realtà l’esigenza del mio cliente era applicare un prezzo per chi usa i dollari e applicarne un’altro per chi usa l’euro come valuta, poi a paypal viene passato il valore in un unica valuta. Quindi il mio metodo è corretto? Ce ne sono altri senza appoggiarsi a servizi esterni, non c’è nulla nell’intestazione del browser?
Gaglia?? Ma sei tu! *__* Ma noi ci conosciamo!!
(scusate l’intrusione XD)
Ciao Lori di quel di Cuneo!
Io l’ho sempre detto che il mondo (internet) è piccolo ;-)
Ohh, ma che simpatica rimpatriata. Perché non vi trovate a farvi un bicchiere di barolo allo Schiaccianoci o alla pizzeria Vesuvio invece di imbrattare di OT i miei post? :-) ahahaha
Smettila di lamentarti Tarchini che senza di me il tuo cielo sarebbe privo di luce inghiottito in un buco nero senza fine e i raggi di sole un’utopia dimenticata da tempo.
PS: Bell’articolo comunque, l’hai scritto tu? :D
(e con questo sono OnTopic, intoccabile dalla legge!)
Si lamenta solo perchè non ha il buon vino a portata di mano ;-)
Io normalmente imposto il file .htaccess in modo che reindirizzi immediatamente sulla versione localizzata (/it, /en, /de, ecc) senza dover “accedere” all’index.php.
Semplice e rapido e, finora, apparentemente senza controindicazioni.
Scusa e come fai il controllo della lingua con .htaccess?
File .htaccess:
Options +FollowSymLinks
RewriteBase /
php_value memory_limit 256M
RewriteEngine on
# Utente italiano
RewriteCond %{HTTP:Accept-Language} (it) [NC]
RewriteRule ^$ /ITA/ [L,R=301]
# Default Page ( tutti gli altri )
RewriteRule ^$ /ENG/ [L,R=301]
Chiaramente in presenza di altre lingue si scriveranno le relative stringhe di codice.
Questo metodo riconosce la lingua del browser.
Buono a sapersi :D Ultimamente mi sto interessando un pò di più al RewriteEngine e questa mi mancava!
Grazie!
Articolo utilissimo per i non-programmatori ;)
concordo!
Grazie ragazzi
Vado di fretta. Io adotto un altro metodo:
1) Sito diviso in cartelle con le lingue.
1.1) Esempio: root/it/contatti.php – root/en/contacts.php
2) Rilevo il linguaggio come la prima riga di codice e anch’io mi prendo le due lettere iniziali.
2.2) Esempio: en – it – es – fr
3) Spezzo l’URL in uso e la parte della cartella la passo in uno switch
4) Visualizzo il contenuto di competenza..
Per @Tiziano Basile al primo commento: soluzione facile e veloce, crea un file e (usando il mio metodo) ci piazzi variabili php che saranno i tuoi testi, immagini, script, ecc. A seconda della lingua rilevata otterrai il testo che vuoi.
Ciao!
Pardon. Sempre per @Tiziano Basile, il file in questione lo includi in ogni file del tuo sito ovviamente :) ..dimenticavo dimenticavo: scegliere un “default” per lo switch in caso la lingua non venga rilevata…
Ciao!
Grazie per questo articolo! E anche per i commenti! Tutti i metodi indicati hanno la loro utilità a seconda dei casi posto che quello descritto da Maurizio è semplice ed immediato. Anche io concordo sul fatto che sia tranquillamente utilizzabile da siti gestiti da cms. Io l’ho appena applicato ad sito di studio legale che è ovviamente duplicato in ogni lingua essendo servizi e sedi dello studio differenti. Grazie ancora!
:) Prenderò spunto dal tuo codice per un piccolo progettino……
Io ho provato questo sistema, e su Opera funziona, ma con Chrome e Firefox dà degli errori. In Firefox la pagina non viene visualizzata e appare la scritta “Questa pagina non reindirizza in modo corretto”. Non capisco come mai nessuno lo abbia finora notato. C’è una soluzione?
Grazie
Bertoldi
una precisazione: ho apportato una (piccola?) modifica al codice che non reindirizza su cartelle, ma su files: è forse questo il problema?
effettivamente usando le cartelle invece dei files funziona; mi scuso!
ciao ho seguito la tua guida per poter realizzare un sito multilingua.
il sito italiano l’ho installato nella root e il link è del tipo:
http://www.miosito.it
poi ho creato la versione inglese:
http://www.miosito.it/en
il problema sta nel fatto che quando vado in un post del sito italiano mi esce questo permalink:
http://www.miosito.it/blog/articolo
perchè si è creato quella sottocartella “blog”?
Domanda scema, ma nella index.php dove va inserito questo codice non devo aggiungere altro tipo:
<meta name="keywords" content="
<meta name="description" content="
….
Queste cose le metto solo nella index delle varie lingue? In pratica oltre a questo codice per selezionare automaticamente la lingua non importa inserire altro?
la soluzione dell’articolo è semplice e volevo provarla ma non avendo tradotto il sito in varie lingue è difficile da usare… purtroppo
quindi le soluzioni sono due:
la traduzione “dinamica” di cui trattava nicola: non potresti postare qualche frammento di cosice e qualche indicazione in più?
o i servizi automatizzati che mi permettano di creare directory differenziate per le varie lingue
il mio sito è di troppe pagine
ciao ragazzi secondo me il miglior metodo è questo usare appunto delle cartelle per gestire le lingue, non è confusionario per nulla se gestito correttamente.
In siti dinamici basta usare delle costanti create nel file config.php di ogni cartella, basterà quindi configuare i link, nomi dei link ecc nel file config.php della cartella stessa e fine!usare page.php?lang=eng non dico che è sbagliato, ma non è una soluzione del tutto corretta…,quelli che mangiano seo lo sanno bene.
Come fai a gestire centinaia di testi unsando solo variabile _GET…, invece il testo inglese risiederà solo nella cartella /eng/ e il tutto girerà all’ interno di essa senza problemi
Salve, cosa comporta questo script in termini di SEO? Google cosa indicizzerà come pagina principale del sito, in questo caso “www. nomesito .com / index.php” ?
Indicizzerà la pagina di default cioè “www. nomesito .com / italiano/ index.php” oppure “www. nomesito .com / index.php” (ovvero una pagina vuota)?
Spero in una vostra risposta.
Molto interessato anche io alla domanda posta da Francesco…