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

File: gettext.info,  Node: Preparing for printf,  Next: Preparing for printf_gettext,  Prev: sh.php">Preparing for gettext.sh,  Up: sh

16.5.15.6 Preparing Shell Scripts for the ‘printf’ 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. 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

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

  3. 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"

  4. For each translatable string, change the output command ‘echo’ or
     ‘$echo’ to ‘gettext’ (if the string contains no references to shell
     variables) or to ‘env printf "`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 ‘env printf "`ngettext ... `"’,
     followed by a no-argument ‘echo’ command.

     When doing this, you also need to replace the references to shell
     variables with format string directives (see *note sh-format::), 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

          env printf "`gettext \"Remaining files: %u.\"`"'\n' "$filecount"

     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 "`env printf \"\`gettext \\\"file not found: %s\\\"\`\" \"\$filename\"`"

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