Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I do this in PHP. Accept-Language is a complex thing. A browser can suggest more than one language that it would like to accept (each with a quality factor that shows which it prefers).</p> <p>Unfortunately my website only has translations for the primary languages (EN, ES, FR) rather than (en_US, en_GB, es_MX, es_ES) so I choose the highest quality factor specified in these for the primary language.</p> <p>Below is an untested edit which should remove most or all of the dependencies from my code. Sorry, things were confusing with my previous answer. I had a few calls to my function with some checking of languages are done elsewhere. The code below should set the session language variable, which you should use elsewhere for determining the correct translation.</p> <p>It seems a lot less complicated than my previous answer and I will have to implement this in my own code before long. For people who need specific translations (EN_US, EN_GB) then the below code should be modified to take account of Match 2 in the preg_match_all.</p> <pre><code>$websiteLanguages = array('EN', 'ES'); session_start(); // The user wants a specific language regardless of their accept settings. if (isset($_GET["lang"])) { $_SESSION["language"] = $_GET["lang"]; return; } // A language has already been decided upon. if (isset($_SESSION["language"])) { return; } // No language has been chosen we should choose from the accept language. if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { // Parse the Accept-Language according to: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4 preg_match_all( '/([a-z]{1,8})' . // M1 - First part of language e.g en '(-[a-z]{1,8})*\s*' . // M2 -other parts of language e.g -us // Optional quality factor M3 ;q=, M4 - Quality Factor '(;\s*q\s*=\s*((1(\.0{0,3}))|(0(\.[0-9]{0,3}))))?/i', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $langParse); $langs = $langParse[1]; // M1 - First part of language $quals = $langParse[4]; // M4 - Quality Factor $numLanguages = count($langs); $langArr = array(); for ($num = 0; $num &lt; $numLanguages; $num++) { $newLang = strtoupper($langs[$num]); $newQual = isset($quals[$num]) ? (empty($quals[$num]) ? 1.0 : floatval($quals[$num])) : 0.0; // Choose whether to upgrade or set the quality factor for the // primary language. $langArr[$newLang] = (isset($langArr[$newLang])) ? max($langArr[$newLang], $newQual) : $newQual; } // sort list based on value // langArr will now be an array like: array('EN' =&gt; 1, 'ES' =&gt; 0.5) arsort($langArr, SORT_NUMERIC); // The languages the client accepts in order of preference. $acceptedLanguages = array_keys($langArr); // Set the most preferred language that we have a translation for. foreach ($acceptedLanguages as $preferredLanguage) { if (in_array($preferredLanguage, $websiteLanguages)) { $_SESSION['Language'] = $preferredLanguage; return; } } } // We will have returned by now if a language could be chosen, otherwise use // our default language. $_SESSION['Language'] = "EN"; </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload