From: Hans U. N. <gp...@n-...> - 2005-05-02 11:41:18
|
Hi, in CVS, libexif calls bind_textdomain_codeset(GETTEXT_DOMAIN, "UTF-8") every time before it calls bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR); This will make libexif return all strings in UTF-8 regardless of the current locale. This, in turn, will break all libexif message output on non-UTF-8 output media, such as iso-8859-1 terminals running exif, which is not good. As the default output character set is the one the locale specifies, if we don't call bind_textdomain_codeset() in libexif at all, exif will always produce proper output for the respective locale. However, I think I remember that GTK (and pango or whatever the one of 100 GTK sub libraries in question is called) requires all strings it is to print to be UTF-8. This would mean that we should add an additional function to libexif which allows such libexif users (libexif-gtk, gexif, or any other software which requires UTF-8) to explicitly request UTF-8. Is this correct? Uli |
From: Lutz <lu...@us...> - 2005-05-02 17:59:41
|
On Mon, 2005-05-02 at 13:37 +0200, Hans Ulrich Niedermann wrote: > This will make libexif return all strings in UTF-8 regardless of the > current locale. > This would mean that we should add an additional function to libexif > which allows such libexif users (libexif-gtk, gexif, or any other > software which requires UTF-8) to explicitly request UTF-8. > Is this correct? There are lots of functions that return translated strings. Wouldn't it be easier to remove the calls to "bind_textdomain_codeset" and leave the task of calling this function to the frontends? Regards --=20 Lutz M=FCller <lu...@us...> |
From: Hans U. N. <gp...@n-...> - 2005-05-04 13:49:19
|
Lutz M=C3=BCller <lu...@us...> writes: > On Tue, 2005-05-03 at 13:03 +0200, Hans Ulrich Niedermann wrote: >> > I don't like the static variable in exif_init_gettext at all. Is >>=20 >> (Note for reference: "static" means "global" here.) >>=20 >> Why don't you like it? > > They are evil in combination with threads. glibc does proper locking, so > let's glibc take care of that. Sounds good :-) >> > "bindtextdomain" that expensive that we can't call it in every function >> > that returns strings? >>=20 >> IMHO, yes. It has to search the filesystem for files. > > As far as I can see in glibc/intl/bindtextdom.c, it first checks if the > value changed. Then a simple wrapper function without any variable checks will do. > Anyways, everything the frontend needs to know in order to get proper > translation is GETTEXT_PACKAGE and LOCALEDIR. What about creating a > libexif/exif-config.h file with those variables? > > /*=20 > * You need to call bindtextdomain & friends first=20 > * with those variables if you would like to=20 > * get proper translations. > */=20 > #define EXIF_GETTEXT_PACKAGE "libexif-12" > #define EXIF_GETTEXT_LOCALEDIR "/some/path" > > /* Name, version... */ > #define EXIF_PACKAGE_NAME "..." > #define EXIF_PACKAGE_VERSION "..." Bad idea. What if any of these values changes from one library version to another? You would have to recompile (relink doesn't help here) all applications. Uli |
From: Lutz <lu...@us...> - 2005-05-04 18:12:46
|
> Lutz M=C3=BCller <lu...@us...> writes: >> What about creating a >> libexif/exif-config.h file with those variables? >> >> /* >> * You need to call bindtextdomain & friends first >> * with those variables if you would like to >> * get proper translations. >> */ >> #define EXIF_GETTEXT_PACKAGE "libexif-12" >> #define EXIF_GETTEXT_LOCALEDIR "/some/path" >> >> /* Name, version... */ >> #define EXIF_PACKAGE_NAME "..." >> #define EXIF_PACKAGE_VERSION "..." > > Bad idea. What if any of these values changes from one library version > to another? You would have to recompile (relink doesn't help here) all > applications. Ok. Then what about: const char *exif_gettext_package (void); const char *exif_gettext_localedir (void); const char *exif_package_name (void); const char *exif_package_version (void); ? Lutz |
From: Hans U. N. <gp...@n-...> - 2005-05-02 18:37:17
|
Lutz M=C3=BCller <lu...@us...> writes: > On Mon, 2005-05-02 at 13:37 +0200, Hans Ulrich Niedermann wrote: >> This will make libexif return all strings in UTF-8 regardless of the >> current locale. >> This would mean that we should add an additional function to libexif >> which allows such libexif users (libexif-gtk, gexif, or any other >> software which requires UTF-8) to explicitly request UTF-8. >> Is this correct? > > There are lots of functions that return translated strings. Wouldn't it > be easier to remove the calls to "bind_textdomain_codeset" and leave the > task of calling this function to the frontends? Then libexif must tell the frontend the gettext domain libexif uses, which IMHO isn't the frontend's business. I'd like to propose this (if it makes sense): /**(exported function) * Explicitly set the codeset for translated libexif messages. * * @codeset The character set to use. "UTF-8" is guaranteed to work. * @returns The return value of bind_textdomain_codeset(3) * * Constraints: * - Requires a gettext supporting bind_textdomain_codeset() * - Must be called before all other libexif functions **/ =20 const char *exif_set_message_codeset(const char *codeset) { const char *result =3D #ifdef HAVE_BIND_TEXTDOMAIN_CODESET bind_textdomain_codeset(GETTEXT_DOMAIN, codeset); #else (const char *) NULL; #endif exif_init_gettext(); return result; } /**(libexif internal function) * Initialize the message translation system. * * @returns The return value of bindtextdomain(3) * * This function must be called by an exported libexif function * before any libexif function translates any messages. **/ const char *exif_init_gettext(void) { static char *basedir =3D NULL; if (basedir =3D=3D NULL) { initialized =3D 1; basedir =3D bindtextdomain(GETTEXT_DOMAIN, LOCALEDIR); } return basedir; } |
From: Lutz <lu...@us...> - 2005-05-02 21:48:14
|
On Mon, 2005-05-02 at 20:33 +0200, Hans Ulrich Niedermann wrote: > Then libexif must tell the frontend the gettext domain libexif uses, > which IMHO isn't the frontend's business. > const char *exif_set_message_codeset(const char *codeset) > const char *exif_init_gettext(void) I don't like the static variable in exif_init_gettext at all. Is "bindtextdomain" that expensive that we can't call it in every function that returns strings? If people would like to optimize libexif for speed, they'd compile libexif without NLS anyways.=20 Regards --=20 Lutz M=FCller <lu...@us...> |
From: Hans U. N. <gp...@n-...> - 2005-05-03 11:05:17
|
Lutz M=C3=BCller <lu...@us...> writes: > On Mon, 2005-05-02 at 20:33 +0200, Hans Ulrich Niedermann wrote: >> Then libexif must tell the frontend the gettext domain libexif uses, >> which IMHO isn't the frontend's business. >> const char *exif_set_message_codeset(const char *codeset) >> const char *exif_init_gettext(void) > > I don't like the static variable in exif_init_gettext at all. Is (Note for reference: "static" means "global" here.) Why don't you like it? bindtextdomain() itself affects global settings by definition. So having a global flag saying whether we initialized all that global stuff yet or not makes sense, IMHO. > "bindtextdomain" that expensive that we can't call it in every function > that returns strings? IMHO, yes. It has to search the filesystem for files. > If people would like to optimize libexif for > speed, they'd compile libexif without NLS anyways.=20 Or do things which need to be done once only once instead of dozens of times. Apart from that, some of those i18n functions are a little picky when being called multiple times in the same program. Uli |
From: Lutz <lu...@us...> - 2005-05-03 20:31:56
|
On Tue, 2005-05-03 at 13:03 +0200, Hans Ulrich Niedermann wrote: > > I don't like the static variable in exif_init_gettext at all. Is >=20 > (Note for reference: "static" means "global" here.) >=20 > Why don't you like it? They are evil in combination with threads. glibc does proper locking, so let's glibc take care of that. =20 > > "bindtextdomain" that expensive that we can't call it in every functi= on > > that returns strings? >=20 > IMHO, yes. It has to search the filesystem for files. As far as I can see in glibc/intl/bindtextdom.c, it first checks if the value changed. Anyways, everything the frontend needs to know in order to get proper translation is GETTEXT_PACKAGE and LOCALEDIR. What about creating a libexif/exif-config.h file with those variables? /*=20 * You need to call bindtextdomain & friends first=20 * with those variables if you would like to=20 * get proper translations. */=20 #define EXIF_GETTEXT_PACKAGE "libexif-12" #define EXIF_GETTEXT_LOCALEDIR "/some/path" /* Name, version... */ #define EXIF_PACKAGE_NAME "..." #define EXIF_PACKAGE_VERSION "..." Regards --=20 Lutz M=FCller <lu...@us...> |