[libvirt] [PATCH 0/2] Add support for translations

libvirt-glib contains a bunch of user visible error message strings which need translation. These patches wire up the glib/intltool/gettext i18n framework I have created a transifex project to go with it https://www.transifex.com/projects/p/libvirt-glib/

From: "Daniel P. Berrange" <berrange@redhat.com> To allow the compiler to check args add G_GNUC_PRINTF and G_GNUC_NULL_TERMINATED to libvirt-gconfig-helpers-private.h Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- libvirt-gconfig/libvirt-gconfig-helpers-private.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-helpers-private.h b/libvirt-gconfig/libvirt-gconfig-helpers-private.h index 1384404..c0f6e4f 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers-private.h +++ b/libvirt-gconfig/libvirt-gconfig-helpers-private.h @@ -31,17 +31,20 @@ G_BEGIN_DECLS GError *gvir_config_error_new(GQuark domain, gint code, - const gchar *format, ...); + const gchar *format, ...) + G_GNUC_PRINTF(3, 4); void gvir_config_set_error(GError **err, GQuark domain, gint code, - const gchar *format, ...); + const gchar *format, ...) + G_GNUC_PRINTF(4, 5); void gvir_config_set_error_literal(GError **err, GQuark domain, gint code, const gchar *message); void gvir_config_set_error_valist(GError **err, GQuark domain, gint code, const gchar *format, - va_list args); + va_list args) + G_GNUC_PRINTF(4, 0); xmlNodePtr gvir_config_xml_parse(const char *xml, const char *root_node, GError **err); @@ -49,7 +52,8 @@ typedef gboolean (*GVirConfigXmlNodeIterator)(xmlNodePtr node, gpointer opaque); void gvir_config_xml_foreach_child(xmlNodePtr node, GVirConfigXmlNodeIterator iter_func, gpointer opaque); -xmlNode * gvir_config_xml_get_element (xmlNode *node, ...); +xmlNode * gvir_config_xml_get_element (xmlNode *node, ...) + G_GNUC_NULL_TERMINATED; const char * gvir_config_xml_get_child_element_content (xmlNode *node, const char *child_name); const char *gvir_config_xml_get_attribute_content(xmlNodePtr node, -- 1.8.1.4

On Mon, Apr 08, 2013 at 01:54:20PM +0100, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
To allow the compiler to check args add G_GNUC_PRINTF and G_GNUC_NULL_TERMINATED to libvirt-gconfig-helpers-private.h
ACK Christophe

From: "Daniel P. Berrange" <berrange@redhat.com> Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- .gitignore | 7 +++++ Makefile.am | 2 +- autogen.sh | 28 ++++++------------ configure.ac | 7 +++++ libvirt-gconfig/libvirt-gconfig-helpers.c | 7 +++-- libvirt-gconfig/libvirt-gconfig-object.c | 11 +++---- libvirt-gobject/libvirt-gobject-connection.c | 44 +++++++++++++++------------- libvirt-gobject/libvirt-gobject-stream.c | 14 +++++---- po/POTFILES.in | 4 +++ 9 files changed, 69 insertions(+), 55 deletions(-) create mode 100644 po/POTFILES.in diff --git a/.gitignore b/.gitignore index 8101dec..df520a1 100644 --- a/.gitignore +++ b/.gitignore @@ -72,4 +72,11 @@ docs/*/*.types *.pc libvirt-gconfig/tests/test-domain-create libvirt-gconfig/tests/test-domain-parse +.tx/ +po/Makefile +po/Makefile.in +po/Makefile.in.in +po/POTFILES +po/libvirt-glib.pot +po/stamp-it vapi/*.vapi diff --git a/Makefile.am b/Makefile.am index 37d1a09..9add74e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ -SUBDIRS = libvirt-glib libvirt-gconfig libvirt-gobject python vapi examples docs +SUBDIRS = libvirt-glib libvirt-gconfig libvirt-gobject python vapi examples docs po ACLOCAL_AMFLAGS = -I m4 diff --git a/autogen.sh b/autogen.sh index 553c3ef..bcec826 100755 --- a/autogen.sh +++ b/autogen.sh @@ -10,38 +10,28 @@ cd $srcdir DIE=0 -(autoconf --version) < /dev/null > /dev/null 2>&1 || { +for prog in intltoolize autoreconf automake autoconf libtool +do + ($prog --version) < /dev/null > /dev/null 2>&1 || { echo - echo "You must have autoconf installed to compile virt-viewer." - echo "Download the appropriate package for your distribution," - echo "or see http://www.gnu.org/software/autoconf" + echo "You must have $prog installed to compile libvirt-glib." DIE=1 -} - -(automake --version) < /dev/null > /dev/null 2>&1 || { - echo - DIE=1 - echo "You must have automake installed to compile virt-viewer." - echo "Download the appropriate package for your distribution," - echo "or see http://www.gnu.org/software/automake" -} + } +done if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then - echo "I am going to run ./configure with --enable-warnings - if you " + echo "I am going to run ./configure with no args - if you " echo "wish to pass any extra arguments to it, please specify them on " echo "the $0 command line." fi mkdir -p build-aux -libtoolize --copy --force -aclocal -I m4 -autoheader -automake --add-missing -autoconf +intltoolize --force +autoreconf -if cd $THEDIR diff --git a/configure.ac b/configure.ac index 7b5a092..6314a7b 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,12 @@ PKG_CHECK_MODULES(GOBJECT2, gobject-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(GIO2, gio-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_REQUIRED) +LIBVIRT_GLIB_GETTEXT +dnl Should be in m4/virt-gettext.m4 but intltoolize is too +dnl dumb to find it there +IT_PROG_INTLTOOL([0.35.0]) + + GTK_DOC_CHECK([1.10],[--flavour no-tmpl]) # Setup GLIB_MKENUMS to use glib-mkenums even if GLib is uninstalled. @@ -262,6 +268,7 @@ AC_OUTPUT(Makefile docs/libvirt-glib/version.xml docs/libvirt-gobject/Makefile docs/libvirt-gconfig/Makefile + po/Makefile.in libvirt-glib-1.0.pc libvirt-gconfig-1.0.pc libvirt-gobject-1.0.pc diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c index 9726dd4..4dfd246 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -26,6 +26,7 @@ #include <string.h> #include <libxml/xmlerror.h> +#include <glib/gi18n.h> #include "libvirt-gconfig/libvirt-gconfig.h" #include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" @@ -137,7 +138,7 @@ gvir_config_xml_parse(const char *xml, const char *root_node, GError **err) *err = g_error_new(GVIR_CONFIG_OBJECT_ERROR, 0, "%s", - "No XML document to parse"); + _("No XML document to parse")); return NULL; } @@ -145,7 +146,7 @@ gvir_config_xml_parse(const char *xml, const char *root_node, GError **err) if (!doc) { gvir_config_set_error_literal(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "Unable to parse configuration"); + _("Unable to parse configuration")); return NULL; } if ((!doc->children) || @@ -153,7 +154,7 @@ gvir_config_xml_parse(const char *xml, const char *root_node, GError **err) g_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "XML data has no '%s' node", + _("XML data has no '%s' node"), root_node); xmlFreeDoc(doc); return NULL; diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index c3228c8..d8ca520 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -26,6 +26,7 @@ #include <string.h> #include <libxml/relaxng.h> +#include <glib/gi18n.h> #include "libvirt-gconfig/libvirt-gconfig.h" #include "libvirt-gconfig/libvirt-gconfig-private.h" @@ -208,7 +209,7 @@ void gvir_config_object_validate(GVirConfigObject *config, gvir_config_set_error_literal(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "No XML document associated with this config object"); + _("No XML document associated with this config object")); return; } @@ -217,7 +218,7 @@ void gvir_config_object_validate(GVirConfigObject *config, gvir_config_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "Unable to create RNG parser for %s", + _("Unable to create RNG parser for %s"), priv->schema); return; } @@ -227,7 +228,7 @@ void gvir_config_object_validate(GVirConfigObject *config, gvir_config_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "Unable to parse RNG %s", + _("Unable to parse RNG %s"), priv->schema); xmlRelaxNGFreeParserCtxt(rngParser); return; @@ -239,7 +240,7 @@ void gvir_config_object_validate(GVirConfigObject *config, gvir_config_set_error(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "Unable to create RNG validation context %s", + _("Unable to create RNG validation context %s"), priv->schema); xmlRelaxNGFree(rng); return; @@ -249,7 +250,7 @@ void gvir_config_object_validate(GVirConfigObject *config, gvir_config_set_error_literal(err, GVIR_CONFIG_OBJECT_ERROR, 0, - "Unable to validate doc"); + _("Unable to validate doc")); xmlRelaxNGFreeValidCtxt(rngValid); xmlRelaxNGFree(rng); return; diff --git a/libvirt-gobject/libvirt-gobject-connection.c b/libvirt-gobject/libvirt-gobject-connection.c index ecf7cb2..a05b5a0 100644 --- a/libvirt-gobject/libvirt-gobject-connection.c +++ b/libvirt-gobject/libvirt-gobject-connection.c @@ -26,6 +26,8 @@ #include <libvirt/libvirt.h> #include <string.h> +#include <glib/gi18n.h> + #include "libvirt-glib/libvirt-glib.h" #include "libvirt-gobject/libvirt-gobject.h" #include "libvirt-gobject-compat.h" @@ -429,7 +431,7 @@ static gboolean _gvir_connection_open(GVirConnection *conn, if (priv->conn) { g_set_error(err, GVIR_CONNECTION_ERROR, 0, - "Connection %s is already open", + _("Connection %s is already open"), priv->uri); g_mutex_unlock(priv->lock); return FALSE; @@ -444,7 +446,7 @@ static gboolean _gvir_connection_open(GVirConnection *conn, if (!priv->conn) { gvir_set_error(err, GVIR_CONNECTION_ERROR, 0, - "Unable to open %s", + _("Unable to open %s"), priv->uri); g_mutex_unlock(priv->lock); return FALSE; @@ -454,8 +456,8 @@ static gboolean _gvir_connection_open(GVirConnection *conn, char *uri = virConnectGetURI(priv->conn); if (!uri) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, - 0, - "Unable to get connection URI"); + 0, + _("Unable to get connection URI")); virConnectClose(priv->conn); priv->conn = NULL; g_mutex_unlock(priv->lock); @@ -696,7 +698,7 @@ static gchar ** fetch_list(virConnectPtr vconn, if ((n = count_func(vconn)) < 0) { gvir_set_error(err, GVIR_CONNECTION_ERROR, 0, - "Unable to count %s", name); + _("Unable to count %s"), name); goto error; } @@ -708,7 +710,7 @@ static gchar ** fetch_list(virConnectPtr vconn, if ((n = list_func(vconn, lst, n)) < 0) { gvir_set_error(err, GVIR_CONNECTION_ERROR, 0, - "Unable to list %s %d", name, n); + _("Unable to list %s %d"), name, n); goto error; } } @@ -755,7 +757,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, if (!priv->conn) { g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Connection is not open"); + _("Connection is not open")); g_mutex_unlock(priv->lock); goto cleanup; } @@ -770,7 +772,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, if ((nactive = virConnectNumOfDomains(vconn)) < 0) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to count domains"); + _("Unable to count domains")); goto cleanup; } if (nactive) { @@ -781,7 +783,7 @@ gboolean gvir_connection_fetch_domains(GVirConnection *conn, if ((nactive = virConnectListDomains(vconn, active, nactive)) < 0) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to list domains"); + _("Unable to list domains")); goto cleanup; } } @@ -892,7 +894,7 @@ gboolean gvir_connection_fetch_storage_pools(GVirConnection *conn, if (!priv->conn) { g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Connection is not open"); + _("Connection is not open")); g_mutex_unlock(priv->lock); goto cleanup; } @@ -1155,14 +1157,14 @@ gvir_connection_get_hypervisor_name(GVirConnection *conn, priv = conn->priv; if (!priv->conn) { g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Connection is not opened"); + _("Connection is not opened")); goto cleanup; } type = virConnectGetType(priv->conn); if (!type) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to get hypervisor name"); + _("Unable to get hypervisor name")); goto cleanup; } @@ -1194,13 +1196,13 @@ gvir_connection_get_version(GVirConnection *conn, priv = conn->priv; if (!priv->conn) { g_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Connection is not opened"); + _("Connection is not opened")); goto cleanup; } if (virConnectGetVersion(priv->conn, &ret) < 0) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to get hypervisor version"); + _("Unable to get hypervisor version")); } cleanup: @@ -1515,7 +1517,7 @@ GVirDomain *gvir_connection_create_domain(GVirConnection *conn, if (!handle) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Failed to create domain"); + _("Failed to create domain")); return NULL; } @@ -1570,7 +1572,7 @@ GVirDomain *gvir_connection_start_domain(GVirConnection *conn, if (!handle) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Failed to create domain"); + _("Failed to create domain")); return NULL; } @@ -1622,7 +1624,7 @@ GVirStoragePool *gvir_connection_create_storage_pool if (!(handle = virStoragePoolDefineXML(priv->conn, xml, flags))) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, flags, - "Failed to create storage pool"); + _("Failed to create storage pool")); return NULL; } @@ -1665,7 +1667,7 @@ GVirNodeInfo *gvir_connection_get_node_info(GVirConnection *conn, if (virNodeGetInfo(priv->conn, &info) < 0) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to get node info"); + _("Unable to get node info")); return NULL; } @@ -1705,7 +1707,7 @@ GVirConfigCapabilities *gvir_connection_get_capabilities(GVirConnection *conn, if (caps_xml == NULL) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, 0, - "Unable to get capabilities"); + _("Unable to get capabilities")); return NULL; } @@ -1832,8 +1834,8 @@ gboolean gvir_connection_restore_domain_from_file(GVirConnection *conn, if (ret < 0) { gvir_set_error_literal(err, GVIR_CONNECTION_ERROR, - 0, - "Unable to restore domain"); + 0, + _("Unable to restore domain")); return FALSE; } diff --git a/libvirt-gobject/libvirt-gobject-stream.c b/libvirt-gobject/libvirt-gobject-stream.c index a75769e..af9b8a0 100644 --- a/libvirt-gobject/libvirt-gobject-stream.c +++ b/libvirt-gobject/libvirt-gobject-stream.c @@ -27,6 +27,8 @@ #include <libvirt/virterror.h> #include <string.h> +#include <glib/gi18n.h> + #include "libvirt-glib/libvirt-glib.h" #include "libvirt-gobject/libvirt-gobject.h" #include "libvirt-gobject-compat.h" @@ -320,10 +322,10 @@ gssize gvir_stream_receive(GVirStream *self, if (got == -2) { /* blocking */ g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, - "virStreamRecv call would block"); + _("virStreamRecv call would block")); } else if (got < 0) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, - "Got virStreamRecv error in %s", G_STRFUNC); + _("Got virStreamRecv error in %s"), G_STRFUNC); } return got; @@ -388,7 +390,7 @@ gvir_stream_receive_all(GVirStream *self, if (r < 0) { gvir_set_error_literal(error, GVIR_STREAM_ERROR, 0, - "Unable to perform RecvAll"); + _("Unable to perform RecvAll")); } return r; @@ -436,10 +438,10 @@ gssize gvir_stream_send(GVirStream *self, if (got == -2) { /* blocking */ g_set_error_literal(error, G_IO_ERROR, G_IO_ERROR_WOULD_BLOCK, - "virStreamSend call would block"); + _("virStreamSend call would block")); } else if (got < 0) { g_set_error(error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, - "Got virStreamRecv error in %s", G_STRFUNC); + _("Got virStreamRecv error in %s"), G_STRFUNC); } return got; @@ -504,7 +506,7 @@ gvir_stream_send_all(GVirStream *self, if (r < 0) { gvir_set_error_literal(error, GVIR_STREAM_ERROR, 0, - "Unable to perform SendAll"); + _("Unable to perform SendAll")); } return r; diff --git a/po/POTFILES.in b/po/POTFILES.in new file mode 100644 index 0000000..335ec67 --- /dev/null +++ b/po/POTFILES.in @@ -0,0 +1,4 @@ +libvirt-gconfig/libvirt-gconfig-helpers.c +libvirt-gconfig/libvirt-gconfig-object.c +libvirt-gobject/libvirt-gobject-connection.c +libvirt-gobject/libvirt-gobject-stream.c -- 1.8.1.4

Hey, On Mon, Apr 08, 2013 at 01:54:21PM +0100, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- .gitignore | 7 +++++ Makefile.am | 2 +- autogen.sh | 28 ++++++------------ configure.ac | 7 +++++ libvirt-gconfig/libvirt-gconfig-helpers.c | 7 +++-- libvirt-gconfig/libvirt-gconfig-object.c | 11 +++---- libvirt-gobject/libvirt-gobject-connection.c | 44 +++++++++++++++------------- libvirt-gobject/libvirt-gobject-stream.c | 14 +++++---- po/POTFILES.in | 4 +++ 9 files changed, 69 insertions(+), 55 deletions(-) create mode 100644 po/POTFILES.in
diff --git a/configure.ac b/configure.ac index 7b5a092..6314a7b 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,12 @@ PKG_CHECK_MODULES(GOBJECT2, gobject-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(GIO2, gio-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_REQUIRED)
+LIBVIRT_GLIB_GETTEXT +dnl Should be in m4/virt-gettext.m4 but intltoolize is too
This macro/file are missing from this patch.
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c index 9726dd4..4dfd246 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -26,6 +26,7 @@ #include <string.h>
#include <libxml/xmlerror.h> +#include <glib/gi18n.h>
In a library you should use glib/gi18n-lib.h along with a GETTEXT_PACKAGE preprocessor define so that the translated string are looked up in the library gettext domain, and not in the application gettext domain, see https://developer.gnome.org/glib/2.31/glib-I18N.html but it does not have a lot of details on that. Christophe

On Wed, Apr 10, 2013 at 10:57:08AM +0200, Christophe Fergeau wrote:
Hey,
On Mon, Apr 08, 2013 at 01:54:21PM +0100, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange@redhat.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com> --- .gitignore | 7 +++++ Makefile.am | 2 +- autogen.sh | 28 ++++++------------ configure.ac | 7 +++++ libvirt-gconfig/libvirt-gconfig-helpers.c | 7 +++-- libvirt-gconfig/libvirt-gconfig-object.c | 11 +++---- libvirt-gobject/libvirt-gobject-connection.c | 44 +++++++++++++++------------- libvirt-gobject/libvirt-gobject-stream.c | 14 +++++---- po/POTFILES.in | 4 +++ 9 files changed, 69 insertions(+), 55 deletions(-) create mode 100644 po/POTFILES.in
diff --git a/configure.ac b/configure.ac index 7b5a092..6314a7b 100644 --- a/configure.ac +++ b/configure.ac @@ -60,6 +60,12 @@ PKG_CHECK_MODULES(GOBJECT2, gobject-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(GIO2, gio-2.0 >= $GLIB2_REQUIRED) PKG_CHECK_MODULES(LIBXML2, libxml-2.0 >= $LIBXML2_REQUIRED)
+LIBVIRT_GLIB_GETTEXT +dnl Should be in m4/virt-gettext.m4 but intltoolize is too
This macro/file are missing from this patch.
Opps, stupid .gitignore marked the whole of m4/ as ignored. The file just sets GETTEXT_PACKAGE - same content as this file in other libvirt modules.
diff --git a/libvirt-gconfig/libvirt-gconfig-helpers.c b/libvirt-gconfig/libvirt-gconfig-helpers.c index 9726dd4..4dfd246 100644 --- a/libvirt-gconfig/libvirt-gconfig-helpers.c +++ b/libvirt-gconfig/libvirt-gconfig-helpers.c @@ -26,6 +26,7 @@ #include <string.h>
#include <libxml/xmlerror.h> +#include <glib/gi18n.h>
In a library you should use glib/gi18n-lib.h along with a GETTEXT_PACKAGE preprocessor define so that the translated string are looked up in the library gettext domain, and not in the application gettext domain, see https://developer.gnome.org/glib/2.31/glib-I18N.html but it does not have a lot of details on that.
Ok, I'll add -lib before pushing this. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On Mon, Apr 08, 2013 at 01:54:19PM +0100, Daniel P. Berrange wrote:
libvirt-glib contains a bunch of user visible error message strings which need translation. These patches wire up the glib/intltool/gettext i18n framework
I have created a transifex project to go with it
Note, I'm abaout to switch libvirt in transifex as a sub-project of Fedora, otherwise there isn't enough momentum to grow some of the main language (even french :-) ! https://www.transifex.com/projects/p/libvirt/announcements/ So you should probably do the same before you get specific language groups as this incompatible. Go to manage, then access control, pick outsourced project and select Fedora Project as the umbrella (assuming you didn't do this already) Daniel -- Daniel Veillard | Open Source and Standards, Red Hat veillard@redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | virtualization library http://libvirt.org/

On Mon, Apr 08, 2013 at 09:09:51PM +0800, Daniel Veillard wrote:
On Mon, Apr 08, 2013 at 01:54:19PM +0100, Daniel P. Berrange wrote:
libvirt-glib contains a bunch of user visible error message strings which need translation. These patches wire up the glib/intltool/gettext i18n framework
I have created a transifex project to go with it
Note, I'm abaout to switch libvirt in transifex as a sub-project of Fedora, otherwise there isn't enough momentum to grow some of the main language (even french :-) ! https://www.transifex.com/projects/p/libvirt/announcements/
So you should probably do the same before you get specific language groups as this incompatible. Go to manage, then access control, pick outsourced project and select Fedora Project as the umbrella (assuming you didn't do this already)
Ah actually you did, I just noticed :-) Daniel -- Daniel Veillard | Open Source and Standards, Red Hat veillard@redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | virtualization library http://libvirt.org/

On Mon, Apr 08, 2013 at 09:09:51PM +0800, Daniel Veillard wrote:
On Mon, Apr 08, 2013 at 01:54:19PM +0100, Daniel P. Berrange wrote:
libvirt-glib contains a bunch of user visible error message strings which need translation. These patches wire up the glib/intltool/gettext i18n framework
I have created a transifex project to go with it
Note, I'm abaout to switch libvirt in transifex as a sub-project of Fedora, otherwise there isn't enough momentum to grow some of the main language (even french :-) ! https://www.transifex.com/projects/p/libvirt/announcements/
So you should probably do the same before you get specific language groups as this incompatible. Go to manage, then access control, pick outsourced project and select Fedora Project as the umbrella (assuming you didn't do this already)
Yep, I set all my projects to be managed by Fedora translation team by default. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (3)
-
Christophe Fergeau
-
Daniel P. Berrange
-
Daniel Veillard