Ik loop een beetje vast met op welk moment ik een Cookie moet zetten voor een geselecteerde taal (drie talige website) met het gebruik van AltoRouter. De situatie is momenteel als volgt. In mijn controller file heb ik momenteel het volgende:

$lang  = filter_input(INPUT_GET, 'lang');
$route = filter_input(INPUT_GET, 'route');

if ( !$lang ) {
    if ( isset($_COOKIE["language"]) ) {
        $lang = $_COOKIE["language"];
    } else {
        $lang = 'nl';
    }
    header("Location: /$lang/$route");
}

Met andere woorden als $_Cookie{"language"] bestaat (nl, en, de) dan dient de uitgangs- taal (bij een tweede bezoek) de waarde van het Cookie te zijn (www.website.com/de/ of een van de andere twee), bestaat het Cookie nog niet zet de taal dan op Nederlands (www.website.com/nl/).

In de navigatie wil ik graag een taal dropdown hebben waar de Cookie taal de link voor de dropdown is:

<?php if (!isset($_COOKIE["lang"]) || isset($_COOKIE["lang"]) && $_COOKIE["lang"] == 'nl' ): ?>
<li class="nav-item dropdown">
	<a id"languageDropdown" class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">
		<img src="/images/flaggs/nl.png">&nbsp;&nbsp;Nederlands
	</a>
	<div class="dropdown-menu" aria-labelledby="languageDropdown">
		<a href="/en<?php echo $current_route?>" class="dropdown-item">
			<img src="/images/flaggs/uk.png">&nbsp;&nbsp;English
		</a>
		<a href="/de<?php echo $current_route?>" class="dropdown-item">
			<img src="/images/flaggs/de.png">&nbsp;&nbsp;Deutsch
		</a>		
	</div>
</li>
<?php elseif(isset($_COOKIE["lang"]) && $_COOKIE["lang"] == 'en'): ?>	
	// Zelfde als boven met Engels als uitgangs taal	
<?php elseif(isset($_COOKIE["lang"]) && $_COOKIE["lang"] == 'de'): ?>
	// Zelfde als boven met Duits als uitgangs taal
<?php endif; ?>


Ik kom er alleen niet uit op welk moment en waar ik het best het Cookie kan zetten. Zit me nu al een uur of wat rot te tobben. Iedere hulp zou ik zeer op prijs stellen.





[size=xsmall]Toevoeging op 30/09/2018 18:11:46:[/size]

Ik heb dit op de volgende wijze opgelost:

$lang  = filter_input(INPUT_GET, 'lang');
$route = filter_input(INPUT_GET, 'route');

if ( !$lang ) {
    if ( isset($_COOKIE["language"]) ) {
        $lang = $_COOKIE["language"];
    } else {
        $lang = 'nl';
    }
    header("Location: /$lang/$route");
} else {
    $lang = (string)$lang; 
    setcookie( 'language', $lang, time() + 60*60*24*365, '/' );	
}

En dat werkt prima. Het enige probleem dat ik nu nog ondervind is de content voor de dropdown niet wijzigd, althans niet met gebruik van de header("Location") Als iemand bijvoorbeeld Engels kies veranderd de waarde van het Cookie naar en maar de nederlandse vlag met bijbehorende tekst blijven staan.

<img src="/images/flaggs/nl.png">&nbsp;&nbsp;Nederlands

Als ik daarna de pagina handmatig ververs veranderd de content wel naar de engelse versie:

<img src="/images/flaggs/uk.png">&nbsp;&nbsp;English

Hoe zou ik dit kunnen oplossen? Alvast bedankt
Rob Doemaarwat op 02/10/2018 18:12:00

... maar dan nog: "/nl" != "nl"?

@Rob Doemaarwat. De slash staat daar handmatig en is gedefinieerd in Router.php en in de header(Location) zoals eerder getoond.
header("Location: /en/$route");

en als ik $_COOKIE['lang']; echo krijg ik de de juiste waarde nl, en of de dus daar is niets mis mee en zoals gezegd het werkt.

@Donald

Het is een beetje een verwarrend draadje inmiddels. Kun je nog eens uitleggen wat er precies misgaat?
Ozzie PHP op 02/10/2018 22:19:20

@Donald

Het is een beetje een verwarrend draadje inmiddels. Kun je nog eens uitleggen wat er precies misgaat?

@Ozzie. Ik ga het proberen :)

In mijn navigatie heb ik een talen dropdown (Bootstrap dropdown), waarbij de actieve taal de dropdown trigger is en de overige talen in het daadwerkelijke dropdown menu staan:

<li class="nav-item dropdown">
	<?php if (!isset($_COOKIE["language"]) || ($_COOKIE["language"] == 'nl')): ?>
    <a class="nav-link dropdown-toggle" href="#">
        <img src="/images/flaggs/nl.png">&nbsp;&nbsp;Nederlands //Nederlands is actief
	</a>
        <div class="dropdown-menu">
			<a href="/en<?php echo $current_route?>" class="dropdown-item">
                <img src="/images/flaggs/uk.png">&nbsp;&nbsp;English
            </a>
			<a href="/de<?php echo $current_route?>" class="dropdown-item">
                <img src="/images/flaggs/de.png">&nbsp;&nbsp;Deutch
            </a>
        </div>
	<?php elseif ($_COOKIE["language"] == 'en' ): ?>
    // Zelfde als boven maar dan voor Engels
	<?php elseif ($_COOKIE["language"] == 'de' ): ?>
	// Zelfde als boven maar dan voor Duits
    <?php endif; ?>
</li>

Nederlands is de default taal voor de website dus als het een eerste bezoek betreft bestaat er uiteraard nog geen Cookie en deze wordt dan gezet met de waarde nl.

Het zetten van de Cookies vindt plaats in de main Controller op de volgende manier:

$lang  = filter_input(INPUT_GET, 'lang');
$route = filter_input(INPUT_GET, 'route');

if ( !$lang ) {
    if ( isset($_COOKIE["language"]) ) {
        $lang = $_COOKIE["language"];
    } else {
        $lang = 'nl';
    }
    header("Location: /$lang/$route");
	exit;
} else {
    $lang = (string)$lang; 
    //setcookie( 'language', $lang, time() + 60*60*24*365, '/' );
	setcookie( 'language', $_COOKIE["lang"] = $lang, time() + 60*60*24*365, '/' );	
}

Waarbij $lang en $route de taal en huidige route(pagina/template) vertegenwoordigen die gebruikt worden in header Location:

header("Location: /$lang/$route");

en in het dropdown menu:

<a href="/en<?php echo $route?>" class="dropdown-item">

Het probleem heeft niets te maken met het veranderen van de taal ($lang) en het verwijzen naar de juiste template ($route) want dat werkt prima. M.a.w. als ik op bijvoorbeeld de contact pagina in het Nederlands besluit dat ik van taal wil veranderen en ik kies voor Engels, veranderd de taal naar Engels (waarde van $_COOKIE['language'] veranderd in en) en kom ik inderdaad op de contact pagina terecht. Dus de variabelen $lang en $rout werken zoals gewenst

Mijn probleem heeft te maken met het dropdown menu. Zoals ik al eerder aangaf is de actieve taal (vlag en naam) de trigger voor het dropdown menu:

<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#">
        <img src="/images/flaggs/nl.png">&nbsp;&nbsp;Nederlands //Nederlands is actief
	</a>
</li>

Dus met bovengenoemd voorbeeld zouden de vlag en naam van de trigger na de keuze voor Engels uit het dropdown menu ook moeten veranderen naar de Engelse variant:

<li class="nav-item dropdown">
    <a class="nav-link dropdown-toggle" href="#">
        <img src="/images/flaggs/uk.png">&nbsp;&nbsp;English //Engels is actief
	</a>
</li>

Maar dat werkt dus niet. Ik moet de pagina handmatig verversen voordat de actieve link ook verandert naar de juiste variatie (Engels in dit geval).

Ik hoop dat ik mijzelf zo een beetje duidelijk heb gemaakt

Maak van regel 15 in de main controller (zoals hierboven) eens:

setcookie( 'language', $_COOKIE["language"] = $lang, time() + 60*60*24*365, '/' ); 
//                                   ^^^^ dit ontbrak ...
@Rob Doemaarwat. Wat ben ik een sukkel :(. De hand gaat geheel in eigen boezem. Bedankt man. Ik ben je een biertje verschuldigd. Komt omdat ik eerst met $_COOKIE['lang'] werkte maar om het onderscheid te maken heb ik daar language van gemaakt. Je bent een topper

Reageren