summaryrefslogtreecommitdiff
path: root/doc/I18N-HOWTO
diff options
context:
space:
mode:
Diffstat (limited to 'doc/I18N-HOWTO')
-rw-r--r--doc/I18N-HOWTO249
1 files changed, 249 insertions, 0 deletions
diff --git a/doc/I18N-HOWTO b/doc/I18N-HOWTO
new file mode 100644
index 0000000..36c14d0
--- /dev/null
+++ b/doc/I18N-HOWTO
@@ -0,0 +1,249 @@
+Autoconf/I18n-ify HelloWorld HOW-TO
+-----------------------------------
+
+Authors:
+ Kenneth Christiansen <kenneth at gnu dot org>
+ Thomas Vander Stichele <thomas at apestaart dot org>
+
+Help from: Bruno Haible <bruno at clisp dot org>
+
+Disclaimer:
+ Kenneth last used autoconf 2.52 and automake 1.4p5 to test this guide.
+ Thomas last used autoconf 2.52 and automake 1.5 to test this guide.
+ We would like you to let us know if you have different versions of
+ these tools and things don't work out the same way.
+ No authors of any autotools were harmed during the making of this guide.
+
+In this article we are going to explain how to turn a simple
+Hello World application with a standard Makefile into an autotools-
+and I18N-enabled tree up to the point where it can be distributed.
+
+Our existing helloworld.c file looks like the following:
+
+#include <stdio.h>
+
+int main (void) {
+ printf ("Hello, world!\n");
+}
+
+1. First we create a source tree :
+
+ / - This is the top level directory
+ /src/ - Here the source will end up.
+
+ and place the helloworld.c file in the src/ dir
+
+2. If your program has not been autoconf-enabled yet, you can
+ create configure.scan (which is a good starting point for configure.ac)
+ and rename it to configure.ac
+
+ autoscan # creates configure.scan
+ mv configure.scan configure.ac
+
+ Now edit configure.ac and make some changes.
+ You can remove everything after AC_INIT, we'll be using AM_INIT_AUTOMAKE
+ to pass on variables.
+
+ Add the lines
+ PACKAGE=helloworld
+ VERSION=0.0.1
+ AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
+ to configure.in, just after AC_INIT
+
+ Change AC_CONFIG_HEADER to AM_CONFIG_HEADER as well.
+
+ If you have an empty AC_CONFIG_FILES macro, then comment that, or automake
+ will fail in the next step.
+
+ Finally, add Makefile to the AC_OUTPUT macro by changing that
+ line to read
+ AC_OUTPUT(Makefile)
+
+ NOTE: configure.ac used to be called configure.in
+
+3. We add some files that automake does not make but are necessary
+ to adhere to GNU standards.
+
+ touch NEWS README AUTHORS ChangeLog
+
+ These two files need to be created to satisfy automake
+
+ touch config.h.in Makefile.am
+
+ We will create Makefile.am later on.
+
+4. To add some basic files (like COPYING, INSTALL, etc..)
+ we run automake in the toplevel directory.
+
+ automake --add-missing --gnu
+
+5. After that we do the big i18n trick :-), also in the toplevel
+ directory.
+
+ intltoolize # bring in the perl helper scripts
+ # and our Makefile.in.in for the po directory
+
+6. Run autoheader which will create config.h.in
+
+ autoheader # create config.h.in
+
+7. Now, open up configure.in and make some modifications.
+
+ The gettext macros need to be added after the initial checks.
+ Putting them after the checks for library functions is a good idea.
+
+ IT_PROG_INTLTOOL(0.26)
+
+ AM_GNU_GETTEXT([external]) # Only one of these two macro calls
+ AM_GLIB_GNU_GETTEXT # is needed to set up your project
+
+ ALL_LINGUAS="da nl" # Internationalization, means there is
+ # a .po file for danish and dutch.
+
+ AC_OUTPUT(
+ Makefile
+ src/Makefile
+ intl/Makefile
+ po/Makefile.in
+ )
+
+ IT_PROG_INTLTOOL checks if a good enough intltool is available.
+ Please require the latest intltool that exists. Intltool releases
+ are pretty stable and often only contains bugfixes.
+
+ AM_GNU_GETTEXT adds native language support to automake, together
+ with a compile option.
+
+ AM_GNU_GETTEXT will check for additional required functions and
+ programs and will finally create po/POTFILES during configure.
+
+ Instead of AM_GNU_GETTEXT you can use AM_GLIB_GNU_GETTEXT, which
+ will do a few less things than AM_GNU_GETTEXT, but does more than
+ enough for what intltool needs to work.
+
+ You do NOT need to use both AM_GNU_GETTEXT and AM_GLIB_GNU_GETTEXT
+ together though. Only one of them will suffice.
+
+ The text domain is identified by PACKAGE. We will need to add a few
+ functions later on to helloworld.c that will use this #define'd variable.
+
+ Also, this will be the base filename for all your translation files,
+ so make sure you choose a unique one.
+
+8.
+ Now add the add the supported languages to po/LINGUAS:
+
+ da nl
+
+ NOTE: These used to be in configure.{in,ac} in the ALL_LINGUAS
+ variable. This is deprecated since gettext 0.11
+
+9. Run
+ aclocal
+ to make sure that the necessary autoconf and automake macros
+ are inserted in aclocal.m4
+
+ Run
+ autoconf
+ to create the configure script.
+
+10. install the gettext.h file (since gettext 0.11) and include it:
+
+ #include "gettext.h"
+ #define _(String) gettext (String)
+
+11. Now add the following to helloworld.c
+
+ #include <locale.h>
+ #include "gettext.h"
+ #define _(String) gettext (String)
+ /* includes used by original program here */
+
+ int main (void)
+ {
+
+ setlocale (LC_ALL, "");
+ bindtextdomain (PACKAGE, LOCALEDIR);
+ textdomain (PACKAGE);
+
+ /* Original Helloworld code here */
+ }
+
+ If you use GNOME or GTK+ the setlocale sentence shouldn't be needed
+
+ We also substitute all strings we want to be translated with
+ _("original string") to make sure that gettext is run on the strings.
+ So the printf now looks like
+
+ printf (_("Hello, world!\n"));
+
+12. We create src/Makefile.am (from which Makefile.in and Makefile will be
+ generated)
+
+ INCLUDES = -I$(top_srcdir) -I$(includedir) \
+ -DLOCALEDIR=\""$(datadir)/locale"\"
+
+ bin_PROGRAMS = helloworld
+
+ helloworld_SOURCES = helloworld.c
+ noinst_HEADERS = i18n-support.h
+
+13. Now we create the following toplevel Makefile.am
+
+ SUBDIRS = src po
+
+14. Go into the directory po/ and create POTFILES.in
+ This file should contain a list of all the files in your distribution
+ (starting from the top, one level above the po dir) that contain
+ strings to be internationalized.
+
+ For the helloworld sample, it would contain
+ src/helloworld.c
+
+ Run
+ intltool-update --pot
+
+ Run
+ intltool-update --maintain
+ to see if you are missing files that contain marked strings.
+ You should consider adding these to POTFILES.in
+
+
+15. Now we start making a Danish and Dutch translation
+
+ msginit --locale=da
+ msginit --locale=nl
+
+ intltool-update da
+ intltool-update nl
+
+ edit and update da.po and nl.po
+ (The respective translations are "Hej verden" and "Hallo wereld")
+
+16. Now we can compile. We will test it later, so we will install it in
+ a temporary location.
+ Close your eyes and type
+ ./configure --prefix=/tmp/helloworld && make
+ in the toplevel directory. :-)
+
+17. To test if it works, you have to install the package.
+ Run
+ make install
+ in the toplevel directory.
+
+18. Now set the environment variable LC_ALL to your preferred language :
+ export LC_ALL=nl_NL
+ /tmp/helloworld/bin/helloworld
+ export LC_ALL=da_DK
+ /tmp/helloworld/bin/helloworld
+
+ And if all goes well, the string should be translated in the two languages.
+
+19. To finish it all up, run
+ make dist
+ to create a distributable tarball containing your internationalized
+ program.
+
+20. Exercises :
+ - add another language
+