gettext: Preparing Shell Scripts

 
 15.5.12.1 Preparing Shell Scripts for Internationalization
 ..........................................................
 
    Preparing a shell script for internationalization is conceptually
 similar to the steps described in ⇒Sources.  The concrete steps
 for shell scripts are as follows.
 
   1. Insert the line
 
           . gettext.sh
 
      near the top of the script.  ‘gettext.sh’ is a shell function
DONTPRINTYET       library that provides the functions ‘eval_gettext’ (see ⇒
      eval_gettext Invocation), ‘eval_ngettext’ (see *noteDONTPRINTYET DONTPRINTYET       library that provides the functions ‘eval_gettext’ (see ⇒
      eval_gettext Invocation), ‘eval_ngettext’ (see ⇒
      eval_ngettext Invocation), ‘eval_pgettext’ (see *noteDONTPRINTYET DONTPRINTYET DONTPRINTYET       library that provides the functions ‘eval_gettext’ (see ⇒
      eval_gettext Invocation), ‘eval_ngettext’ (see ⇒
      eval_ngettext Invocation), ‘eval_pgettext’ (see ⇒
      eval_pgettext Invocation), and ‘eval_npgettext’ (see *noteDONTPRINTYET DONTPRINTYET DONTPRINTYET       library that provides the functions ‘eval_gettext’ (see ⇒
      eval_gettext Invocation), ‘eval_ngettext’ (see ⇒
      eval_ngettext Invocation), ‘eval_pgettext’ (see ⇒
      eval_pgettext Invocation), and ‘eval_npgettext’ (see ⇒
      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 ⇒
      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\"`"