Identificazione della lingua del browser con PHP

In un recente progetto di sviluppo per un cliente, abbiamo avuto la necessità di creare un catalogo multilungua. Anche se il lavoro prevedeva solamente due lingue (italiano ed inglese), abbiamo preferito scrivere del codice che fosse completamente scalabile, per consentire al cliente di aggiungere facilmente una o più lingue in futuro.

Uno degli aspetti che volevamo implementare era quello di presentare la lingua migliore ad ogni nuovo utente che non l’avesse già selezionata all’interno del sito, ad esempio sfruttando la lingua predefinita del browser utilizzato. Per fare questo è bastato sfruttare una delle variabili PHP contenute nell’array $_SERVER: ‘HTTP_ACCEPT_LANGUAGE’.

La variabile ‘HTTP_ACCEPT_LANGUAGE’ contiene l’indicazione della lingua (o delle lingue) correntemente utilizzata dal browser. Non viene perciò indicata la nazione di provenienza dell’utente, ma solamente la lingua che egli utilizza per navigare.

La lingua principale e le lingue secondarie sono modificabili in tutti i browser, tramite le impostazioni specifiche di ognuno di essi. Sul computer in cui mi trovo ora, ad esempio, viste le differenti impostazioni dei browser principali, il contenuto della variabile ‘HTTP_ACCEPT_LANGUAGE’ è questo:

  • Firefox, con impostato italiano come lingua principale, inglese (US) e inglese generico come lingue secondarie: it-it,it;q=0.8,en-us;q=0.5,en;q=0.3
  • Internet Explorer, con impostato unicamente l’italiano: it-IT
  • Chrome, con impostato unicamente l’inglese (US) come principale e inglese generico come secondaria: en-US,en;q=0.8

 

Il contenuto è diverso in ognuno di questi, ma ciò che ci interessa è rappresentato dai primi 2 caratteri della stringa, indipendentemente dal browser. Possiamo estrapolare quindi una semplice regola del tipo (ovviamente da rivedere per progetti più complessi):

Primi 2 caratteri di ‘HTTP_ACCEPT_LANGUAGE’ = lingua principale del browser

Perciò:

  • primi 2 caratteri: “it” = italiano
  • primi 2 caratteri: “en” = inglese
  • primi 2 caratteri: “de” = tedesco
  • primi 2 caratteri: “fr” = francese
  • …e altri esempi nel codice riportato di seguito

 

Nello sviluppo del progetto, abbiamo creato vari file *.php contenenti le stringhe tradotte nelle lingua necessarie. In questo modo non abbiamo scritto i testi direttamente nei file delle pagina, ma solamente in questi *.php di linguaggio, salvati nella cartella /languages/. Ad ognuno di questi file possiamo dare semplicemente i nomi, ad esempio, it.php per l’italiano e en.php per l’inglese.

Quindi per finire abbiamo incluso, con la funzione “require_once”, il file di lingua coerente con la lingua salvata nella variabile ‘HTTP_ACCEPT_LANGUAGE’.

Ecco il semplice script di codice contenete quanto detto:

<?php
$language_detect = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if($language_detect == "it") {$lang_det = "it";} // italiano
elseif($language_detect == "en") {$lang_det = "en";} // inglese
elseif($language_detect == "de") {$lang_det = "de";} // tedesco
elseif($language_detect == "es") {$lang_det = "es";} // spagnolo
elseif($language_detect == "ar") {$lang_det = "ar";} // arabo
elseif($language_detect == "fr") {$lang_det = "fr";} // francese
elseif($language_detect == "ru") {$lang_det = "ru";} // russo
elseif($language_detect == "zh") {$lang_det = "zh";} // cinese
elseif($language_detect == "ja") {$lang_det = "ja";} // giapponese
elseif($language_detect == "hi") {$lang_det = "hi";} // hindi
elseif($language_detect == "pt") {$lang_det = "pt";} // portoghese
elseif($language_detect == "id") {$lang_det = "id";} // indonesiano versione 1
elseif($language_detect == "in") {$lang_det = "id";} // indonesiano versione 2
elseif($language_detect == "ko") {$lang_det = "ko";} // koreano
elseif($language_detect == "tr") {$lang_det = "tr";} // turco
elseif($language_detect == "th") {$lang_det = "th";} // thailandese
else{$lang = "en";} // default: inglese
 
require_once('./languages/' . $lang_det . '.php');
?>

Da notare che il lunghissimo if…elseif…else si chiude con la lingua che desideriamo utilizzare come default nel caso nessuna delle precedenti sia impostata nel browser. Particolare anche il caso dell’indonesiano, che può essere rappresentato in modi diversi in ‘HTTP_ACCEPT_LANGUAGE’, per cui abbiamo creato 2 condizioni su di esso, uniformandolo in “id”, in modo da dover creare solo un file di lingua chiamato id.php, contenuto in /languages/.

La sezione if…elseif…else potrebbe essere eliminata, se non è necessario prevedere una condizione di default. Rischiamo però di ottenere un risultato inaspettato ed un errore sul “require_once” nel caso non ci sia il file adatto all’inclusione. In ogni caso, in questa situazione, potremmo ridurre il codice alle semplici 2 righe (la prima e l’ultima, modificata, del caso precedente):

<?php
$language_detect = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
require_once('./languages/' . $language_detect . '.php');
?>

Fonte per $_SERVER e ‘HTTP_ACCEPT_LANGUAGE’:
http://php.net/manual/en/reserved.variables.server.php

 

di Massimo Cinquini, Web Developer @ Voxart
Seguimi su Twitter oppure aggiungimi su Google Plus