Re: retranslating the UI, proof of concept

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I've send my updated patch to the devel list, so we can push them both and test this further.

----- Original Message -----
> I think it's a nice solution from what is available to us in gtk.
> 
> ----- Original Message -----
> > Today, the question came up of how we can change the translation of
> > the
> > UI when you pick a different language.  This is made more
> > complicated
> > by
> > the facts that the UI is all instantiated up front, and that you
> > can
> > change translation from a spoke off the first hub.  The latter
> > problem
> > means we can't just have a separate "choose your language" program
> > up
> > front.
> > 
> > In the old UI, we delete the windows and reload them.  I have a
> > strict
> > policy against deleting screens in the new UI, so we can't do that.
> > 
> > I thus present the attached patch, which works well enough in my
> > testing.  It obviously needs further cleanup.  All the 'XXXXXXXXX'
> > stuff
> > is because there's currently no translations of the new UI so I
> > need
> > something to prove that it works.
> > 
> > - Chris
> > 
> > 
> > diff --git a/pyanaconda/ui/gui/__init__.py
> > b/pyanaconda/ui/gui/__init__.py
> > index ca08edc..8dd1e99 100644
> > --- a/pyanaconda/ui/gui/__init__.py
> > +++ b/pyanaconda/ui/gui/__init__.py
> > @@ -214,6 +214,29 @@ class UIObject(object):
> >          """
> >          pass
> >  
> > +    def retranslate(self):
> > +        from gi.repository import AnacondaWidgets, Gtk
> > +
> > +        # Widget class -> (getter, setter)   -or-
> > +        # Widget class -> (setter, )
> > +        widgetMap = { AnacondaWidgets.StandaloneWindow:
> > ("retranslate", ),
> > +                      Gtk.Button: ("get_label", "set_label"),
> > +                      Gtk.Label: ("get_label", "set_label") }
> > +        classes = widgetMap.keys()
> > +
> > +        objs = filter(lambda obj: obj.__class__ in classes,
> > self.builder.get_objects())
> > +        for obj in objs:
> > +            klass = obj.__class__
> > +            funcs = widgetMap[klass]
> > +
> > +            if len(funcs) == 1:
> > +                getattr(obj, funcs[0])()
> > +            else:
> > +                before = getattr(obj, funcs[0])()
> > +                #xlated = _(before)
> > +                #getattr(obj, funcs[1])(xlated)
> > +                getattr(obj, funcs[1])("XXXXXXXXXX")
> > +
> >      def setup(self):
> >          """Perform whatever actions are necessary to set defaults
> >          on
> >          the UI.
> >             This method may be called multiple times, so it's
> >             important to not
> > diff --git a/pyanaconda/ui/gui/spokes/welcome.py
> > b/pyanaconda/ui/gui/spokes/welcome.py
> > index c5d0e1d..167f012 100644
> > --- a/pyanaconda/ui/gui/spokes/welcome.py
> > +++ b/pyanaconda/ui/gui/spokes/welcome.py
> > @@ -76,6 +76,8 @@ class WelcomeLanguageSpoke(StandaloneSpoke):
> >          (store, selected) = selection.get_selected_rows()
> >          self.window.set_may_continue(len(selected) > 0)
> >  
> > +        self.retranslate()
> > +
> >      # Override the default in StandaloneSpoke so we can display
> >      the
> >      beta
> >      # warning dialog first.
> >      def _on_continue_clicked(self, cb):
> > diff --git a/pyanaconda/ui/gui/spokes/welcome.ui
> > b/pyanaconda/ui/gui/spokes/welcome.ui
> > index b1894d5..d6cacd7 100644
> > --- a/pyanaconda/ui/gui/spokes/welcome.ui
> > +++ b/pyanaconda/ui/gui/spokes/welcome.ui
> > @@ -242,7 +242,9 @@ OS you can rely on.  It's for testing purposes
> > only.</property>
> >                          <property
> >                          name="headers_visible">False</property>
> >                          <property
> >                          name="search_column">0</property>
> >                          <child internal-child="selection">
> > -                          <object class="GtkTreeSelection"
> > id="treeview-selection"/>
> > +                          <object class="GtkTreeSelection"
> > id="treeview-selection">
> > +                            <signal name="changed"
> > handler="on_selection_changed" swapped="no"/>
> > +                          </object>
> >                          </child>
> >                          <child>
> >                            <object class="GtkTreeViewColumn"
> >                            id="nativeName">
> > diff --git a/widgets/src/BaseWindow.c b/widgets/src/BaseWindow.c
> > index 44c60ef..a1f7da0 100644
> > --- a/widgets/src/BaseWindow.c
> > +++ b/widgets/src/BaseWindow.c
> > @@ -407,6 +407,32 @@ void
> > anaconda_base_window_clear_info(AnacondaBaseWindow *win) {
> >      win->priv->info_shown = FALSE;
> >  }
> >  
> > +void anaconda_base_window_retranslate(AnacondaBaseWindow *win) {
> > +    char *markup;
> > +    GValue distro = G_VALUE_INIT;
> > +
> > +    g_value_init(&distro, G_TYPE_STRING);
> > +    /* g_value_set_string(&distro,
> > gtk_label_get_text(GTK_LABEL(win->priv->distro_label))); */
> > +    g_value_set_string(&distro, "XXXXXXXXXX");
> > +
> > +    /* A window name is not necessarily set. */
> > +    if
> > (strcmp(gtk_label_get_text(GTK_LABEL(win->priv->name_label)),
> > "") != 0) {
> > +        GValue name = G_VALUE_INIT;
> > +
> > +        g_value_init(&name, G_TYPE_STRING);
> > +        /* g_value_set_string(&name,
> > gtk_label_get_text(GTK_LABEL(win->priv->name_label))); */
> > +        g_value_set_string(&name, "XXXXXXXXXX");
> > +
> > +        anaconda_base_window_set_property((GObject *) win,
> > PROP_WINDOW_NAME, &name, NULL);
> > +    }
> > +
> > +    anaconda_base_window_set_property((GObject *) win,
> > PROP_DISTRIBUTION, &distro, NULL);
> > +
> > +    markup = g_markup_printf_escaped("<span foreground='red'
> > weight='bold' size='large'>%s</span>", "XXXXXXXXXX");
> > +    gtk_label_set_markup(GTK_LABEL(win->priv->beta_label),
> > markup);
> > +    g_free(markup);
> > +}
> > +
> >  static GtkBuildableIface *parent_buildable_iface;
> >  
> >  static void
> > diff --git a/widgets/src/BaseWindow.h b/widgets/src/BaseWindow.h
> > index f1132f6..222fb8d 100644
> > --- a/widgets/src/BaseWindow.h
> > +++ b/widgets/src/BaseWindow.h
> > @@ -62,6 +62,8 @@ struct _AnacondaBaseWindowClass {
> >  GType       anaconda_base_window_get_type (void);
> >  GtkWidget  *anaconda_base_window_new      ();
> >  
> > +void        anaconda_base_window_retranslate (AnacondaBaseWindow
> > *win);
> > +
> >  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 5ceddd4..d770e93 100644
> > --- a/widgets/src/StandaloneWindow.c
> > +++ b/widgets/src/StandaloneWindow.c
> > @@ -190,3 +190,9 @@ void
> > anaconda_standalone_window_set_may_continue(AnacondaStandaloneWindow
> > *win,
> >                                                   gboolean
> >                                                   may_continue) {
> >      gtk_widget_set_sensitive(win->priv->continue_button,
> >      may_continue);
> >  }
> > +
> > +void
> > anaconda_standalone_window_retranslate(AnacondaStandaloneWindow
> > *win) {
> > +    anaconda_base_window_retranslate(ANACONDA_BASE_WINDOW(win));
> > +    gtk_button_set_label(GTK_BUTTON(win->priv->quit_button),
> > "XXXXXXXXXX");
> > +    gtk_button_set_label(GTK_BUTTON(win->priv->continue_button),
> > "XXXXXXXXXX");
> > +}
> > diff --git a/widgets/src/StandaloneWindow.h
> > b/widgets/src/StandaloneWindow.h
> > index b1ba029..0838b20 100644
> > --- a/widgets/src/StandaloneWindow.h
> > +++ b/widgets/src/StandaloneWindow.h
> > @@ -72,6 +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);
> >  
> >  G_END_DECLS
> >  
> > 
> > _______________________________________________
> > Anaconda-devel-list mailing list
> > Anaconda-devel-list@xxxxxxxxxx
> > https://www.redhat.com/mailman/listinfo/anaconda-devel-list
> > 
> 
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list@xxxxxxxxxx
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list
> 

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux