Next: gettext.sh, Up: sh [Contents][Index]
Preparing a shell script for internationalization is conceptually similar to the steps described in Sources. The concrete steps for shell scripts are as follows.
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 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
.
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.
[email protected]@ export TEXTDOMAIN [email protected]@ export TEXTDOMAINDIR
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"
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\"`"
Next: gettext.sh, Up: sh [Contents][Index]