[PATCH 04/10] When we retranslate the welcome window, inform glibc.

Chris Lumens clumens at redhat.com
Fri Nov 30 16:28:20 UTC 2012


Everything in the beginning of anaconda_base_window_retranslate is critical
to making sure we can change translations at runtime.  The textdomain call
could go somewhere else such that it only happens once when the library is
loaded, but it's not doing any harm where it is (for now).

Translations are still not totally working, but this gets us a lot closer.
---
 pyanaconda/ui/gui/spokes/welcome.py |  6 +++---
 widgets/src/BaseWindow.c            | 17 ++++++++++++++++-
 widgets/src/BaseWindow.h            |  2 +-
 widgets/src/StandaloneWindow.c      |  4 ++--
 widgets/src/StandaloneWindow.h      |  2 +-
 5 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/pyanaconda/ui/gui/spokes/welcome.py b/pyanaconda/ui/gui/spokes/welcome.py
index 5668d1e..e2aa78b 100644
--- a/pyanaconda/ui/gui/spokes/welcome.py
+++ b/pyanaconda/ui/gui/spokes/welcome.py
@@ -147,7 +147,7 @@ class LanguageMixIn(object):
             before = self._origStrings[widget]
             widget.set_label(_(before))
 
-    def retranslate(self):
+    def retranslate(self, lang):
         # Change the translations on labels and buttons that do not have
         # substitution text.
         for name in ["pickLanguageLabel", "betaWarnTitle", "betaWarnDesc",
@@ -166,7 +166,7 @@ class LanguageMixIn(object):
         welcomeLabel.set_label(xlated)
 
         # And of course, don't forget the underlying window.
-        self.window.retranslate()
+        self.window.retranslate(lang)
 
     def refresh(self, displayArea):
         store = self.builder.get_object("languageStore")
@@ -234,7 +234,7 @@ class LanguageMixIn(object):
             lang = store[selected[0]][2]
             self.language.set_install_lang(lang)
             self.language.set_system_lang(lang)
-            self.retranslate()
+            self.retranslate(lang)
 
     def on_clear_icon_clicked(self, entry, icon_pos, event):
         if icon_pos == Gtk.EntryIconPosition.SECONDARY:
diff --git a/widgets/src/BaseWindow.c b/widgets/src/BaseWindow.c
index 8b3fcc3..ff21a8d 100644
--- a/widgets/src/BaseWindow.c
+++ b/widgets/src/BaseWindow.c
@@ -17,6 +17,8 @@
  * Author: Chris Lumens <clumens at redhat.com>
  */
 
+#include <libintl.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "BaseWindow.h"
@@ -522,10 +524,23 @@ void anaconda_base_window_clear_info(AnacondaBaseWindow *win) {
  *
  * Since: 1.0
  */
-void anaconda_base_window_retranslate(AnacondaBaseWindow *win) {
+void anaconda_base_window_retranslate(AnacondaBaseWindow *win, const char *lang) {
     char *markup;
     GValue distro = G_VALUE_INIT;
 
+    if (!textdomain("anaconda")) {
+        fprintf(stderr, "textdomain failed\n");
+        return;
+    }
+
+    setenv("LANGUAGE", lang, 1);
+    setlocale(LC_ALL, "");
+
+    {
+        extern int _nl_msg_cat_cntr;
+        ++_nl_msg_cat_cntr;
+    }
+
     g_value_init(&distro, G_TYPE_STRING);
     g_value_set_string(&distro, _(win->priv->orig_distro));
 
diff --git a/widgets/src/BaseWindow.h b/widgets/src/BaseWindow.h
index 3dd82bc..ef9c210 100644
--- a/widgets/src/BaseWindow.h
+++ b/widgets/src/BaseWindow.h
@@ -66,7 +66,7 @@ struct _AnacondaBaseWindowClass {
 GType       anaconda_base_window_get_type (void);
 GtkWidget  *anaconda_base_window_new      ();
 
-void        anaconda_base_window_retranslate (AnacondaBaseWindow *win);
+void        anaconda_base_window_retranslate (AnacondaBaseWindow *win, const char *lang);
 
 gboolean    anaconda_base_window_get_beta (AnacondaBaseWindow *win);
 void        anaconda_base_window_set_beta (AnacondaBaseWindow *win, gboolean is_beta);
diff --git a/widgets/src/StandaloneWindow.c b/widgets/src/StandaloneWindow.c
index 5d68f8e..d7e86a8 100644
--- a/widgets/src/StandaloneWindow.c
+++ b/widgets/src/StandaloneWindow.c
@@ -205,8 +205,8 @@ void anaconda_standalone_window_set_may_continue(AnacondaStandaloneWindow *win,
  *
  * Since: 1.0
  */
-void anaconda_standalone_window_retranslate(AnacondaStandaloneWindow *win) {
-    anaconda_base_window_retranslate(ANACONDA_BASE_WINDOW(win));
+void anaconda_standalone_window_retranslate(AnacondaStandaloneWindow *win, const char *lang) {
+    anaconda_base_window_retranslate(ANACONDA_BASE_WINDOW(win), lang);
     gtk_button_set_label(GTK_BUTTON(win->priv->quit_button), _(QUIT_TEXT));
     gtk_button_set_label(GTK_BUTTON(win->priv->continue_button), _(CONTINUE_TEXT));
 }
diff --git a/widgets/src/StandaloneWindow.h b/widgets/src/StandaloneWindow.h
index 6afce6f..d156205 100644
--- a/widgets/src/StandaloneWindow.h
+++ b/widgets/src/StandaloneWindow.h
@@ -72,7 +72,7 @@ GType       anaconda_standalone_window_get_type (void);
 GtkWidget  *anaconda_standalone_window_new      ();
 gboolean    anaconda_standalone_window_get_may_continue  (AnacondaStandaloneWindow *win);
 void        anaconda_standalone_window_set_may_continue  (AnacondaStandaloneWindow *win, gboolean may_continue);
-void        anaconda_standalone_window_retranslate       (AnacondaStandaloneWindow *win);
+void        anaconda_standalone_window_retranslate       (AnacondaStandaloneWindow *win, const char *lang);
 
 G_END_DECLS
 
-- 
1.7.11.2



More information about the anaconda-patches mailing list