| @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. |