Update.
[glibc/history.git] / manual / message.texi
blobc0ab28161c009965d3cc833887fa720dcd5d1b2d
1 @node Message Translation, Searching and Sorting, Locales, Top
2 @c %MENU% How to make the program speak the user's language
3 @chapter Message Translation
5 The program's interface with the human should be designed in a way to
6 ease the human the task.  One of the possibilities is to use messages in
7 whatever language the user prefers.
9 Printing messages in different languages can be implemented in different
10 ways.  One could add all the different languages in the source code and
11 add among the variants every time a message has to be printed.  This is
12 certainly no good solution since extending the set of languages is
13 difficult (the code must be changed) and the code itself can become
14 really big with dozens of message sets.
16 A better solution is to keep the message sets for each language are kept
17 in separate files which are loaded at runtime depending on the language
18 selection of the user.
20 The GNU C Library provides two different sets of functions to support
21 message translation.  The problem is that neither of the interfaces is
22 officially defined by the POSIX standard.  The @code{catgets} family of
23 functions is defined in the X/Open standard but this is derived from
24 industry decisions and therefore not necessarily based on reasonable
25 decisions.
27 As mentioned above the message catalog handling provides easy
28 extendibility by using external data files which contain the message
29 translations.  I.e., these files contain for each of the messages used
30 in the program a translation for the appropriate language.  So the tasks
31 of the message handling functions are
33 @itemize @bullet
34 @item
35 locate the external data file with the appropriate translations.
36 @item
37 load the data and make it possible to address the messages
38 @item
39 map a given key to the translated message
40 @end itemize
42 The two approaches mainly differ in the implementation of this last
43 step.  The design decisions made for this influences the whole rest.
45 @menu
46 * Message catalogs a la X/Open::  The @code{catgets} family of functions.
47 * The Uniforum approach::         The @code{gettext} family of functions.
48 @end menu
51 @node Message catalogs a la X/Open
52 @section X/Open Message Catalog Handling
54 The @code{catgets} functions are based on the simple scheme:
56 @quotation
57 Associate every message to translate in the source code with a unique
58 identifier.  To retrieve a message from a catalog file solely the
59 identifier is used.
60 @end quotation
62 This means for the author of the program that s/he will have to make
63 sure the meaning of the identifier in the program code and in the
64 message catalogs are always the same.
66 Before a message can be translated the catalog file must be located.
67 The user of the program must be able to guide the responsible function
68 to find whatever catalog the user wants.  This is separated from what
69 the programmer had in mind.
71 All the types, constants and functions for the @code{catgets} functions
72 are defined/declared in the @file{nl_types.h} header file.
74 @menu
75 * The catgets Functions::      The @code{catgets} function family.
76 * The message catalog files::  Format of the message catalog files.
77 * The gencat program::         How to generate message catalogs files which
78                                 can be used by the functions.
79 * Common Usage::               How to use the @code{catgets} interface.
80 @end menu
83 @node The catgets Functions
84 @subsection The @code{catgets} function family
86 @comment nl_types.h
87 @comment X/Open
88 @deftypefun nl_catd catopen (const char *@var{cat_name}, int @var{flag})
89 The @code{catgets} function tries to locate the message data file names
90 @var{cat_name} and loads it when found.  The return value is of an
91 opaque type and can be used in calls to the other functions to refer to
92 this loaded catalog.
94 The return value is @code{(nl_catd) -1} in case the function failed and
95 no catalog was loaded.  The global variable @var{errno} contains a code
96 for the error causing the failure.  But even if the function call
97 succeeded this does not mean that all messages can be translated.
99 Locating the catalog file must happen in a way which lets the user of
100 the program influence the decision.  It is up to the user to decide
101 about the language to use and sometimes it is useful to use alternate
102 catalog files.  All this can be specified by the user by setting some
103 environment variables.
105 The first problem is to find out where all the message catalogs are
106 stored.  Every program could have its own place to keep all the
107 different files but usually the catalog files are grouped by languages
108 and the catalogs for all programs are kept in the same place.
110 @cindex NLSPATH environment variable
111 To tell the @code{catopen} function where the catalog for the program
112 can be found the user can set the environment variable @code{NLSPATH} to
113 a value which describes her/his choice.  Since this value must be usable
114 for different languages and locales it cannot be a simple string.
115 Instead it is a format string (similar to @code{printf}'s).  An example
118 @smallexample
119 /usr/share/locale/%L/%N:/usr/share/locale/%L/LC_MESSAGES/%N
120 @end smallexample
122 First one can see that more than one directory can be specified (with
123 the usual syntax of separating them by colons).  The next things to
124 observe are the format string, @code{%L} and @code{%N} in this case.
125 The @code{catopen} function knows about several of them and the
126 replacement for all of them is of course different.
128 @table @code
129 @item %N
130 This format element is substituted with the name of the catalog file.
131 This is the value of the @var{cat_name} argument given to
132 @code{catgets}.
134 @item %L
135 This format element is substituted with the name of the currently
136 selected locale for translating messages.  How this is determined is
137 explained below.
139 @item %l
140 (This is the lowercase ell.) This format element is substituted with the
141 language element of the locale name.  The string describing the selected
142 locale is expected to have the form
143 @code{@var{lang}[_@var{terr}[.@var{codeset}]]} and this format uses the
144 first part @var{lang}.
146 @item %t
147 This format element is substituted by the territory part @var{terr} of
148 the name of the currently selected locale.  See the explanation of the
149 format above.
151 @item %c
152 This format element is substituted by the codeset part @var{codeset} of
153 the name of the currently selected locale.  See the explanation of the
154 format above.
156 @item %%
157 Since @code{%} is used in a meta character there must be a way to
158 express the @code{%} character in the result itself.  Using @code{%%}
159 does this just like it works for @code{printf}.
160 @end table
163 Using @code{NLSPATH} allows to specify arbitrary directories to be
164 searched for message catalogs while still allowing different languages
165 to be used.  If the @code{NLSPATH} environment variable is not set the
166 default value is
168 @smallexample
169 @var{prefix}/share/locale/%L/%N:@var{prefix}/share/locale/%L/LC_MESSAGES/%N
170 @end smallexample
172 @noindent
173 where @var{prefix} is given to @code{configure} while installing the GNU
174 C Library (this value is in many cases @code{/usr} or the empty string).
176 The remaining problem is to decide which must be used.  The value
177 decides about the substitution of the format elements mentioned above.
178 First of all the user can specify a path in the message catalog name
179 (i.e., the name contains a slash character).  In this situation the
180 @code{NLSPATH} environment variable is not used.  The catalog must exist
181 as specified in the program, perhaps relative to the current working
182 directory.  This situation in not desirable and catalogs names never
183 should be written this way.  Beside this, this behaviour is not portable
184 to all other platforms providing the @code{catgets} interface.
186 @cindex LC_ALL environment variable
187 @cindex LC_MESSAGES environment variable
188 @cindex LANG environment variable
189 Otherwise the values of environment variables from the standard
190 environment are examined (@pxref{Standard Environment}).  Which
191 variables are examined is decided by the @var{flag} parameter of
192 @code{catopen}.  If the value is @code{NL_CAT_LOCALE} (which is defined
193 in @file{nl_types.h}) then the @code{catopen} function examines the
194 environment variable @code{LC_ALL}, @code{LC_MESSAGES}, and @code{LANG}
195 in this order.  The first variable which is set in the current
196 environment will be used.
198 If @var{flag} is zero only the @code{LANG} environment variable is
199 examined.  This is a left-over from the early days of this function
200 where the other environment variable were not known.
202 In any case the environment variable should have a value of the form
203 @code{@var{lang}[_@var{terr}[.@var{codeset}]]} as explained above.  If
204 no environment variable is set the @code{"C"} locale is used which
205 prevents any translation.
207 The return value of the function is in any case a valid string.  Either
208 it is a translation from a message catalog or it is the same as the
209 @var{string} parameter.  So a piece of code to decide whether a
210 translation actually happened must look like this:
212 @smallexample
214   char *trans = catgets (desc, set, msg, input_string);
215   if (trans == input_string)
216     @{
217       /* Something went wrong.  */
218     @}
220 @end smallexample
222 @noindent
223 When an error occured the global variable @var{errno} is set to
225 @table @var
226 @item EBADF
227 The catalog does not exist.
228 @item ENOMSG
229 The set/message ttuple does not name an existing element in the
230 message catalog.
231 @end table
233 While it sometimes can be useful to test for errors programs normally
234 will avoid any test.  If the translation is not available it is no big
235 problem if the original, untranslated message is printed.  Either the
236 user understands this as well or s/he will look for the reason why the
237 messages are not translated.
238 @end deftypefun
240 Please note that the currently selected locale does not depend on a call
241 to the @code{setlocale} function.  It is not necessary that the locale
242 data files for this locale exist and calling @code{setlocale} succeeds.
243 The @code{catopen} function directly reads the values of the environment
244 variables.
247 @deftypefun {char *} catgets (nl_catd @var{catalog_desc}, int @var{set}, int @var{message}, const char *@var{string})
248 The function @code{catgets} has to be used to access the massage catalog
249 previously opened using the @code{catopen} function.  The
250 @var{catalog_desc} parameter must be a value previously returned by
251 @code{catopen}.
253 The next two parameters, @var{set} and @var{message}, reflect the
254 internal organization of the message catalog files.  This will be
255 explained in detail below.  For now it is interesting to know that a
256 catalog can consists of several set and the messages in each thread are
257 individually numbered using numbers.  Neither the set number nor the
258 message number must be consecutive.  They can be arbitrarily chosen.
259 But each message (unless equal to another one) must have its own unique
260 pair of set and message number.
262 Since it is not guaranteed that the message catalog for the language
263 selected by the user exists the last parameter @var{string} helps to
264 handle this case gracefully.  If no matching string can be found
265 @var{string} is returned.  This means for the programmer that
267 @itemize @bullet
268 @item
269 the @var{string} parameters should contain reasonable text (this also
270 helps to understand the program seems otherwise there would be no hint
271 on the string which is expected to be returned.
272 @item
273 all @var{string} arguments should be written in the same language.
274 @end itemize
275 @end deftypefun
277 It is somewhat uncomfortable to write a program using the @code{catgets}
278 functions if no supporting functionality is available.  Since each
279 set/message number tuple must be unique the programmer must keep lists
280 of the messages at the same time the code is written.  And the work
281 between several people working on the same project must be coordinated.
282 In @ref{Common Usage} we will see some how these problems can be relaxed
283 a bit.
285 @deftypefun int catclose (nl_catd @var{catalog_desc})
286 The @code{catclose} function can be used to free the resources
287 associated with a message catalog which previously was opened by a call
288 to @code{catopen}.  If the resources can be successfully freed the
289 function returns @code{0}.  Otherwise it return @code{@minus{}1} and the
290 global variable @var{errno} is set.  Errors can occur if the catalog
291 descriptor @var{catalog_desc} is not valid in which case @var{errno} is
292 set to @code{EBADF}.
293 @end deftypefun
296 @node The message catalog files
297 @subsection  Format of the message catalog files
299 The only reasonable way the translate all the messages of a function and
300 store the result in a message catalog file which can be read by the
301 @code{catopen} function is to write all the message text to the
302 translator and let her/him translate them all.  I.e., we must have a
303 file with entries which associate the set/message tuple with a specific
304 translation.  This file format is specified in the X/Open standard and
305 is as follows:
307 @itemize @bullet
308 @item
309 Lines containing only whitespace characters or empty lines are ignored.
311 @item
312 Lines which contain as the first non-whitespace character a @code{$}
313 followed by a whitespace character are comment and are also ignored.
315 @item
316 If a line contains as the first non-whitespace characters the sequence
317 @code{$set} followed by a whitespace character an additional argument
318 is required to follow.  This argument can either be:
320 @itemize @minus
321 @item
322 a number.  In this case the value of this number determines the set
323 to which the following messages are added.
325 @item
326 an identifier consisting of alphanumeric characters plus the underscore
327 character.  In this case the set get automatically a number assigned.
328 This value is one added to the largest set number which so far appeared.
330 How to use the symbolic names is explained in section @ref{Common Usage}.
332 It is an error if a symbol name appears more than once.  All following
333 messages are placed in a set with this number.
334 @end itemize
336 @item
337 If a line contains as the first non-whitespace characters the sequence
338 @code{$delset} followed by a whitespace character an additional argument
339 is required to follow.  This argument can either be:
341 @itemize @minus
342 @item
343 a number.  In this case the value of this number determines the set
344 which will be deleted.
346 @item
347 an identifier consisting of alphanumeric characters plus the underscore
348 character.  This symbolic identifier must match a name for a set which
349 previously was defined.  It is an error if the name is unknown.
350 @end itemize
352 In both cases all messages in the specified set will be removed.  They
353 will not appear in the output.  But if this set is later again selected
354 with a @code{$set} command again messages could be added and these
355 messages will appear in the output.
357 @item
358 If a line contains after leading whitespaces the sequence
359 @code{$quote}, the quoting character used for this input file is
360 changed to the first non-whitespace character following the
361 @code{$quote}.  If no non-whitespace character is present before the
362 line ends quoting is disable.
364 By default no quoting character is used.  In this mode strings are
365 terminated with the first unescaped line break.  If there is a
366 @code{$quote} sequence present newline need not be escaped.  Instead a
367 string is terminated with the first unescaped appearance of the quote
368 character.
370 A common usage of this feature would be to set the quote character to
371 @code{"}.  Then any appearance of the @code{"} in the strings must
372 be escaped using the backslash (i.e., @code{\"} must be written).
374 @item
375 Any other line must start with a number or an alphanumeric identifier
376 (with the underscore character included).  The following characters
377 (starting at the first non-whitespace character) will form the string
378 which gets associated with the currently selected set and the message
379 number represented by the number and identifier respectively.
381 If the start of the line is a number the message number is obvious.  It
382 is an error if the same message number already appeared for this set.
384 If the leading token was an identifier the message number gets
385 automatically assigned.  The value is the current maximum messages
386 number for this set plus one.  It is an error if the identifier was
387 already used for a message in this set.  It is ok to reuse the
388 identifier for a message in another thread.  How to use the symbolic
389 identifiers will be explained below (@pxref{Common Usage}).  There is
390 one limitation with the identifier: it must not be @code{Set}.  The
391 reason will be explained below.
393 Please note that you must use a quoting character if a message contains
394 leading whitespace.  Since one cannot guarantee this never happens it is
395 probably a good idea to always use quoting.
397 The text of the messages can contain escape characters.  The usual bunch
398 of characters known from the @w{ISO C} language are recognized
399 (@code{\n}, @code{\t}, @code{\v}, @code{\b}, @code{\r}, @code{\f},
400 @code{\\}, and @code{\@var{nnn}}, where @var{nnn} is the octal coding of
401 a character code).
402 @end itemize
404 @strong{Important:} The handling of identifiers instead of numbers for
405 the set and messages is a GNU extension.  Systems strictly following the
406 X/Open specification do not have this feature.  An example for a message
407 catalog file is this:
409 @smallexample
410 $ This is a leading comment.
411 $quote "
413 $set SetOne
414 1 Message with ID 1.
415 two "   Message with ID \"two\", which gets the value 2 assigned"
417 $set SetTwo
418 $ Since the last set got the number 1 assigned this set has number 2.
419 4000 "The numbers can be arbitrary, they need not start at one."
420 @end smallexample
422 This small example shows various aspects:
423 @itemize @bullet
424 @item
425 Lines 1 and 9 are comments since they start with @code{$} followed by
426 a whitespace.
427 @item
428 The quoting character is set to @code{"}.  Otherwise the quotes in the
429 message definition would have to be left away and in this case the
430 message with the identifier @code{two} would loose its leading whitespace.
431 @item
432 Mixing numbered messages with message having symbolic names is no
433 problem and the numbering happens automatically.
434 @end itemize
437 While this file format is pretty easy it is not the best possible for
438 use in a running program.  The @code{catopen} function would have to
439 parser the file and handle syntactic errors gracefully.  This is not so
440 easy and the whole process is pretty slow.  Therefore the @code{catgets}
441 functions expect the data in another more compact and ready-to-use file
442 format.  There is a special program @code{gencat} which is explained in
443 detail in the next section.
445 Files in this other format are not human readable.  To be easy to use by
446 programs it is a binary file.  But the format is byte order independent
447 so translation files can be shared by systems of arbitrary architecture
448 (as long as they use the GNU C Library).
450 Details about the binary file format are not important to know since
451 these files are always created by the @code{gencat} program.  The
452 sources of the GNU C Library also provide the sources for the
453 @code{gencat} program and so the interested reader can look through
454 these source files to learn about the file format.
457 @node The gencat program
458 @subsection Generate Message Catalogs files
460 @cindex gencat
461 The @code{gencat} program is specified in the X/Open standard and the
462 GNU implementation follows this specification and so allows to process
463 all correctly formed input files.  Additionally some extension are
464 implemented which help to work in a more reasonable way with the
465 @code{catgets} functions.
467 The @code{gencat} program can be invoked in two ways:
469 @example
470 `gencat [@var{Option}]@dots{} [@var{Output-File} [@var{Input-File}]@dots{}]`
471 @end example
473 This is the interface defined in the X/Open standard.  If no
474 @var{Input-File} parameter is given input will be read from standard
475 input.  Multiple input files will be read as if they are concatenated.
476 If @var{Output-File} is also missing, the output will be written to
477 standard output.  To provide the interface one is used from other
478 programs a second interface is provided.
480 @smallexample
481 `gencat [@var{Option}]@dots{} -o @var{Output-File} [@var{Input-File}]@dots{}`
482 @end smallexample
484 The option @samp{-o} is used to specify the output file and all file
485 arguments are used as input files.
487 Beside this one can use @file{-} or @file{/dev/stdin} for
488 @var{Input-File} to denote the standard input.  Corresponding one can
489 use @file{-} and @file{/dev/stdout} for @var{Output-File} to denote
490 standard output.  Using @file{-} as a file name is allowed in X/Open
491 while using the device names is a GNU extension.
493 The @code{gencat} program works by concatenating all input files and
494 then @strong{merge} the resulting collection of message sets with a
495 possibly existing output file.  This is done by removing all messages
496 with set/message number tuples matching any of the generated messages
497 from the output file and then adding all the new messages.  To
498 regenerate a catalog file while ignoring the old contents therefore
499 requires to remove the output file if it exists.  If the output is
500 written to standard output no merging takes place.
502 @noindent
503 The following table shows the options understood by the @code{gencat}
504 program.  The X/Open standard does not specify any option for the
505 program so all of these are GNU extensions.
507 @table @samp
508 @item -V
509 @itemx --version
510 Print the version information and exit.
511 @item -h
512 @itemx --help
513 Print a usage message listing all available options, then exit successfully.
514 @item --new
515 Do never merge the new messages from the input files with the old content
516 of the output files.  The old content of the output file is discarded.
517 @item -H
518 @itemx --header=name
519 This option is used to emit the symbolic names given to sets and
520 messages in the input files for use in the program.  Details about how
521 to use this are given in the next section.  The @var{name} parameter to
522 this option specifies the name of the output file.  It will contain a
523 number of C preprocessor @code{#define}s to associate a name with a
524 number.
526 Please note that the generated file only contains the symbols from the
527 input files.  If the output is merged with the previous content of the
528 output file the possibly existing symbols from the file(s) which
529 generated the old output files are not in the generated header file.
530 @end table
533 @node Common Usage
534 @subsection How to use the @code{catgets} interface
536 The @code{catgets} functions can be used in two different ways.  By
537 following slavishly the X/Open specs and not relying on the extension
538 and by using the GNU extensions.  We will take a look at the former
539 method first to understand the benefits of extensions.
541 @subsubsection Not using symbolic names
543 Since the X/Open format of the message catalog files does not allow
544 symbol names we have to work with numbers all the time.  When we start
545 writing a program we have to replace all appearances of translatable
546 strings with something like
548 @smallexample
549 catgets (catdesc, set, msg, "string")
550 @end smallexample
552 @noindent
553 @var{catgets} is retrieved from a call to @code{catopen} which is
554 normally done once at the program start.  The @code{"string"} is the
555 string we want to translate.  The problems start with the set and
556 message numbers.
558 In a bigger program several programmers usually work at the same time on
559 the program and so coordinating the number allocation is crucial.
560 Though no two different strings must be indexed by the same tuple of
561 numbers it is highly desirable to reuse the numbers for equal strings
562 with equal translations (please note that there might be strings which
563 are equal in one language but have different translations due to
564 difference contexts).
566 The allocation process can be relaxed a bit by different set numbers for
567 different parts of the program.  So the number of developers who have to
568 coordinate the allocation can be reduced.  But still lists must be keep
569 track of the allocation and errors can easily happen.  These errors
570 cannot be discovered by the compiler or the @code{catgets} functions.
571 Only the user of the program might see wrong messages printed.  In the
572 worst cases the messages are so irritating that they cannot be
573 recognized as wrong.  Think about the translations for @code{"true"} and
574 @code{"false"} being exchanged.  This could result in a disaster.
577 @subsubsection Using symbolic names
579 The problems mentioned in the last section derive from the fact that:
581 @enumerate
582 @item
583 the numbers are allocated once and due to the possibly frequent use of
584 them it is difficult to change a number later.
585 @item
586 the numbers do not allow to guess anything about the string and
587 therefore collisions can easily happen.
588 @end enumerate
590 By constantly using symbolic names and by providing a method which maps
591 the string content to a symbolic name (however this will happen) one can
592 prevent both problems above.  The cost of this is that the programmer
593 has to write a complete message catalog file while s/he is writing the
594 program itself.
596 This is necessary since the symbolic names must be mapped to numbers
597 before the program sources can be compiled.  In the last section it was
598 described how to generate a header containing the mapping of the names.
599 E.g., for the example message file given in the last section we could
600 call the @code{gencat} program as follow (assume @file{ex.msg} contains
601 the sources).
603 @smallexample
604 gencat -H ex.h -o ex.cat ex.msg
605 @end smallexample
607 @noindent
608 This generates a header file with the following content:
610 @smallexample
611 #define SetTwoSet 0x2   /* u.msg:8 */
613 #define SetOneSet 0x1   /* u.msg:4 */
614 #define SetOnetwo 0x2   /* u.msg:6 */
615 @end smallexample
617 As can be seen the various symbols given in the source file are mangled
618 to generate unique identifiers and these identifiers get numbers
619 assigned.  Reading the source file and knowing about the rules will
620 allow to predict the content of the header file (it is deterministic)
621 but this is not necessary.  The @code{gencat} program can take care for
622 everything.  All the programmer has to do is to put the generated header
623 file in the dependency list of the source files of her/his project and
624 to add a rules to regenerate the header of any of the input files
625 change.
627 One word about the symbol mangling.  Every symbol consists of two parts:
628 the name of the message set plus the name of the message or the special
629 string @code{Set}.  So @code{SetOnetwo} means this macro can be used to
630 access the translation with identifier @code{two} in the message set
631 @code{SetOne}.
633 The other names denote the names of the message sets.  The special
634 string @code{Set} is used in the place of the message identifier.
636 If in the code the second string of the set @code{SetOne} is used the C
637 code should look like this:
639 @smallexample
640 catgets (catdesc, SetOneSet, SetOnetwo,
641          "   Message with ID \"two\", which gets the value 2 assigned")
642 @end smallexample
644 Writing the function this way will allow to change the message number
645 and even the set number without requiring any change in the C source
646 code.  (The text of the string is normally not the same; this is only
647 for this example.)
650 @subsubsection How does to this allow to develop
652 To illustrate the usual way to work with the symbolic version numbers
653 here is a little example.  Assume we want to write the very complex and
654 famous greeting program.  We start by writing the code as usual:
656 @smallexample
657 #include <stdio.h>
659 main (void)
661   printf ("Hello, world!\n");
662   return 0;
664 @end smallexample
666 Now we want to internationalize the message and therefore replace the
667 message with whatever the user wants.
669 @smallexample
670 #include <nl_types.h>
671 #include <stdio.h>
672 #include "msgnrs.h"
674 main (void)
676   nl_catd catdesc = catopen ("hello.cat", NL_CAT_LOCALE);
677   printf (catgets (catdesc, SetMainSet, SetMainHello,
678                    "Hello, world!\n"));
679   catclose (catdesc);
680   return 0;
682 @end smallexample
684 We see how the catalog object is opened and the returned descriptor used
685 in the other function calls.  It is not really necessary to check for
686 failure of any of the functions since even in these situations the
687 functions will behave reasonable.  They simply will be return a
688 translation.
690 What remains unspecified here are the constants @code{SetMainSet} and
691 @code{SetMainHello}.  These are the symbolic names describing the
692 message.  To get the actual definitions which match the information in
693 the catalog file we have to create the message catalog source file and
694 process it using the @code{gencat} program.
696 @smallexample
697 $ Messages for the famous greeting program.
698 $quote "
700 $set Main
701 Hello "Hallo, Welt!\n"
702 @end smallexample
704 Now we can start building the program (assume the message catalog source
705 file is named @file{hello.msg} and the program source file @file{hello.c}):
707 @smallexample
708 @cartouche
709 % gencat -H msgnrs.h -o hello.cat hello.msg
710 % cat msgnrs.h
711 #define MainSet 0x1     /* hello.msg:4 */
712 #define MainHello 0x1   /* hello.msg:5 */
713 % gcc -o hello hello.c -I.
714 % cp hello.cat /usr/share/locale/de/LC_MESSAGES
715 % echo $LC_ALL
717 % ./hello
718 Hallo, Welt!
720 @end cartouche
721 @end smallexample
723 The call of the @code{gencat} program creates the missing header file
724 @file{msgnrs.h} as well as the message catalog binary.  The former is
725 used in the compilation of @file{hello.c} while the later is placed in a
726 directory in which the @code{catopen} function will try to locate it.
727 Please check the @code{LC_ALL} environment variable and the default path
728 for @code{catopen} presented in the description above.
731 @node The Uniforum approach
732 @section The Uniforum approach to Message Translation
734 Sun Microsystems tried to standardize a different approach to message
735 translation in the Uniforum group.  There never was a real standard
736 defined but still the interface was used in Sun's operation systems.
737 Since this approach fits better in the development process of free
738 software it is also used throughout the GNU package and the GNU
739 @file{gettext} package provides support for this outside the GNU C
740 Library.
742 The code of the @file{libintl} from GNU @file{gettext} is the same as
743 the code in the GNU C Library.  So the documentation in the GNU
744 @file{gettext} manual is also valid for the functionality here.  The
745 following text will describe the library functions in detail.  But the
746 numerous helper programs are not described in this manual.  Instead
747 people should read the GNU @file{gettext} manual
748 (@pxref{Top,,GNU gettext utilities,gettext,Native Language Support Library and Tools}).
749 We will only give a short overview.
751 Though the @code{catgets} functions are available by default on more
752 systems the @code{gettext} interface is at least as portable as the
753 former.  The GNU @file{gettext} package can be used wherever the
754 functions are not available.
757 @menu
758 * Message catalogs with gettext::  The @code{gettext} family of functions.
759 * Helper programs for gettext::    Programs to handle message catalogs
760                                     for @code{gettext}.
761 @end menu
764 @node Message catalogs with gettext
765 @subsection The @code{gettext} family of functions
767 The paradigms underlying the @code{gettext} approach to message
768 translations is different from that of the @code{catgets} functions the
769 basic functionally is equivalent.  There are functions of the following
770 categories:
772 @menu
773 * Translation with gettext::    What has to be done to translate a message.
774 * Locating gettext catalog::    How to determine which catalog to be used.
775 * Using gettextized software::  The possibilities of the user to influence
776                                  the way @code{gettext} works.
777 @end menu
779 @node Translation with gettext
780 @subsubsection What has to be done to translate a message?
782 The @code{gettext} functions have a very simple interface.  The most
783 basic function just takes the string which shall be translated as the
784 argument and it returns the translation.  This is fundamentally
785 different from the @code{catgets} approach where an extra key is
786 necessary and the original string is only used for the error case.
788 If the string which has to be translated is the only argument this of
789 course means the string itself is the key.  I.e., the translation will
790 be selected based on the original string.  The message catalogs must
791 therefore contain the original strings plus one translation for any such
792 string.  The task of the @code{gettext} function is it to compare the
793 argument string with the available strings in the catalog and return the
794 appropriate translation.  Of course this process is optimized so that
795 this process is not more expensive than an access using an atomic key
796 like in @code{catgets}.
798 The @code{gettext} approach has some advantages but also some
799 disadvantages.  Please see the GNU @file{gettext} manual for a detailed
800 discussion of the pros and cons.
802 All the definitions and declarations for @code{gettext} can be found in
803 the @file{libintl.h} header file.  On systems where these functions are
804 not part of the C library they can be found in a separate library named
805 @file{libintl.a} (or accordingly different for shared libraries).
807 @deftypefun {char *} gettext (const char *@var{msgid})
808 The @code{gettext} function searches the currently selected message
809 catalogs for a string which is equal to @var{msgid}.  If there is such a
810 string available it is returned.  Otherwise the argument string
811 @var{msgid} is returned.
813 Please note that all though the return value is @code{char *} the
814 returned string must not be changed.  This broken type results from the
815 history of the function and does not reflect the way the function should
816 be used.
818 Please note that above we wrote ``message catalogs'' (plural).  This is
819 a speciality of the GNU implementation of these functions and we will
820 say more about this in section @xref{Locating gettext catalog} when we
821 talk about the ways message catalogs are selected.
823 The @code{gettext} function does not modify the value of the global
824 @var{errno} variable.  This is necessary to make it possible to write
825 something like
827 @smallexample
828   printf (gettext ("Operation failed: %m\n"));
829 @end smallexample
831 Here the @var{errno} value is used in the @code{printf} function while
832 processing the @code{%m} format element and if the @code{gettext}
833 function would change this value (it is called before @code{printf} is
834 called) we would get a wrong message.
836 So there is no easy way to detect a missing message catalog beside
837 comparing the argument string with the result.  But it is normally the
838 task of the user to react on missing catalogs.  The program cannot guess
839 when a message catalog is really necessary since for a user who s peaks
840 the language the program was developed in does not need any translation.
841 @end deftypefun
843 The remaining two functions to access the message catalog add some
844 functionality to select a message catalog which is not the default one.
845 This is important if parts of the program are developed independently.
846 Every part can have its own message catalog and all of them can be used
847 at the same time.  The C library itself is an example: internally it
848 uses the @code{gettext} functions but since it must not depend on a
849 currently selected default message catalog it must specify all ambiguous
850 information.
852 @deftypefun {char *} dgettext (const char *@var{domainname}, const char *@var{msgid})
853 The @code{dgettext} functions acts just like the @code{gettext}
854 function.  It only takes an additional first argument @var{domainname}
855 which guides the selection of the message catalogs which are searched
856 for the translation.  If the @var{domainname} parameter is the null
857 pointer the @code{dgettext} function is exactly equivalent to
858 @code{gettext} since the default value for the domain name is used.
860 As for @code{gettext} the return value type is @code{char *} which is an
861 anachronism.  The returned string must never be modified.
862 @end deftypefun
864 @deftypefun {char *} dcgettext (const char *@var{domainname}, const char *@var{msgid}, int @var{category})
865 The @code{dcgettext} adds another argument to those which
866 @code{dgettext} takes.  This argument @var{category} specifies the last
867 piece of information needed to localize the message catalog.  I.e., the
868 domain name and the locale category exactly specify which message
869 catalog has to be used (relative to a given directory, see below).
871 The @code{dgettext} function can be expressed in terms of
872 @code{dcgettext} by using
874 @smallexample
875 dcgettext (domain, string, LC_MESSAGES)
876 @end smallexample
878 @noindent
879 instead of
881 @smallexample
882 dgettext (domain, string)
883 @end smallexample
885 This also shows which values are expected for the third parameter.  One
886 has to use the available selectors for the categories available in
887 @file{locale.h}.  Normally the available values are @code{LC_CTYPE},
888 @code{LC_COLLATE}, @code{LC_MESSAGES}, @code{LC_MONETARY},
889 @code{LC_NUMERIC}, and @code{LC_TIME}.  Please note that @code{LC_ALL}
890 must not be used and even though the names might suggest this, there is
891 no relation to the environments variables of this name.
893 The @code{dcgettext} function is only implemented for compatibility with
894 other systems which have @code{gettext} functions.  There is not really
895 any situation where it is necessary (or useful) to use a different value
896 but @code{LC_MESSAGES} in for the @var{category} parameter.  We are
897 dealing with messages here and any other choice can only be irritating.
899 As for @code{gettext} the return value type is @code{char *} which is an
900 anachronism.  The returned string must never be modified.
901 @end deftypefun
903 When using the three functions above in a program it is a frequent case
904 that the @var{msgid} argument is a constant string.  So it is worth to
905 optimize this case.  Thinking shortly about this one will realize that
906 as long as no new message catalog is loaded the translation of a message
907 will not change.  I.e., the algorithm to determine the translation is
908 deterministic.
910 Exactly this is what the optimizations implemented in the
911 @file{libintl.h} header will use.  Whenever a program is compiler with
912 the GNU C compiler, optimization is selected and the @var{msgid}
913 argument to @code{gettext}, @code{dgettext} or @code{dcgettext} is a
914 constant string the actual function call will only be done the first
915 time the message is used and then always only if any new message catalog
916 was loaded and so the result of the translation lookup might be
917 different.  See the @file{libintl.h} header file for details.  For the
918 user it is only important to know that the result is always the same,
919 independent of the compiler or compiler options in use.
922 @node Locating gettext catalog
923 @subsubsection How to determine which catalog to be used
925 The functions to retrieve the translations for a given message have a
926 remarkable simple interface.  But to provide the user of the program
927 still the opportunity to select exactly the translation s/he wants and
928 also to provide the programmer the possibility to influence the way to
929 locate the search for catalogs files there is a quite complicated
930 underlying mechanism which controls all this.  The code is complicated
931 the use is easy.
933 Basically we have two different tasks to perform which can also be
934 performed by the @code{catgets} functions:
936 @enumerate
937 @item
938 Locate the set of message catalogs.  There are a number of files for
939 different languages and which all belong to the package.  Usually they
940 are all stored in the filesystem below a certain directory.
942 There can be arbitrary many packages installed and they can follow
943 different guidelines for the placement of their files.
945 @item
946 Relative to the location specified by the package the actual translation
947 files must be searched, based on the wishes of the user.  I.e., for each
948 language the user selects the program should be able to locate the
949 appropriate file.
950 @end enumerate
952 This is the functionality required by the specifications for
953 @code{gettext} and this is also what the @code{catgets} functions are
954 able to do.  But there are some problems unresolved:
956 @itemize @bullet
957 @item
958 The language to be used can be specified in several different ways.
959 There is no generally accepted standard for this and the user always
960 expects the program understand what s/he means.  E.g., to select the
961 German translation one could write @code{de}, @code{german}, or
962 @code{deutsch} and the program should always react the same.
964 @item
965 Sometimes the specification of the user is too detailed.  If s/he, e.g.,
966 specifies @code{de_DE.ISO-8859-1} which means German, spoken in Germany,
967 coded using the @w{ISO 8859-1} character set there is the possibility
968 that a message catalog matching this exactly is not available.  But
969 there could be a catalog matching @code{de} and if the character set
970 used on the machine is always @w{ISO 8859-1} there is no reason why this
971 later message catalog should not be used.  (We call this @dfn{message
972 inheritance}.)
974 @item
975 If a catalog for a wanted language is not available it is not always the
976 second best choice to fall back on the language of the developer and
977 simply not translate any message.  Instead a user might be better able
978 to read the messages in another language and so the user of the program
979 should be able to define an precedence order of languages.
980 @end itemize
982 We can divide the configuration actions in two parts: the one is
983 performed by the programmer, the other by the user.  We will start with
984 the functions the programmer can use since the user configuration will
985 be based on this.
987 As the functions described in the last sections already mention separate
988 sets of messages can be selected by a @dfn{domain name}.  This is a
989 simple string which should be unique for each program part with uses a
990 separate domain.  It is possible to use in one program arbitrary many
991 domains at the same time.  E.g., the GNU C Library itself uses a domain
992 named @code{libc} while the program using the C Library could use a
993 domain named @code{foo}.  The important point is that at any time
994 exactly one domain is active.  This is controlled with the following
995 function.
997 @deftypefun {char *} textdomain (const char *@var{domainname})
998 The @code{textdomain} function sets the default domain, which is used in
999 all future @code{gettext} calls, to @var{domainname}.  Please note that
1000 @code{dgettext} and @code{dcgettext} calls are not influenced if the
1001 @var{domainname} parameter of these functions is not the null pointer.
1003 Before the first call to @code{textdomain} the default domain is
1004 @code{messages}.  This is the name specified in the specification of
1005 the @code{gettext} API.  This name is as good as any other name.  No
1006 program should ever really use a domain with this name since this can
1007 only lead to problems.
1009 The function returns the value which is from now on taken as the default
1010 domain.  If the system went out of memory the returned value is
1011 @code{NULL} and the global variable @var{errno} is set to @code{ENOMEM}.
1012 Despite the return value type being @code{char *} the return string must
1013 not be changed.  It is allocated internally by the @code{textdomain}
1014 function.
1016 If the @var{domainname} parameter is the null pointer no new default
1017 domain is set.  Instead the currently selected default domain is
1018 returned.
1020 If the @var{domainname} parameter is the empty string the default domain
1021 is reset to its initial value, the domain with the name @code{messages}.
1022 This possibility is questionable to use since the domain @code{messages}
1023 really never should be used.
1024 @end deftypefun
1026 @deftypefun {char *} bindtextdomain (const char *@var{domainname}, const char *@var{dirname})
1027 The @code{bindtextdomain} function can be used to specify the directly
1028 which contains the message catalogs for domain @var{domainname} for the
1029 different languages.  To be correct, this is the directory where the
1030 hierarchy of directories is expected.  Details are explained below.
1032 For the programmer it is important to note that the translations which
1033 come with the program have be placed in a directory hierarchy starting
1034 at, say, @file{/foo/bar}.  Then the program should make a
1035 @code{bindtextdomain} call to bind the domain for the current program to
1036 this directory.  So it is made sure the catalogs are found.  A correctly
1037 running program does not depend on the user setting an environment
1038 variable.
1040 The @code{bindtextdomain} function can be used several times and if the
1041 @var{domainname} argument is different the previously bounded domains
1042 will not be overwritten.
1044 If the program which wish to use @code{bindtextdomain} at some point of
1045 time use the @code{chdir} function to change the current working
1046 directory it is important that the @var{dirname} strings ought to be an
1047 absolute pathname.  Otherwise the addressed directory might vary with
1048 the time.
1050 If the @var{dirname} parameter is the null pointer @code{bindtextdomain}
1051 returns the currently selected directory for the domain with the name
1052 @var{domainname}.
1054 the @code{bindtextdomain} function returns a pointer to a string
1055 containing the name of the selected directory name.  The string is
1056 allocated internally in the function and must not be changed by the
1057 user.  If the system went out of core during the execution of
1058 @code{bindtextdomain} the return value is @code{NULL} and the global
1059 variable @var{errno} is set accordingly.
1060 @end deftypefun
1063 @node Using gettextized software
1064 @subsubsection User influence on @code{gettext}
1066 The last sections described what the programmer can do to
1067 internationalize the messages of the program.  But it is finally up to
1068 the user to select the message s/he wants to see.  S/He must understand
1069 them.
1071 The POSIX locale model uses the environment variables @code{LC_COLLATE},
1072 @code{LC_CTYPE}, @code{LC_MESSAGES}, @code{LC_MONETARY}, @code{NUMERIC},
1073 and @code{LC_TIME} to select the locale which is to be used.  This way
1074 the user can influence lots of functions.  As we mentioned above the
1075 @code{gettext} functions also take advantage of this.
1077 To understand how this happens it is necessary to take a look at the
1078 various components of the filename which gets computed to locate a
1079 message catalog.  It is composed as follows:
1081 @smallexample
1082 @var{dir_name}/@var{locale}/LC_@var{category}/@var{domain_name}.mo
1083 @end smallexample
1085 The default value for @var{dir_name} is system specific.  It is computed
1086 from the value given as the prefix while configuring the C library.
1087 This value normally is @file{/usr} or @file{/}.  For the former the
1088 complete @var{dir_name} is:
1090 @smallexample
1091 /usr/share/locale
1092 @end smallexample
1094 We can use @file{/usr/share} since the @file{.mo} files containing the
1095 message catalogs are system independent, all systems can use the same
1096 files.  If the program executed the @code{bindtextdomain} function for
1097 the message domain that is currently handled the @code{dir_name}
1098 component is the exactly the value which was given to the function as
1099 the second parameter.  I.e., @code{bindtextdomain} allows to overwrite
1100 the only system dependent and fixed value to make it possible to
1101 address file everywhere in the filesystem.
1103 The @var{category} is the name of the locale category which was selected
1104 in the program code.  For @code{gettext} and @code{dgettext} this is
1105 always @code{LC_MESSAGES}, for @code{dcgettext} this is selected by the
1106 value of the third parameter.  As said above it should be avoided to
1107 ever use a category other than @code{LC_MESSAGES}.
1109 The @var{locale} component is computed based on the category used.  Just
1110 like for the @code{setlocale} function here comes the user selection
1111 into the play.  Some environment variables are examined in a fixed order
1112 and the first environment variable set determines the return value of
1113 the lookup process.  In detail, for the category @code{LC_xxx} the
1114 following variables in this order are examined:
1116 @table @code
1117 @item LANGUAGE
1118 @item LC_ALL
1119 @item LC_xxx
1120 @item LANG
1121 @end table
1123 This looks very familiar.  With the exception of the @code{LANGUAGE}
1124 environment variable this is exactly the lookup order the
1125 @code{setlocale} function uses.  But why introducing the @code{LANGUAGE}
1126 variable?
1128 The reason is that the syntax of the values these variables can have is
1129 different to what is expected by the @code{setlocale} function.  If we
1130 would set @code{LC_ALL} to a value following the extended syntax that
1131 would mean the @code{setlocale} function will never be able to use the
1132 value of this variable as well.  An additional variable removes this
1133 problem plus we can select the language independently of the locale
1134 setting which sometimes is useful.
1136 While for the @code{LC_xxx} variables the value should consist of
1137 exactly one specification of a locale the @code{LANGUAGE} variable's
1138 value can consist of a colon separated list of locale names.  The
1139 attentive reader will realize that this is the way we manage to
1140 implement one of our additional demands above: we want to be able to
1141 specify an ordered list of language.
1143 Back to the constructed filename we have only one component missing.
1144 The @var{domain_name} part is the name which was either registered using
1145 the @code{textdomain} function or which was given to @code{dgettext} or
1146 @code{dcgettext} as the first parameter.  Now it becomes obvious that a
1147 good choice for the domain name in the program code is a string which is
1148 closely related to the program/package name.  E.g., for the GNU C
1149 Library the domain name is @code{libc}.
1151 @noindent
1152 A limit piece of example code should show how the programmer is supposed
1153 to work:
1155 @smallexample
1157   textdomain ("test-package");
1158   bindtextdomain ("test-package", "/usr/local/share/locale");
1159   puts (gettext ("Hello, world!");
1161 @end smallexample
1163 At the program start the default domain is @code{messages}.  The
1164 @code{textdomain} call changes this to @code{test-package}.  The
1165 @code{bindtextdomain} call specifies that the message catalogs for the
1166 domain @code{test-package} can be found below the directory
1167 @file{/usr/local/share/locale}.
1169 If now the user set in her/his environment the variable @code{LANGUAGE}
1170 to @code{de} the @code{gettext} function will try to use the
1171 translations from the file
1173 @smallexample
1174 /usr/local/share/locale/de/LC_MESSAGES/test-package.mo
1175 @end smallexample
1177 From the above descriptions it should be clear which component of this
1178 filename is determined by which source.
1180 In the above example we assumed that the @code{LANGUAGE} environment
1181 variable to @code{de}.  This might be an appropriate selection but what
1182 happens if the user wants to use @code{LC_ALL} because of the wider
1183 usability and here the required value is @code{de_DE.ISO-8859-1}?  We
1184 already mentioned above that a situation like this is not infrequent.
1185 E.g., a person might prefer reading a dialect and if this is not
1186 available fall back on the standard language.
1188 The @code{gettext} functions know about situations like this and can
1189 handle them gracefully.  The functions recognize the format of the value
1190 of the environment variable.  It can split the value is different pieces
1191 and by leaving out the only or the other part it can construct new
1192 values.  This happens of course in a predictable way.  To understand
1193 this one must know the format of the environment variable value.  There
1194 are to more or less standardized forms:
1196 @table @emph
1197 @item X/Open Format
1198 @code{language[_territory[.codeset]][@@modifier]}
1200 @item CEN Format (European Community Standard)
1201 @code{language[_territory][+audience][+special][,[sponsor][_revision]]}
1202 @end table
1204 The functions will automatically recognize which format is used.  Less
1205 specific locale names will be stripped of in the order of the following
1206 list:
1208 @enumerate
1209 @item
1210 @code{revision}
1211 @item
1212 @code{sponsor}
1213 @item
1214 @code{special}
1215 @item
1216 @code{codeset}
1217 @item
1218 @code{normalized codeset}
1219 @item
1220 @code{territory}
1221 @item
1222 @code{audience}/@code{modifier}
1223 @end enumerate
1225 From the last entry one can see that the meaning of the @code{modifier}
1226 field in the X/Open format and the @code{audience} format have the same
1227 meaning.  Beside one can see that the @code{language} field for obvious
1228 reasons never will be dropped.
1230 The only new thing is the @code{normalized codeset} entry.  This is
1231 another goodie which is introduced to help reducing the chaos which
1232 derives from the inability of the people to standardize the names of
1233 character sets.  Instead of @w{ISO-8859-1} one can often see @w{8859-1},
1234 @w{88591}, @w{iso8859-1}, or @w{iso_8859-1}.  The @code{normalized
1235 codeset} value is generated from the user-provided character set name by
1236 applying the following rules:
1238 @enumerate
1239 @item
1240 Remove all characters beside numbers and letters.
1241 @item
1242 Fold letters to lowercase.
1243 @item
1244 If the same only contains digits prepend the string @code{"iso"}.
1245 @end enumerate
1247 @noindent
1248 So all of the above name will be normalized to @code{iso88591}.  This
1249 allows the program user much more freely choosing the locale name.
1251 Even this extended functionality still does not help to solve the
1252 problem that completely different names can be used to denote the same
1253 locale (e.g., @code{de} and @code{german}).  To be of help in this
1254 situation the locale implementation and also the @code{gettext}
1255 functions know about aliases.
1257 The file @file{/usr/share/locale/locale.alias} (replace @file{/usr} with
1258 whatever prefix you used for configuring the C library) contains a
1259 mapping of alternative names to more regular names.  The system manager
1260 is free to add new entries to fill her/his own needs.  The selected
1261 locale from the environment is compared with the entries in the first
1262 column of this file ignoring the case.  If they match the value of the
1263 second column is used instead for the further handling.
1265 In the description of the format of the environment variables we already
1266 mentioned the character set as a factor in the selection of the message
1267 catalog.  In fact, only catalogs which contain text written using the
1268 character set of the system/program can be used (directly; there will
1269 come a solution for this some day).  This means for the user that s/he
1270 will always have to take care for this.  If in the collection of the
1271 message catalogs there are files for the same language but coded using
1272 different character sets the user has to be careful.
1275 @node Helper programs for gettext
1276 @subsection Programs to handle message catalogs for @code{gettext}
1278 The GNU C Library does not contain the source code for the programs to
1279 handle message catalogs for the @code{gettext} functions.  As part of
1280 the GNU project the GNU gettext package contains everything the
1281 developer needs.  The functionality provided by the tools in this
1282 package by far exceeds the abilities of the @code{gencat} program
1283 described above for the @code{catgets} functions.
1285 There is a program @code{msgfmt} which is the equivalent program to the
1286 @code{gencat} program.  It generates from the human-readable and
1287 -editable form of the message catalog a binary file which can be used by
1288 the @code{gettext} functions.  But there are several more programs
1289 available.
1291 The @code{xgettext} program can be used to automatically extract the
1292 translatable messages from a source file.  I.e., the programmer need not
1293 take care for the translations and the list of messages which have to be
1294 translated.  S/He will simply wrap the translatable string in calls to
1295 @code{gettext} et.al and the rest will be done by @code{xgettext}.  This
1296 program has a lot of option which help to customize the output or do
1297 help to understand the input better.
1299 Other programs help to manage development cycle when new messages appear
1300 in the source files or when a new translation of the messages appear.
1301 here it should only be noted that using all the tools in GNU gettext it
1302 is possible to @emph{completely} automize the handling of message
1303 catalog.  Beside marking the translatable string in the source code and
1304 generating the translations the developers do not have anything to do
1305 themself.