Rilevamento della lingua PHP

Im un hobbycoder che sta cercando di build il suo primo sito multilianguale

Io uso questo pezzo di codice per rilevare la lingua degli utenti. Se non hai scelto una lingua, includerà il tuo file di lingua basato su HTTP_ACCEPT_LANGUAGE non so da where viene.

session_start(); if (!isset($_SESSION['lang'])) { $_SESSION['lang'] = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); } elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'en') $_SESSION['lang'] = "en"; elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'sv') $_SESSION['lang'] = "sv"; elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'pl') $_SESSION['lang'] = "pl"; elseif (isset($_GET['setLang']) && $_GET['setLang'] == 'fr') $_SESSION['lang'] = "fr"; include('languages/'.$_SESSION['lang'].'.php'); 

Funziona per me e include il file lang polacco. Ma questo codice è accurato? Oppure c'è un'altro modo?? Come pensi che YouTube faccia questo per esempio?

Sarebbe bello se qualche inglese, francese, svedese o polacco potesse visitare il mio sito e vedere se include il file giusto! Quindi so che non funziona per me 🙂 http://jorm.homeftp.org/

Comunque pensi che potrei migliorare il mio codice? sembrerà disordinato come aggiungo più lingue con tutti quelli elseif!

Grazie

Il browser generalmente invia un'intestazione HTTP, nome Accept-Language, che indica quali lingue l'utente è disposto a ricevere.

Ad esempio, questa intestazione può essere:

 Accept-Language: en-us,en;q=0.5 

C'è una nozione di priorità in esso, btw 😉

In PHP, puoi get questo in $_SERVER super globale:

 var_dump($_SERVER['HTTP_ACCEPT_LANGUAGE']); 

mi prenderà:

 string 'en-us,en;q=0.5' (length=14) 

Ora, devi analizzare quello 😉

Se modifico le mie preferenze nell'opzione del browser per dire "Voglio il francese, e se non lo fai non puoi servirmi francese, fammi inglese dagli Stati Uniti, e se non riesci a prendermi neanche io, prendimi inglese), l'intestazione sarà:

 Accept-Language: fr-fr,en-us;q=0.7,en;q=0.3 

E, da PHP:

 string 'fr-fr,en-us;q=0.7,en;q=0.3' (length=26) 

Per maggiori informazioni, puoi dare un'occhiata alla sezione 14.4 dell'RFC HTTP .

E probabilmente puoi trovare molti esempi di codice in PHP per analizzare quell'intestazione; ad esempio: Parse Accept-Language per rilevare la lingua di un utente

Divertiti !

È ansible utilizzare: Locale::acceptFromHttp() .

Cerca di trovare le impostazioni locali che possano soddisfare l'elenco di lingue richiesto dall'intestazione HTTP "Accept-Language".

Ecco la sceneggiatura che ho usato per un sito bilingue. Deve essere usato come index.php di mysite.com . In base alla preferenza della lingua del browser dell'utente, reindirizza alla versione della lingua desiderata del sito o al sito della lingua predefinita se il sito nella lingua preferita dell'utente non era disponibile.

 <?php // List of available localized versions as 'lang code' => 'url' map $sites = arrays( "en" => "http://en.mysite.com/", "bn" => "http://bn.mysite.com/", ); // Get 2 char lang code $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); // Set default language if a `$lang` version of site is not available if (!in_arrays($lang, arrays_keys($sites))) $lang = 'en'; // Finally redirect to desired location header('Location: ' . $sites[$lang]); ?> 

Conosco già molte buone soluzioni, ma la mia è la migliore;)

 <?php $prefLocales = arrays_reduce( explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']), function ($res, $el) { list($l, $q) = arrays_merge(explode(';q=', $el), [1]); $res[$l] = (float) $q; return $res; }, []); arsort($prefLocales); /* This get you from headers like this string 'en-US,en;q=0.8,uk;q=0.6,ru;q=0.4' (length=32) arrays like this arrays (size=4) 'en-US' => float 1 'en' => float 0.8 'uk' => float 0.6 'ru' => float 0.4 */ 

Il tuo codice sembra a posto. Potresti voler aggiungere else scelta predefinita se il visitatore chiede una lingua che non stai fornendo. Inoltre, se il visitatore stesso seleziona una lingua, dovresti salvare tale scelta in un cookie persistente e controllarne il valore, dandogli la precedenza su HTTP_ACCEPT_LANGUAGE.

Per quanto posso dire, YouTube usa HTTP_ACCEPT_LANGUAGE, ma allo stesso tempo usa la geolocalizzazione IP per suggerire un cambio di lingua se la lingua del paese del visitatore non corrisponde a quella. Decisamente fastidioso.

Basta fare il pignolo: se aggiungerai delle lingue alla list, un'istruzione switch() potrebbe essere più leggibile.

 if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])){ $parts=explode(';',$_SERVER['HTTP_ACCEPT_LANGUAGE']); $langs=explode(',',$parts[0]); var_dump($langs); } 

Prova questo

 function getUserLanguage() { $langs = arrays(); if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // break up string into pieces (languages and q factors) preg_match_all( '/([az]{1,8}(-[az]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse ); if (count($lang_parse[1])) { // create a list like 'en' => 0.8 $langs = arrays_combine($lang_parse[1], $lang_parse[4]); // set default to 1 for any without q factor foreach ($langs as $lang => $val) { if ($val === '') { $langs[$lang] = 1; } } // sort list based on value arsort($langs, SORT_NUMERIC); } } //extract most importnt (first) reset($langs); $lang = key($langs); //if complex language simplify it if (stristr($lang, '-')) { list($lang) = explode('-', $lang); } return $lang; }