From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35106) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a9tN6-0005JB-Hj for qemu-devel@nongnu.org; Fri, 18 Dec 2015 06:38:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1a9tN1-0003Hs-IN for qemu-devel@nongnu.org; Fri, 18 Dec 2015 06:38:52 -0500 Received: from mx1.redhat.com ([209.132.183.28]:46654) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1a9tN1-0003Hn-Cn for qemu-devel@nongnu.org; Fri, 18 Dec 2015 06:38:47 -0500 Date: Fri, 18 Dec 2015 12:38:44 +0100 From: Kevin Wolf Message-ID: <20151218113844.GA31910@noname.redhat.com> References: <1441898372-32679-1-git-send-email-berto@igalia.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1441898372-32679-1-git-send-email-berto@igalia.com> Subject: Re: [Qemu-devel] [PATCH] gtk: use setlocale() for LC_MESSAGES only List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alberto Garcia Cc: Gerd Hoffmann , qemu-devel@nongnu.org, Markus Armbruster Am 10.09.2015 um 17:19 hat Alberto Garcia geschrieben: > The QEMU code is not internationalized and assumes that it runs under > the C locale, but if we use the GTK+ UI we'll end up importing the > locale settings from the environment. This can break things, such as > the JSON generator and iotest 120 in locales that use a decimal comma. > > We do however have translations for a few simple strings for the GTK+ > menu items, so in order to run QEMU using the C locale, and yet have a > translated UI let's use setlocale() for LC_MESSAGES only. > > Signed-off-by: Alberto Garcia Not sure why I noticed it only now and if it's related to any recent package upgrade on my side (using RHEL 7), but I noticed that non-ASCII characters in the GTK UI strings are broken for me and git bisect pointed to this commit. Kevin > ui/gtk.c | 21 ++++++++++++++++++++- > 1 file changed, 20 insertions(+), 1 deletion(-) > > diff --git a/ui/gtk.c b/ui/gtk.c > index df2a79e..11ea2cf 100644 > --- a/ui/gtk.c > +++ b/ui/gtk.c > @@ -1941,7 +1941,8 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) > > s->free_scale = FALSE; > > - setlocale(LC_ALL, ""); > + /* LC_MESSAGES only. See early_gtk_display_init() for details */ > + setlocale(LC_MESSAGES, ""); > bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR); > textdomain("qemu"); > > @@ -2010,6 +2011,24 @@ void gtk_display_init(DisplayState *ds, bool full_screen, bool grab_on_hover) > > void early_gtk_display_init(int opengl) > { > + /* The QEMU code relies on the assumption that it's always run in > + * the C locale. Therefore it is not prepared to deal with > + * operations that produce different results depending on the > + * locale, such as printf's formatting of decimal numbers, and > + * possibly others. > + * > + * Since GTK+ calls setlocale() by default -importing the locale > + * settings from the environment- we must prevent it from doing so > + * using gtk_disable_setlocale(). > + * > + * QEMU's GTK+ UI, however, _does_ have translations for some of > + * the menu items. As a trade-off between a functionally correct > + * QEMU and a fully internationalized UI we support importing > + * LC_MESSAGES from the environment (see the setlocale() call > + * earlier in this file). This allows us to display translated > + * messages leaving everything else untouched. > + */ > + gtk_disable_setlocale(); > gtkinit = gtk_init_check(NULL, NULL); > if (!gtkinit) { > /* don't exit yet, that'll break -help */ > -- > 2.5.1 > >