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\"`"
