Pregunta

Me salvar mi país e idioma a los usuarios en una cookie cuando los usuarios se conectan a mi sitio. Pero cuando la cookie se guarda redirección de E / actualizar la página para que el usuario consigue el idioma correcto. Pero cuando un usuario tiene las cookies desactivadas esta causa un bucle infinito! Pensé que iba a solucionar este problema mediante wrinting include_once, pero ya que la actualización del sitio, que include_one cada una y otra vez ...

aquí está mi código:

lang_set.php

include("php functions\GeoIP\geoipcity.inc");
include("php functions\GeoIP\geoipregionvars.php");
include("php functions\ip.php"); 

if (!isset($_COOKIE['country'])) // om land ikke er registrert (første gang bruker requester siden) 
{   
    $gi = geoip_open("php functions/GeoIP/GeoLiteCity.dat",GEOIP_STANDARD);
    $country = geoip_country_code_by_addr($gi, ip());   

    if ($country == "") { 
        setcookie("country", 'US'); 
        $country = "US"; 
        //reloader og setter språk en_US
        header("Location: ".$_SERVER["REQUEST_URI"]." ");
    }
    else 
    {
        //sett land basert på geoip og reload siden
        setcookie("country", trim($country));
        header("Location: ".$_SERVER["REQUEST_URI"]." ");           
    }

    $country_cookie = false; 

//land ikke satt    
} else {
    //bruker har _COOKIE country
    $country_cookie = true; 

    if ( (!isset($_COOKIE['lang'])) or (!$country_cookie) ){    

        //bruker har country cookie men ikke språk
        //sett språk og reload

        if($country_cookie){
            $country = $_COOKIE['country'];
        }

        if ($country == "NO"){              //Norge
            setcookie("lang", "no_NO");                                 
        }                   
                    /*
                    elseif ($country == "SE" || $country == "FI"){      //Sverige
                        setcookie("lang", "se_SE");                                 
                    }       

                    elseif ($country == "DA" ){         //Danmark
                        setcookie("lang", "dk_DK");                                 
                    }                       
                    */
                    elseif 
                    (
                    $country == "US"                    //Alle engelsktalende land
                    || $country == "AG" || $country == "AI" || $country == "AS" || $country == "AU" || $country == "BE"
                    || $country == "CA" || $country == "FJ" || $country == "GB" || $country == "HK" || $country == "IE"
                    || $country == "JM" || $country == "NF" || $country == "NZ" || $country == "SG" || $country == "UM"
                    || $country == "RW" || $country == "SC"){       

                    setcookie("lang", "en_US");                     
                    }
                    /*
                    elseif ($country == "FR"            //Alle fransktalende land
                    || $country == "AD" || $country == "BI" || $country == "BJ" || $country == "CD" || $country == "CF"
                    || $country == "CG" || $country == "GA" || $country == "GF" || $country == "GN" || $country == "GP"
                    || $country == "HT" || $country == "KM" || $country == "LB" || $country == "MC" || $country == "MG"         
                    || $country == "NC" || $country == "NE" || $country == "PF" || $country == "PM" || $country == "RE"
                    || $country == "TD" || $country == "VA" || $country == "ML" || $country == "MQ"){               

                    setcookie("lang", "fr_FR");     
                    }   

                    elseif ($country == "ES"            //Alle spanske land
                    || $country == "AR" || $country == "MX" || $country == "PA" || $country == "PE" || $country == "PR"
                    || $country == "PY" || $country == "CL" || $country == "CO" || $country == "CR" || $country == "CU"
                    || $country == "DO" || $country == "EC" || $country == "GQ" || $country == "GT" || $country == "HN"         
                    || $country == "NI" || $country == "SV" || $country == "UY" || $country == "VE" ){                  

                    setcookie("lang", "es_ES"); 
                    }   

                    elseif ($country == "DE"            //Alle tyske land
                    || $country == "AT" || $country == "BE" || $country == "CH" || $country == "HU" || $country == "IT"
                    || $country == "LI" || $country == "LU" || $country == "PL"  ){                 

                    setcookie("lang", "de_DE"); 
                    }

                    elseif ($country == "ZH"            //Alle kinesiske land
                    || $country == "CN" || $country == "HK" || $country == "MO" || $country == "SG" || $country == "TW" ){                  

                    setcookie("lang", "zh_ZH"); 
                    }           

                    elseif ($country == "PT" || $country == "BR" ){             
                    setcookie("lang", "pt_PT"); 
                    }                       

                    elseif ($country == "RU" || $country == "MO" ){                 
                    setcookie("lang", "ru_RU"); 
                    }   

                    elseif ($country == "YI" ){                 
                    setcookie("lang", "yi_YI"); 
                    }
                    */

                    //sett default språk engelsk om jeg ikke gjensjender landet
                    else {

                    setcookie("lang", "en_US"); 

                    }

            header("Location: ".$_SERVER["REQUEST_URI"]." "); 
    }// !isset språk

}   

Debe ser una solución fácil a esto, pero he cambiado hasta este código tantas veces que pensé que shoud pido.

¿Fue útil?

Solución

No redirigir a la misma página, pero a otro (o el mismo con un parámetro GET).

<?php
if (!isset($_COOKIE['lang'])) {
  if (isset($_GET['redirected'])) {
    $lang = getLang();
  } else {
    $_COOKIE['lang'] = getLang();
    header("Location: ".$_SERVER['PHP_SELF']. '?redirected=1'); 
    exit();
  }
} else {
  $lang = $_COOKIE['lang'];
}
echo 'stuff in ' . $lang;

También tenga en cuenta el código de detección de país es parcialmente incorrecto (usuarios pulir probablemente preferiría Inglés al alemán, por ejemplo).

Otros consejos

Pienso que usted es malentendido lo que hace include_once. No se aplica a través de múltiples pageloads sólo significa que si incluye un archivo dos veces la segunda vez de incluir el archivo se ignora.

Su cheque para la cookie siempre va a devolver false si el usuario tiene las cookies desactivadas. Lo que debe hacer es añadir una variable, por ejemplo "redirigida = 1" a la dirección URL antes de su reorientación. No redirigirlos de nuevo si la variable se establece redirigida, pero muestran un mensaje de error o algo en su lugar.

Así por ejemplo, si su página es http://example.com/foo.php , enviar a http://example.com/foo.php?redirected=1 .

podría tener otra galleta que le dirá si las cookies están habilitadas o no. Si no es así, no lo haga la redirección.

Mira esto: http: // nik. chankov.net/2010/01/16/detecting-if-the-cookies-are-enabled-with-php/

Después de establecer la cookie, redirigir al usuario, sino también añadir un "= true cookieset" parámetro a la URL.

Si a continuación, en su código de detección se puede ver que hay:

  • No conjunto de cookies, y
  • la URL del parámetro "cookieset = true"

entonces usted sabe que las cookies están desactivadas por el usuario y debe redirigir lugar a una página de configuración de idioma predeterminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top