The setup, blog and admin area is automatically determined by the user agent

Fixes #216
Fixes #197

The exchange between browser and server transmits information about the client and its capabilities in headers - user agent, what it accepts, and (what interests us) language. The browser sends the language information in a header.
These values indicate that the browser accepts, for example, US English (en-us) or German (de-de).
We make use of this. The setup of FlatPress now starts automatically in the language of the user. The determined language will also be used as default language for the FlatPressblog and the administration area until the user defines a language himself.

For the setup the language files 'el-gr','es-es','fr-fr' are still missing.
Therefore I limited the automatic determination of the language to 'cs-cz', 'de-de', 'en-us', 'it-it', 'ja-jp', 'nl-nl', 'pt-br'. See #239
This commit is contained in:
Fraenkiman 2023-04-18 23:27:40 +02:00
parent fd0d631259
commit 73153cffed
4 changed files with 70 additions and 64 deletions

View File

@ -93,7 +93,8 @@ define('IMAGES_DIR', FP_CONTENT . 'images/');
// here is where all the attachments will be saved // here is where all the attachments will be saved
define('ATTACHS_DIR', FP_CONTENT . 'attachs/'); define('ATTACHS_DIR', FP_CONTENT . 'attachs/');
define('LANG_DEFAULT', 'en-us'); include(LANG_DIR . 'browserlang.php');
define('LANG_DEFAULT', $browserLang);
define('BPT_SORT', SORT_DESC); define('BPT_SORT', SORT_DESC);
set_include_path(ABS_PATH); set_include_path(ABS_PATH);

View File

@ -21,7 +21,7 @@ $fp_config = array(
'dateformat' => '%A, %B %e, %Y', 'dateformat' => '%A, %B %e, %Y',
'dateformatshort' => '%Y-%m-%d', 'dateformatshort' => '%Y-%m-%d',
'charset' => 'utf-8', 'charset' => 'utf-8',
'lang' => 'en-us' 'lang' => ''
), ),
'plugins' => array( 'plugins' => array(
'blockparser' => array( 'blockparser' => array(
@ -37,4 +37,6 @@ $fp_config = array(
'url-maxlen' => 40, 'url-maxlen' => 40,
), ),
), ),
); );
?>

View File

@ -0,0 +1,64 @@
<?php
/**
* Get the language code from the browser
*
* @param array Allowed Languages "array('cs-cz','de-de','en-us','it-it','ja-jp','nl-nl','pt-br')"
* @param string Default language
* @param string Language string from HTTP-Header
* @param bool Strict-Mode
* @return array|int Data as array or null
*/
error_reporting(0);
function getBrowserLanguage($arrAllowedLanguages, $strDefaultLanguage, $strLangVariable = null, $boolStrictMode = true) {
if (isset($_REQUEST ['language'])) {
if (strlen($_REQUEST ['language']) == 2) {
return strtolower($_REQUEST ['language']);
}
foreach ($arrAllowedLanguages as $strValue) {
if (preg_match('/^' . $strValue . '\-/i', $_REQUEST ['language'])) {
return strtolower($strValue);
}
}
}
if (!is_array($arrAllowedLanguages)) {
if (strpos($arrAllowedLanguages,';')) {
$array = explode(';', $arrAllowedLanguages);
$arrAllowedLanguages = $array;
}
}
if (!isset($_SERVER ['HTTP_ACCEPT_LANGUAGE'])) {
return $arrAllowedLanguages [0];
}
if ($strLangVariable === null) $strLangVariable = $_SERVER ['HTTP_ACCEPT_LANGUAGE'];
if (empty($strLangVariable)) return $strDefaultLanguage;
$arrAcceptedLanguages = preg_split('/,\s*/', $strLangVariable);
$strCurrentLanguage = $strDefaultLanguage;
$intCurrentQ = 0;
foreach ($arrAcceptedLanguages as $arrAcceptedLanguage) {
$boolResult = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)' . '(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $arrAcceptedLanguage, $arrMatches);
if (!$boolResult) continue;
$arrLangCode = explode ('-', $arrMatches [1]);
if (isset($arrMatches [2]))
$intLangQuality = (float)$arrMatches [2];
else
$intLangQuality = 1.0;
while (count ($arrLangCode)) {
if (!is_array($arrAllowedLanguages)) $arrAllowedLanguages = array($arrAllowedLanguages);
if (in_array (strtolower (join ('-', $arrLangCode)), $arrAllowedLanguages)) {
if ($intLangQuality > $intCurrentQ) {
$strCurrentLanguage = strtolower (join ('-', $arrLangCode));
$intCurrentQ = $intLangQuality;
break;
}
}
if ($boolStrictMode) break;
array_pop ($arrLangCode);
}
}
return $strCurrentLanguage;
}
// accept the following languages, otherwise fall back to "en-us"
$browserLang = getBrowserLanguage(array('cs-cz', 'de-de', 'en-us', 'it-it', 'ja-jp', 'nl-nl', 'pt-br'), 'en-us');
?>

View File

@ -1,65 +1,4 @@
<?php <?php
/**
* Get the language code from the browser
*
* @param array Allowed Languages "array('cs-cz','de-de','en-us','it-it','ja-jp','nl-nl','pt-br')"
* @param string Default language
* @param string Language string from HTTP-Header
* @param bool Strict-Mode
* @return array|int Data as array or null
*/
function getBrowserLanguage($arrAllowedLanguages, $strDefaultLanguage, $strLangVariable = null, $boolStrictMode = true) {
if (isset($_REQUEST ['language'])) {
if (strlen($_REQUEST ['language']) == 2) {
return strtolower($_REQUEST ['language']);
}
foreach ($arrAllowedLanguages as $strValue) {
if (preg_match('/^' . $strValue . '\-/i', $_REQUEST ['language'])) {
return strtolower($strValue);
}
}
}
if (!is_array($arrAllowedLanguages)) {
if (strpos($arrAllowedLanguages,';')) {
$array = explode(';', $arrAllowedLanguages);
$arrAllowedLanguages = $array;
}
}
if (!isset($_SERVER ['HTTP_ACCEPT_LANGUAGE'])) {
return $arrAllowedLanguages [0];
}
if ($strLangVariable === null) $strLangVariable = $_SERVER ['HTTP_ACCEPT_LANGUAGE'];
if (empty($strLangVariable)) return $strDefaultLanguage;
$arrAcceptedLanguages = preg_split('/,\s*/', $strLangVariable);
$strCurrentLanguage = $strDefaultLanguage;
$intCurrentQ = 0;
foreach ($arrAcceptedLanguages as $arrAcceptedLanguage) {
$boolResult = preg_match ('/^([a-z]{1,8}(?:-[a-z]{1,8})*)' . '(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $arrAcceptedLanguage, $arrMatches);
if (!$boolResult) continue;
$arrLangCode = explode ('-', $arrMatches [1]);
if (isset($arrMatches [2]))
$intLangQuality = (float)$arrMatches [2];
else
$intLangQuality = 1.0;
while (count ($arrLangCode)) {
if (!is_array($arrAllowedLanguages)) $arrAllowedLanguages = array($arrAllowedLanguages);
if (in_array (strtolower (join ('-', $arrLangCode)), $arrAllowedLanguages)) {
if ($intLangQuality > $intCurrentQ) {
$strCurrentLanguage = strtolower (join ('-', $arrLangCode));
$intCurrentQ = $intLangQuality;
break;
}
}
if ($boolStrictMode) break;
array_pop ($arrLangCode);
}
}
return $strCurrentLanguage;
}
// accept the following languages, otherwise fall back to "en-us"
$browserLang = getBrowserLanguage(array('cs-cz', 'de-de', 'en-us', 'it-it', 'ja-jp', 'nl-nl', 'pt-br'), 'en-us');
$language = @$_POST ['language']? $_POST ['language'] : $browserLang; $language = @$_POST ['language']? $_POST ['language'] : $browserLang;
$lf = "lang.$language.php"; $lf = "lang.$language.php";