summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2008-03-02 01:14:48 +0000
committerJohan Dahlin <johan@src.gnome.org>2008-03-02 01:14:48 +0000
commite2534d54e12c3d9c4b2047608574bf3e2fa5db76 (patch)
tree7db2ab9027b0e1fd405edd768ad47cd734ee1e59
parentbee4a9fcc3a6d3d888363ed60291e8b176b314fe (diff)
downloadgtk+-e2534d54e12c3d9c4b2047608574bf3e2fa5db76.tar.gz
Add translatable/context and comment attributes on <col> tags under a
2008-02-29 Johan Dahlin <johan@gnome.org> * demos/gtk-demo/demo.ui: * gtk/gtkbuilderparser.c: * gtk/gtkbuilderprivate.h: * gtk/gtkliststore.c: * tests/buildertest.c: Add translatable/context and comment attributes on <col> tags under a GtkListStore. Refactor parts of the translation api and make it available inside gtk+ itself. Update tests and example. Fixes a part of #518642 svn path=/trunk/; revision=19685
-rw-r--r--ChangeLog13
-rw-r--r--demos/gtk-demo/demo.ui14
-rw-r--r--gtk/gtkbuilderparser.c32
-rw-r--r--gtk/gtkbuilderprivate.h6
-rw-r--r--gtk/gtkliststore.c81
-rw-r--r--tests/buildertest.c6
6 files changed, 124 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index 4f9a9c9aed..ac23015c11 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,18 @@
2008-02-29 Johan Dahlin <johan@gnome.org>
+ * demos/gtk-demo/demo.ui:
+ * gtk/gtkbuilderparser.c:
+ * gtk/gtkbuilderprivate.h:
+ * gtk/gtkliststore.c:
+ * tests/buildertest.c:
+ Add translatable/context and comment attributes on
+ <col> tags under a GtkListStore. Refactor parts of the
+ translation api and make it available inside gtk+ itself.
+ Update tests and example.
+ Fixes a part of #518642
+
+2008-02-29 Johan Dahlin <johan@gnome.org>
+
* gtk/gtkbuilder.c:
Add missing g_return_val_if_fail checks for public API.
diff --git a/demos/gtk-demo/demo.ui b/demos/gtk-demo/demo.ui
index 9d27c85cea..57dd232505 100644
--- a/demos/gtk-demo/demo.ui
+++ b/demos/gtk-demo/demo.ui
@@ -1,5 +1,5 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
-<interface>
+<interface domain="gtk20">
<object class="GtkListStore" id="liststore1">
<columns>
<column type="gchararray"/>
@@ -9,16 +9,16 @@
</columns>
<data>
<row>
- <col id="0">John</col>
- <col id="1">Doe</col>
+ <col id="0" translatable="yes">John</col>
+ <col id="1" translatable="yes">Doe</col>
<col id="2">25</col>
- <col id="3">This is the John Doe row</col>
+ <col id="3" translatable="yes">This is the John Doe row</col>
</row>
<row>
- <col id="0">Mary</col>
- <col id="1">Dole</col>
+ <col id="0" translatable="yes">Mary</col>
+ <col id="1" translatable="yes">Unknown</col>
<col id="2">50</col>
- <col id="3">This is the Mary Dole row</col>
+ <col id="3" translatable="yes">This is the Mary Unknown row</col>
</row>
</data>
</object>
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index 76e633e874..d6d69a46cf 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -791,6 +791,21 @@ dpgettext (const char *domain,
return translation;
}
+gchar *
+_gtk_builder_parser_translate (const gchar *domain,
+ const gchar *context,
+ const gchar *text)
+{
+ const char *s;
+
+ if (context)
+ s = dpgettext (domain, context, text);
+ else
+ s = dgettext (domain, text);
+
+ return g_strdup (s);
+}
+
/* Called for close tags </foo> */
static void
end_element (GMarkupParseContext *context,
@@ -841,22 +856,15 @@ end_element (GMarkupParseContext *context,
if (prop_info->translatable && prop_info->text->len)
{
- const char *text;
-
- if (prop_info->context)
- text = dpgettext (data->domain,
- prop_info->context,
- prop_info->text->str);
- else
- text = dgettext (data->domain, prop_info->text->str);
-
- prop_info->data = g_strdup (text);
+ prop_info->data = _gtk_builder_parser_translate (data->domain,
+ prop_info->context,
+ prop_info->text->str);
g_string_free (prop_info->text, TRUE);
}
else
{
- prop_info->data = prop_info->text->str;
- g_string_free (prop_info->text, FALSE);
+ prop_info->data = g_string_free (prop_info->text, FALSE);
+
}
object_info->properties =
diff --git a/gtk/gtkbuilderprivate.h b/gtk/gtkbuilderprivate.h
index 2cbb322bec..1a45aca236 100644
--- a/gtk/gtkbuilderprivate.h
+++ b/gtk/gtkbuilderprivate.h
@@ -97,6 +97,7 @@ typedef struct {
typedef GType (*GTypeGetFunc) (void);
+/* Things only GtkBuilder should use */
void _gtk_builder_parser_parse_buffer (GtkBuilder *builder,
const gchar *filename,
const gchar *buffer,
@@ -112,6 +113,8 @@ void _gtk_builder_add_signals (GtkBuilder *builder,
void _gtk_builder_finish (GtkBuilder *builder);
void _free_signal_info (SignalInfo *info,
gpointer user_data);
+
+/* Internal API which might be made public at some point */
gboolean _gtk_builder_boolean_from_string (const gchar *string,
gboolean *value,
GError **error);
@@ -119,5 +122,8 @@ gboolean _gtk_builder_flags_from_string (GType type,
const char *string,
guint *value,
GError **error);
+gchar * _gtk_builder_parser_translate (const gchar *domain,
+ const gchar *context,
+ const gchar *text);
#endif /* __GTK_BUILDER_PRIVATE_H__ */
diff --git a/gtk/gtkliststore.c b/gtk/gtkliststore.c
index 3557a7cf36..3e56ef4b6e 100644
--- a/gtk/gtkliststore.c
+++ b/gtk/gtkliststore.c
@@ -28,6 +28,7 @@
#include "gtktreednd.h"
#include "gtkintl.h"
#include "gtkbuildable.h"
+#include "gtkbuilderprivate.h"
#include "gtkalias.h"
#define GTK_LIST_STORE_IS_SORTED(list) (((GtkListStore*)(list))->sort_column_id != GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID)
@@ -2043,17 +2044,25 @@ gtk_list_store_insert_with_valuesv (GtkListStore *list_store,
* </columns>
*/
typedef struct {
+ gboolean translatable;
+ gchar *context;
+ int id;
+} ColInfo;
+
+typedef struct {
GtkBuilder *builder;
GObject *object;
GSList *column_type_names;
GType *column_types;
GValue *values;
- gint *columns;
+ gint *colids;
+ ColInfo **columns;
gint last_row;
gint n_columns;
gint row_column;
GQuark error_quark;
gboolean is_data;
+ const gchar *domain;
} SubParserData;
static void
@@ -2070,6 +2079,9 @@ list_store_start_element (GMarkupParseContext *context,
if (strcmp (element_name, "col") == 0)
{
int i, id = -1;
+ gchar *context = NULL;
+ gboolean translatable = FALSE;
+ ColInfo *info;
if (data->row_column >= data->n_columns)
g_set_error (error, data->error_quark, 0,
@@ -2082,14 +2094,35 @@ list_store_start_element (GMarkupParseContext *context,
id = atoi (values[i]);
if (errno)
g_set_error (error, data->error_quark, 0,
- "the id tag %s could not be converted to an integer", values[i]);
+ "the id tag %s could not be converted to an integer",
+ values[i]);
+ }
+ else if (strcmp (names[i], "translatable") == 0)
+ {
+ if (!_gtk_builder_boolean_from_string (values[i], &translatable,
+ error))
+ return;
+ }
+ else if (strcmp (names[i], "comments") == 0)
+ {
+ /* do nothing, comments are for translators */
+ }
+ else if (strcmp (names[i], "context") == 0)
+ {
+ context = g_strdup (values[i]);
}
if (id == -1)
g_set_error (error, data->error_quark, 0,
"<col> needs an id attribute");
+
+ info = g_slice_new0 (ColInfo);
+ info->translatable = translatable;
+ info->context = context;
+ info->id = id;
- data->columns[data->row_column] = id;
+ data->colids[data->row_column] = id;
+ data->columns[data->row_column] = info;
data->row_column++;
data->is_data = TRUE;
}
@@ -2127,11 +2160,17 @@ list_store_end_element (GMarkupParseContext *context,
gtk_list_store_insert_with_valuesv (GTK_LIST_STORE (data->object),
&iter,
data->last_row,
- data->columns,
+ data->colids,
data->values,
data->row_column);
for (i = 0; i < data->row_column; i++)
- g_value_unset (&data->values[i]);
+ {
+ ColInfo *info = data->columns[i];
+ g_free (info->context);
+ g_slice_free (ColInfo, info);
+ data->columns[i] = NULL;
+ g_value_unset (&data->values[i]);
+ }
g_free (data->values);
data->values = g_new0 (GValue, data->n_columns);
data->last_row++;
@@ -2189,13 +2228,30 @@ list_store_text (GMarkupParseContext *context,
gint i;
GError *tmp_error = NULL;
gchar *string;
+ ColInfo *info;
if (!data->is_data)
return;
i = data->row_column - 1;
+ info = data->columns[i];
string = g_strndup (text, text_len);
+ if (info->translatable && text_len)
+ {
+ gchar *translated;
+
+ /* FIXME: This will not use the domain set in the .ui file,
+ * since the parser is not telling the builder about the domain.
+ * However, it will work for gtk_builder_set_translation_domain() calls.
+ */
+ translated = _gtk_builder_parser_translate (data->domain,
+ info->context,
+ string);
+ g_free (string);
+ string = translated;
+ }
+
if (!gtk_builder_value_from_string_type (data->builder,
data->column_types[i],
string,
@@ -2255,11 +2311,13 @@ gtk_list_store_buildable_custom_tag_start (GtkBuildable *buildable,
parser_data->builder = builder;
parser_data->object = G_OBJECT (buildable);
parser_data->values = g_new0 (GValue, n_columns);
- parser_data->columns = g_new0 (gint, n_columns);
+ parser_data->colids = g_new0 (gint, n_columns);
+ parser_data->columns = g_new0 (ColInfo*, n_columns);
parser_data->column_types = GTK_LIST_STORE (buildable)->column_headers;
parser_data->n_columns = n_columns;
parser_data->last_row = 0;
parser_data->error_quark = g_quark_from_static_string ("GtkListStore");
+ parser_data->domain = gtk_builder_get_translation_domain (builder);
*parser = list_store_parser;
*data = parser_data;
@@ -2287,6 +2345,17 @@ gtk_list_store_buildable_custom_tag_end (GtkBuildable *buildable,
}
else if (strcmp (tagname, "data") == 0)
{
+ int i;
+ for (i = 0; i < sub->n_columns; i++)
+ {
+ ColInfo *info = sub->columns[i];
+ if (info)
+ {
+ g_free (info->context);
+ g_slice_free (ColInfo, info);
+ }
+ }
+ g_free (sub->colids);
g_free (sub->columns);
g_free (sub->values);
g_slice_free (SubParserData, sub);
diff --git a/tests/buildertest.c b/tests/buildertest.c
index fb6f7104d3..6649aa18b6 100644
--- a/tests/buildertest.c
+++ b/tests/buildertest.c
@@ -527,9 +527,9 @@ test_list_store (void)
" </columns>"
" <data>"
" <row>"
- " <col id=\"0\">John</col>"
- " <col id=\"1\">Doe</col>"
- " <col id=\"2\">25</col>"
+ " <col id=\"0\" translatable=\"yes\">_Quit</col>"
+ " <col id=\"1\" context=\"foo\">Doe</col>"
+ " <col id=\"2\" comment=\"foobar\">25</col>"
" </row>"
" <row>"
" <col id=\"0\">Johan</col>"