]> Pileus Git - ~andy/gtk/commitdiff
Make gtk_builder_get_translation_domain() useful for subparsers.
authorMatthias Clasen <matthiasc@src.gnome.org>
Mon, 8 Dec 2008 03:57:16 +0000 (03:57 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Mon, 8 Dec 2008 03:57:16 +0000 (03:57 +0000)
        * gtk/gtkbuilderparser.c: Make gtk_builder_get_translation_domain()
        useful for subparsers.

        * gtk/gtkcontainer.c: Make the child property parser support
        translatable child properties.

svn path=/trunk/; revision=21855

ChangeLog
docs/reference/ChangeLog
docs/reference/gtk/tmpl/gtkcontainer.sgml
gtk/gtkbuilderparser.c
gtk/gtkcontainer.c

index 97e74dca26a724fb5ea1966b524415b9616b5498..b66500926f1944add0ef142d5ef5ba61433f39a8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2008-12-07  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtkbuilderparser.c: Make gtk_builder_get_translation_domain()
+       useful for subparsers.
+
+       * gtk/gtkcontainer.c: Make the child property parser support
+       translatable child properties.
 2008-12-07  Matthias Clasen  <mclasen@redhat.com>
 
        Bug 554274 – Add default hook for GtkLinkButton
@@ -8,7 +16,7 @@
 2008-12-07  Matthias Clasen  <mclasen@redhat.com>
 
        Bug 559325 – documentation for gdk_display_get_window_at_pointer() 
-       is wrong
+:      is wrong
 
        * gdk/gdkdisplay.c (gdk_display_get_window_at_pointer): Correct
        the documentation. Patch by Paul Davis
index b302b6a00c090fe9629a3fa5d299cb856f0b3256..0fa917f43aaffb577d4e47ea3db6af31de5934aa 100644 (file)
@@ -1,3 +1,8 @@
+2008-12-07  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/tmpl/gtkcontainer.sgml: Document translatable child
+       properties in GtkBuilder
+
 2008-11-29  Baptiste Mille-Mathias <baptiste.millemathias@gmail.com>
 
        * docs/reference/gtk/images/accel-label.png:
index 01c819e77d4d2c06f2dee700e16e2d966932cd18..7d28b5bc35a69a8421b8c4c7efaeec5024add393 100644 (file)
@@ -125,6 +125,11 @@ child properties for the child.
 </object>
 ]]></programlisting>
 </example>
+<para>
+Since 2.16, child properties can also be marked as translatable using
+the same "translatable", "comments" and "context" attributes that are used
+for regular properties.
+</para>
 </refsect2>
 
 <!-- ##### SECTION See_Also ##### -->
index d1057811a3435eae926bb89adf43f44640fa4859..f4cb947a80c6c7bc19fa55b700ea0934fa26b854 100644 (file)
@@ -634,9 +634,24 @@ parse_interface (ParserData   *data,
     {
       if (strcmp (names[i], "domain") == 0)
        {
-         g_free (data->domain);
-         data->domain = g_strdup (values[i]);
-         break;
+
+         if (data->domain)
+           {
+             if (strcmp (data->domain, values[i]) == 0)
+               continue;
+             else
+               g_warning ("%s: interface domain '%s' overrides "
+                          "programically set domain '%s'",
+                          data->filename,
+                          values[i],
+                          data->domain
+                          );
+             
+             g_free (data->domain);
+           }
+         
+         data->domain = g_strdup (values[i]);
+         gtk_builder_set_translation_domain (data->builder, data->domain);
        }
       else
        error_invalid_attribute (data, "interface", names[i], error);
@@ -1116,13 +1131,21 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
                                   gchar       **requested_objs,
                                   GError      **error)
 {
+  const gchar* domain;
   ParserData *data;
   GSList *l;
   
+  /* Store the original domain so that interface domain attribute can be
+   * applied for the builder and the original domain can be restored after
+   * parsing has finished. This allows subparsers to translate elements with
+   * gtk_builder_get_translation_domain() without breaking the ABI or API
+   */
+  domain = gtk_builder_get_translation_domain (builder);
+
   data = g_new0 (ParserData, 1);
   data->builder = builder;
   data->filename = filename;
-  data->domain = g_strdup (gtk_builder_get_translation_domain (builder));
+  data->domain = g_strdup (domain);
 
   data->requested_objects = NULL;
   if (requested_objs)
@@ -1184,4 +1207,7 @@ _gtk_builder_parser_parse_buffer (GtkBuilder   *builder,
   g_free (data->domain);
   g_markup_parse_context_free (data->ctx);
   g_free (data);
+
+  /* restore the original domain */
+  gtk_builder_set_translation_domain (builder, domain);
 }
index 516773af01aa8e10198ffb7e89091d2147ab7443..0ee531828e5ab83aeb5f331666657ca642a8060e 100644 (file)
@@ -31,6 +31,7 @@
 
 #include "gtkcontainer.h"
 #include "gtkbuildable.h"
+#include "gtkbuilderprivate.h"
 #include "gtkprivate.h"
 #include "gtkmain.h"
 #include "gtkmarshalers.h"
@@ -361,6 +362,8 @@ typedef struct {
   GtkContainer *container;
   GtkWidget    *child;
   gchar        *child_prop_name;
+  gchar        *context;
+  gboolean     translatable
 } PackingPropertiesData;
 
 static void
@@ -379,6 +382,20 @@ attributes_start_element (GMarkupParseContext *context,
       for (i = 0; names[i]; i++)
        if (strcmp (names[i], "name") == 0)
          parser_data->child_prop_name = g_strdup (values[i]);
+       else if (strcmp (names[i], "translatable") == 0)
+         {
+           if (!_gtk_builder_boolean_from_string (values[1],
+                                                  &parser_data->translatable,
+                                                  error))
+             return;
+         }
+       else if (strcmp (names[i], "comments") == 0)
+         ; /* for translators */
+       else if (strcmp (names[i], "context") == 0)
+         parser_data->context = g_strdup (values[1]);
+       else
+         g_warning ("Unsupported attribute for GtkContainer Child "
+                    "property: %s\n", names[i]);
     }
   else if (strcmp (element_name, "packing") == 0)
     return;
@@ -394,18 +411,37 @@ attributes_text_element (GMarkupParseContext *context,
                         GError             **error)
 {
   PackingPropertiesData *parser_data = (PackingPropertiesData*)user_data;
+  const gchar* value;
 
   if (!parser_data->child_prop_name)
     return;
+  
+  if (parser_data->translatable && text_len)
+    {
+      const gchar* domain;
+      domain = gtk_builder_get_translation_domain (parser_data->builder);
+      
+      value = _gtk_builder_parser_translate (domain,
+                                            parser_data->context,
+                                            text);
+    }
+  else
+    {
+      value = g_strdup (text);
+    }
 
   gtk_container_buildable_set_child_property (parser_data->container,
                                              parser_data->builder,
                                              parser_data->child,
                                              parser_data->child_prop_name,
-                                             text);
+                                             value);
 
   g_free (parser_data->child_prop_name);
+  g_free (parser_data->context);
+  g_free (value);
   parser_data->child_prop_name = NULL;
+  parser_data->context = NULL;
+  parser_data->translatable = FALSE;
 }
 
 static const GMarkupParser attributes_parser =