Add PG version number to NLS files - Mailing list pgsql-patches

From Bruce Momjian
Subject Add PG version number to NLS files
Date
Msg-id 200506150315.j5F3Fh502616@candle.pha.pa.us
Whole thread Raw
Responses Re: Add PG version number to NLS files
List pgsql-patches
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
>   pgman@candle.pha.pa.us               |  (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 majordomo@postgresql.org so that your
>       message can get through to the mailing list cleanly
>

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (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)

pgsql-patches by date:

Previous
From: Bruce Momjian
Date:
Subject: Re: [HACKERS] Should *.backup files ever be removed from pg_xlog?
Next
From: Neil Conway
Date:
Subject: Re: uptime function to postmaster