Voo het testen van enkele instelling heb ik een script gemaakt dat een aantal globale variabelen in $_SESSION plaatst
if ( ! session_id() ) @ session_start();
//$datum = date("d-m-Y H:i");
$_SESSION = array("first_name"=>"John",
                "family_name"=>"Doe",
                "user_rank"=>"ADMIN",
                "user_logged" => TRUE,
                "language"=>substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2),
                "ip-adres"=>$_SERVER['REMOTE_ADDR'],
                "SESSIONID"=>session_id(),
                "client-UNIX" => $timenow,
                "time-zone" => $datum
                );

Om gebruikers van niet toegankelijke pagina's door te sturen plaats ik boven aan die pagina's deze code
  if(!(! isset($_SESSION["user_logged"]) && $_SESSION["user_logged"] == FALSE)) {
    header("Location: login.php");
    exit;
}
Echter wordt altijd door verwezen naar de login pagina.
Enig idee??
Daar wordt ook gemeld dat accept-language een last line of defense is, waar aparte url's voor verschillende talen de voorkeur hebben. Immers; ik kan prima in de VS zitten maar Nederlands of desnoods Frans willen zien. Dat is niet IP gebonden, dat is gebruiker gebonden. Zelfde geldt voor accept-language. Veel gebruikers weten niet dat ze dit kunnen aanpassen, laat staan hoe.
Implementatie van ip2geo gaat mij boven de pet.
Vraag mij ook af dit voor het welkoms bericht van die paar talen zinvol is.
Of alles maar gewoon in het Engels doen??
Wat jij wilt, als jij het leuk vindt om iedereen in alle talen te begroeten. Dan doe je dat toch ;-)
Flickr doet dat ook. Maar ik was even in de veronderstelling dat je alles van je site wou vertalen.

Voor een enkel stukje vertaling voldoet deze implementatie van de array wel.
accept-language is in zo'n geval ook best bruikbaar, zolang je dit op een correcte manier doet. Je zou dit bijvoorbeeld kunnen doen met Locale::acceptFromHttp($_SERVER['HTTP_ACCEPT_LANGUAGE']). Wel even een default aangeven voor als HTTP_ACCEPT_LANGUAGE niet wordt meegestuurd, zoals vaker voorkomt achter strenge firewalls/proxy servers.
Om het voor mij compleet te maken voor niet in de greetings tabel bekende gebruikers wordt het standaard Engels
    if(!isset($_greetings[$_SESSION['language']])) { } else {
         $_SESSION['language'] = "en";
    }

Om de Scandinavisch namen en woorden juist te laten zien wordt het welkom op deze wijze getoond

    $wMessage = htmlentities((explode(' ',trim($_greetings[$_SESSION['language']]))[0])) ;
    $wMessage .= " ".htmlentities($_SESSION['language']." ,");
    $wMessage .= htmlentities((explode(' ',trim($_greetings[$_SESSION['language']]))[1]));
Deze werkt niet voor Russisch enz
Schrijf eerst je code eens zoals hij hoort te zijn. Dus niet $_SESSION[language] maar $_SESSION['language']. Hoe vaak is dit ondertussen al gezegd eigenlijk?
Daarna kun je gaan kijken naar de juiste charsets. Hier ben je van afhankelijk.
Ben van Velzen op 28/08/2017 18:18:13

Schrijf eerst je code eens zoals hij hoort te zijn. Dus niet $_SESSION[language] maar $_SESSION['language']. Hoe vaak is dit ondertussen al gezegd eigenlijk?
Daarna kun je gaan kijken naar de juiste charsets. Hier ben je van afhankelijk.
Aangepast en
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
toegevoegd aan de html. Dit lijkt het probleem opgelost te hebben.

Ik zou dan ook zeker een header meegeven:

header('Content-Type: text/html; charset=UTF-8');


En als je databases gebruikt, geef dan ook mee bij je connectie dat je UTF-8 gebruikt.
Dit is zeker interessant leesvoer: http://www.phptherightway.com/#php_and_utf8

Hier wordt een hoop verteld over UTF-8 in PHP, en natuurlijk op de rest van de site een hoop andere 'good practise'.
Nu nog één probleem, ik wil controleren of een waarde in de array voorkomt andere moet een default ingesteld worden.

De array's
$_SESSION['language'] = "we";

    date_default_timezone_set(Europe/Amsterdam');

    $_SESSION['client-UNIX'] = time();


$_greetings = array(    "nl" => "Hallo #USER# Welkom, <BR /> uw laatste bezoek was op #DATE# om #TIME#",
                        "de" => "Hallo #USER# Wilkommen,<br/>Ihr letzter Besuch war auf #DATE# at #TIME#",
                        "en" => "Hello #USER# Welcome,<br/>Your last visit was on #DATE# at #TIME#");


Nu wil ik dus controleren of $_SESSION['language'] in de array voorkomt met de in_array functie
if (in_array($_SESSION['language'], $_greetings)) {
    echo "this array contains".$_SESSION['language'];
} else {
    echo "this array NOT contains ".$_SESSION['language'];
         $_SESSION['language'] = 'en'; // default language
}


Echter wordt altijd de default in gesteld
Dit moet je ook gewoon met isset of array_key_exists controleren. in_array() kijkt naar de waarde, niet naar de key. Vul je ondertussen de variabele al op een correcte manier?

Reageren