facf0c92e0
Red Bear OS is a full fork. All sources must be available from git clone with zero network access. Removed gitignore rules that excluded fetched source trees under recipes/*/source/, local/recipes/kde/*/source/, local/recipes/qt/*/source/, and vendor source trees. Build artifacts (target/, build/, source.tar, *.o, *.so) remain excluded. 127291 files added — kernel, relibc, base, bootloader, pkgar, all KDE/Qt frameworks, mesa, wayland, DRM drivers, and every other recipe source.
297 lines
8.7 KiB
Plaintext
297 lines
8.7 KiB
Plaintext
@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.
|