gettext v0.17.1 mix gettext.merge View Source

Merges PO/POT files with PO files.

This task is used when translations in the source code change: when they do, mix gettext.extract is usually used to extract the new translations to POT files. At this point, developers or translators can use this task to "sync" the newly updated POT files with the existing locale-specific PO files. All the metadata for each translation (like position in the source code, comments and so on) is taken from the newly updated POT file; the only things taken from the PO file are the actual translated strings.

Fuzzy matching

Translations in the updated PO/POT file that have an exact match (a translation with the same msgid) in the old PO file are merged as described above. When a translation in the update PO/POT files has no match in the old PO file, a fuzzy match for that translation is attempted. For example, assume we have this POT file:

msgid "hello, world!"
msgstr ""

and we merge it with this PO file:

# notice no exclamation point here
msgid "hello, world"
msgstr "ciao, mondo"

Since the two translations are very similar, the msgstr from the existing translation will be taken over to the new translation, which will however be marked as fuzzy:

#, fuzzy
msgid "hello, world!"
msgstr "ciao, mondo"

Generally, a fuzzy flag calls for review from a translator.

Fuzzy matching can be configured (for example, the threshold for translation similarity can be tweaked) or disabled entirely; look at the "Options" section below.

Usage

mix gettext.merge OLD_FILE UPDATED_FILE [OPTIONS]
mix gettext.merge DIR [OPTIONS]

If two files are given as arguments, they must be a .po file and a .po/.pot file. The first one is the old PO file, while the second one is the last generated one. They are merged and written over the first file. For example:

mix gettext.merge priv/gettext/en/LC_MESSAGES/default.po priv/gettext/default.pot

If only one argument is given, then that argument must be a directory containing Gettext translations (with .pot files at the root level alongside locale directories - this is usually a "backend" directory used by a Gettext backend, see Gettext.Backend).

mix gettext.merge priv/gettext

If the --locale LOCALE option is given, then only the PO files in DIR/LOCALE/LC_MESSAGES will be merged with the POT files in DIR. If no options are given, then all the PO files for all locales under DIR are merged with the POT files in DIR.

Plural forms

By default, Gettext will determine the number of plural forms for newly generated translations by checking the value of nplurals in the Plural-Forms header in the existing .po file. If a .po file doesn't already exist and Gettext is creating a new one or if the Plural-Forms header is not in the .po file, Gettext will use the number of plural forms that Gettext.Plural returns for the locale of the file being created. The number of plural forms can be forced through the --plural-forms option (see below).

Options

  • --locale - a string representing a locale. If this is provided, then only the PO files in DIR/LOCALE/LC_MESSAGES will be merged with the POT files in DIR. This option can only be given when a single argument is passed to the task (a directory).

  • --no-fuzzy - stops fuzzy matching from being performed when merging files.

  • --fuzzy-threshold - a float between 0 and 1 which represents the miminum Jaro distance needed for two translations to be considered a fuzzy match. Overrides the global :fuzzy_threshold option (see the docs for Gettext for more information on this option).

  • --plural-forms - a integer strictly greater than 0. If this is passed, new translations in the target PO files will have this number of empty plural forms. See the "Plural forms" section above.

Link to this section Summary

Functions

A task needs to implement run which receives a list of command line args.

Link to this section Functions

Link to this function

locale_dir(pot_dir, locale) View Source

A task needs to implement run which receives a list of command line args.

Callback implementation for Mix.Task.run/1.