On Thu, May 20, 2010 at 05:01:01PM -0400, James Vega wrote:
> On Thu, May 20, 2010 at 10:12:50PM +0200, Bram Moolenaar wrote:
> > > If the locale is changed in gvim via ":lang" to a locale which uses
> > > comma for the decimal separator, then floating point numbers are no
> > > longer usable.  This only happens with the ":lang $locale" variant,
> > > since that sets $LANG before calling gtk_set_locale().
> > > 
> > >   env LANG=C gvim
> > >   :lang es_ES.UTF-8
> > >   :lang messages C  " so errors are in English
> > >   :echo ceil(1.2)
> > >   E806: using Float as a String
> > >   E116: Invalid arguments for function ceil(1.2)
> > >   E15: Invalid expression: ceil(1.2)
> > >   :echo str2float('1.2')
> > >   1,0
> > >   :echo str2float('1,2')
> > >   1,2
> > > 
> > > Attached patch fixes the issue by ensuring $LC_NUMERIC is set to C if
> > > the LC_ALL version of :lang is called.
> > 
> > Thanks.  In other places we do this:
> > 
> >     setlocale(LC_NUMERIC, "C");
> > 
> > Thus I think we should do the same in this place.
> 
> That won't work here.  The issue is specifically to do with the
> environment variables present when gtk_set_locale is called.  In fact,
> there's already an instance of “setlocal(LC_NUMERIC, "C");” a few lines
> above the code my patch adds.

Alternatively, it may be simpler to simply tell Gtk not to call
setlocale(LC_ALL, "") at all.  This would remove the need for the change
introduced in 7.2.318 as well as the call to gtk_set_locale in
ex_language().

Attached patch does this and appears to work fine.  Gtk dialogs created
after running ":lang es_ES.UTF-8" are properly translated.

-- 
James
GPG Key: 1024D/61326D40 2003-09-02 James Vega <james...@debian.org>
diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -4159,18 +4159,6 @@
 		    set_helplang_default(mname);
 #endif
 		}
-
-		/* Set $LC_CTYPE, because it overrules $LANG, and
-		 * gtk_set_locale() calls setlocale() again.  gnome_init()
-		 * sets $LC_CTYPE to "en_US" (that's a bug!). */
-		if (what != VIM_LC_MESSAGES)
-		    vim_setenv((char_u *)"LC_CTYPE", name);
-# ifdef FEAT_GUI_GTK
-		/* Let GTK know what locale we're using.  Not sure this is
-		 * really needed... */
-		if (gui.in_use)
-		    (void)gtk_set_locale();
-# endif
 	    }
 
 # ifdef FEAT_EVAL
diff --git a/src/main.c b/src/main.c
--- a/src/main.c
+++ b/src/main.c
@@ -377,10 +377,6 @@
 	    if (params.evim_mode)
 		mch_exit(1);
 	}
-#  if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
-	/* Re-initialize locale, it may have been altered by gui_init_check() */
-	init_locale();
-#  endif
     }
 # endif
 #endif
@@ -1400,6 +1396,10 @@
 {
     setlocale(LC_ALL, "");
 
+# ifdef FEAT_GUI_GTK
+    /* Tell Gtk not to change our locale settings. */
+    gtk_disable_setlocale();
+# endif
 # if defined(FEAT_FLOAT) && defined(LC_NUMERIC)
     /* Make sure strtod() uses a decimal point, not a comma. */
     setlocale(LC_NUMERIC, "C");

Attachment: signature.asc
Description: Digital signature

Reply via email to