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 <be...@igalia.com>
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 > >