Provided by: po4a_0.66-1_all bug

NAME

       po4a - update both the PO files and translated documents in one shot

SYNOPSIS

       po4a [options] config_file

DESCRIPTION

       po4a (PO for anything) eases the maintenance of documentation translation using the
       classical gettext tools. The main feature of po4a is that it decouples the translation of
       content from its document structure.  Please refer to the page po4a(7) for a gentle
       introduction to this project.

       When you run the po4a program for the first time, with only a configuration file and the
       documents to translate (called master documents), it produces a POT file (also called
       translation template) that contains all of the translatable strings in the document in a
       form that eases the work of translators.

       Those POT files can either be translated with a specific editor such as the GNOME
       Translation Editor, KDE's Lokalize or poedit, or they can be integrated in an online
       localization platform such as weblate or pootle.  The translation result is a set of PO
       files, one per language.

       When you run the po4a program with both the master documents and the PO files, it produces
       the translated documents by injecting the content's translation (found in the PO files)
       into the structure of the original master document.

       If the master documents changed in the meanwhile, po4a will update the PO and POT files
       accordingly, so that the translators can easily detect the modifications and update their
       work. Depending on your settings, po4a will discard the partially translated documents, or
       produce a document mixing English (for the new or modified paragraphs) and the target
       language (for paragraphs where translation is already in the PO file).

       By default, the translated documents are produced when at least 80% of their content is
       translated (see the --keep option below).  Discarding translations as soon as they are not
       100% may be discouraging for the translators, while showing "translations" that are too
       incomplete may be troubling for the end users.

   Graphical overview
        master documents ---+---->-------->---------+
         (doc authoring)    |                       |
                            V   (po4a executions)   >-----+--> translations
                            |                       |     |
        existing PO files -->--> updated PO files >-+     |
             ^                            |               |
             |                            V               |
             +----------<---------<-------+               ^
              (manual translation process)                |
                                                          |
        addendum -->--------------------------------------+

       The master documents are authored by the documentation writers. Any changes are
       automatically reflected by po4a in the PO files, that are then updated by the translators.
       All changes to the PO files (either manual or by po4a) are automatically reflected in
       translated documents. You can mimic this behavior using the po4a-updatepo(1) and
       po4a-translate(1) scripts in makefiles, but this quickly becomes bothersome and repetitive
       (see po4a(7)). It is highly recommended to use the po4a program in your build process.

OPTIONS

       -k, --keep
           Minimal threshold for translation percentage to keep (i.e. write) the resulting file
           (default: 80). I.e. by default, files have to be translated at least at 80% to be
           written on disk.

       -h, --help
           Show a short help message.

       -M, --master-charset
           Charset of the files containing the documents to translate. Note that all master
           documents must use the same charset.

       -L, --localized-charset
           Charset of the files containing the localized documents. Note that all translated
           documents will use the same charset.

       -A, --addendum-charset
           Charset of the addenda. Note that all the addenda should be in the same charset.

       -V, --version
           Display the version of the script and exit.

       -v, --verbose
           Increase the verbosity of the program.

       -q, --quiet
           Decrease the verbosity of the program.

       -d, --debug
           Output some debugging information.

       -o, --option
           Extra option(s) to pass to the format plugin. See the documentation of each plugin for
           more information about the valid options and their meanings. For example, you could
           pass '-o tablecells' to the AsciiDoc parser, while the text parser would accept '-o
           tabs=split'.

       -f, --force
           Always generate the POT and PO files, even if po4a considers it is not necessary.

           The default behavior (when --force is not specified) is the following:

               If the POT file already exists, it is regenerated if a master document or the
               configuration file is more recent (unless --no-update is provided).  The POT file
               is also written in a temporary document and po4a verifies that the changes are
               really needed.

               Also, a translation is regenerated only if its master document, the PO file, one
               of its addenda or the configuration file is more recent.  To avoid trying to
               regenerate translations which do not pass the threshold test (see --keep), a file
               with the .po4a-stamp extension can be created (see --stamp).

           If a master document includes files, you should use the --force flag because the
           modification time of these included files are not taken into account.

           The PO files are always re-generated based on the POT with msgmerge -U.

       --stamp
           Tells po4a to create stamp files when a translation is not generated because it does
           not reach the threshold. These stamp files are named according to the expected
           translated document, with the .po4a-stamp extension.

           Note: This only activates the creation of the .po4a-stamp files. The stamp files are
           always used if they exist, and they are removed with --rm-translations or when the
           file is finally translated.

       --no-translations
           Do not generate the translated documents, only update the POT and PO files.

       --no-update
           Do not change the POT and PO files, only the translation may be updated.

       --keep-translations
           Keeps the existing translation files even if the translation doesn't meet the
           threshold specified by --keep.  This option does not create new translation files with
           few content, but it will save existing translations which decay because of changes to
           the master files.

           WARNING: This flag changes the po4a behavior in a rather drastic way: your translated
           files will not get updated at all until the translation improves. Only use this flag
           if you prefer shipping an outdated translated documentation rather than only shipping
           an accurate untranslated documentation.

       --rm-translations
           Remove the translated files (implies --no-translations).

       --no-backups
           This flag does nothing since 0.41, and may be removed in later releases.

       --rm-backups
           This flag does nothing since 0.41, and may be removed in later releases.

       --translate-only translated-file
           Translate only the specified file.  It may be useful to speed up processing if a
           configuration file contains a lot of files.  Note that this option does not update PO
           and POT files.  This option can be used multiple times.

       --variable var=value
           Define a variable that will be expanded in the po4a configuration file.  Every
           occurrence of $(var) will be replaced by value.  This option can be used multiple
           times.

       --srcdir SRCDIR
           Set the base directory for all input documents specified in the po4a configuration
           file.

           If both destdir and srcdir are specified, input files are searched in the following
           directories, in order: destdir, the current directory and srcdir. Output files are
           written to destdir if specified, or to the current directory.

       --destdir DESTDIR
           Set the base directory for all the output documents specified in the po4a
           configuration file (see --srcdir above).

   Options modifying the POT header
       --porefs type
           Specify the reference format. Argument type can be one of never to not produce any
           reference, file to only specify the file without the line number, counter to replace
           line number by an increasing counter, and full to include complete references
           (default: full).

       --wrap-po no|newlines|number (default: 76)
           Specify how the po file should be wrapped. This gives the choice between either files
           that are nicely wrapped but could lead to git conflicts, or files that are easier to
           handle automatically, but harder to read for humans.

           Historically, the gettext suite has reformatted the po files at the 77th column for
           cosmetics. This option specifies the behavior of po4a. If set to a numerical value,
           po4a will wrap the po file after this column and after newlines in the content. If set
           to newlines, po4a will only split the msgid and msgstr after newlines in the content.
           If set to no, po4a will not wrap the po file at all.  The reference comments are
           always wrapped by the gettext tools that we use internally.

           Note that this option has no impact on how the msgid and msgstr are wrapped, ie on how
           newlines are added to the content of these strings.

       --master-language
           Language of the source files containing the documents to translate. Note that all
           master documents must use the same language.

       --msgid-bugs-address email@address
           Set the report address for msgid bugs. By default, the created POT files have no
           Report-Msgid-Bugs-To fields.

       --copyright-holder string
           Set the copyright holder in the POT header. The default value is "Free Software
           Foundation, Inc."

       --package-name string
           Set the package name for the POT header. The default is "PACKAGE".

       --package-version string
           Set the package version for the POT header. The default is "VERSION".

   Options to modify the PO files
       --msgmerge-opt options
           Extra options for msgmerge(1).

           Note: $lang will be extended to the current language.

       --no-previous
           This option removes --previous from the options passed to msgmerge.  This permits to
           support versions of gettext earlier than 0.16.

       --previous
           This option adds --previous to the options passed to msgmerge.  It requires gettext
           0.16 or later, and is activated by default.

CONFIGURATION FILE

       po4a expects a configuration file as argument. This file must contain the following
       elements:

       •   The path to the PO files and the list of languages existing in the project;

       •   Optionally, some global options and so-called configuration aliases that are used as
           templates to configure individual master files;

       •   The list of each master file to translate, along with specific parameters.

       All lines contain a command between square braces, followed by its parameters.  Comments
       begin with the char '#' and run until the end of the line. You can escape the end of line
       to spread a command over several lines.

       Some full examples are presented on this page, while other examples can be found in the
       "t/cfg" directory of the source distribution.

   Finding the PO and POT files
       The simplest solution is to explicitly give the path to POT and PO files, as follows:

        [po4a_paths] man/po/project.pot de:man/po/de.po fr:man/po/fr.po

       This specifies the path to the POT file first, and then the paths to the German and French
       PO files.

       The same information can be written as follows to reduce the risk of copy/paste errors:

        [po4a_langs] fr de
        [po4a_paths] man/po/project.pot $lang:man/po/$lang.po

       The $lang component is automatically expanded using the provided languages list, reducing
       the risk of copy/paste error when a new language is added.

       You can further compact the same information by only providing the path to the directory
       containing your translation project, as follows.

        [po_directory] man/po/

       The provided directory must contain a set of PO files, each named XX.po with "XX" the ISO
       639-1 of the language used in this file. The directory must also contain a single POT
       file, with the ".pot" file extension. For the first run, this file can be empty but it
       must exist (po4a cannot guess the name to use before the extension).

       Note that you must choose only one between "po_directory" and "po4a_paths". The first one
       ("po_directory") is more compact, further reduces the risk of copy/paste error, but forces
       you to use the expected project structure and file names. The second one ("po4a_paths"),
       is more explicit, probably more readable, and advised when you setup your first project
       with po4a.

       Centralized or split PO files?

       By default, po4a produces one single PO file per target language, containing the whole
       content of your translation project. As your project grows, the size of these files may
       become problematic. When using weblate, it is possible to specify priorities for each
       translation segment (i.e., msgid) so that the important ones get translated first. Still,
       some translation teams prefer to split the content in several files.

       To have one PO file per master file, you simply have to use the string $master in the name
       of your PO files on the "[po4a_paths]" line, as follows.

        [po4a_paths] doc/$master/$master.pot $lang:doc/$master/$lang.po

       With this line, po4a will produce separate POT and PO files for each document to
       translate.  For example, if you have 3 documents and 5 languages, this will result in 3
       POT files and 15 PO files. These files are named as specified on the "po4a_paths"
       template, with $master substituted to the basename of each document to translate. In case
       of name conflict, you can specify the POT file to use as follows, with the "pot="
       parameter.  This feature can also be used to group several translated files into the same
       POT file.

        [po4a_langs] de fr ja
        [po4a_paths] l10n/po/$master.pot $lang:l10n/po/$master.$lang.po
        [type: xml] foo/gui.xml $lang:foo/gui.$lang.xml pot=foo-gui
        [type: xml] bar/gui.xml $lang:bar/gui.$lang.xml pot=bar
        [type: xml] bar/cli.xml $lang:bar/cli.$lang.xml pot=bar

       In split mode, po4a builds a temporary compendium during the PO update, to share the
       translations between all the PO files. If two PO files have different translations for the
       same string, po4a will mark this string as fuzzy and will submit both translations in all
       the PO files containing this string. When unfuzzied by the translator, the translation is
       automatically used in every PO files.

   Specifying the documents to translate
       You must also list the documents that should be translated. For each master file, you must
       specify the format parser to use, the location of the translated document to produce, and
       optionally some configuration. Here is an example:

        [type: sgml] doc/my_stuff.sgml fr:doc/fr/mon_truc.sgml \
                     de:doc/de/mein_kram.sgml
        [type: man] script fr:doc/fr/script.1 de:doc/de/script.1
        [type: docbook] doc/script.xml fr:doc/fr/script.xml \
                    de:doc/de/script.xml

       But again, these complex lines are difficult to read and modify, e.g. when adding a new
       language. It is much simpler to reorganize things using the $lang template as follows:

        [type: sgml]    doc/my_stuff.sgml $lang:doc/$lang/my_stuff.sgml
        [type: man]     script.1          $lang:po/$lang/script.1
        [type: docbook] doc/script.xml    $lang:doc/$lang/script.xml

   Specifying options
       There is two types of options: po4a options are default values to the po4a command line
       options while format options are used to change the behavior of the format parsers. As a
       po4a options, you could for example specify in your configuration file that the default
       value of the --keep command line parameter is 50% instead of 80%. Format options are
       documented on the specific page of each parsing module, e.g. Locale::Po4a::Xml(3pm). You
       could for example pass nostrip to the XML parser to not strip the spaces around the
       extracted strings.

       You can pass these options for a specific master file, or even for a specific translation
       of that file, using "opt:" and "opt_XX:" for the "XX" language.  In the following example,
       the nostrip option is passed to the XML parser (for all languages), while the threshold
       will be reduced to 0% for the French translation (that is thus always kept).

        [type:xml] toto.xml $lang:toto.$lang.xml opt:"-o nostrip" opt_fr:"--keep 0"

       In any case, these configuration chunks must be located at the end of the line.  The
       declaration of files must come first, then the addendum if any (see below), and then only
       the options. The grouping of configuration chunks is not very important, since elements
       are internally concatenated as strings. The following examples are all equivalent:

         [type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20" opt:"-o nostrip" opt_fr:"--keep 0"
         [type:xml] toto.xml $lang:toto.$lang.xml opt:"--keep 20 -o nostrip" opt_fr:"--keep 0"
         [type:xml] toto.xml $lang:toto.$lang.xml opt:--keep opt:20 opt:-o opt:nostrip opt_fr:--keep opt_fr:0

       Note that language specific options are not used when building the POT file. It is for
       example impossible to pass nostrip to the parser only when building the French
       translation, because the same POT file is used to update every languages. So the only
       options that can be language-specific are the ones that are used when producing the
       translation, as the "--keep" option.

       Configuration aliases

       To pass the same options to several files, the best is to define a type alias as follows.
       In the next example, "--keep 0" is passed to every Italian translation using this "test"
       type, that is an extension of the "man" type.

         [po4a_alias:test] man opt_it:"--keep 0"
         [type: test] man/page.1 $lang:man/$lang/page.1

       You can also extend an existing type reusing the same name for the alias as follows. This
       is not interpreted as as an erroneous recursive definition.

         [po4a_alias:man] man opt_it:"--keep 0"
         [type: man] man/page.1 $lang:man/$lang/page.1

       Global default options

       You can also use "[options]" lines to define options that must be used for all files,
       regardless of their type.

         [options] --keep 20 --option nostrip

       As with the command line options, you can abbreviate the parameters passed in the
       configuration file:

         [options] -k 20 -o nostrip

       Option priorities

       The options of every sources are concatenated, ensuring that the default values can easily
       be overridden by more specific options. The order is as follows:

       •   "[options]" lines provide default values that can be overridden by any other source.

       •   Type aliases are then used. Language specific settings override the ones applicable to
           all languages.

       •   Settings that are specific to a given master file override both the default ones and
           the ones coming from the type alias. In this case also, language specific settings
           override the global ones.

       •   Finally, parameters provided on the po4a command line override any settings from the
           configuration file.

       Example

       Here is an example showing how to quote the spaces and quotes:

        [po_directory] man/po/

        [options] --master-charset UTF-8

        [po4a_alias:man] man opt:"-o \"mdoc=NAME,SEE ALSO\""
        [type:man] t-05-config/test02_man.1 $lang:tmp/test02_man.$lang.1 \
                   opt:"-k 75" opt_it:"-L UTF-8" opt_fr:--verbose

   Addendum: Adding extra content in the translation
       If you want to add an extra section to the translation, for example to give credit to the
       translator, then you need to define an addendum to the line defining your master file.
       Please refer to the page po4a(7) for more details on the syntax of addendum files.

        [type: pod] script fr:doc/fr/script.1 \
                    add_fr:doc/l10n/script.fr.add

       You can also use language templates as follow:

        [type: pod] script $lang:doc/$lang/script.1 \
                    add_$lang:doc/l10n/script.$lang.add

       If an addendum fails to apply, the translation is discarded.

       Modifiers for the addendum declaration

       Addendum modifiers can simplify the configuration file in the case where not all languages
       provide an addendum, or when the list of addenda changes from one language to the other.
       The modifier is a single char located before the file name.

       ? Include addendum_path if this file does exist, otherwise do nothing.

       @ addendum_path is not a regular addendum but a file containing a list of addenda, one by
         line.  Each addendum may be preceded by modifiers.

       ! addendum_path is discarded, it is not loaded and will not be loaded by any further
         addendum specification.

       The following includes an addendum in any language, but if only it exists. No error is
       reported if the addendum does not exist.

        [type: pod] script $lang:doc/$lang/script.1  add_$lang:?doc/l10n/script.$lang.add

       The following includes a list of addendum for every language:

        [type: pod] script $lang:doc/$lang/script.1  add_$lang:@doc/l10n/script.$lang.add

   Filtering the translated strings
       Sometimes, you want to hide some strings from the translation process. To that extend, you
       can give a "pot_in" parameter to your master file to specify the name of the file to use
       instead of the real master when building the POT file. Here is an example:

         [type:docbook] book.xml          \
                 pot_in:book-filtered.xml \
                 $lang:book.$lang.xml

       With this setting, the strings to translate will be extracted from the book-filtered.xml
       (that must be produced before calling po4a) while the translated files will be built from
       book.xml. As a result, any string that is part of book.xml but not in book-filtered.xml
       will not be included in the PO files, preventing the translators from providing a
       translation for them. So these strings will be left unmodified when producing the
       translated documents.  This naturally decreases the level of translation, so you may need
       the "--keep" option to ensure that the document is produced anyway.

   CONFIGURATION EXAMPLE
       TODO: Is this section really useful?

       Let's assume you maintain a program named foo which has a man page man/foo.1 which
       naturally is maintained in English only. Now you as the upstream or downstream maintainer
       want to create and maintain the translation.  First you need to create the POT file
       necessary to send to translators using po4a-gettextize(1).

       So for our case we would call

        cd man && po4a-gettextize -f man -m foo.1 -p foo.pot

       You would then send this file to the appropriate language lists or offer it for download
       somewhere on your website.

       Now let's assume you received three translations before your next release: de.po
       (including an addendum de.add), sv.po and pt.po.  Since you don't want to change your
       Makefile(s) whenever a new translation arrives you can use po4a with an appropriate
       configuration file in your Makefile.  Let's call it po4a.cfg. In our example it would look
       like the following:

        [po_directory] man/po4a/po/

        [type: man] man/foo.1 $lang:man/translated/$lang/foo.1 \
                   add_$lang:?man/po4a/add_$lang/$lang.add opt:"-k 80"

       In this example we assume that your generated man pages (and all PO and addenda files)
       should be stored in man/translated/$lang/ (respectively in man/po4a/po/ and
       man/po4a/add_$lang/) below the current directory. In our example the man/po4a/po/
       directory would include de.po, pt.po and sv.po, and the man/po4a/add_de/ directory would
       include de.add.

       Note the use of the modifier ? as only the German translation (de.po) is accompanied by an
       addendum.

       To actually build the translated man pages you would then (once!) add the following line
       in the build target of the appropriate Makefile:

               po4a po4a.cfg

       Once this is set up you don't need to touch the Makefile when a new translation arrives,
       i.e. if the French team sends you fr.po and fr.add then you simply drop them respectively
       in man/po4a/po/ and man/po4a/add_fr/ and the next time the program is built the French
       translation is automatically build as well in man/translated/fr/.

       Note that you still need an appropriate target to install localized manual pages with
       English ones.

       Finally if you do not store generated files into your version control system, you will
       need a line in your clean target as well:
               -rm -rf man/translated

SEE ALSO

       po4a-gettextize(1), po4a-normalize(1), po4a-translate(1), po4a-updatepo(1), po4a(7).

AUTHORS

        Denis Barbier <barbier@linuxfr.org>
        Nicolas Francois <nicolas.francois@centraliens.net>
        Martin Quinson (mquinson#debian.org)

COPYRIGHT AND LICENSE

       Copyright 2002-2020 by SPI, inc.

       This program is free software; you may redistribute it and/or modify it under the terms of
       GPL (see the COPYING file).