• User Attivo

    Sito multi-lingua in PHP. Dov'è l'errore?

    Ciao a tutti :wink3:

    Sto realizzando un sito in PHP con più lingue.
    Nell'index voglio mettere una parte di codice che mi riconosca automaticamente la lingua del browser utilizzato dall'utente che naviga sul sito e poi caricare il relativo file con le variabili tradotte.

    Eccovi il codice:

    
    <?php
    # Recupero il valore della lingua usata
    $language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $lang = substr($language,0,2);
    $lang = $_GET['lang'];
    
    # Includo il file di linguaggio interessato
    require("{$lang}.php");
    
    # Stampo a video il testo nella lingua selezionata
    echo $output[0] . " " . $output[1] . "<br>";
    echo $output[3] . "<br><br>";
    
    # Aggiungo dei link per cambiare la lingua
    echo $output[6] . "<br>";
    echo "<a href='" . $_SERVER['PHP_SELF'] . "?lang=it'>IT</a> - ";
    echo "<a href='" . $_SERVER['PHP_SELF'] . "?lang=en'>EN</a> - ";
    echo "<a href='" . $_SERVER['PHP_SELF'] . "?lang=de'>DE</a> - ";
    echo "<a href='" . $_SERVER['PHP_SELF'] . "?lang=fr'>FR</a>";
    ?>
    
    

    Il file {$lang}.php contiene le variabili $output[xxx] tradotte nella lingua definita.

    Il problema sta nel fatto che quando faccio girare per la prima volta questo piccolo script mi viene generato un errore:

    Notice: Undefined index: lang in C:\Programmi\EasyPHP5.2.10\www\Script di prova\Multilingua\Lingua.php on line 5
    

    Se invece scelgo una lingua dal menu per cambiare lingua allora il messaggio di errore scompare...

    Significa che c'è un problema quì: $lang = $_GET['lang'];

    Di preciso dove sbaglio? :mmm:
    Qualcuno sa aiutarmi?

    Grazie a tutti 😄

    Ciao ciao! :ciauz:


  • Super User

    Guarda qui:

    $language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $lang =  substr($language,0,2);
    $lang = $_GET['lang'];
    
    

    Così facendo stai sovrascrivendo il valore che avevi prima preso da $language.

    Per ovviare a tale problema, potresti fare così: SE non passi niente da GET allora usi il valore che prendi da $_SERVER, altrimenti usi quello da GET.

    Come fai a vedere se in GET c'è una variabile lang? Usi array_key_exists.

    
    $lang =  (array_key_exists('lang', $_GET)) ? $_GET['lang'] : substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
    
    

    con questo dovresti ovviare al tuo problema.
    $lang =


  • User Attivo

    @PaTeR said:

    Guarda qui:

    $language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    $lang =  substr($language,0,2);
    $lang = $_GET['lang'];
    
    

    Così facendo stai sovrascrivendo il valore che avevi prima preso da $language.

    Per ovviare a tale problema, potresti fare così: SE non passi niente da GET allora usi il valore che prendi da $_SERVER, altrimenti usi quello da GET.

    Come fai a vedere se in GET c'è una variabile lang? Usi array_key_exists.

    
    $lang =  (array_key_exists('lang', $_GET)) ? $_GET['lang'] : substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
    
    

    con questo dovresti ovviare al tuo problema.
    $lang =

    mmm non mi è tanto chiaro...
    E' vero che comunque che nello script originale (pescato sul web) non c'era "$language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];"... insomma, sono stato io ad aggiungerlo perchè pensavo che ovviamente GET non trovasse nulla.
    Però dal tuo suggerimento, mi devi scusare, non sono riuscito a capire come risolvere il problema.

    Facciamo finta che quel codice non esiste.
    Come faccio nella pagina index a riconoscere la lingua del browser, ad inserire questo valore in una variabile e a rimandare questa variabile (con POST o GET?) ad un'altra pagina?

    Abbi pazienda con me :fumato:


  • Super User

    Potresti usare le sessioni per portarti dietro il valore della lingua scelta.

    Dal fatto che il codice usasse $_GET pensavo che fosse possibile adoperare una scelta tramite per esempio una select, pertanto il valore a cui si dovrebbe dare più peso sarebbe questo.

    Insomma... in ordine di peso:
    GET - SESSION - HTTP_ACCEPT_LANGUAGE

    L'informazione che prendi la metti in una variabile di sessione così te la puoi portare sempre dietro.

    SE si usa una select o quant'altro per passarti il valore della lingua, verrà creata ( in GET o POST dipende dal tipo di form che implementi ) una chiave nell'array _GET o _POST, e sarà questo il valore più importante, perchè deciso dall'utente!

    $lang = $_SESSION['lang'] = $_GET['lang'];

    Così nel frattempo ce lo scriviamo nella sessione e ce lo possiamo portare in giro durante la navigazione.

    Se non c'è niente in _GET? Vediamo nella sessione. Se la sessione è vuota? vediamo da HTTP_ACCEPT_LANGUAGE.

    Io farei così!


  • User Attivo

    Io farei così!

    Ok, grazie 😉

    ciao ciao :ciauz: