Support client-side translations

epel9
Matthias Clasen 16 years ago
parent bf2c662b77
commit 114d4a5284

@ -0,0 +1,360 @@
diff -up GConf-2.26.0/backends/markup-tree.c.gettext GConf-2.26.0/backends/markup-tree.c
--- GConf-2.26.0/backends/markup-tree.c.gettext 2009-04-26 23:33:05.258484987 -0400
+++ GConf-2.26.0/backends/markup-tree.c 2009-04-26 23:34:25.026700526 -0400
@@ -52,6 +52,7 @@ struct _MarkupEntry
char *schema_name;
char *mod_user;
GTime mod_time;
+ const char *gettext_domain;
};
static LocalSchemaInfo* local_schema_info_new (void);
@@ -1593,6 +1594,8 @@ markup_entry_set_value (MarkupEntry
gconf_schema_get_type (schema));
gconf_schema_set_owner (current_schema,
gconf_schema_get_owner (schema));
+ gconf_schema_set_gettext_domain (current_schema,
+ gconf_schema_get_gettext_domain (schema));
}
/* Update mod time */
@@ -1805,6 +1808,8 @@ markup_entry_get_value (MarkupEntry *ent
else if (c_local_schema && c_local_schema->long_desc)
gconf_schema_set_long_desc (schema, c_local_schema->long_desc);
+ gconf_schema_set_gettext_domain (schema, entry->gettext_domain);
+
return retval;
}
}
@@ -2339,8 +2344,9 @@ parse_value_element (GMarkupParseContext
const char *ltype;
const char *list_type;
const char *owner;
+
GConfValueType vtype;
- const char *dummy1, *dummy2, *dummy3, *dummy4;
+ const char *dummy1, *dummy2, *dummy3, *dummy4, *dummy5;
#if 0
g_assert (ELEMENT_IS ("entry") ||
@@ -2377,6 +2383,7 @@ parse_value_element (GMarkupParseContext
"muser", &dummy2,
"mtime", &dummy3,
"schema", &dummy4,
+ "gettext_domain", &dummy5,
NULL))
return;
@@ -2683,6 +2690,7 @@ parse_entry_element (GMarkupParseContext
const char *mtime;
const char *schema;
const char *type;
+ const char *gettext_domain;
const char *dummy1, *dummy2, *dummy3, *dummy4;
const char *dummy5, *dummy6, *dummy7;
GConfValue *value;
@@ -2693,6 +2701,7 @@ parse_entry_element (GMarkupParseContext
mtime = NULL;
schema = NULL;
type = NULL;
+ gettext_domain = NULL;
if (!locate_attributes (context, element_name, attribute_names, attribute_values,
error,
@@ -2701,6 +2710,7 @@ parse_entry_element (GMarkupParseContext
"mtime", &mtime,
"schema", &schema,
"type", &type,
+ "gettext_domain", &gettext_domain,
/* These are allowed but we don't use them until
* parse_value_element
@@ -2768,6 +2778,9 @@ parse_entry_element (GMarkupParseContext
*/
if (schema)
entry->schema_name = g_strdup (schema);
+
+ if (gettext_domain)
+ entry->gettext_domain = g_intern_string (gettext_domain);
}
else
{
@@ -3716,6 +3729,7 @@ write_value_element (GConfValue *value,
GConfSchema *schema;
GConfValueType stype;
const char *owner;
+ const char *gettext_domain;
schema = gconf_value_get_schema (value);
@@ -3741,6 +3755,23 @@ write_value_element (GConfValue *value,
g_free (s);
}
+
+ gettext_domain = gconf_schema_get_gettext_domain (schema);
+
+ if (gettext_domain)
+ {
+ char *s;
+
+ s = g_markup_escape_text (gettext_domain, -1);
+
+ if (fprintf (f, " gettext_domain=\"%s\"", s) < 0)
+ {
+ g_free (s);
+ return FALSE;
+ }
+
+ g_free (s);
+ }
if (stype == GCONF_VALUE_LIST)
{
diff -up GConf-2.26.0/doc/gconf-1.0.dtd.gettext GConf-2.26.0/doc/gconf-1.0.dtd
--- GConf-2.26.0/doc/gconf-1.0.dtd.gettext 2009-04-26 23:33:17.240736103 -0400
+++ GConf-2.26.0/doc/gconf-1.0.dtd 2009-04-26 23:34:25.027700384 -0400
@@ -7,7 +7,7 @@
<!-- A single schema. What I am trying to say is "this set of
elements, in any order". Duplicate elements (apart from <locale>) are
not allowed). -->
-<!ELEMENT schema (key|applyto*|owner?|type|(list_type|(car_type,cdr_type))?|default?|locale*)*>
+<!ELEMENT schema (key|applyto*|owner?|type|(list_type|(car_type,cdr_type))?|default?|locale*|gettext_domain?)*>
<!-- The key for this schema (e.g. /schemas/apps/foo/bar) -->
<!ELEMENT key (#PCDATA)>
diff -up GConf-2.26.0/gconf/gconf-internals.c.gettext GConf-2.26.0/gconf/gconf-internals.c
--- GConf-2.26.0/gconf/gconf-internals.c.gettext 2009-04-26 23:34:10.994700035 -0400
+++ GConf-2.26.0/gconf/gconf-internals.c 2009-04-26 23:34:53.767450191 -0400
@@ -513,6 +513,7 @@ gconf_fill_corba_schema_from_gconf_schem
cs->short_desc = CORBA_string_dup (gconf_schema_get_short_desc (sc) ? gconf_schema_get_short_desc (sc) : "");
cs->long_desc = CORBA_string_dup (gconf_schema_get_long_desc (sc) ? gconf_schema_get_long_desc (sc) : "");
cs->owner = CORBA_string_dup (gconf_schema_get_owner (sc) ? gconf_schema_get_owner (sc) : "");
+ cs->gettext_domain = CORBA_string_dup (gconf_schema_get_gettext_domain (sc) ? gconf_schema_get_gettext_domain (sc) : "");
{
gchar* encoded;
@@ -600,6 +601,14 @@ gconf_schema_from_corba_schema(const Con
gconf_schema_set_owner(sc, cs->owner);
}
+ if (*cs->gettext_domain != '\0')
+ {
+ if (!g_utf8_validate (cs->gettext_domain, -1, NULL))
+ gconf_log (GCL_ERR, _("Invalid UTF-8 in gettext domain for schema"));
+ else
+ gconf_schema_set_gettext_domain(sc, cs->gettext_domain);
+ }
+
{
GConfValue* val;
diff -up GConf-2.26.0/gconf/gconf-schema.c.gettext GConf-2.26.0/gconf/gconf-schema.c
--- GConf-2.26.0/gconf/gconf-schema.c.gettext 2009-04-26 23:33:26.787483545 -0400
+++ GConf-2.26.0/gconf/gconf-schema.c 2009-04-26 23:35:54.240450142 -0400
@@ -32,9 +32,10 @@ typedef struct {
GConfValueType car_type; /* Pair car type of the described entry */
GConfValueType cdr_type; /* Pair cdr type of the described entry */
gchar* locale; /* Schema locale */
- gchar* owner; /* Name of creating application */
+ const gchar* owner; /* Name of creating application */
gchar* short_desc; /* 40 char or less description, no newlines */
gchar* long_desc; /* could be a paragraph or so */
+ const gchar* gettext_domain; /* description gettext domain */
GConfValue* default_value; /* Default value of the key */
} GConfRealSchema;
@@ -63,7 +64,6 @@ gconf_schema_free (GConfSchema* sc)
g_free (real->locale);
g_free (real->short_desc);
g_free (real->long_desc);
- g_free (real->owner);
if (real->default_value)
gconf_value_free (real->default_value);
@@ -91,7 +91,9 @@ gconf_schema_copy (const GConfSchema* sc
dest->long_desc = g_strdup (real->long_desc);
- dest->owner = g_strdup (real->owner);
+ dest->gettext_domain = real->gettext_domain;
+
+ dest->owner = real->owner;
dest->default_value = real->default_value ? gconf_value_copy (real->default_value) : NULL;
@@ -136,6 +138,17 @@ gconf_schema_set_locale (GConfSchema* sc
REAL_SCHEMA (sc)->locale = NULL;
}
+void
+gconf_schema_set_gettext_domain (GConfSchema* sc, const gchar* domain)
+{
+ g_return_if_fail (domain == NULL || g_utf8_validate (domain, -1, NULL));
+
+ if (domain)
+ REAL_SCHEMA (sc)->gettext_domain = g_intern_string (domain);
+ else
+ REAL_SCHEMA (sc)->gettext_domain = NULL;
+}
+
void
gconf_schema_set_short_desc (GConfSchema* sc, const gchar* desc)
{
@@ -169,11 +182,8 @@ gconf_schema_set_owner (GConfSchema* sc,
{
g_return_if_fail (owner == NULL || g_utf8_validate (owner, -1, NULL));
- if (REAL_SCHEMA (sc)->owner)
- g_free (REAL_SCHEMA (sc)->owner);
-
if (owner)
- REAL_SCHEMA (sc)->owner = g_strdup (owner);
+ REAL_SCHEMA (sc)->owner = g_intern_string (owner);
else
REAL_SCHEMA (sc)->owner = NULL;
}
@@ -228,6 +238,14 @@ gconf_schema_validate (const GConfSchema
return FALSE;
}
+ if (real->gettext_domain && !g_utf8_validate (real->gettext_domain, -1, NULL))
+ {
+ g_set_error (err, GCONF_ERROR,
+ GCONF_ERROR_FAILED,
+ _("Schema contains invalid UTF-8"));
+ return FALSE;
+ }
+
if (real->owner && !g_utf8_validate (real->owner, -1, NULL))
{
g_set_error (err, GCONF_ERROR,
@@ -299,11 +317,32 @@ gconf_schema_get_locale (const GConfSche
}
const char*
+gconf_schema_get_gettext_domain (const GConfSchema *schema)
+{
+ g_return_val_if_fail (schema != NULL, NULL);
+
+ return REAL_SCHEMA (schema)->gettext_domain;
+}
+
+static inline const char *
+schema_translate (const GConfSchema *schema,
+ const char *string)
+{
+ if (REAL_SCHEMA (schema)->gettext_domain)
+ {
+ bind_textdomain_codeset (REAL_SCHEMA (schema)->gettext_domain, "UTF-8");
+ return g_dgettext(REAL_SCHEMA (schema)->gettext_domain, string);
+ }
+ else
+ return string;
+}
+
+const char*
gconf_schema_get_short_desc (const GConfSchema *schema)
{
g_return_val_if_fail (schema != NULL, NULL);
- return REAL_SCHEMA (schema)->short_desc;
+ return schema_translate (schema, REAL_SCHEMA (schema)->short_desc);
}
const char*
@@ -311,7 +350,7 @@ gconf_schema_get_long_desc (const GConfS
{
g_return_val_if_fail (schema != NULL, NULL);
- return REAL_SCHEMA (schema)->long_desc;
+ return schema_translate (schema, REAL_SCHEMA (schema)->long_desc);
}
const char*
diff -up GConf-2.26.0/gconf/gconf-schema.h.gettext GConf-2.26.0/gconf/gconf-schema.h
--- GConf-2.26.0/gconf/gconf-schema.h.gettext 2009-04-26 23:33:33.979744088 -0400
+++ GConf-2.26.0/gconf/gconf-schema.h 2009-04-26 23:34:25.030737043 -0400
@@ -48,6 +48,8 @@ void gconf_schema_set_cdr_type
GConfValueType type);
void gconf_schema_set_locale (GConfSchema *sc,
const gchar *locale);
+void gconf_schema_set_gettext_domain (GConfSchema *sc,
+ const gchar *domain);
void gconf_schema_set_short_desc (GConfSchema *sc,
const gchar *desc);
void gconf_schema_set_long_desc (GConfSchema *sc,
@@ -65,6 +67,7 @@ GConfValueType gconf_schema_get_list_typ
GConfValueType gconf_schema_get_car_type (const GConfSchema *schema);
GConfValueType gconf_schema_get_cdr_type (const GConfSchema *schema);
const char* gconf_schema_get_locale (const GConfSchema *schema);
+const char* gconf_schema_get_gettext_domain(const GConfSchema *schema);
const char* gconf_schema_get_short_desc (const GConfSchema *schema);
const char* gconf_schema_get_long_desc (const GConfSchema *schema);
const char* gconf_schema_get_owner (const GConfSchema *schema);
diff -up GConf-2.26.0/gconf/gconftool.c.gettext GConf-2.26.0/gconf/gconftool.c
--- GConf-2.26.0/gconf/gconftool.c.gettext 2009-04-26 23:33:41.907451190 -0400
+++ GConf-2.26.0/gconf/gconftool.c 2009-04-26 23:34:25.034736752 -0400
@@ -3295,6 +3295,7 @@ struct _SchemaInfo {
GConfValueType cdr_type;
GConfValue* global_default;
GHashTable* hash;
+ gchar* gettext_domain;
};
static int
@@ -3547,6 +3548,15 @@ extract_global_info(xmlNodePtr node,
else
g_printerr (_("WARNING: empty <applyto> node"));
}
+ else if (strcmp((char *)iter->name, "gettext_domain") == 0)
+ {
+ tmp = (char *)xmlNodeGetContent(iter);
+ if (tmp)
+ {
+ info->gettext_domain = g_strdup(tmp);
+ xmlFree(tmp);
+ }
+ }
else
g_printerr (_("WARNING: node <%s> not understood below <schema>\n"),
iter->name);
@@ -3636,6 +3646,9 @@ process_locale_info(xmlNodePtr node, Sch
if (info->owner != NULL)
gconf_schema_set_owner(schema, info->owner);
+ if (info->gettext_domain != NULL)
+ gconf_schema_set_gettext_domain(schema, info->gettext_domain);
+
xmlFree(name);
/* Locale-specific info */
@@ -3765,6 +3778,7 @@ get_schema_from_xml(xmlNodePtr node, gch
info.apply_to = NULL;
info.owner = NULL;
info.global_default = NULL;
+ info.gettext_domain = NULL;
info.hash = g_hash_table_new(g_str_hash, g_str_equal);
extract_global_info(node, &info);
@@ -3801,6 +3815,8 @@ get_schema_from_xml(xmlNodePtr node, gch
; /* nothing */
else if (strcmp((char *)iter->name, "applyto") == 0)
; /* nothing */
+ else if (strcmp((char *)iter->name, "gettext_domain") == 0)
+ ; /* nothing */
else if (strcmp((char *)iter->name, "locale") == 0)
{
process_locale_info(iter, &info);
diff -up GConf-2.26.0/gconf/GConfX.idl.gettext GConf-2.26.0/gconf/GConfX.idl
--- GConf-2.26.0/gconf/GConfX.idl.gettext 2009-04-26 23:33:58.457483190 -0400
+++ GConf-2.26.0/gconf/GConfX.idl 2009-04-26 23:34:53.764448732 -0400
@@ -16,6 +16,7 @@ struct ConfigSchema {
string short_desc;
string long_desc;
string owner;
+ string gettext_domain;
// Work around lack of recursive data types
string encoded_default_value;
};

@ -33,11 +33,15 @@ Requires: /usr/bin/killall
Conflicts: GConf2-dbus Conflicts: GConf2-dbus
Patch0: GConf-2.18.0.1-reload.patch Patch0: GConf-2.18.0.1-reload.patch
# from upstream
Patch1: gconf-less-work.patch Patch1: gconf-less-work.patch
# http://bugzilla.gnome.org/show_bug.cgi?id=568845
Patch2: GConf-gettext.patch
%description %description
GConf is a process-transparent configuration database API used to GConf is a process-transparent configuration database API used to
store user preferences. It has pluggable backends and features to store user preferences. It has pluggable backends and features to
support workgroup administration. support workgroup administration.
%package devel %package devel
@ -70,6 +74,7 @@ which require GTK+.
%setup -q -n GConf-%{version} %setup -q -n GConf-%{version}
%patch0 -p1 -b .reload %patch0 -p1 -b .reload
%patch1 -p1 -b .less-work %patch1 -p1 -b .less-work
%patch2 -p1 -b .gettext
%build %build
%configure --disable-static --enable-defaults-service %configure --disable-static --enable-defaults-service
@ -144,6 +149,9 @@ fi
%{_libdir}/pkgconfig/* %{_libdir}/pkgconfig/*
%changelog %changelog
* Mon Apr 27 2009 Matthias Clasen <mclasen@redhat.com> - 2.26.0-3
- Support client-side translations
* Mon Apr 13 2009 Adam Jackson <ajax@redhat.com> 2.26.0-2 * Mon Apr 13 2009 Adam Jackson <ajax@redhat.com> 2.26.0-2
- Explicit Conflicts: GConf2-dbus (#492636) - Explicit Conflicts: GConf2-dbus (#492636)

Loading…
Cancel
Save