ho affrontato lo stesso problema e per agevolarmi il tutto ho utilizzato un "doppio binario" GET e SESSIONI

Infatti gestire tutto tramite get (tutti i link interni del sito dovranno avere la variabile GET della lingua, anche quelli dei form!!!) alle volte crea complicazioni o cmq cose brutte...

ad esempio un form con method post ma che nell'action contient ela variabile get... un casino insomma!!

Allora ho fatto una cosa di questo genere

Codice PHP:
<?php
session_start
();
session_regenerate_id(TRUE);

/*se mi arriva la variabile get utilizzo quella per impostare $lang*/
/*contestualmente creo una variabile di sessione*/

if( (isset($_GET['lang'])) && (!empty($_GET['lang'])) )
    {
    
$lang=$_GET['lang'];
    
$_SESSION['lang']=$lang;
    }

/*se la viariabile get non mi è arrivata 
cerco se è stata in precedenza valorizzata la sessione con la lingua
e con quella imposto $lang*/

else if( (isset($_SESSION['lang'])) && (!empty($_SESSION['lang'])) )
    {
    
$lang=$_SESSION['lang'];
    }

/*altrimenti si beccano $lang italiano*/
else
    {
    
$lang="ita";
    }


/*in base al valore di $lang includo il file della lingua
che contiene una serie di define*/
switch ($lang)
    {
    case 
'eng': include("/language/eng/define_eng.php");
    break;

    case 
'ita': include("/language/ita/define_ita.php");
    break;

    default: include(
"language/ita/define_ita.php");    
    }

?>
in questo modo se eventualmente mi crea casini inviare la variabile GET con la lingua la posso comunque recuperare ricorrendo alla variabile di sessione...

Spero di essermi spiegato bene..

anzi se c'è un esperto che mi possa dare un parere (soprattutto se critico!!) lo gradierei particolarmente