manpagez: man pages & more
info gettext
Home | html | info | man

File: gettext.info,  Node: Preparing for gettext.sh,  Next: Preparing for printf,  Prev: The printf_gettext approach,  Up: sh

16.5.15.5 Preparing Shell Scripts for the ‘gettext.sh’ approach
...............................................................

   Preparing a shell script for internationalization is conceptually
similar to the steps described in *note Sources::.  The concrete steps
for shell scripts with this approach are as follows.

  1. Insert the line

          . gettext.sh

     near the top of the script.  ‘gettext.sh’ is a shell function
     library that provides the functions ‘eval_gettext’ (see *note
     eval_gettext Invocation::), ‘eval_ngettext’ (see *note
     eval_ngettext Invocation::), ‘eval_pgettext’ (see *note
     eval_pgettext Invocation::), and ‘eval_npgettext’ (see *note
     eval_npgettext Invocation::).  You have to ensure that ‘gettext.sh’
     can be found in the ‘PATH’.

  2. Set and export the ‘TEXTDOMAIN’ and ‘TEXTDOMAINDIR’ environment
     variables.  Usually ‘TEXTDOMAIN’ is the package or program name,
     and ‘TEXTDOMAINDIR’ is the absolute pathname corresponding to
     ‘$prefix/share/locale’, where ‘$prefix’ is the installation
     location.

          TEXTDOMAIN=@PACKAGE@
          export TEXTDOMAIN
          TEXTDOMAINDIR=@LOCALEDIR@
          export TEXTDOMAINDIR

  3. Prepare the strings for translation, as described in *note
     Preparing Strings::.

  4. Simplify translatable strings so that they don't contain command
     substitution (‘"`...`"’ or ‘"$(...)"’), variable access with
     defaulting (like ‘${VARIABLE-DEFAULT}’), access to positional
     arguments (like ‘$0’, ‘$1’, ...)  or highly volatile shell
     variables (like ‘$?’).  This can always be done through simple
     local code restructuring.  For example,

          echo "Usage: $0 [OPTION] FILE..."

     becomes

          program_name=$0
          echo "Usage: $program_name [OPTION] FILE..."

     Similarly,

          echo "Remaining files: `ls | wc -l`"

     becomes

          filecount="`ls | wc -l`"
          echo "Remaining files: $filecount"

  5. For each translatable string, change the output command ‘echo’ or
     ‘$echo’ to ‘gettext’ (if the string contains no references to shell
     variables) or to ‘eval_gettext’ (if it refers to shell variables),
     followed by a no-argument ‘echo’ command (to account for the
     terminating newline).  Similarly, for cases with plural handling,
     replace a conditional ‘echo’ command with an invocation of
     ‘ngettext’ or ‘eval_ngettext’, followed by a no-argument ‘echo’
     command.

     When doing this, you also need to add an extra backslash before the
     dollar sign in references to shell variables, so that the
     ‘eval_gettext’ function receives the translatable string before the
     variable values are substituted into it.  For example,

          echo "Remaining files: $filecount"

     becomes

          eval_gettext "Remaining files: \$filecount"; echo

     If the output command is not ‘echo’, you can make it use ‘echo’
     nevertheless, through the use of backquotes.  However, note that
     inside backquotes, backslashes must be doubled to be effective
     (because the backquoting eats one level of backslashes).  For
     example, assuming that ‘error’ is a shell function that signals an
     error,

          error "file not found: $filename"

     is first transformed into

          error "`echo \"file not found: \$filename\"`"

     which then becomes

          error "`eval_gettext \"file not found: \\\$filename\"`"

© manpagez.com 2000-2026
Individual documents may contain additional copyright information.