blob: b253db002583cc0546258d69c1917d4282504e5d [file] [log] [blame]
@c This file is part of the GNU gettext manual.
@c Copyright (C) 1995-2020 Free Software Foundation, Inc.
@c See the file gettext.texi for copying conditions.
@node sh
@subsection sh - Shell Script
@cindex shell scripts
@table @asis
@item RPMs
bash, gettext
@item Ubuntu packages
bash, gettext-base
@item File extension
@code{sh}
@item String syntax
@code{"abc"}, @code{'abc'}, @code{abc}
@item gettext shorthand
@code{"`gettext \"abc\"`"}
@item gettext/ngettext functions
@pindex gettext
@pindex ngettext
@code{gettext}, @code{ngettext} programs
@*@code{eval_gettext}, @code{eval_ngettext}, @code{eval_pgettext},
@code{eval_npgettext} shell functions
@item textdomain
@vindex TEXTDOMAIN@r{, environment variable}
environment variable @code{TEXTDOMAIN}
@item bindtextdomain
@vindex TEXTDOMAINDIR@r{, environment variable}
environment variable @code{TEXTDOMAINDIR}
@item setlocale
automatic
@item Prerequisite
@code{. gettext.sh}
@item Use or emulate GNU gettext
use
@item Extractor
@code{xgettext}
@item Formatting with positions
---
@item Portability
fully portable
@item po-mode marking
---
@end table
An example is available in the @file{examples} directory: @code{hello-sh}.
@menu
* Preparing Shell Scripts:: Preparing Shell Scripts for Internationalization
* gettext.sh:: Contents of @code{gettext.sh}
* gettext Invocation:: Invoking the @code{gettext} program
* ngettext Invocation:: Invoking the @code{ngettext} program
* envsubst Invocation:: Invoking the @code{envsubst} program
* eval_gettext Invocation:: Invoking the @code{eval_gettext} function
* eval_ngettext Invocation:: Invoking the @code{eval_ngettext} function
* eval_pgettext Invocation:: Invoking the @code{eval_pgettext} function
* eval_npgettext Invocation:: Invoking the @code{eval_npgettext} function
@end menu
@node Preparing Shell Scripts
@subsubsection Preparing Shell Scripts for Internationalization
@cindex preparing shell scripts for translation
Preparing a shell script for internationalization is conceptually similar
to the steps described in @ref{Sources}. The concrete steps for shell
scripts are as follows.
@enumerate
@item
Insert the line
@smallexample
. gettext.sh
@end smallexample
near the top of the script. @code{gettext.sh} is a shell function library
that provides the functions
@code{eval_gettext} (see @ref{eval_gettext Invocation}),
@code{eval_ngettext} (see @ref{eval_ngettext Invocation}),
@code{eval_pgettext} (see @ref{eval_pgettext Invocation}), and
@code{eval_npgettext} (see @ref{eval_npgettext Invocation}).
You have to ensure that @code{gettext.sh} can be found in the @code{PATH}.
@item
Set and export the @code{TEXTDOMAIN} and @code{TEXTDOMAINDIR} environment
variables. Usually @code{TEXTDOMAIN} is the package or program name, and
@code{TEXTDOMAINDIR} is the absolute pathname corresponding to
@code{$prefix/share/locale}, where @code{$prefix} is the installation location.
@smallexample
TEXTDOMAIN=@@PACKAGE@@
export TEXTDOMAIN
TEXTDOMAINDIR=@@LOCALEDIR@@
export TEXTDOMAINDIR
@end smallexample
@item
Prepare the strings for translation, as described in @ref{Preparing Strings}.
@item
Simplify translatable strings so that they don't contain command substitution
(@code{"`...`"} or @code{"$(...)"}), variable access with defaulting (like
@code{$@{@var{variable}-@var{default}@}}), access to positional arguments
(like @code{$0}, @code{$1}, ...) or highly volatile shell variables (like
@code{$?}). This can always be done through simple local code restructuring.
For example,
@smallexample
echo "Usage: $0 [OPTION] FILE..."
@end smallexample
becomes
@smallexample
program_name=$0
echo "Usage: $program_name [OPTION] FILE..."
@end smallexample
Similarly,
@smallexample
echo "Remaining files: `ls | wc -l`"
@end smallexample
becomes
@smallexample
filecount="`ls | wc -l`"
echo "Remaining files: $filecount"
@end smallexample
@item
For each translatable string, change the output command @samp{echo} or
@samp{$echo} to @samp{gettext} (if the string contains no references to
shell variables) or to @samp{eval_gettext} (if it refers to shell variables),
followed by a no-argument @samp{echo} command (to account for the terminating
newline). Similarly, for cases with plural handling, replace a conditional
@samp{echo} command with an invocation of @samp{ngettext} or
@samp{eval_ngettext}, followed by a no-argument @samp{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 @samp{eval_gettext}
function receives the translatable string before the variable values are
substituted into it. For example,
@smallexample
echo "Remaining files: $filecount"
@end smallexample
becomes
@smallexample
eval_gettext "Remaining files: \$filecount"; echo
@end smallexample
If the output command is not @samp{echo}, you can make it use @samp{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
@samp{error} is a shell function that signals an error,
@smallexample
error "file not found: $filename"
@end smallexample
is first transformed into
@smallexample
error "`echo \"file not found: \$filename\"`"
@end smallexample
which then becomes
@smallexample
error "`eval_gettext \"file not found: \\\$filename\"`"
@end smallexample
@end enumerate
@node gettext.sh
@subsubsection Contents of @code{gettext.sh}
@code{gettext.sh}, contained in the run-time package of GNU gettext, provides
the following:
@itemize @bullet
@item $echo
The variable @code{echo} is set to a command that outputs its first argument
and a newline, without interpreting backslashes in the argument string.
@item eval_gettext
See @ref{eval_gettext Invocation}.
@item eval_ngettext
See @ref{eval_ngettext Invocation}.
@item eval_pgettext
See @ref{eval_pgettext Invocation}.
@item eval_npgettext
See @ref{eval_npgettext Invocation}.
@end itemize
@node gettext Invocation
@subsubsection Invoking the @code{gettext} program
@include rt-gettext.texi
Note: @code{xgettext} supports only the one-argument form of the
@code{gettext} invocation, where no options are present and the
@var{textdomain} is implicit, from the environment.
@node ngettext Invocation
@subsubsection Invoking the @code{ngettext} program
@include rt-ngettext.texi
Note: @code{xgettext} supports only the three-arguments form of the
@code{ngettext} invocation, where no options are present and the
@var{textdomain} is implicit, from the environment.
@node envsubst Invocation
@subsubsection Invoking the @code{envsubst} program
@include rt-envsubst.texi
@node eval_gettext Invocation
@subsubsection Invoking the @code{eval_gettext} function
@cindex @code{eval_gettext} function, usage
@example
eval_gettext @var{msgid}
@end example
@cindex lookup message translation
This function outputs the native language translation of a textual message,
performing dollar-substitution on the result. Note that only shell variables
mentioned in @var{msgid} will be dollar-substituted in the result.
@node eval_ngettext Invocation
@subsubsection Invoking the @code{eval_ngettext} function
@cindex @code{eval_ngettext} function, usage
@example
eval_ngettext @var{msgid} @var{msgid-plural} @var{count}
@end example
@cindex lookup plural message translation
This function outputs the native language translation of a textual message
whose grammatical form depends on a number, performing dollar-substitution
on the result. Note that only shell variables mentioned in @var{msgid} or
@var{msgid-plural} will be dollar-substituted in the result.
@node eval_pgettext Invocation
@subsubsection Invoking the @code{eval_pgettext} function
@cindex @code{eval_pgettext} function, usage
@example
eval_pgettext @var{msgctxt} @var{msgid}
@end example
@cindex lookup message translation with context
This function outputs the native language translation of a textual message
in the given context @var{msgctxt} (see @ref{Contexts}), performing
dollar-substitution on the result. Note that only shell variables mentioned
in @var{msgid} will be dollar-substituted in the result.
@node eval_npgettext Invocation
@subsubsection Invoking the @code{eval_npgettext} function
@cindex @code{eval_npgettext} function, usage
@example
eval_npgettext @var{msgctxt} @var{msgid} @var{msgid-plural} @var{count}
@end example
@cindex lookup plural message translation with context
This function outputs the native language translation of a textual message
whose grammatical form depends on a number in the given context @var{msgctxt}
(see @ref{Contexts}), performing dollar-substitution on the result. Note
that only shell variables mentioned in @var{msgid} or @var{msgid-plural}
will be dollar-substituted in the result.