X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0d3a69ec7039f1c77bb3c23d1bfabb13d5df223f..93c4157c6cf8603eaba7ebbbc3b1e7bd303d8241:/docs/html/gettext/gettext_10.html diff --git a/docs/html/gettext/gettext_10.html b/docs/html/gettext/gettext_10.html new file mode 100644 index 0000000000..2b8d78b953 --- /dev/null +++ b/docs/html/gettext/gettext_10.html @@ -0,0 +1,656 @@ + + + + +GNU gettext utilities - The Maintainer's View + + + + + + +

Go to the first, previous, next, last section, table of contents. +


+ + +

The Maintainer's View

+ +

+The maintainer of a package has many responsibilities. One of them +is ensuring that the package will install easily on many platforms, +and that the magic we described earlier (see section The User's View) will work +for installers and end users. + +

+

+Of course, there are many possible ways by which GNU gettext +might be integrated in a distribution, and this chapter does not cover +them in all generality. Instead, it details one possible approach which +is especially adequate for many free software distributions following GNU +standards, or even better, Gnits standards, because GNU gettext +is purposely for helping the internationalization of the whole GNU +project, and as many other good free packages as possible. So, the +maintainer's view presented here presumes that the package already has +a `configure.in' file and uses GNU Autoconf. + +

+

+Nevertheless, GNU gettext may surely be useful for free packages +not following GNU standards and conventions, but the maintainers of such +packages might have to show imagination and initiative in organizing +their distributions so gettext work for them in all situations. +There are surely many, out there. + +

+

+Even if gettext methods are now stabilizing, slight adjustments +might be needed between successive gettext versions, so you +should ideally revise this chapter in subsequent releases, looking +for changes. + +

+ + + +

Flat or Non-Flat Directory Structures

+ +

+Some free software packages are distributed as tar files which unpack +in a single directory, these are said to be flat distributions. +Other free software packages have a one level hierarchy of subdirectories, using +for example a subdirectory named `doc/' for the Texinfo manual and +man pages, another called `lib/' for holding functions meant to +replace or complement C libraries, and a subdirectory `src/' for +holding the proper sources for the package. These other distributions +are said to be non-flat. + +

+

+For now, we cannot say much about flat distributions. A flat +directory structure has the disadvantage of increasing the difficulty +of updating to a new version of GNU gettext. Also, if you have +many PO files, this could somewhat pollute your single directory. +In the GNU gettext distribution, the `misc/' directory +contains a shell script named `combine-sh'. That script may +be used for combining all the C files of the `intl/' directory +into a pair of C files (one `.c' and one `.h'). Those two +generated files would fit more easily in a flat directory structure, +and you will then have to add these two files to your project. + +

+

+Maybe because GNU gettext itself has a non-flat structure, +we have more experience with this approach, and this is what will be +described in the remaining of this chapter. Some maintainers might +use this as an opportunity to unflatten their package structure. +Only later, once gained more experience adapting GNU gettext +to flat distributions, we might add some notes about how to proceed +in flat situations. + +

+ + +

Prerequisite Works

+ +

+There are some works which are required for using GNU gettext +in one of your package. These works have some kind of generality +that escape the point by point descriptions used in the remainder +of this chapter. So, we describe them here. + +

+ + + +

+It is worth adding here a few words about how the maintainer should +ideally behave with PO files submissions. As a maintainer, your role is +to authentify the origin of the submission as being the representative +of the appropriate translating teams of the Translation Project (forward +the submission to `translation@iro.umontreal.ca' in case of doubt), +to ensure that the PO file format is not severely broken and does not +prevent successful installation, and for the rest, to merely to put these +PO files in `po/' for distribution. + +

+

+As a maintainer, you do not have to take on your shoulders the +responsibility of checking if the translations are adequate or +complete, and should avoid diving into linguistic matters. Translation +teams drive themselves and are fully responsible of their linguistic +choices for the Translation Project. Keep in mind that translator teams are not +driven by maintainers. You can help by carefully redirecting all +communications and reports from users about linguistic matters to the +appropriate translation team, or explain users how to reach or join +their team. The simplest might be to send them the `ABOUT-NLS' file. + +

+

+Maintainers should never ever apply PO file bug reports +themselves, short-cutting translation teams. If some translator has +difficulty to get some of her points through her team, it should not be +an issue for her to directly negotiate translations with maintainers. +Teams ought to settle their problems themselves, if any. If you, as +a maintainer, ever think there is a real problem with a team, please +never try to solve a team's problem on your own. + +

+ + +

Invoking the gettextize Program

+ +

+Some files are consistently and identically needed in every package +internationalized through GNU gettext. As a matter of +convenience, the gettextize program puts all these files right +in your package. This program has the following synopsis: + +

+ +
+gettextize [ option... ] [ directory ]
+
+ +

+and accepts the following options: + +

+
+ +
`-c' +
+
`--copy' +
+Copy the needed files instead of making symbolic links. Using links +would allow the package to always use the latest gettext code +available on the system, but it might disturb some mechanism the +maintainer is used to apply to the sources. Because running +gettextize is easy there shouldn't be problems with using copies. + +
`-f' +
+
`--force' +
+Force replacement of files which already exist. + +
`-h' +
+
`--help' +
+Display this help and exit. + +
`--version' +
+Output version information and exit. + +
+ +

+If directory is given, this is the top level directory of a +package to prepare for using GNU gettext. If not given, it +is assumed that the current directory is the top level directory of +such a package. + +

+

+The program gettextize provides the following files. However, +no existing file will be replaced unless the option --force +(-f) is specified. + +

+ +
    +
  1. + +The `ABOUT-NLS' file is copied in the main directory of your package, +the one being at the top level. This file gives the main indications +about how to install and use the Native Language Support features +of your program. You might elect to use a more recent copy of this +`ABOUT-NLS' file than the one provided through gettextize, +if you have one handy. You may also fetch a more recent copy of file +`ABOUT-NLS' from Translation Project sites, and from most GNU +archive sites. + +
  2. + +A `po/' directory is created for eventually holding +all translation files, but initially only containing the file +`po/Makefile.in.in' from the GNU gettext distribution. +(beware the double `.in' in the file name). If the `po/' +directory already exists, it will be preserved along with the files +it contains, and only `Makefile.in.in' will be overwritten. + +
  3. + +A `intl/' directory is created and filled with most of the files +originally in the `intl/' directory of the GNU gettext +distribution. Also, if option --force (-f) is given, +the `intl/' directory is emptied first. + +
+ +

+If your site support symbolic links, gettextize will not +actually copy the files into your package, but establish symbolic +links instead. This avoids duplicating the disk space needed in +all packages. Merely using the `-h' option while creating the +tar archive of your distribution will resolve each link by an +actual copy in the distribution archive. So, to insist, you really +should use `-h' option with tar within your dist +goal of your main `Makefile.in'. + +

+

+It is interesting to understand that most new files for supporting +GNU gettext facilities in one package go in `intl/' +and `po/' subdirectories. One distinction between these two +directories is that `intl/' is meant to be completely identical +in all packages using GNU gettext, while all newly created +files, which have to be different, go into `po/'. There is a +common `Makefile.in.in' in `po/', because the `po/' +directory needs its own `Makefile', and it has been designed so +it can be identical in all packages. + +

+ + +

Files You Must Create or Alter

+ +

+Besides files which are automatically added through gettextize, +there are many files needing revision for properly interacting with +GNU gettext. If you are closely following GNU standards for +Makefile engineering and auto-configuration, the adaptations should +be easier to achieve. Here is a point by point description of the +changes needed in each. + +

+

+So, here comes a list of files, each one followed by a description of +all alterations it needs. Many examples are taken out from the GNU +gettext 0.10.35 distribution itself. You may indeed +refer to the source code of the GNU gettext package, as it +is intended to be a good example and master implementation for using +its own functionality. + +

+ + + +

`POTFILES.in' in `po/'

+ +

+The `po/' directory should receive a file named +`POTFILES.in'. This file tells which files, among all program +sources, have marked strings needing translation. Here is an example +of such a file: + +

+ +
+# List of source files containing translatable strings.
+# Copyright (C) 1995 Free Software Foundation, Inc.
+
+# Common library files
+lib/error.c
+lib/getopt.c
+lib/xmalloc.c
+
+# Package source files
+src/gettextp.c
+src/msgfmt.c
+src/xgettext.c
+
+ +

+Dashed comments and white lines are ignored. All other lines +list those source files containing strings marked for translation +(see section How Marks Appears in Sources), in a notation relative to the top level +of your whole distribution, rather than the location of the +`POTFILES.in' file itself. + +

+ + +

`configure.in' at top level

+ + +
    +
  1. Declare the package and version. + +This is done by a set of lines like these: + + +
    +PACKAGE=gettext
    +VERSION=0.10.35
    +AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE")
    +AC_DEFINE_UNQUOTED(VERSION, "$VERSION")
    +AC_SUBST(PACKAGE)
    +AC_SUBST(VERSION)
    +
    + +Of course, you replace `gettext' with the name of your package, +and `0.10.35' by its version numbers, exactly as they +should appear in the packaged tar file name of your distribution +(`gettext-0.10.35.tar.gz', here). + +
  2. Declare the available translations. + +This is done by defining ALL_LINGUAS to the white separated, +quoted list of available languages, in a single line, like this: + + +
    +ALL_LINGUAS="de fr"
    +
    + +This example means that German and French PO files are available, so +that these languages are currently supported by your package. If you +want to further restrict, at installation time, the set of installed +languages, this should not be done by modifying ALL_LINGUAS in +`configure.in', but rather by using the LINGUAS environment +variable (see section Magic for Installers). + +
  3. Check for internationalization support. + +Here is the main m4 macro for triggering internationalization +support. Just add this line to `configure.in': + + +
    +AM_GNU_GETTEXT
    +
    + +This call is purposely simple, even if it generates a lot of configure +time checking and actions. + +
  4. Have output files created. + +The AC_OUTPUT directive, at the end of your `configure.in' +file, needs to be modified in two ways: + + +
    +AC_OUTPUT([existing configuration files intl/Makefile po/Makefile.in],
    +existing additional actions])
    +
    + +The modification to the first argument to AC_OUTPUT asks +for substitution in the `intl/' and `po/' directories. +Note the `.in' suffix used for `po/' only. This is because +the distributed file is really `po/Makefile.in.in'. + +
+ + + +

`aclocal.m4' at top level

+ +

+If you do not have an `aclocal.m4' file in your distribution, +the simplest is taking a copy of `aclocal.m4' from +GNU gettext. But to be precise, you only need macros +AM_LC_MESSAGES, AM_WITH_NLS and AM_GNU_GETTEXT, +and AM_PATH_PROG_WITH_TEST, which is called by AM_WITH_NLS, +so you may use an editor and remove macros you do not need. + +

+

+If you already have an `aclocal.m4' file, then you will have +to merge the said macros into your `aclocal.m4'. Note that if +you are upgrading from a previous release of GNU gettext, you +should most probably replace the said macros, as they usually +change a little from one release of GNU gettext to the next. +Their contents may vary as we get more experience with strange systems +out there. + +

+

+These macros check for the internationalization support functions +and related informations. Hopefully, once stabilized, these macros +might be integrated in the standard Autoconf set, because this +piece of m4 code will be the same for all projects using GNU +gettext. + +

+ + +

`acconfig.h' at top level

+ +

+If you do not have an `acconfig.h' file in your distribution, the +simplest is use take a copy of `acconfig.h' from GNU +gettext. But to be precise, you only need the lines and comments +for ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT and +HAVE_LC_MESSAGES, HAVE_STPCPY, PACKAGE and +VERSION, so you may use an editor and remove everything else. If +you already have an `acconfig.h' file, then you should merge the +said definitions into your `acconfig.h'. + +

+ + +

`Makefile.in' at top level

+ +

+Here are a few modifications you need to make to your main, top-level +`Makefile.in' file. + +

+ +
    +
  1. + +Add the following lines near the beginning of your `Makefile.in', +so the `dist:' goal will work properly (as explained further down): + + +
    +PACKAGE = @PACKAGE@
    +VERSION = @VERSION@
    +
    + +
  2. + +Add file `ABOUT-NLS' to the DISTFILES definition, so the file gets +distributed. + +
  3. + +Wherever you process subdirectories in your `Makefile.in', be sure +you also process dir subdirectories `intl' and `po'. Special +rules in the `Makefiles' take care for the case where no +internationalization is wanted. + +If you are using Makefiles, either generated by automake, or hand-written +so they carefully follow the GNU coding standards, the effected goals for +which the new subdirectories must be handled include `installdirs', +`install', `uninstall', `clean', `distclean'. + +Here is an example of a canonical order of processing. In this +example, we also define SUBDIRS in Makefile.in for it +to be further used in the `dist:' goal. + + +
    +SUBDIRS = doc lib @INTLSUB@ src @POSUB@
    +
    + +that you will have to adapt to your own package. + +
  4. + +A delicate point is the `dist:' goal, as both +`intl/Makefile' and `po/Makefile' will later assume that the +proper directory has been set up from the main `Makefile'. Here is +an example at what the `dist:' goal might look like: + + +
    +distdir = $(PACKAGE)-$(VERSION)
    +dist: Makefile
    +	rm -fr $(distdir)
    +	mkdir $(distdir)
    +	chmod 777 $(distdir)
    +	for file in $(DISTFILES); do \
    +	  ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir); \
    +	done
    +	for subdir in $(SUBDIRS); do \
    +	  mkdir $(distdir)/$$subdir || exit 1; \
    +	  chmod 777 $(distdir)/$$subdir; \
    +	  (cd $$subdir && $(MAKE) $@) || exit 1; \
    +	done
    +	tar chozf $(distdir).tar.gz $(distdir)
    +	rm -fr $(distdir)
    +
    + +
+ + + +

`Makefile.in' in `src/'

+ +

+Some of the modifications made in the main `Makefile.in' will +also be needed in the `Makefile.in' from your package sources, +which we assume here to be in the `src/' subdirectory. Here are +all the modifications needed in `src/Makefile.in': + +

+ +
    +
  1. + +In view of the `dist:' goal, you should have these lines near the +beginning of `src/Makefile.in': + + +
    +PACKAGE = @PACKAGE@
    +VERSION = @VERSION@
    +
    + +
  2. + +If not done already, you should guarantee that top_srcdir +gets defined. This will serve for cpp include files. Just add +the line: + + +
    +top_srcdir = @top_srcdir@
    +
    + +
  3. + +You might also want to define subdir as `src', later +allowing for almost uniform `dist:' goals in all your +`Makefile.in'. At list, the `dist:' goal below assume that +you used: + + +
    +subdir = src
    +
    + +
  4. + +You should ensure that the final linking will use @INTLLIBS@ as +a library. An easy way to achieve this is to manage that it gets into +LIBS, like this: + + +
    +LIBS = @INTLLIBS@ @LIBS@
    +
    + +In most packages internationalized with GNU gettext, one will +find a directory `lib/' in which a library containing some helper +functions will be build. (You need at least the few functions which the +GNU gettext Library itself needs.) However some of the functions +in the `lib/' also give messages to the user which of course should be +translated, too. Taking care of this it is not enough to place the support +library (say `libsupport.a') just between the @INTLLIBS@ +and @LIBS@ in the above example. Instead one has to write this: + + +
    +LIBS = ../lib/libsupport.a @INTLLIBS@ ../lib/libsupport.a @LIBS@
    +
    + +
  5. + +You should also ensure that directory `intl/' will be searched for +C preprocessor include files in all circumstances. So, you have to +manage so both `-I../intl' and `-I$(top_srcdir)/intl' will +be given to the C compiler. + +
  6. + +Your `dist:' goal has to conform with others. Here is a +reasonable definition for it: + + +
    +distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
    +dist: Makefile $(DISTFILES)
    +	for file in $(DISTFILES); do \
    +	  ln $$file $(distdir) 2>/dev/null || cp -p $$file $(distdir); \
    +	done
    +
    + +
+ +


+

Go to the first, previous, next, last section, table of contents. + +