From 7ab77ec9cd2072d0bacf4d2c93ac1824c2c82d06 Mon Sep 17 00:00:00 2001 From: Yair Hershkovitz Date: Sun, 11 May 2008 09:34:29 +0000 Subject: [PATCH] Bug 503071 - Application direction changes to right to left even if theres 2008-05-11 Yair Hershkovitz Bug 503071 - Application direction changes to right to left even if theres no translation. * glib/gi18n.c: g_i18n_init() for initializing the glib i18n, checking if a translation is available for the calling app. wrappers for gettext, dgettext and dpgettext to check first if the application should be translated. * glib/gi18n.h: symbol declaration for gettext wrappers. * glib/gi18n-lib.h: include gi18n.h instead of libintl.h. * glib/gstrfuncs.c: moved g_dpgettext() to glib/gi18n.c. * glib/gutils.c: use g_dgettext() instead of dgettext(). * glib/glibintl.h: include gi18n.h. * glib.symbols: added gettext wrappers. * glib/Makefile.am: added gi18n.c. svn path=/trunk/; revision=6882 --- ChangeLog | 24 +++++++ glib/Makefile.am | 3 +- glib/gi18n-lib.h | 5 +- glib/gi18n.c | 167 ++++++++++++++++++++++++++++++++++++++++++++++ glib/gi18n.h | 19 +++++- glib/glib.symbols | 9 ++- glib/glibintl.h | 2 + glib/gstrfuncs.c | 61 ----------------- glib/gutils.c | 2 +- 9 files changed, 224 insertions(+), 68 deletions(-) create mode 100644 glib/gi18n.c diff --git a/ChangeLog b/ChangeLog index 3bc224ece..364c56a24 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,27 @@ +2008-05-11 Yair Hershkovitz + + Bug 503071 - Application direction changes to right to left even if + theres no translation. + + * glib/gi18n.c: g_i18n_init() for initializing the glib i18n, + checking if a translation is available for the calling app. wrappers for + gettext, dgettext and dpgettext to check first if the application + should be translated. + + * glib/gi18n.h: symbol declaration for gettext wrappers. + + * glib/gi18n-lib.h: include gi18n.h instead of libintl.h. + + * glib/gstrfuncs.c: moved g_dpgettext() to glib/gi18n.c. + + * glib/gutils.c: use g_dgettext() instead of dgettext(). + + * glib/glibintl.h: include gi18n.h. + + * glib.symbols: added gettext wrappers. + + * glib/Makefile.am: added gi18n.c. + 2008-05-05 Michael Natterer * glib/glib.h: #define __GLIB_H_INSIDE__ around including diff --git a/glib/Makefile.am b/glib/Makefile.am index b92777b77..2e8b7066b 100644 --- a/glib/Makefile.am +++ b/glib/Makefile.am @@ -164,7 +164,8 @@ libglib_2_0_la_SOURCES = \ gutils.c \ gdebug.h \ gprintf.c \ - gprintfint.h + gprintfint.h \ + gi18n.c EXTRA_libglib_2_0_la_SOURCES = \ giounix.c \ diff --git a/glib/gi18n-lib.h b/glib/gi18n-lib.h index 0d6701756..c5e03bd9c 100644 --- a/glib/gi18n-lib.h +++ b/glib/gi18n-lib.h @@ -21,14 +21,13 @@ #define __G_I18N_LIB_H__ #include - -#include +#include #ifndef GETTEXT_PACKAGE #error You must define GETTEXT_PACKAGE before including gi18n-lib.h. #endif -#define _(String) dgettext (GETTEXT_PACKAGE, String) +#define _(String) g_dgettext (GETTEXT_PACKAGE, String) #define Q_(String) g_dpgettext (GETTEXT_PACKAGE, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (GETTEXT_PACKAGE, Context "\004" String, strlen (Context) + 1) diff --git a/glib/gi18n.c b/glib/gi18n.c new file mode 100644 index 000000000..0d185edfb --- /dev/null +++ b/glib/gi18n.c @@ -0,0 +1,167 @@ +/* GLIB - Library of useful routines for C programming + * Copyright (C) 1995-1998 Peter Mattis, Spencer Kimball and Josh MacDonald + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * Modified by the GLib Team and others 1997-2000. See the AUTHORS + * file for a list of people on the GLib Team. See the ChangeLog + * files for a list of changes. These files are distributed with + * GLib at ftp://ftp.gtk.org/pub/gtk/. + */ + +#include "gi18n.h" +#include "galias.h" +#include "gmessages.h" +#include "galloca.h" +#include "string.h" + +static gboolean g_should_translate = TRUE; + +void +g_i18n_init (void) +{ + gchar *domain, *default_domain; + + setlocale(LC_ALL, ""); + domain = g_strdup(textdomain (NULL)); + default_domain = g_strdup(textdomain ("")); + textdomain(domain); + + if (!strcmp (domain, default_domain)) + g_warning ("textdomain() must be called before glib i18n initialization"); + + g_free(domain); + g_free(default_domain); + + if (!*gettext("")) + { + g_should_translate = FALSE; + g_warning ("No translation is available for the requested locale."); + } +} + +/** + * g_gettext: + * @msgid: message to translate + * + * This function is a wrapper of gettext() which does not not translate + * the message if the application who initialized glib i18n is not translated. + * + * Applications should normally not use this function directly, + * but use the _() macro for translations. + * + * Returns: The translated string + * + * Since: 2.16 + */ +const gchar * +g_gettext (const gchar *msgid) +{ + if (g_should_translate) + return gettext (msgid); + else + return msgid; +} + +/** + * g_dgettext: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgid: message to translate + * + * This function is a wrapper of dgettext() which does not not translate + * the message if the application who initialized glib i18n is not translated. + * + * Applications should normally not use this function directly, + * but use the _() macro for translations. + * + * Returns: The translated string + * + * Since: 2.16 + */ +const gchar * +g_dgettext (const gchar *domain, + const gchar *msgid) +{ + if (g_should_translate) + return dgettext (domain, msgid); + else + return msgid; +} + +/** + * g_dpgettext: + * @domain: the translation domain to use, or %NULL to use + * the domain set with textdomain() + * @msgctxtid: a combined message context and message id, separated + * by a \004 character + * @msgidoffset: the offset of the message id in @msgctxid + * + * This function is a variant of dgettext() which supports + * a disambiguating message context. GNU gettext uses the + * '\004' character to separate the message context and + * message id in @msgctxtid. + * If 0 is passed as @msgidoffset, this function will fall back to + * trying to use the deprecated convention of using "|" as a separation + * character. + * + * Applications should normally not use this function directly, + * but use the C_() macro for translations with context. + * + * Returns: The translated string + * + * Since: 2.16 + */ +const gchar * +g_dpgettext (const gchar *domain, + const gchar *msgctxtid, + gsize msgidoffset) +{ + const gchar *translation; + gchar *sep; + + translation = g_dgettext (domain, msgctxtid); + + if (translation == msgctxtid) + { + if (msgidoffset > 0) + return msgctxtid + msgidoffset; + + sep = strchr (msgctxtid, '|'); + + if (sep) + { + /* try with '\004' instead of '|', in case + * xgettext -kQ_:1g was used + */ + gchar *tmp = g_alloca (strlen (msgctxtid) + 1); + strcpy (tmp, msgctxtid); + tmp[sep - msgctxtid] = '\004'; + + translation = g_dgettext (domain, tmp); + + if (translation == tmp) + return sep + 1; + } + } + + return translation; +} + +#define __G_I18N_C__ +#include "galiasdef.c" diff --git a/glib/gi18n.h b/glib/gi18n.h index 011b52f89..17f06f95b 100644 --- a/glib/gi18n.h +++ b/glib/gi18n.h @@ -24,9 +24,26 @@ #include -#define _(String) gettext (String) +#if !defined(__G_I18N_LIB_H__) && !defined(__GLIBINTL_H__) +#define _(String) g_gettext (String) #define Q_(String) g_dpgettext (NULL, String, 0) #define N_(String) (String) #define C_(Context,String) g_dpgettext (NULL, Context "\004" String, strlen (Context) + 1) +#endif + +G_BEGIN_DECLS + +G_CONST_RETURN gchar *g_gettext (const gchar *msgid); + +G_CONST_RETURN gchar *g_dgettext (const gchar *domain, + const gchar *msgid); + +G_CONST_RETURN gchar *g_dpgettext (const gchar *domain, + const gchar *msgctxtid, + gsize msgidoffset); + +void g_i18n_init (void); + +G_END_DECLS #endif /* __G_I18N_H__ */ diff --git a/glib/glib.symbols b/glib/glib.symbols index d9b661191..33e2fa1f8 100644 --- a/glib/glib.symbols +++ b/glib/glib.symbols @@ -1146,7 +1146,6 @@ g_strdown #endif g_strv_length g_strip_context -g_dpgettext #endif #endif @@ -1583,6 +1582,14 @@ g_win32_locale_filename_from_utf8 #endif #endif +#if IN_HEADER(__G_I18N_H__) +#if IN_FILE(__G_I18N_C__) +g_gettext +g_dgettext +g_dpgettext +#endif +#endif + #ifdef INCLUDE_VARIABLES g_ascii_table g_utf8_skip diff --git a/glib/glibintl.h b/glib/glibintl.h index 4bed7c144..d902be3b6 100644 --- a/glib/glibintl.h +++ b/glib/glibintl.h @@ -1,6 +1,8 @@ #ifndef __GLIBINTL_H__ #define __GLIBINTL_H__ +#include + #ifndef SIZEOF_CHAR #error "config.h must be included prior to glibintl.h" #endif diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 74419d9ad..e2b616768 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -2844,66 +2844,5 @@ g_strv_length (gchar **str_array) return i; } - -/** - * g_dpgettext: - * @domain: the translation domain to use, or %NULL to use - * the domain set with textdomain() - * @msgctxtid: a combined message context and message id, separated - * by a \004 character - * @msgidoffset: the offset of the message id in @msgctxid - * - * This function is a variant of dgettext() which supports - * a disambiguating message context. GNU gettext uses the - * '\004' character to separate the message context and - * message id in @msgctxtid. - * If 0 is passed as @msgidoffset, this function will fall back to - * trying to use the deprecated convention of using "|" as a separation - * character. - * - * Applications should normally not use this function directly, - * but use the C_() macro for translations with context. - * - * Returns: The translated string - * - * Since: 2.16 - */ -const gchar * -g_dpgettext (const gchar *domain, - const gchar *msgctxtid, - gsize msgidoffset) -{ - const gchar *translation; - gchar *sep; - - translation = dgettext (domain, msgctxtid); - - if (translation == msgctxtid) - { - if (msgidoffset > 0) - return msgctxtid + msgidoffset; - - sep = strchr (msgctxtid, '|'); - - if (sep) - { - /* try with '\004' instead of '|', in case - * xgettext -kQ_:1g was used - */ - gchar *tmp = g_alloca (strlen (msgctxtid) + 1); - strcpy (tmp, msgctxtid); - tmp[sep - msgctxtid] = '\004'; - - translation = dgettext (domain, tmp); - - if (translation == tmp) - return sep + 1; - } - } - - return translation; -} - - #define __G_STRFUNCS_C__ #include "galiasdef.c" diff --git a/glib/gutils.c b/glib/gutils.c index 03a822766..be1714a24 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -3237,7 +3237,7 @@ glib_gettext (const gchar *str) _glib_gettext_initialized = TRUE; } - return dgettext (GETTEXT_PACKAGE, str); + return g_dgettext (GETTEXT_PACKAGE, str); } #ifdef G_OS_WIN32