From 08c9582210be11ba211d012e8aea2838fd1e9909 Mon Sep 17 00:00:00 2001 From: Joshua Ramon Enslin Date: Mon, 10 Aug 2020 19:55:40 +0200 Subject: [PATCH] Add lang_getfrombrowser and human_filesize These functions are used in almost all md projects at one point or another. --- MD_STD.php | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/MD_STD.php b/MD_STD.php index 9556f67..c6421ce 100644 --- a/MD_STD.php +++ b/MD_STD.php @@ -196,4 +196,109 @@ class MD_STD { } + /** + * Function lang_getfrombrowser gets the browser language based on HTTP headers. + * + * @param array $allowed_languages Array containing all the languages for which + * there are translations. + * @param string $default_language Default language of the instance of MD. + * @param string $lang_variable Currently set language variable. Optional. + * @param boolean $strict_mode Whether to demand "de-de" (true) or "de" (false) Optional. + * + * @return string + */ + public static function lang_getfrombrowser(array $allowed_languages, string $default_language, string $lang_variable = "", bool $strict_mode = true):string { + + // $_SERVER['HTTP_ACCEPT_LANGUAGE'] verwenden, wenn keine Sprachvariable mitgegeben wurde + if ($lang_variable === "") { + if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE']; + } + + // wurde irgendwelche Information mitgeschickt? + if (empty($lang_variable)) { + // Nein? => Standardsprache zurückgeben + return $default_language; + } + + // Den Header auftrennen + $accepted_languages = preg_split('/,\s*/', $lang_variable); + if (!is_array($accepted_languages)) return $default_language; + + // Die Standardwerte einstellen + $current_lang = $default_language; + $current_q = 0; + + // Nun alle mitgegebenen Sprachen abarbeiten + foreach ($accepted_languages as $accepted_language) { + + // Alle Infos über diese Sprache rausholen + // phpcs:disable Generic.Strings.UnnecessaryStringConcat + $res = preg_match('/^([a-z]{1,8}(?:-[a-z]{1,8})*)(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i', $accepted_language, $matches); + // phpcs:enable + + // war die Syntax gültig? + if (!$res) { + // Nein? Dann ignorieren + continue; + } + + // Sprachcode holen und dann sofort in die Einzelteile trennen + $lang_code = explode('-', $matches[1]); + + // Wurde eine Qualität mitgegeben? + if (isset($matches[2])) { + // die Qualität benutzen + $lang_quality = (float)$matches[2]; + } else { + // Kompabilitätsmodus: Qualität 1 annehmen + $lang_quality = 1.0; + } + + // Bis der Sprachcode leer ist... + // phpcs:disable Squiz.PHP.DisallowSizeFunctionsInLoops + while (!empty($lang_code)) { + // phpcs:enable + // mal sehen, ob der Sprachcode angeboten wird + if (in_array(strtolower(join('-', $lang_code)), $allowed_languages)) { + // Qualität anschauen + if ($lang_quality > $current_q) { + // diese Sprache verwenden + $current_lang = strtolower(join('-', $lang_code)); + $current_q = $lang_quality; + // Hier die innere while-Schleife verlassen + break; + } + } + // Wenn wir im strengen Modus sind, die Sprache nicht versuchen zu minimalisieren + if ($strict_mode) { + // innere While-Schleife aufbrechen + break; + } + // den rechtesten Teil des Sprachcodes abschneiden + array_pop($lang_code); + } + } + + // die gefundene Sprache zurückgeben + return $current_lang; + + } + + /** + * Function human_filesize translates byte-level filesizes to human readable ones. + * Thanks to Jeffrey Sambells http://jeffreysambells.com/2012/10/25/human-readable-filesize-php + * + * @param string $bytes A file size, e.g. returned from filesize(). + * @param integer $decimals Number of decimal digits to allow. + * + * @return string + */ + public static function human_filesize(string $bytes, int $decimals = 2):string { + + $size = ['B','kB','MB','GB','TB','PB','EB','ZB','YB']; + $factor = floor((strlen($bytes) - 1) / 3); + return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . $size[$factor]; + + } + }