function update_locale($loc) { // $LANG or DEFAULT_LANGUAGE is too less information, at least on unix for // setlocale(), for bindtextdomain() to succeed. $setlocale = guessing_setlocale(LC_ALL, $loc); // [56ms] if (!$setlocale) { // system has no locale for this language, so gettext might fail $setlocale = FileFinder::_get_lang(); list($setlocale, ) = split('_', $setlocale, 2); $setlocale = guessing_setlocale(LC_ALL, $setlocale); // try again if (!$setlocale) { $setlocale = $loc; } } // Try to put new locale into environment (so any // programs we run will get the right locale.) if (!function_exists('bindtextdomain')) { // Reinitialize translation array. global $locale; $locale = array(); // do reinit to purge PHP's static cache [43ms] if ($lcfile = FindLocalizedFile("LC_MESSAGES/phpwiki.php", 'missing_ok', 'reinit')) { include $lcfile; } } else { // If PHP is in safe mode, this is not allowed, // so hide errors... @putenv("LC_ALL={$setlocale}"); @putenv("LANG={$loc}"); @putenv("LANGUAGE={$loc}"); } // To get the POSIX character classes in the PCRE's (e.g. // [[:upper:]]) to match extended characters (e.g. GrüßGott), we have // to set the locale, using setlocale(). // // The problem is which locale to set? We would like to recognize all // upper-case characters in the iso-8859-1 character set as upper-case // characters --- not just the ones which are in the current $LANG. // // As it turns out, at least on my system (Linux/glibc-2.2) as long as // you setlocale() to anything but "C" it works fine. (I'm not sure // whether this is how it's supposed to be, or whether this is a bug // in the libc...) // // We don't currently use the locale setting for anything else, so for // now, just set the locale to US English. // // FIXME: Not all environments may support en_US? We should probably // have a list of locales to try. if (setlocale(LC_CTYPE, 0) == 'C') { $x = setlocale(LC_CTYPE, 'en_US.' . $GLOBALS['charset']); } else { $x = setlocale(LC_CTYPE, $setlocale); } return $loc; }