@c This file is part of the GNU gettext manual.
@c Copyright (C) 1995-2019 Free Software Foundation, Inc.
@c See the file gettext.texi for copying conditions.

@pindex msgexec
@cindex @code{msgexec} program, usage
@example
msgexec [@var{option}] @var{command} [@var{command-option}]
@end example

@cindex apply command to all translations in a catalog
The @code{msgexec} program applies a command to all translations of a
translation catalog.
The @var{command} can be any program that reads a translation from standard
input.  It is invoked once for each translation.  Its output becomes
msgexec's output.  @code{msgexec}'s return code is the maximum return code
across all invocations.

@cindex @code{xargs}, and output from @code{msgexec}
A special builtin command called @samp{0} outputs the translation, followed
by a null byte.  The output of @samp{msgexec 0} is suitable as input for
@samp{xargs -0}.

@table @samp
@item --newline
@opindex --newline@r{, @code{msgfilter} option}
Add newline at the end of each input line.

@end table

@vindex MSGEXEC_MSGCTXT@r{, environment variable}
@vindex MSGEXEC_MSGID@r{, environment variable}
@vindex MSGEXEC_MSGID_PLURAL@r{, environment variable}
@vindex MSGEXEC_LOCATION@r{, environment variable}
@vindex MSGEXEC_PLURAL_FORM@r{, environment variable}
@vindex MSGEXEC_PREV_MSGCTXT@r{, environment variable}
@vindex MSGEXEC_PREV_MSGID@r{, environment variable}
@vindex MSGEXEC_PREV_MSGID_PLURAL@r{, environment variable}
During each @var{command} invocation, the environment variable
@code{MSGEXEC_MSGID} is bound to the message's msgid, and the environment
variable @code{MSGEXEC_LOCATION} is bound to the location in the PO file
of the message.  If the message has a context, the environment variable
@code{MSGEXEC_MSGCTXT} is bound to the message's msgctxt, otherwise it is
unbound.  If the message has a plural form, environment variable
@code{MSGEXEC_MSGID_PLURAL} is bound to the message's msgid_plural and
@code{MSGEXEC_PLURAL_FORM} is bound to the order number of the plural
actually processed (starting with 0), otherwise both are unbound.
If the message has a previous msgid (added by @code{msgmerge}),
environment variable @code{MSGEXEC_PREV_MSGCTXT} is bound to the
message's previous msgctxt, @code{MSGEXEC_PREV_MSGID} is bound to
the previous msgid, and @code{MSGEXEC_PREV_MSGID_PLURAL} is bound to
the previous msgid_plural.

@cindex catalog encoding and @code{msgexec} output
Note: It is your responsibility to ensure that the @var{command} can cope
with input encoded in the translation catalog's encoding.  If the
@var{command} wants input in a particular encoding, you can in a first step
convert the translation catalog to that encoding using the @samp{msgconv}
program, before invoking @samp{msgexec}.  If the @var{command} wants input
in the locale's encoding, but you want to avoid the locale's encoding, then
you can first convert the translation catalog to UTF-8 using the
@samp{msgconv} program and then make @samp{msgexec} work in an UTF-8
locale, by using the @code{LC_ALL} environment variable.

@subsection Input file location

@table @samp
@item -i @var{inputfile}
@itemx --input=@var{inputfile}
@opindex -i@r{, @code{msgexec} option}
@opindex --input@r{, @code{msgexec} option}
Input PO file.

@item -D @var{directory}
@itemx --directory=@var{directory}
@opindex -D@r{, @code{msgexec} option}
@opindex --directory@r{, @code{msgexec} option}
Add @var{directory} to the list of directories.  Source files are
searched relative to this list of directories.  The resulting @file{.po}
file will be written relative to the current directory, though.

@end table

If no @var{inputfile} is given or if it is @samp{-}, standard input is read.

@subsection Input file syntax

@table @samp
@item -P
@itemx --properties-input
@opindex -P@r{, @code{msgexec} option}
@opindex --properties-input@r{, @code{msgexec} option}
Assume the input file is a Java ResourceBundle in Java @code{.properties}
syntax, not in PO file syntax.

@item --stringtable-input
@opindex --stringtable-input@r{, @code{msgexec} option}
Assume the input file is a NeXTstep/GNUstep localized resource file in
@code{.strings} syntax, not in PO file syntax.

@end table

@subsection Informative output

@table @samp
@item -h
@itemx --help
@opindex -h@r{, @code{msgexec} option}
@opindex --help@r{, @code{msgexec} option}
Display this help and exit.

@item -V
@itemx --version
@opindex -V@r{, @code{msgexec} option}
@opindex --version@r{, @code{msgexec} option}
Output version information and exit.

@end table
