+ * Sniff browser language to set the locale automatically.
+ * Note that is may not work on your server if the corresponding locale is not installed.
+ *
+ * @param string $headerLocale Locale send in HTTP headers (e.g. "fr,fr-fr;q=0.8,en;q=0.5,en-us;q=0.3").
+ **/
+function autoLocale($headerLocale)
+{
+ // Default if browser does not send HTTP_ACCEPT_LANGUAGE
+ $attempts = array('en_US', 'en_US.utf8', 'en_US.UTF-8');
+ if (isset($headerLocale)) {
+ // (It's a bit crude, but it works very well. Preferred language is always presented first.)
+ if (preg_match('/([a-z]{2,3})[-_]?([a-z]{2})?/i', $headerLocale, $matches)) {
+ $first = [strtolower($matches[1]), strtoupper($matches[1])];
+ $separators = ['_', '-'];
+ $encodings = ['utf8', 'UTF-8'];
+ if (!empty($matches[2])) {
+ $second = [strtoupper($matches[2]), strtolower($matches[2])];
+ $attempts = cartesian_product_generator([$first, $separators, $second, ['.'], $encodings]);
+ } else {
+ $attempts = cartesian_product_generator([$first, $separators, $first, ['.'], $encodings]);
+ }
+ }
+ }
+ setlocale(LC_ALL, implode('implode', iterator_to_array($attempts)));
+}
+
+/**
+ * Build a Generator object representing the cartesian product from given $items.