Add more ``Plural-Forms``. Document how the current ``Plural-Forms`` were
obtained.

 * https://docs.translatehouse.org/projects/localization-guide/en/latest/l10n/pluralforms.html?id=l10n/pluralforms
 * https://unicode.org/cldr/trac/browser/trunk/common/supplemental/plurals.xml

Complain about incorrect locale codes:

 * https://www.loc.gov/standards/iso639-2/php/code_changes.php
 * ``al`` → ``sq``
 * ``bh`` → ``bho`` | ``mai`` | ``mag``
 * ``ca-XV`` → ``ca@valencia``
 * ``cn`` → ``zh``
 * ``cz`` → ``cs``
 * ``dk`` → ``da``
 * ``en_AM`` → ``en_US``
 * ``en_BR`` → ``en_GB``
 * ``en_UK`` → ``en_GB``
 * ``gr`` → ``el``
 * ``in`` → ``id``
 * ``iw`` → ``he``
 * ``ji`` → ``yi``
 * ``jw`` → ``jv``
 * ``mo`` → ``ro_MD``
 * ``no`` → ``nb``
 * ``sh_BA`` → ``bs_BA``
 * ``sh_HR`` → ``hr_HR``
 * ``sh_RS`` → ``sr_RS``
 * ``sr@Latn`` → ``sr@latin``
 * ``sr_CS`` → ``sr``
 * ``sr_SR`` → ``sr_RS``
 * ``sr_YU`` → ``sr``
 * ``uk_UK`` → ``uk_UA``
 * ``vn`` → ``vi``

Correct locale codes in invalid format, e.g.:

 * ``da-DK`` → ``da_DK``: https://sources.debian.org/data/main/d/debian-handbook/7.20140126~deb7u1/da-DK/00a_preface.po
 * ``pt_br`` → ``pt_BR``: https://sources.debian.org/data/main/p/pam-pkcs11/0.6.8-1/po/pt_br.po
 * ``Pt`` → ``pt``: https://sources.debian.org/data/main/d/darcsweb/1.1-3.1/debian/po/pt.po

Correct ``Language`` with both a natural language and a language code, e.g.:

 * ``nl (Dutch)``: https://sources.debian.org/data/main/g/garcon/0.1.12-1/po/nl.po
 * ``Serbian (sr)``: https://sources.debian.org/data/main/a/at-spi2-atk/2.5.3-2/po/sr.po

Guess language from ``Language-Team``.

 * https://translationproject.org/team/

Guess language from the filename even when it includes encoding. Test-cases:

 * https://sources.debian.org/src/vim/2:7.3.547-7/src/po/

Add ``characters=``\ … for more languages. Document how the current values were
obtained.

Fix support for ``X-Poedit-Language: (Afan) Oromo``.

Fix support for ``X-Poedit-Language: Serbian (Latin)``.

Document the security model.

Add tests for:

 * Debian source packages
 * Debian binary packages
 * MO files (at least against some tags)
 * languages with multiple correct ``Plural-Forms``
 * lib.moparser
 * all non-Python encodings
 * 0x5C byte as a part of a multibyte character:
   https://sources.debian.org/src/vim/2:7.3.547-7/src/po/zh_TW.po/#L13
 * SHIFT_JIS encoding:
   https://git.savannah.gnu.org/cgit/gettext.git/tree/gettext-tools/src/po-lex.c?id=v0.18.3#n179

Detect question marks in unusual places.

Add support for configuration files. Once it's implemented:

 * Disable ``--pedantic`` by default.

Add support for profiles: severity of a tag may depend on whether you are
upstream, a translator, or a user.

Add support for overrides.

Add option for disabling/forcing colored output.

Use `blessed <https://pypi.org/project/blessed/>`_ for colored output.

Reimplement the EUC-TW codec with PyICU.

Check for hardcoded Language in POT files.

Add option for printing tag descriptions.

When emitting ``encoding-in-language-header-field``, check if the encoding
matches the one from ``Content-Type``. Test-cases:

 * https://sources.debian.org/data/main/r/rhn-client-tools/1.8.9-3/po/zh_CN.GB2312.po

Split ``no-email-address-in-last-translator`` from ``invalid-last-translator``.
Test-cases:

 * https://sources.debian.org/data/main/m/mtpaint/3.40-1/po/de.po
 * https://sources.debian.org/data/main/y/yaboot-installer/1.1.26/debian/po/hi.po

Split ``missing-timezone-in-date`` from ``invalid-date``.

Check for non-ASCII (translated?) project id. Test-case:

 * https://sources.debian.org/data/main/a/alarm-clock/1.2.5-1.2/po/sr.po

Check for localized boilerplate in headers.

Decide what to do with commas in ``Last-Translator``: either accept them, or
provide a better error message. Test-case:

 * https://sources.debian.org/data/main/i/installation-guide/20130503/po/zh_TW/using-d-i.po

polib PO encoding detection is not robust enough.
Test-case: ``xfail-header-imitation.po``

Add support for system-dependent messages (minor revision 1).

Check for PO files that are not encoding-aware:

 * https://marc.info/?l=openbsd-ports&m=98988950322667&w=2

Add support for MediaWiki Translate's ``invalid-plural`` flag. Test-case:

 * https://sources.debian.org/data/main/e/evolution/3.4.4-3/po/fi.po

Add support for pygettext's ``docstring`` flag.

Check .desktop files:

 * https://specifications.freedesktop.org/desktop-entry/latest/localized-keys.html

Check Shared Mime Info files:

 * https://specifications.freedesktop.org/shared-mime-info/latest/

Figure out what to do with software that call ``gettext("")`` intentionally.
Test-case:

 * https://sources.debian.org/src/evolution/3.4.4-3/shell/main.c/#L579

Check for ``msgstr_plural`` without ``msgstr[N]``, and other way round.

Verify that if *n* = plural(1) = plural(*i*) for some *i* > 1, then msgstr[*n*]
distinguishes singular and plural forms, even when no numeral is involved.

 * https://bugs.debian.org/753946#51

Add support for more string formats (in order of popularity on GitHub)::

   php-format
   javascript-format
   perl-format
   java-format
   csharp-format
   kde-format
   sh-format
   qt-format
   tcl-format
   perl-brace-format
   scheme-format
   ycp-format
   lisp-format
   awk-format
   objc-format
   object-pascal-format
   librep-format
   smalltalk-format
   boost-format
   qt-plural-format
   lua-format
   kde-kuit
   gfc-internal-format
   gcc-internal-format
   elisp-format

Improve C format string checks:

 * Check for the ``I`` C format string flag in msgid.
 * Recognize type mismatch between ``%*d%d`` and ``%d%*d``.
 * Make sure ``%%`` is treated as text wrt. omitting integer conversion.

SHIFT_JIS and JOHAB encodings are broken in Python; or at least they
are not compatible with glibc. Implement a work-around. Test-case::

   assert b'\\'.decode('SHIFT_JIS') == '\N{YEN SIGN}'
   assert b'\\'.decode('JOHAB') == '\N{WON SIGN}'

Timezone abbreviations not only are not unique, but also can change their
meaning over time.

 * https://mm.icann.org/pipermail/tz/2014-June/021089.html

Check for capitalization inconsistencies between msgid and msgstr.

Language codes for some locales supported by glibc aren't recognized::

   ayc ber brx cmn hak hne lij lzh mhr nan nhn pap quz shs szl the unm wae yue

The tag name ``invalid-language`` might be misleading.
Rename or split it.

Check for ``li.org`` mailing lists in ``Language-Team``.

 * https://lists.gnu.org/archive/html/bug-gettext/2016-02/msg00003.html

Add support for xgettext message syntax check flags:

 * https://git.savannah.gnu.org/cgit/gettext.git/commit/?id=d9fc3d2a3f43

Investigate possible bugs in PO editors:

 * Virtaal (0.7.1) leaves stray previous msgid.
   https://bugs.debian.org/809522

 * Lokalize (1.4) leaves stray previous msgid.

Use Public Suffix List to check for domains in non-existent TLDs.

Use ``/usr/share/lintian/data/obsolete-sites/obsolete-sites``
to check for defunct domains.

.. vim:ft=rst ts=3 sts=3 sw=3
