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?
47 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…
Scusate se ritorno sull’argomento, ma ci tengo a precisare per i posteri… e per rispondere a Francesco e Mattia (chissà se aspettano ancora una risposta :) ).
In questa pagina ufficiale Google da una estensiva panoramica sull’argomento “Siti Multilingua”:
https://support.google.com/webmasters/answer/182192?hl=it
Si legge ad un certo punto:
“Evita il reindirizzamento automatico basato sulla presunta lingua dell’utente. Questi reindirizzamenti potrebbero impedire agli utenti (e ai motori di ricerca) di visualizzare tutte le versioni del sito.”
Poi… Google è il primo a non rispettare tale regola (vedi google.com)… ma quello è un altro discorso :)
Ciao a tutti.
Sto cercando di realizzare il mio sito statico in multilingue italiano e francese.
Purtroppo ho delle difficoltà.
Ho creato la cartella it con i miei html
In seguito l’ho copiata per creare la cartella fr.
Ho cambiato i testi della cartella fr.
Dopodiché ho pubblicato il sito ma non funziona per niente.
Come si fa a passare da html in php per creare il sito multilingue?
Grazie a chi sa indirizzarmi
Usa un CMS, fai prima fidati…
In che modo il tuo sito non funziona? Non vedo la necessità di passare a php se hai fatto un sito statico.
Sapendo poco sul tuo progetto, provo ad ipotizzare e a darti un suggerimento semplice da seguire. Hai già le due cartelle IT ed FR con i siti funzionanti, quindi suppongo ti serva un collante:
Crea nella root del dominio (la pagina che esce digitando http://www.tuodominio.it) un file index.html e mettici dentro la scelta della lingua. Ad esempio 2 bandierine con i rispettivi link a http://www.tuodominio.it/it e http://www.tuodominio.it/fr
Ci penserà poi Google ad indirizzare nel giusto sito i visitatori.
Salve avrei bisogno un aiuto per il mio sito multilingue.
Ho creato un sito in italiano e francese in html.
Ho creato dapprima la cartella italiano con i file html, poi ho creato la cartella francese con i file html.
In seguito ho creato un file php.index con la seguente formula.
“italiano/”,
“fr” => “francais/”,
“default” => “italiano/”);
if(array_key_exists($lang, $lang_config))
{
$location = $lang_config[$lang];
}
else
{
$location = $lang_config[‘default’];
}
header(‘Location: ‘ . $location);
?> “italiano/”,
“fr” => “francais/”,
“default” => “italiano/”);
if(array_key_exists($lang, $lang_config))
{
$location = $lang_config[$lang];
}
else
{
$location = $lang_config[‘default’];
}
header(‘Location: ‘ . $location);
?>
Il problema è che non riesco a creare il link corretto sulle mie pagine html per passare dalla home page italiano alla home page francese.
Qualcuno sa aiutarmi?
Grazie
Ciao ho inserito lo script suggerito.
Mi sapete dire come si comporterà l’indicizzazione degli spider di google.
Leggi il mio commento precedente (dove indico il link alla pagina del supporto di Google per i webmasters).
Volevo avere un aiuto da Maurizio a proposito dello script che ha proposto.
Premetto che sono un grafico web con poche base di programmazione, a parte Html.
Io ho appena utilizzato il file index.php per fare un indirizzamento automatico del mio sito aziendale (costruito principalmente in Html) in due lingue, italiano e inglese.
Mi aspetto quindi che venga sempre selezionata la pagina in italiano (index_ita.htm).
Su Chrome e Firefox funziona perfettamente.
Su Internet Explorer 11 (su Windows 7) non funziona. O, meglio, ha un comportamento anomalo.
Se scrivo semplicemente il nome del dominio http://www.aim-sportline.com Explorer non “capisce” lo script e va alla pagina inglese.
Se chiamo direttamente la pagina (www.aim-sportline.com/index.php) funziona correttamente e seleziona index_ita.htm
Se scrivo semplicemente aim-sportline.com (omettendo www) funziona correttamente.
Puoi aiutarmi a capire come mai succede questa cosa?
Ti ringrazio anticipatamente.
Salve,
quindi, se ho ben capito, lo script indicato (index.php) fa si che l’utente francese visualizzi in modo automatico il sito in lingua francese e così via…. cioè con la store view corretta senza dover andare lui nel menu a tendina e scegliere la lingua?
Basta aggiungere il file ESTERNO alle cartelle di lingue:
“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);
?>
E qualora ci fossero più lingue? Sempre utilizzando la stessa logica, (codice ecc… esempio “en” => “english/”) si inseriscono in questo punto senza dover modificare altro?
Grazie
Ho costruito la rotta del mio sito multilingue adottando la index.php come da Voi indicato.
Domanda:
– Non è che nell’indicizzazione di Google il fatto di avere una index.php che reindirizza alle varie index.html delle varie lingue può provocare problemi o scarsa indicizzazione?
– Posso accorciare il nome delle cartelle delle versioni (tipo: italiano/, english/eng e così via)?
Grazie