Refactor locale initialisation.
authorJohn Darrington <john@darrington.wattle.id.au>
Wed, 1 Apr 2009 00:43:07 +0000 (08:43 +0800)
committerJohn Darrington <john@darrington.wattle.id.au>
Wed, 1 Apr 2009 00:43:07 +0000 (08:43 +0800)
Created a common i18n_init function that both
the GUI and terminal can use, instead of each
doing it their own way.

src/data/settings.c
src/libpspp/i18n.c
src/ui/gui/main.c
src/ui/gui/psppire.c
src/ui/terminal/main.c

index ad509fb028059a6c6d3af86445a1bdb9e744ce08..94f1f09a4c5475060d34c357148834880f8f1447 100644 (file)
@@ -22,7 +22,6 @@
 #include "format.h"
 #include "value.h"
 #include "xalloc.h"
-#include <libpspp/i18n.h>
 #include <libpspp/integer-format.h>
 #include <libpspp/message.h>
 
@@ -147,7 +146,6 @@ settings_init (int *width, int *length)
 {
   init_viewport (width, length);
   settings_set_epoch (-1);
-  i18n_init ();
   the_settings.styles = fmt_create ();
 
   settings_set_decimal_char (get_system_decimal ());
@@ -157,7 +155,6 @@ void
 settings_done (void)
 {
   fmt_done (the_settings.styles);
-  i18n_done ();
 }
 
 /* Returns the floating-point format used for RB and RBHEX
index 1463a4eecf667e43dd8fcbbedfa35f0d527ad4d4..36215b700c574ee6d9ef69acadc1e684cbde99e5 100644 (file)
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <libintl.h>
 #include <iconv.h>
 #include <errno.h>
 #include "assertion.h"
@@ -29,6 +30,8 @@
 
 #include "i18n.h"
 
+#include "version.h"
+
 #include <localcharset.h>
 #include "xstrndup.h"
 
@@ -182,7 +185,19 @@ recode_string (const char *to, const char *from,
 void
 i18n_init (void)
 {
-  free (default_encoding);
+#if ENABLE_NLS
+  setlocale (LC_CTYPE, "");
+#if HAVE_LC_MESSAGES
+  setlocale (LC_MESSAGES, "");
+#endif
+#if HAVE_LC_PAPER
+  setlocale (LC_PAPER, "");
+#endif
+  bindtextdomain (PACKAGE, locale_dir);
+  textdomain (PACKAGE);
+#endif /* ENABLE_NLS */
+
+  assert (default_encoding == NULL);
   default_encoding = strdup (locale_charset ());
 
   hmapx_init (&map);
index a36e9410a345557f6c7e9a8ece90b0a15b5aec3d..71b9fbdc9674bebc13b6ea4ccca79d93619a1e00 100644 (file)
@@ -142,6 +142,8 @@ main (int argc, char *argv[])
 
   set_program_name (argv[0]);
 
+  gtk_disable_setlocale ();
+
   if ( ! gtk_parse_args (&argc, &argv) )
     {
       perror ("Error parsing arguments");
index 3d0d864967542bc05ebba66dc322844ef2d391d6..405e135024870f8348e7de84c78e70c4e12ebeee 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <config.h>
 
-#include <locale.h>
+#include <libpspp/i18n.h>
 #include <assert.h>
 #include <libintl.h>
 #include <gsl/gsl_errno.h>
@@ -89,12 +89,8 @@ initialize (struct command_line_processor *clp, int argc, char **argv)
 {
   PsppireDict *dictionary = 0;
 
-  /* gtk_init messes with the locale.
-     So unset the bits we want to control ourselves */
-  setlocale (LC_NUMERIC, "C");
-
-  bindtextdomain (PACKAGE, locale_dir);
 
+  i18n_init ();
 
   preregister_widgets ();
 
@@ -171,6 +167,7 @@ de_initialize (void)
   message_dialog_done ();
   settings_done ();
   outp_done ();
+  i18n_done ();
 }
 
 
index e37cace39ec05af2527c6e23493689b46e75d75b..a1f201697193e04282e5726fc3b4493050fecbb1 100644 (file)
@@ -16,7 +16,6 @@
 
 #include <config.h>
 
-#include <locale.h>
 #include <signal.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -30,6 +29,8 @@
 #include <ieeefp.h>
 #endif
 
+
+#include <libpspp/i18n.h>
 #include <data/dictionary.h>
 #include <data/file-handle-def.h>
 #include <libpspp/getl.h>
@@ -61,7 +62,6 @@
 #define _(msgid) gettext (msgid)
 
 
-static void i18n_init (void);
 static void fpu_init (void);
 static void clean_up (void);
 
@@ -166,21 +166,6 @@ main (int argc, char **argv)
   return any_errors ();
 }
 \f
-static void
-i18n_init (void)
-{
-#if ENABLE_NLS
-#if HAVE_LC_MESSAGES
-  setlocale (LC_MESSAGES, "");
-#endif
-#if HAVE_LC_PAPER
-  setlocale (LC_PAPER, "");
-#endif
-  bindtextdomain (PACKAGE, locale_dir);
-  textdomain (PACKAGE);
-#endif /* ENABLE_NLS */
-}
-
 static void
 fpu_init (void)
 {
@@ -234,5 +219,6 @@ clean_up (void)
       readln_uninitialize ();
       outp_done ();
       msg_ui_done ();
+      i18n_done ();
     }
 }