+ if (!$locale_set) {
+ // The requested locale doesn't exist on the system.
+ //
+ // gettext seems very picky... We first need to setlocale()
+ // to a locale which _does_ exist on the system, and _then_
+ // we can set in another locale that may not be set up
+ // (say, ga_ES for Galego/Galician) it seems to take it.
+ //
+ // For some reason C and POSIX which are guaranteed to work
+ // don't do the job. en_US.UTF-8 should be there most of the
+ // time, but not guaranteed.
+ $ok = common_init_locale("en_US");
+ if (!$ok) {
+ // Try to find a complete, working locale...
+ // @fixme shelling out feels awfully inefficient
+ // but I don't think there's a more standard way.
+ $all = `locale -a`;
+ foreach (explode("\n", $all) as $locale) {
+ if (preg_match('/\.utf[-_]?8$/i', $locale)) {
+ $ok = setlocale(LC_ALL, $locale);
+ if ($ok) {
+ break;
+ }
+ }
+ }
+ if (!$ok) {
+ common_log(LOG_ERR, "Unable to find a UTF-8 locale on this system; UI translations may not work.");
+ }
+ }
+ $locale_set = common_init_locale($language);
+ }
+
+ common_init_gettext();
+}
+
+/**
+ * @access private
+ */
+function common_init_gettext()
+{
+ setlocale(LC_CTYPE, 'C');
+ // So we do not have to make people install the gettext locales
+ $path = common_config('site','locale_path');
+ bindtextdomain("statusnet", $path);
+ bind_textdomain_codeset("statusnet", "UTF-8");
+ textdomain("statusnet");
+}
+
+/**
+ * Switch locale during runtime, and poke gettext until it cries uncle.
+ * Otherwise, sometimes it doesn't actually switch away from the old language.
+ *
+ * @param string $language code for locale ('en', 'fr', 'pt_BR' etc)
+ */
+function common_switch_locale($language=null)
+{
+ common_init_locale($language);
+