[PHP] Taalkeuze met cookies: kiezen met splash of in-site

Pagina: 1
Acties:
  • 740 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Voor een project moet de bezoeker op de pagina start.php kiezen of 'ie de site in het Frans of in het Nederlands wil bekijken.
Wordt er voor Frans gekozen, dan gaat de bezoeker naar 'index.php?taal=fr'. Zo ook voor het Nederlands. Dat lukt.

Maar ook in de site zelf is er een optie om nog van taal te verwisselen; zie het als twee subtiele knopjes bovenaan iedere pagina. Ik zeg wel iedere pagina, maar ik gebruik steeds index.php met ?pagina=homepagina en zo.

Dit is mijn script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    function zet_taal($taal){
        $lijst_taal = array("nl", "fr");
        if(!isset($taal) || !in_array($taal, $lijst_taal)){
            $taal = nl;
        }
        return $taal;
    }
    if(!isset($_COOKIE['spar_taal']) || $_COOKIE['spar_taal'] != zet_taal($_GET['taal'])){
        setcookie("spar_taal", zet_taal($_GET['taal']), time()+3600, "/");
        header("location: index.php?taal=" . zet_taal($_GET['taal']));
        exit;
    }


Dat werkt wel een beetje, maar niet helemaal.
Ik kan, als ik op de index.php zit (dus zonder ?pagina=homepage, die wel automatisch wordt geincludet als er geen $_GET['pagina'] wordt gedeclareerd) die kleine taalwisselknopjes gebruiken. De afbeeldingen die van die keuze afhangen, veranderen inderdaad ook naar hun specifieke taalafbeeldingen. Dus dat is goed.

Het probleem zit 'em echter in het feit dat ik niet kan doornavigeren, dus naar een pagina anders dan index.php?taal=fr of ?taal=fr wil gaan. Hij stuurt me onverbiddelijk terug naar de index.php?taal=nl, en dan pas kan ik doordoen, enkel in het Nederlands. Als ik het script bekijk, is dat niet meer dan normaal.

Maar nu zou ik het dus zo willen, dat PHP eerst kijkt of er een cookie bestaat. Is dat niet, dan zet 'ie er eentje met de $_GET['taal'] als voorkeur. Is die $_GET['taal'] leeg of ongeldig, dan wordt dat Nederlands. De rest van de site wordt dan in het Nederlands bekeken. Wanneer de gebruiker opeens op Frans wil overschakelen, moet de cookie aangepast, zodat de hele site in het Frans kan bekeken.

Wie helpt?

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 13:59

DexterDee

I doubt, therefore I might be

Als je het taal cookie nu eens op de client (in de browser) zet en dan gewoon de huidige url herlaadt? de php functie setcookie zet het cookie wel in de browser, maar pas tijdens het laden van een pagina. Zodoende wordt deze de eerste keer nog niet teruggestuurd.

zoiets als dit:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function setCookie(name, value, expires, path, domain, secure)
{
    document.cookie= name + "=" + escape(value) +
    ((expires) ? "; expires=" + expires.toGMTString() : "") +
    ((path) ? "; path=" + path : "") +
    ((domain) ? "; domain=" + domain : "") +
    ((secure) ? "; secure" : "");
}

function changeLanguage( lang ) {
    var today = new Date()
    var expires = new Date();
    expires.setTime(today.getTime() + 1000*60*60*24*365);
    setCookie('mijnsite_lang', lang, expires, '/');
    location.replace( document.URL );
}
en dan achter de link van je vlaggetje de javascript functie changeLanguage aanroepen.

PHP:
1
$taal = nl;
Bovenstaande is trouwens not-done. De quotes missen hier en de enige reden dat dit werkt is omdat PHP dit als constante ziet die hij impliciet de waarde van de constantenaam toekent ('nl' dus...)

[ Voor 11% gewijzigd door DexterDee op 09-09-2006 21:48 ]

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
PHP:
1
    if(!isset($_COOKIE['spar_taal']) || $_COOKIE['spar_taal'] != zet_taal($_GET['taal'])){
Wat gebeurt er hier als $_GET['taal'] niet ingesteld is? Voeg bij die ongelijkheidscheck een isset($_GET['taal']) toe.

De inhoud van het koekje zou ik trouwens ook checken; die is namelijk eenvoudig door een kwaadwillende gebruiker te wijzigen. Verder denk ik dat zet_taal niet de juiste naam is voor die functie.
Op regel 4 van je code staat 'nl' zonder enige quotes. Hoewel PHP het misschien wel slikt, kun je hier heel veel beter een echte string van maken.
De isset($taal) op regel 3 is nutteloos, aangezien die altijd gedefinieerd zal zijn in je functie.
de php functie setcookie zet het cookie wel in de browser, maar pas tijdens het laden van een pagina. Zodoende wordt deze de eerste keer nog niet teruggestuurd.
Daarom staat er na de setcookie direct een redirect.

Onderstaande code heb ik geschreven ter verduidelijking. Er kunnen nog parse errors inzitten.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function maak_geldige_taal($taal = 'nl'){
        $lijst_taal = array('nl', 'fr');
        if(! in_array($taal, $lijst_taal)){
            $taal = 'nl';
        }
        return $taal;
    }
    if(  (  isset($_COOKIE['spar_taal']) && $_COOKIE['spar_taal'] != maak_geldige_taal($_COOKIE['spar_taal']) )
         ||
         isset($_GET['taal']) )
    {
        $nieuwe_taal = isset($_GET['taal']) ? maak_geldige_taal($_GET['taal']) : maak_geldige_taal();
        setcookie('spar_taal', $nieuwe_taal, time()+3600, '/');
        header('Location: http://pad/naar/site/index.php?taal=' . $nieuwe_taal);
        die();
    }

[ Voor 94% gewijzigd door GlowMouse op 09-09-2006 21:58 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op zaterdag 09 september 2006 @ 21:45:
[...]

Wat gebeurt er hier als $_GET['taal'] niet ingesteld is? Voeg bij die ongelijkheidscheck een isset($_GET['taal']) toe.

De inhoud van het koekje zou ik trouwens ook checken; die is namelijk eenvoudig door een kwaadwillende gebruiker te wijzigen. Verder denk ik dat zet_taal niet de juiste naam is voor die functie.
Op regel 4 van je code staat 'nl' zonder enige quotes. Hoewel PHP het misschien wel slikt, kun je hier heel veel beter een echte string van maken.
De isset($taal) op regel 3 is nutteloos, aangezien die altijd gedefinieerd zal zijn in je functie.


[...]

Daarom staat er na de setcookie direct een redirect.

Onderstaande code heb ik geschreven ter verduidelijking. Er kunnen nog parse errors inzitten.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    function maak_geldige_taal($taal = 'nl'){
        $lijst_taal = array('nl', 'fr');
        if(! in_array($taal, $lijst_taal)){
            $taal = 'nl';
        }
        return $taal;
    }
    if(  (  isset($_COOKIE['spar_taal']) && $_COOKIE['spar_taal'] != maak_geldige_taal($_COOKIE['spar_taal']) )
         ||
         isset($_GET['taal']) )
    {
        $nieuwe_taal = isset($_GET['taal']) ? maak_geldige_taal($_GET['taal']) : maak_geldige_taal();
        setcookie('spar_taal', $nieuwe_taal, time()+3600, '/');
        header('Location: http://pad/naar/site/index.php?taal=' . $nieuwe_taal);
        die();
    }
Hej, alvast bedankt. Het werkt wel niet echt, ik heb voor de veiligheid al mijn cookies gewist... Als ik de index.php oproep zonder ?taal=xx parameter, laadt 'ie niet standaard "nl" in. Roep ik index.php?taal=fr of nl op, dan melkt Firefox iets als
Firefox heeft vastgesteld dat de server het verzoek voor dit adres doorverwijst op een manier die nooit zal eindigen.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
- Als ik de index.php oproep zonder ?taal=xx parameter, laadt 'ie niet standaard "nl"
$_COOKIE['spar_taal'] is dan niet gezet, daar moet nog een conditie voor gemaakt worden.
- Roep ik index.php?taal=fr of nl op, dan melkt Firefox iets als [..]
Te verklaren omdat hij weer redirect naar een url die de taal opnieuw instelt.
Onderstaande code verhelpt beide problemen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    function maak_geldige_taal($taal = 'nl'){
        $lijst_taal = array('nl', 'fr');
        if(! in_array($taal, $lijst_taal)){
            $taal = 'nl';
        }
        return $taal;
    }
    if(  (  isset($_COOKIE['spar_taal']) && $_COOKIE['spar_taal'] != maak_geldige_taal($_COOKIE['spar_taal']) )
         || ! isset($_COOKIE['spar_taal']) || isset($_GET['taal'])  )
    {
        $nieuwe_taal = isset($_GET['taal']) ? maak_geldige_taal($_GET['taal']) : maak_geldige_taal();
        setcookie('spar_taal', $nieuwe_taal, time()+3600, '/');
        header('Location: http://pad/naar/site/index.php');
        die();
    }

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Ik zou de taalselectie eerlijk gezegd niet via een cookie doen, maar de parameter elke keer met het url meegeven. Op die manier zorg je ervoor dat mensen direct naar je content kunnen linken (in de verwachte taal), dat zoekmachines alle talen kunnen indexeren en bovendien dat mensen die cookies weigeren ook alle talen beschikbaar hebben. Het middel lijkt me zegmaar wat te lomp voor wat je wil bereiken...

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
T-MOB schreef op zondag 10 september 2006 @ 20:55:
Ik zou de taalselectie eerlijk gezegd niet via een cookie doen, maar de parameter elke keer met het url meegeven.
En daarvoor heeft men sessies uitgevonden. Waarom moeilijk als het makkelijk kan ;^)

Acties:
  • 0 Henk 'm!

  • DexterDee
  • Registratie: November 2004
  • Laatst online: 13:59

DexterDee

I doubt, therefore I might be

moozzuzz schreef op maandag 11 september 2006 @ 09:32:
[...]
En daarvoor heeft men sessies uitgevonden. Waarom moeilijk als het makkelijk kan ;^)
En waarvoor heeft men sessies uitgevonden? Sessies hebben helemaal niks te maken met een parameter die via de url wordt doorgegeven. Het punt van T-MOB is juist dat je elke pagina per taal kunt bookmarken, omdat de gekozen taalinformatie in de url staat. Een sessie bestaat op de server en wordt bovendien na een bepaalde tijd inactief, waardoor je bovenstaande nog steeds niet kunt bereiken.

Klik hier om mij een DM te sturen • 3245 WP op ZW


Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Even een opmerking vwb het SEO gedeelte: je homepage heeft op dit moment dus als tekst: "Kies taal, choisir lanque, nederlands, francais". Dat is niet echt relevante tekst waar een homepage uit zo moeten bestaan ;) Splash pages zijn in 99,99% van de gevallen een slecht idee.

ps. mijn frans is niet te best ;)

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Waarom een splash pagina wanneer de browser zelf keurig meestuurt welke taal de gebruiker het liefst voorsgeschoteld krijgt? Dat lijstje kan zelfs uit meerdere talen bestaan dus vaak zit de gewenste taal er wel tussen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • moozzuzz
  • Registratie: Januari 2005
  • Niet online
DexterDee schreef op maandag 11 september 2006 @ 09:54:
En waarvoor heeft men sessies uitgevonden?
Parameters elke keer met de url doorgeven. Telkens een (zelfde) parameter meegeven is eigenlijk niet nodig: Je zet em eenmaal in een session en dan gedaan :^). Wordt $_POST['taal'] geset op een bepaald ogenblik, dan verander je de waarde in de sessie en in alle gevallen gebruik je enkel de sessie-vars.

Evt. kan je em ook in cookie gooien voor latere visits, maar dat is al extra functionaliteit.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Voor André: maak daar maar 100 procent van. Maar ach, klant is koning. :)

Voor Janoz: maar als een Nederlander de pagina op een Franse computer wil bekijken? Aha! :)

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 11 september 2006 @ 11:45:
Voor Janoz: maar als een Nederlander de pagina op een Franse computer wil bekijken? Aha! :)
Het idee van Janoz vind ik toch wel het beste. Op de website kun je natuurlijk een systeem (linkjes, vlaggen, noem het maar op) maken waarmee de gebruiker de taal alsnog kan wijzigen. Zorg ervoor dat de gebruiker zo min mogelijk moeite hoeft te doen om de website te gebruiken.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

@Urbi: Als een nederlander op een franse computer zit dan kan die persoon gewoon zelf instellen wat zijn accept language is. En als hij dat niet gedaan heeft (omdat het bv een inet cafe is) dan heb je altijd nog de vlaggetjes op de pagina om te wisselen van taal.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1