Patchwork [7/9] gtk: add translation support (v4)

login
register
mail settings
Submitter Anthony Liguori
Date Feb. 18, 2013, 11:57 p.m.
Message ID <1361231825-12037-8-git-send-email-aliguori@us.ibm.com>
Download mbox | patch
Permalink /patch/221571/
State New
Headers show

Comments

Anthony Liguori - Feb. 18, 2013, 11:57 p.m.
This includes a de_DE translation from Kevin Wolf and an it translation from
Paolo Bonzini.

Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>
Cc: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
---
v1 -> v4
 - Don't use '|| exit 1' with sub-invocation of make
 - Actually include Kevin's translation

Both translations are missing a few things because of refactorings I've
done.  For 'it', we're missing:

- Zoom to Fit
- Grab on Hover
- File

I think the last one is a borrowed word though.  Paolo (or someone else
that speaks Italian), could you provide the translations for the above
and I will incorporate?

'de_DE' is only missing:

- Zoom to Fit
- Grab on Hover

Kevin/Stefan/et al, could you provide translations for these?

Thanks!

merge into basic ui
---
 Makefile       |  3 +++
 configure      |  4 +++-
 po/Makefile    | 43 +++++++++++++++++++++++++++++++++++++++++++
 po/de_DE.po    | 45 +++++++++++++++++++++++++++++++++++++++++++++
 po/it.po       | 37 +++++++++++++++++++++++++++++++++++++
 po/messages.po | 45 +++++++++++++++++++++++++++++++++++++++++++++
 ui/gtk.c       | 22 +++++++++++++++-------
 7 files changed, 191 insertions(+), 8 deletions(-)
 create mode 100644 po/Makefile
 create mode 100644 po/de_DE.po
 create mode 100644 po/it.po
 create mode 100644 po/messages.po
Stefan Hajnoczi - Feb. 19, 2013, 8:30 a.m.
On Mon, Feb 18, 2013 at 05:57:03PM -0600, Anthony Liguori wrote:
> This includes a de_DE translation from Kevin Wolf and an it translation from
> Paolo Bonzini.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> ---
> v1 -> v4
>  - Don't use '|| exit 1' with sub-invocation of make
>  - Actually include Kevin's translation
> 
> Both translations are missing a few things because of refactorings I've
> done.  For 'it', we're missing:
> 
> - Zoom to Fit
> - Grab on Hover
> - File
> 
> I think the last one is a borrowed word though.  Paolo (or someone else
> that speaks Italian), could you provide the translations for the above
> and I will incorporate?
> 
> 'de_DE' is only missing:
> 
> - Zoom to Fit
> - Grab on Hover
> 
> Kevin/Stefan/et al, could you provide translations for these?

I don't use localized software so I'm not sure what the standard terms
for "Zoom to Fit" or "Grab on Hover" are, sorry.  Kevin?

Stefan
Paolo Bonzini - Feb. 19, 2013, 9:04 a.m.
Il 19/02/2013 00:57, Anthony Liguori ha scritto:
> This includes a de_DE translation from Kevin Wolf and an it translation from
> Paolo Bonzini.
> 
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Kevin Wolf <kwolf@redhat.com>
> Cc: Stefan Hajnoczi <stefanha@redhat.com>
> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> ---
> v1 -> v4
>  - Don't use '|| exit 1' with sub-invocation of make
>  - Actually include Kevin's translation
> 
> Both translations are missing a few things because of refactorings I've
> done.  For 'it', we're missing:
> 
> - Zoom to Fit

Adatta alla finestra

> - Grab on Hover

Cattura automatica input

Both are pretty liberal adaptations.  The Italian grammar just doesn't
lend itself to these constructs.  CCing Stefano.

> - File

"File" works in Italian as well, but it's better to include the
translation explicitly in the .po file.

Paolo

> I think the last one is a borrowed word though.  Paolo (or someone else
> that speaks Italian), could you provide the translations for the above
> and I will incorporate?
> 
> 'de_DE' is only missing:
> 
> - Zoom to Fit
> - Grab on Hover
> 
> Kevin/Stefan/et al, could you provide translations for these?
> 
> Thanks!
> 
> merge into basic ui
> ---
>  Makefile       |  3 +++
>  configure      |  4 +++-
>  po/Makefile    | 43 +++++++++++++++++++++++++++++++++++++++++++
>  po/de_DE.po    | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  po/it.po       | 37 +++++++++++++++++++++++++++++++++++++
>  po/messages.po | 45 +++++++++++++++++++++++++++++++++++++++++++++
>  ui/gtk.c       | 22 +++++++++++++++-------
>  7 files changed, 191 insertions(+), 8 deletions(-)
>  create mode 100644 po/Makefile
>  create mode 100644 po/de_DE.po
>  create mode 100644 po/it.po
>  create mode 100644 po/messages.po
> 
> diff --git a/Makefile b/Makefile
> index 0d9099a..2262410 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -314,6 +314,9 @@ ifneq ($(BLOBS),)
>  		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
>  	done
>  endif
> +ifeq ($(CONFIG_GTK),y)
> +	$(MAKE) -C po $@
> +endif
>  	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
>  	set -e; for x in $(KEYMAPS); do \
>  		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
> diff --git a/configure b/configure
> index b0595b1..cd7ea5d 100755
> --- a/configure
> +++ b/configure
> @@ -3235,6 +3235,7 @@ fi
>  
>  qemu_confdir=$sysconfdir$confsuffix
>  qemu_datadir=$datadir$confsuffix
> +qemu_localedir="$datadir/locale"
>  
>  tools=""
>  if test "$want_tools" = "yes" ; then
> @@ -3408,6 +3409,7 @@ echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
>  echo "qemu_helperdir=$libexecdir" >> $config_host_mak
>  echo "extra_cflags=$EXTRA_CFLAGS" >> $config_host_mak
>  echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
> +echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
>  
>  echo "ARCH=$ARCH" >> $config_host_mak
>  if test "$debug_tcg" = "yes" ; then
> @@ -4328,7 +4330,7 @@ DIRS="$DIRS roms/seabios roms/vgabios"
>  DIRS="$DIRS qapi-generated"
>  FILES="Makefile tests/tcg/Makefile qdict-test-data.txt"
>  FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
> -FILES="$FILES tests/tcg/lm32/Makefile"
> +FILES="$FILES tests/tcg/lm32/Makefile po/Makefile"
>  FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
>  FILES="$FILES pc-bios/spapr-rtas/Makefile"
>  FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
> diff --git a/po/Makefile b/po/Makefile
> new file mode 100644
> index 0000000..047b785
> --- /dev/null
> +++ b/po/Makefile
> @@ -0,0 +1,43 @@
> +# This makefile is very special as it's meant to build as part of the build
> +# process and also within the source tree to update the translation files.
> +
> +VERSION=$(shell cat ../VERSION)
> +TRANSLATIONS=de_DE it
> +SRCS=$(addsuffix .po, $(TRANSLATIONS))
> +OBJS=$(addsuffix .mo, $(TRANSLATIONS))
> +
> +SRC_PATH=..
> +
> +-include ../config-host.mak
> +
> +vpath %.po $(SRC_PATH)/po
> +
> +all:
> +	@echo Use 'make update' to update translation files
> +	@echo or us 'make build' or 'make install' to build and install
> +	@echo the translation files
> +
> +update: $(SRCS)
> +
> +build: $(OBJS)
> +
> +clean:
> +	$(RM) $(OBJS)
> +
> +install: $(OBJS)
> +	for obj in $(OBJS); do \
> +	    base=`basename $$obj .mo`; \
> +	    $(INSTALL) -d $(DESTDIR)$(prefix)/share/locale/$$base/LC_MESSAGES; \
> +	    $(INSTALL) -m644 $$obj $(DESTDIR)$(prefix)/share/locale/$$base/LC_MESSAGES/qemu.mo; \
> +	done
> +
> +%.mo:
> +	@msgfmt -o $@ $(SRC_PATH)/po/`basename $@ .mo`.po
> +
> +messages.po: $(SRC_PATH)/ui/gtk.c
> +	@xgettext -o $@ --foreign-user --package-name=QEMU --package-version=1.0.50 --msgid-bugs-address=qemu-devel@nongnu.org -k_ -C $<
> +
> +de_DE.po: messages.po $(SRC_PATH)/ui/gtk.c
> +	@msgmerge $@ $< > $@.bak && mv $@.bak $@
> +
> +.PHONY: $(SRCS) clean all
> diff --git a/po/de_DE.po b/po/de_DE.po
> new file mode 100644
> index 0000000..7982df8
> --- /dev/null
> +++ b/po/de_DE.po
> @@ -0,0 +1,45 @@
> +# German translation for QEMU.
> +# This file is put in the public domain.
> +# Kevin Wolf <kwolf@redhat.com>, 2012.
> +#
> +msgid ""
> +msgstr ""
> +"Project-Id-Version: QEMU 1.4.50\n"
> +"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
> +"POT-Creation-Date: 2013-02-08 09:21-0600\n"
> +"PO-Revision-Date: 2012-02-28 16:00+0100\n"
> +"Last-Translator: Kevin Wolf <kwolf@redhat.com>\n"
> +"Language-Team: Deutsch <de@li.org>\n"
> +"Language: \n"
> +"MIME-Version: 1.0\n"
> +"Content-Type: text/plain; charset=UTF-8\n"
> +"Content-Transfer-Encoding: 8bit\n"
> +"Plural-Forms: nplurals=2; plural=(n!=1);\n"
> +
> +#: ../ui/gtk.c:990
> +msgid "_File"
> +msgstr "_Datei"
> +
> +#: ../ui/gtk.c:1000
> +msgid "_View"
> +msgstr "_Ansicht"
> +
> +#: ../ui/gtk.c:1002
> +msgid "_Full Screen"
> +msgstr "Voll_bild"
> +
> +#: ../ui/gtk.c:1029
> +msgid "Zoom To _Fit"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1035
> +msgid "Grab On _Hover"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1038
> +msgid "_Grab Input"
> +msgstr "_Eingabegeräte einfangen"
> +
> +#: ../ui/gtk.c:1064
> +msgid "Show _Tabs"
> +msgstr "_Tableiste anzeigen"
> diff --git a/po/it.po b/po/it.po
> new file mode 100644
> index 0000000..e4bacde
> --- /dev/null
> +++ b/po/it.po
> @@ -0,0 +1,37 @@
> +# Italian translation for QEMU.
> +# This file is put in the public domain.
> +# Paolo Bonzini <pbonzini@redhat.com>, 2012.
> +#
> +msgid ""
> +msgstr ""
> +"Project-Id-Version: QEMU 1.4.50\n"
> +"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
> +"POT-Creation-Date: 2012-02-26 11:30-0600\n"
> +"PO-Revision-Date: 2012-02-27 08:23+0100\n"
> +"Last-Translator: Paolo Bonzini <pbonzini@redhat.com>\n"
> +"Language-Team: Italian <it@li.org>\n"
> +"Language: \n"
> +"MIME-Version: 1.0\n"
> +"Content-Type: text/plain; charset=UTF-8\n"
> +"Content-Transfer-Encoding: 8bit\n"
> +"Plural-Forms: nplurals=2; plural=n != 1;\n"
> +
> +#: ../ui/gtk.c:769
> +msgid "_File"
> +msgstr "_File"
> +
> +#: ../ui/gtk.c:779
> +msgid "_View"
> +msgstr "_Visualizza"
> +
> +#: ../ui/gtk.c:781
> +msgid "_Full Screen"
> +msgstr "_Schermo intero"
> +
> +#: ../ui/gtk.c:805
> +msgid "_Grab Input"
> +msgstr "_Cattura input"
> +
> +#: ../ui/gtk.c:831
> +msgid "Show _Tabs"
> +msgstr "Mostra _tab"
> diff --git a/po/messages.po b/po/messages.po
> new file mode 100644
> index 0000000..a90cd6f
> --- /dev/null
> +++ b/po/messages.po
> @@ -0,0 +1,45 @@
> +# SOME DESCRIPTIVE TITLE.
> +# This file is put in the public domain.
> +# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
> +#
> +#, fuzzy
> +msgid ""
> +msgstr ""
> +"Project-Id-Version: QEMU 1.4.50\n"
> +"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
> +"POT-Creation-Date: 2013-02-08 09:21-0600\n"
> +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
> +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
> +"Language-Team: LANGUAGE <LL@li.org>\n"
> +"Language: \n"
> +"MIME-Version: 1.0\n"
> +"Content-Type: text/plain; charset=CHARSET\n"
> +"Content-Transfer-Encoding: 8bit\n"
> +
> +#: ../ui/gtk.c:990
> +msgid "_File"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1000
> +msgid "_View"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1002
> +msgid "_Full Screen"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1029
> +msgid "Zoom To _Fit"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1035
> +msgid "Grab On _Hover"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1038
> +msgid "_Grab Input"
> +msgstr ""
> +
> +#: ../ui/gtk.c:1064
> +msgid "Show _Tabs"
> +msgstr ""
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 2eaa3a8..8ef6e46 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -31,8 +31,12 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
>   */
>  
> +#define GETTEXT_PACKAGE "qemu"
> +#define LOCALEDIR "po"
> +
>  #include <gtk/gtk.h>
>  #include <gdk/gdkkeysyms.h>
> +#include <glib/gi18n.h>
>  #include <vte/vte.h>
>  #include <sys/types.h>
>  #include <sys/socket.h>
> @@ -953,7 +957,7 @@ static void gd_create_menus(GtkDisplayState *s)
>      accel_group = gtk_accel_group_new();
>      s->file_menu = gtk_menu_new();
>      gtk_menu_set_accel_group(GTK_MENU(s->file_menu), accel_group);
> -    s->file_menu_item = gtk_menu_item_new_with_mnemonic("_File");
> +    s->file_menu_item = gtk_menu_item_new_with_mnemonic(_("_File"));
>  
>      s->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
>      gtk_stock_lookup(GTK_STOCK_QUIT, &item);
> @@ -963,9 +967,9 @@ static void gd_create_menus(GtkDisplayState *s)
>  
>      s->view_menu = gtk_menu_new();
>      gtk_menu_set_accel_group(GTK_MENU(s->view_menu), accel_group);
> -    s->view_menu_item = gtk_menu_item_new_with_mnemonic("_View");
> +    s->view_menu_item = gtk_menu_item_new_with_mnemonic(_("_View"));
>  
> -    s->full_screen_item = gtk_check_menu_item_new_with_mnemonic("_Full Screen");
> +    s->full_screen_item = gtk_check_menu_item_new_with_mnemonic(_("_Full Screen"));
>      gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->full_screen_item),
>                                   "<QEMU>/View/Full Screen");
>      gtk_accel_map_add_entry("<QEMU>/View/Full Screen", GDK_KEY_f, GDK_CONTROL_MASK | GDK_MOD1_MASK);
> @@ -992,16 +996,16 @@ static void gd_create_menus(GtkDisplayState *s)
>      gtk_accel_map_add_entry("<QEMU>/View/Zoom Fixed", GDK_KEY_0, GDK_CONTROL_MASK | GDK_MOD1_MASK);
>      gtk_menu_append(GTK_MENU(s->view_menu), s->zoom_fixed_item);
>  
> -    s->zoom_fit_item = gtk_check_menu_item_new_with_mnemonic("Zoom To _Fit");
> +    s->zoom_fit_item = gtk_check_menu_item_new_with_mnemonic(_("Zoom To _Fit"));
>      gtk_menu_append(GTK_MENU(s->view_menu), s->zoom_fit_item);
>  
>      separator = gtk_separator_menu_item_new();
>      gtk_menu_append(GTK_MENU(s->view_menu), separator);
>  
> -    s->grab_on_hover_item = gtk_check_menu_item_new_with_mnemonic("Grab On _Hover");
> +    s->grab_on_hover_item = gtk_check_menu_item_new_with_mnemonic(_("Grab On _Hover"));
>      gtk_menu_append(GTK_MENU(s->view_menu), s->grab_on_hover_item);
>  
> -    s->grab_item = gtk_check_menu_item_new_with_mnemonic("_Grab Input");
> +    s->grab_item = gtk_check_menu_item_new_with_mnemonic(_("_Grab Input"));
>      gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->grab_item),
>                                   "<QEMU>/View/Grab Input");
>      gtk_accel_map_add_entry("<QEMU>/View/Grab Input", GDK_KEY_g, GDK_CONTROL_MASK | GDK_MOD1_MASK);
> @@ -1027,7 +1031,7 @@ static void gd_create_menus(GtkDisplayState *s)
>      separator = gtk_separator_menu_item_new();
>      gtk_menu_append(GTK_MENU(s->view_menu), separator);
>  
> -    s->show_tabs_item = gtk_check_menu_item_new_with_mnemonic("Show _Tabs");
> +    s->show_tabs_item = gtk_check_menu_item_new_with_mnemonic(_("Show _Tabs"));
>      gtk_menu_append(GTK_MENU(s->view_menu), s->show_tabs_item);
>  
>      g_object_set_data(G_OBJECT(s->window), "accel_group", accel_group);
> @@ -1063,6 +1067,10 @@ void gtk_display_init(DisplayState *ds)
>      s->scale_y = 1.0;
>      s->free_scale = FALSE;
>  
> +    setlocale(LC_ALL, "");
> +    bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR);
> +    textdomain("qemu");
> +
>      s->null_cursor = gdk_cursor_new(GDK_BLANK_CURSOR);
>  
>      s->mouse_mode_notifier.notify = gd_mouse_mode_change;
>
Paolo Bonzini - Feb. 19, 2013, 9:10 a.m.
Il 19/02/2013 09:30, Stefan Hajnoczi ha scritto:
>> > 
>> > - Zoom to Fit
>> > - Grab on Hover
>> > 
>> > Kevin/Stefan/et al, could you provide translations for these?
> I don't use localized software so I'm not sure what the standard terms
> for "Zoom to Fit" or "Grab on Hover" are, sorry.  Kevin?

The translation for "Zoom to Fit" can be found in GIMP (fourth menu,
third item, fourth submenu item - has a Ctrl-Shift-J accelerator).

Paolo
Stefano Stabellini - Feb. 19, 2013, 11:45 a.m.
On Tue, 19 Feb 2013, Paolo Bonzini wrote:
> Il 19/02/2013 00:57, Anthony Liguori ha scritto:
> > This includes a de_DE translation from Kevin Wolf and an it translation from
> > Paolo Bonzini.
> > 
> > Cc: Paolo Bonzini <pbonzini@redhat.com>
> > Cc: Kevin Wolf <kwolf@redhat.com>
> > Cc: Stefan Hajnoczi <stefanha@redhat.com>
> > Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
> > ---
> > v1 -> v4
> >  - Don't use '|| exit 1' with sub-invocation of make
> >  - Actually include Kevin's translation
> > 
> > Both translations are missing a few things because of refactorings I've
> > done.  For 'it', we're missing:
> > 
> > - Zoom to Fit
> 
> Adatta alla finestra
> 
> > - Grab on Hover
> 
> Cattura automatica input
> 
> Both are pretty liberal adaptations.  The Italian grammar just doesn't
> lend itself to these constructs.  CCing Stefano.

Oh, it has been a long while since I had a window in Italian.
However I think that your translations are good.

> > - File
> 
> "File" works in Italian as well, but it's better to include the
> translation explicitly in the .po file.
Kevin Wolf - Feb. 19, 2013, 2:03 p.m.
On Tue, Feb 19, 2013 at 09:30:41AM +0100, Stefan Hajnoczi wrote:
> On Mon, Feb 18, 2013 at 05:57:03PM -0600, Anthony Liguori wrote:
> > 'de_DE' is only missing:
> > 
> > - Zoom to Fit

- Auf Fenstergröße skalieren

> > - Grab on Hover

- Tastatur automatisch einfangen

> > Kevin/Stefan/et al, could you provide translations for these?
> 
> I don't use localized software so I'm not sure what the standard terms
> for "Zoom to Fit" or "Grab on Hover" are, sorry.  Kevin?

I don't think these menu entries are so common that there is a real
standard translation for them. "Zoom to fit" isn't completely uncommon,
but ofter refers to a page or document which doesn't make a lot of sense
in our context. FWIW, GTK's standard translation for it seems to be
"Einpassen", but I wouldn't have really understood what it means in the
context of a VM without trying it out.

Kevin

Patch

diff --git a/Makefile b/Makefile
index 0d9099a..2262410 100644
--- a/Makefile
+++ b/Makefile
@@ -314,6 +314,9 @@  ifneq ($(BLOBS),)
 		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(qemu_datadir)"; \
 	done
 endif
+ifeq ($(CONFIG_GTK),y)
+	$(MAKE) -C po $@
+endif
 	$(INSTALL_DIR) "$(DESTDIR)$(qemu_datadir)/keymaps"
 	set -e; for x in $(KEYMAPS); do \
 		$(INSTALL_DATA) $(SRC_PATH)/pc-bios/keymaps/$$x "$(DESTDIR)$(qemu_datadir)/keymaps"; \
diff --git a/configure b/configure
index b0595b1..cd7ea5d 100755
--- a/configure
+++ b/configure
@@ -3235,6 +3235,7 @@  fi
 
 qemu_confdir=$sysconfdir$confsuffix
 qemu_datadir=$datadir$confsuffix
+qemu_localedir="$datadir/locale"
 
 tools=""
 if test "$want_tools" = "yes" ; then
@@ -3408,6 +3409,7 @@  echo "qemu_localstatedir=$local_statedir" >> $config_host_mak
 echo "qemu_helperdir=$libexecdir" >> $config_host_mak
 echo "extra_cflags=$EXTRA_CFLAGS" >> $config_host_mak
 echo "extra_ldflags=$EXTRA_LDFLAGS" >> $config_host_mak
+echo "qemu_localedir=$qemu_localedir" >> $config_host_mak
 
 echo "ARCH=$ARCH" >> $config_host_mak
 if test "$debug_tcg" = "yes" ; then
@@ -4328,7 +4330,7 @@  DIRS="$DIRS roms/seabios roms/vgabios"
 DIRS="$DIRS qapi-generated"
 FILES="Makefile tests/tcg/Makefile qdict-test-data.txt"
 FILES="$FILES tests/tcg/cris/Makefile tests/tcg/cris/.gdbinit"
-FILES="$FILES tests/tcg/lm32/Makefile"
+FILES="$FILES tests/tcg/lm32/Makefile po/Makefile"
 FILES="$FILES pc-bios/optionrom/Makefile pc-bios/keymaps"
 FILES="$FILES pc-bios/spapr-rtas/Makefile"
 FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
diff --git a/po/Makefile b/po/Makefile
new file mode 100644
index 0000000..047b785
--- /dev/null
+++ b/po/Makefile
@@ -0,0 +1,43 @@ 
+# This makefile is very special as it's meant to build as part of the build
+# process and also within the source tree to update the translation files.
+
+VERSION=$(shell cat ../VERSION)
+TRANSLATIONS=de_DE it
+SRCS=$(addsuffix .po, $(TRANSLATIONS))
+OBJS=$(addsuffix .mo, $(TRANSLATIONS))
+
+SRC_PATH=..
+
+-include ../config-host.mak
+
+vpath %.po $(SRC_PATH)/po
+
+all:
+	@echo Use 'make update' to update translation files
+	@echo or us 'make build' or 'make install' to build and install
+	@echo the translation files
+
+update: $(SRCS)
+
+build: $(OBJS)
+
+clean:
+	$(RM) $(OBJS)
+
+install: $(OBJS)
+	for obj in $(OBJS); do \
+	    base=`basename $$obj .mo`; \
+	    $(INSTALL) -d $(DESTDIR)$(prefix)/share/locale/$$base/LC_MESSAGES; \
+	    $(INSTALL) -m644 $$obj $(DESTDIR)$(prefix)/share/locale/$$base/LC_MESSAGES/qemu.mo; \
+	done
+
+%.mo:
+	@msgfmt -o $@ $(SRC_PATH)/po/`basename $@ .mo`.po
+
+messages.po: $(SRC_PATH)/ui/gtk.c
+	@xgettext -o $@ --foreign-user --package-name=QEMU --package-version=1.0.50 --msgid-bugs-address=qemu-devel@nongnu.org -k_ -C $<
+
+de_DE.po: messages.po $(SRC_PATH)/ui/gtk.c
+	@msgmerge $@ $< > $@.bak && mv $@.bak $@
+
+.PHONY: $(SRCS) clean all
diff --git a/po/de_DE.po b/po/de_DE.po
new file mode 100644
index 0000000..7982df8
--- /dev/null
+++ b/po/de_DE.po
@@ -0,0 +1,45 @@ 
+# German translation for QEMU.
+# This file is put in the public domain.
+# Kevin Wolf <kwolf@redhat.com>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: QEMU 1.4.50\n"
+"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
+"POT-Creation-Date: 2013-02-08 09:21-0600\n"
+"PO-Revision-Date: 2012-02-28 16:00+0100\n"
+"Last-Translator: Kevin Wolf <kwolf@redhat.com>\n"
+"Language-Team: Deutsch <de@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n!=1);\n"
+
+#: ../ui/gtk.c:990
+msgid "_File"
+msgstr "_Datei"
+
+#: ../ui/gtk.c:1000
+msgid "_View"
+msgstr "_Ansicht"
+
+#: ../ui/gtk.c:1002
+msgid "_Full Screen"
+msgstr "Voll_bild"
+
+#: ../ui/gtk.c:1029
+msgid "Zoom To _Fit"
+msgstr ""
+
+#: ../ui/gtk.c:1035
+msgid "Grab On _Hover"
+msgstr ""
+
+#: ../ui/gtk.c:1038
+msgid "_Grab Input"
+msgstr "_Eingabegeräte einfangen"
+
+#: ../ui/gtk.c:1064
+msgid "Show _Tabs"
+msgstr "_Tableiste anzeigen"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..e4bacde
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,37 @@ 
+# Italian translation for QEMU.
+# This file is put in the public domain.
+# Paolo Bonzini <pbonzini@redhat.com>, 2012.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: QEMU 1.4.50\n"
+"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
+"POT-Creation-Date: 2012-02-26 11:30-0600\n"
+"PO-Revision-Date: 2012-02-27 08:23+0100\n"
+"Last-Translator: Paolo Bonzini <pbonzini@redhat.com>\n"
+"Language-Team: Italian <it@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../ui/gtk.c:769
+msgid "_File"
+msgstr "_File"
+
+#: ../ui/gtk.c:779
+msgid "_View"
+msgstr "_Visualizza"
+
+#: ../ui/gtk.c:781
+msgid "_Full Screen"
+msgstr "_Schermo intero"
+
+#: ../ui/gtk.c:805
+msgid "_Grab Input"
+msgstr "_Cattura input"
+
+#: ../ui/gtk.c:831
+msgid "Show _Tabs"
+msgstr "Mostra _tab"
diff --git a/po/messages.po b/po/messages.po
new file mode 100644
index 0000000..a90cd6f
--- /dev/null
+++ b/po/messages.po
@@ -0,0 +1,45 @@ 
+# SOME DESCRIPTIVE TITLE.
+# This file is put in the public domain.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: QEMU 1.4.50\n"
+"Report-Msgid-Bugs-To: qemu-devel@nongnu.org\n"
+"POT-Creation-Date: 2013-02-08 09:21-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../ui/gtk.c:990
+msgid "_File"
+msgstr ""
+
+#: ../ui/gtk.c:1000
+msgid "_View"
+msgstr ""
+
+#: ../ui/gtk.c:1002
+msgid "_Full Screen"
+msgstr ""
+
+#: ../ui/gtk.c:1029
+msgid "Zoom To _Fit"
+msgstr ""
+
+#: ../ui/gtk.c:1035
+msgid "Grab On _Hover"
+msgstr ""
+
+#: ../ui/gtk.c:1038
+msgid "_Grab Input"
+msgstr ""
+
+#: ../ui/gtk.c:1064
+msgid "Show _Tabs"
+msgstr ""
diff --git a/ui/gtk.c b/ui/gtk.c
index 2eaa3a8..8ef6e46 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -31,8 +31,12 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#define GETTEXT_PACKAGE "qemu"
+#define LOCALEDIR "po"
+
 #include <gtk/gtk.h>
 #include <gdk/gdkkeysyms.h>
+#include <glib/gi18n.h>
 #include <vte/vte.h>
 #include <sys/types.h>
 #include <sys/socket.h>
@@ -953,7 +957,7 @@  static void gd_create_menus(GtkDisplayState *s)
     accel_group = gtk_accel_group_new();
     s->file_menu = gtk_menu_new();
     gtk_menu_set_accel_group(GTK_MENU(s->file_menu), accel_group);
-    s->file_menu_item = gtk_menu_item_new_with_mnemonic("_File");
+    s->file_menu_item = gtk_menu_item_new_with_mnemonic(_("_File"));
 
     s->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL);
     gtk_stock_lookup(GTK_STOCK_QUIT, &item);
@@ -963,9 +967,9 @@  static void gd_create_menus(GtkDisplayState *s)
 
     s->view_menu = gtk_menu_new();
     gtk_menu_set_accel_group(GTK_MENU(s->view_menu), accel_group);
-    s->view_menu_item = gtk_menu_item_new_with_mnemonic("_View");
+    s->view_menu_item = gtk_menu_item_new_with_mnemonic(_("_View"));
 
-    s->full_screen_item = gtk_check_menu_item_new_with_mnemonic("_Full Screen");
+    s->full_screen_item = gtk_check_menu_item_new_with_mnemonic(_("_Full Screen"));
     gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->full_screen_item),
                                  "<QEMU>/View/Full Screen");
     gtk_accel_map_add_entry("<QEMU>/View/Full Screen", GDK_KEY_f, GDK_CONTROL_MASK | GDK_MOD1_MASK);
@@ -992,16 +996,16 @@  static void gd_create_menus(GtkDisplayState *s)
     gtk_accel_map_add_entry("<QEMU>/View/Zoom Fixed", GDK_KEY_0, GDK_CONTROL_MASK | GDK_MOD1_MASK);
     gtk_menu_append(GTK_MENU(s->view_menu), s->zoom_fixed_item);
 
-    s->zoom_fit_item = gtk_check_menu_item_new_with_mnemonic("Zoom To _Fit");
+    s->zoom_fit_item = gtk_check_menu_item_new_with_mnemonic(_("Zoom To _Fit"));
     gtk_menu_append(GTK_MENU(s->view_menu), s->zoom_fit_item);
 
     separator = gtk_separator_menu_item_new();
     gtk_menu_append(GTK_MENU(s->view_menu), separator);
 
-    s->grab_on_hover_item = gtk_check_menu_item_new_with_mnemonic("Grab On _Hover");
+    s->grab_on_hover_item = gtk_check_menu_item_new_with_mnemonic(_("Grab On _Hover"));
     gtk_menu_append(GTK_MENU(s->view_menu), s->grab_on_hover_item);
 
-    s->grab_item = gtk_check_menu_item_new_with_mnemonic("_Grab Input");
+    s->grab_item = gtk_check_menu_item_new_with_mnemonic(_("_Grab Input"));
     gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->grab_item),
                                  "<QEMU>/View/Grab Input");
     gtk_accel_map_add_entry("<QEMU>/View/Grab Input", GDK_KEY_g, GDK_CONTROL_MASK | GDK_MOD1_MASK);
@@ -1027,7 +1031,7 @@  static void gd_create_menus(GtkDisplayState *s)
     separator = gtk_separator_menu_item_new();
     gtk_menu_append(GTK_MENU(s->view_menu), separator);
 
-    s->show_tabs_item = gtk_check_menu_item_new_with_mnemonic("Show _Tabs");
+    s->show_tabs_item = gtk_check_menu_item_new_with_mnemonic(_("Show _Tabs"));
     gtk_menu_append(GTK_MENU(s->view_menu), s->show_tabs_item);
 
     g_object_set_data(G_OBJECT(s->window), "accel_group", accel_group);
@@ -1063,6 +1067,10 @@  void gtk_display_init(DisplayState *ds)
     s->scale_y = 1.0;
     s->free_scale = FALSE;
 
+    setlocale(LC_ALL, "");
+    bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR);
+    textdomain("qemu");
+
     s->null_cursor = gdk_cursor_new(GDK_BLANK_CURSOR);
 
     s->mouse_mode_notifier.notify = gd_mouse_mode_change;