I have developed the following patch which adds PG_VERSION to the end of
language-specific file names. I used it for libpq too, rather than the
SONAME, because the language strings might change between versions while
the API/SONAME might not.
Would someone who uses NLS please test this? Thanks.
---------------------------------------------------------------------------
Bruce Momjian wrote:
>
> Is this a direction we want to explore --- using the SONAME as part of
> the translation domain?
>
> ---------------------------------------------------------------------------
>
> Martin Pitt wrote:
> -- Start of PGP signed section.
> > Hi!
> >
> > Bruce Momjian [2005-02-09 18:05 -0500]:
> > > > However, I just stumbled across another problem: libpq3 and the new
> > > > libpq4 use the same translation domain "libpq4", thus they cannot be
> > > > installed in parallel. Can you please change the domain to "libpq4" as
> > > > well? This should generally be done anyway, but at least we can live
> > > > with one breakage of this rule (for libpq3), so that we don't need to
> > > > mess with the old libpq3 package.
> > >
> > > Uh, what is the translation domain?
> >
> > In short, that is the unique name for a bunch of translations for a
> > particular application or group of related applications. The key point
> > is that the name of the file in
> > /usr/share/locale/<LOCALE>/LC_MESSAGES/<DOMAIN>.mo and the call
> >
> > bindtextdomain ("<DOMAIN>", NULL)
> >
> > must use the same <DOMAIN> so that libintl can find the mo file.
> > However, that means that all applications that are installed in
> > parallel need a distinct domain. Since the whole point of SONAMes is
> > to allow several different library API versions to be installed in
> > parallel, every library API (i. e. SONAME) should have an unique
> > domain, which can be achieved easiest by just appending the SONAME to
> > the translation domain.
> >
> > In my test packages I used the following patch:
> >
> > diff -ruN postgresql-8.0.1-old/src/interfaces/libpq/fe-misc.c
> > postgresql-8.0.1/src/interfaces/libpq/fe-misc.c
> > --- postgresql-8.0.1-old/src/interfaces/libpq/fe-misc.c 2004-12-31
> > 23:03:50.000000000 +0100
> > +++ postgresql-8.0.1/src/interfaces/libpq/fe-misc.c 2005-02-07
> > 22:55:13.177419296 +0100
> > @@ -1133,7 +1133,7 @@
> > {
> > already_bound = 1;
> > /* No relocatable lookup here because the binary could be
> > anywhere */
> > - bindtextdomain("libpq", getenv("PGLOCALEDIR") ?
> > getenv("PGLOCALEDIR") : LOCALEDIR);
> > + bindtextdomain("libpq4", getenv("PGLOCALEDIR") ?
> > getenv("PGLOCALEDIR") : LOCALEDIR);
> > }
> >
> > return dgettext("libpq", msgid);
> > diff -ruN postgresql-8.0.1-old/src/interfaces/libpq/nls.mk
> > postgresql-8.0.1/src/interfaces/libpq/nls.mk
> > --- postgresql-8.0.1-old/src/interfaces/libpq/nls.mk 2005-01-14
> > 09:57:06.000000000 +0100
> > +++ postgresql-8.0.1/src/interfaces/libpq/nls.mk 2005-02-07
> > 22:54:54.770217616 +0100
> > @@ -1,5 +1,5 @@
> > # $PostgreSQL: pgsql/src/interfaces/libpq/nls.mk,v 1.20 2005/01/14
> > 08:57:06 petere Exp $
> > -CATALOG_NAME := libpq
> > +CATALOG_NAME := libpq4
> > AVAIL_LANGUAGES := af cs de es fr hr it ko nb pl pt_BR ru sk sl sv
> > tr zh_CN zh_TW
> > GETTEXT_FILES := fe-auth.c fe-connect.c fe-exec.c fe-lobj.c fe-misc.c
> > fe-protocol2.c fe-protocol3.c fe-secure.c
> > GETTEXT_TRIGGERS:= libpq_gettext pqInternalNotice:2
> >
> > Compared to the SONAME, changing the translation domain is relatively
> > uncritical, so if you don't want to change this upstream, I can
> > maintain this patch for Debian/Ubuntu. However, I heard that some RPM
> > guys plan a infrastructure similar to mine, and at that point they
> > will have precisely the same problems :-)
> >
> > Thanks for considering and have a nice day!
> >
> > Martin
> > --
> > Martin Pitt http://www.piware.de
> > Ubuntu Developer http://www.ubuntulinux.org
> > Debian GNU/Linux Developer http://www.debian.org
> -- End of PGP section, PGP failed!
>
> --
> Bruce Momjian | http://candle.pha.pa.us
> [email protected] | (610) 359-1001
> + If your life is a hard drive, | 13 Roberts Road
> + Christ can be your backup. | Newtown Square, Pennsylvania 19073
>
> ---------------------------(end of broadcast)---------------------------
> TIP 3: if posting/reading through Usenet, please send an appropriate
> subscribe-nomail command to [EMAIL PROTECTED] so that your
> message can get through to the mailing list cleanly
>
--
Bruce Momjian | http://candle.pha.pa.us
[email protected] | (610) 359-1001
+ If your life is a hard drive, | 13 Roberts Road
+ Christ can be your backup. | Newtown Square, Pennsylvania 19073
Index: src/nls-global.mk
===================================================================
RCS file: /cvsroot/pgsql/src/nls-global.mk,v
retrieving revision 1.10
diff -c -c -r1.10 nls-global.mk
*** src/nls-global.mk 1 Jun 2004 03:32:28 -0000 1.10
--- src/nls-global.mk 15 Jun 2005 03:11:49 -0000
***************
*** 39,44 ****
--- 39,45 ----
XGETTEXT += --foreign-user -ctranslator
endif
+ CATALOG_NAME_VER=$(CATALOG_NAME).$(VERSION)
all-po: $(MO_FILES)
***************
*** 47,56 ****
ifdef XGETTEXT
ifeq ($(word 1,$(GETTEXT_FILES)),+)
! po/$(CATALOG_NAME).pot: $(word 2, $(GETTEXT_FILES))
$(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) -f $<
else
! po/$(CATALOG_NAME).pot: $(GETTEXT_FILES)
# Change to srcdir explicitly, don't rely on $^. That way we get
# consistent #: file references in the po files.
$(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS))
$(GETTEXT_FILES)
--- 48,57 ----
ifdef XGETTEXT
ifeq ($(word 1,$(GETTEXT_FILES)),+)
! po/$(CATALOG_NAME_VER).pot: $(word 2, $(GETTEXT_FILES))
$(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS)) -f $<
else
! po/$(CATALOG_NAME_VER).pot: $(GETTEXT_FILES)
# Change to srcdir explicitly, don't rely on $^. That way we get
# consistent #: file references in the po files.
$(XGETTEXT) -D $(srcdir) -n $(addprefix -k, $(GETTEXT_TRIGGERS))
$(GETTEXT_FILES)
***************
*** 65,71 ****
install-po: all-po installdirs-po
ifneq (,$(LANGUAGES))
for lang in $(LANGUAGES); do \
! $(INSTALL_DATA) po/$$lang.mo
$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(CATALOG_NAME).mo || exit 1; \
done
endif
--- 66,72 ----
install-po: all-po installdirs-po
ifneq (,$(LANGUAGES))
for lang in $(LANGUAGES); do \
! $(INSTALL_DATA) po/$$lang.mo
$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(CATALOG_NAME_VER).mo || exit 1; \
done
endif
***************
*** 73,85 ****
$(mkinstalldirs) $(foreach lang, $(LANGUAGES),
$(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES)
uninstall-po:
! rm -f $(foreach lang, $(LANGUAGES),
$(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES/$(CATALOG_NAME).mo)
clean-po:
rm -f $(MO_FILES)
@rm -f $(addsuffix .old, $(PO_FILES))
! rm -f po/$(CATALOG_NAME).pot
maintainer-check-po: $(PO_FILES)
--- 74,86 ----
$(mkinstalldirs) $(foreach lang, $(LANGUAGES),
$(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES)
uninstall-po:
! rm -f $(foreach lang, $(LANGUAGES),
$(DESTDIR)$(localedir)/$(lang)/LC_MESSAGES/$(CATALOG_NAME_VER).mo)
clean-po:
rm -f $(MO_FILES)
@rm -f $(addsuffix .old, $(PO_FILES))
! rm -f po/$(CATALOG_NAME_VER).pot
maintainer-check-po: $(PO_FILES)
***************
*** 88,97 ****
done
! init-po: po/$(CATALOG_NAME).pot
! update-po: po/$(CATALOG_NAME).pot
ifdef MSGMERGE
@for lang in $(LANGUAGES); do \
echo "merging $$lang:"; \
--- 89,98 ----
done
! init-po: po/$(CATALOG_NAME_VER).pot
! update-po: po/$(CATALOG_NAME_VER).pot
ifdef MSGMERGE
@for lang in $(LANGUAGES); do \
echo "merging $$lang:"; \
Index: src/interfaces/libpq/fe-misc.c
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v
retrieving revision 1.114
diff -c -c -r1.114 fe-misc.c
*** src/interfaces/libpq/fe-misc.c 12 Jun 2005 00:00:21 -0000 1.114
--- src/interfaces/libpq/fe-misc.c 15 Jun 2005 03:11:52 -0000
***************
*** 1134,1140 ****
{
already_bound = 1;
/* No relocatable lookup here because the binary could be
anywhere */
! bindtextdomain("libpq", getenv("PGLOCALEDIR") ?
getenv("PGLOCALEDIR") : LOCALEDIR);
}
return dgettext("libpq", msgid);
--- 1134,1140 ----
{
already_bound = 1;
/* No relocatable lookup here because the binary could be
anywhere */
! bindtextdomain("libpq" PG_VERSION, getenv("PGLOCALEDIR") ?
getenv("PGLOCALEDIR") : LOCALEDIR);
}
return dgettext("libpq", msgid);
Index: src/port/path.c
===================================================================
RCS file: /cvsroot/pgsql/src/port/path.c,v
retrieving revision 1.51
diff -c -c -r1.51 path.c
*** src/port/path.c 26 Jan 2005 19:24:03 -0000 1.51
--- src/port/path.c 15 Jun 2005 03:11:53 -0000
***************
*** 507,513 ****
void
set_pglocale_pgservice(const char *argv0, const char *app)
{
! char path[MAXPGPATH];
char my_exec_path[MAXPGPATH];
char env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")]; /*
longer than
* PGLOCALEDIR */
--- 507,514 ----
void
set_pglocale_pgservice(const char *argv0, const char *app)
{
! char path[MAXPGPATH],
! app_with_version[MAXPGPATH + sizeof(PG_VERSION)
- 1];
char my_exec_path[MAXPGPATH];
char env_path[MAXPGPATH + sizeof("PGSYSCONFDIR=")]; /*
longer than
* PGLOCALEDIR */
***************
*** 521,527 ****
#ifdef ENABLE_NLS
get_locale_path(my_exec_path, path);
! bindtextdomain(app, path);
textdomain(app);
if (getenv("PGLOCALEDIR") == NULL)
--- 522,530 ----
#ifdef ENABLE_NLS
get_locale_path(my_exec_path, path);
! StrNCpy(app_with_version, app, MAXPGPATH + sizeof(PG_VERSION) - 1);
! strncat(app_with_version, PG_VERSION, MAXPGPATH + sizeof(PG_VERSION) -
2);
! bindtextdomain(app_with_version, path);
textdomain(app);
if (getenv("PGLOCALEDIR") == NULL)
---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
(send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])