i18ndude


Namei18ndude JSON
Version 6.2.0 PyPI version JSON
download
home_pagehttps://github.com/collective/i18ndude
Summaryi18ndude performs various tasks related to ZPT's, Python Scripts and i18n.
upload_time2024-04-22 09:48:41
maintainerMaurits van Rees
docs_urlNone
authorDaniel Nouri
requires_python>=3.8
licenseGPL
keywords plone i18n zpt
VCS
bugtrack_url
requirements lxml six zope.i18nmessageid zope.interface zope.tal
Travis-CI No Travis.
coveralls test coverage No coveralls.
            i18ndude
========

.. contents::


Introduction
------------

i18ndude performs various tasks related to ZPT's, Python Scripts and i18n.

.. image:: https://github.com/collective/i18ndude/workflows/Tests/badge.svg
    :alt: GitHub Actions badge
    :target: https://github.com/collective/i18ndude/actions


Compatibility
-------------

i18ndude works with Python 3.8-3.11, and PyPy3.
Older versions are not supported anymore, use the i18ndude 5.x series
if you need that.

You can install ``i18ndude`` with Buildout or ``pip``.
With ``pip`` you may want to look at our `requirements.txt <https://github.com/collective/i18ndude/blob/master/requirements.txt>`_.

``UnicodeEncodeError``
----------------------

When running some ``i18ndude`` commands, you might get a ``UnicodeEncodeError``.
This can especially happen when ``i18ndude`` prints the result and you redirect the output or pipe it.
This is tricky, maybe impossible, to solve in ``i18ndude`` itself.
See this related `question on stackoverflow <https://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python>`_.
This question points to a solution that you yourself can do when you encounter this.
In the (Unix-like) shell, do this::

    export PYTHONIOENCODING=utf-8

This fixes UnicodeEncodeErrors when piping or redirecting output that contains non-ascii.
I (Maurits) have this line in my bash profile now.

Note: if you get a ``UnicodeDecodeError``, so 'decode' instead of 'encode', then it may be something that needs fixing in ``i18ndude``.
Please `report <https://github.com/collective/i18ndude/issues>`_ it then.

Pre commit hook
---------------

Since version 6 we have a ``pre-commit`` hook available::

    -   repo: https://github.com/collective/i18ndude
        rev: "master"
        hooks:
        -   id: i18ndude

For now it only finds the strings not marked for translation.


Command line interface
======================

These are the various command line options.

.. ### AUTOGENERATED FROM HERE ###

i18ndude
--------

::

  usage: i18ndude [-h]
                  {find-untranslated,rebuild-pot,merge,sync,filter,admix,list,trmerge}
                  ...

  i18ndude performs various tasks related to ZPT's, Python Scripts
  and i18n.

  Its main task is to extract translation strings (msgids) into a
  .pot file (with the 'rebuild-pot' command), and sync the .pot file
  with .po files (with the 'sync' command).

  Call i18ndude with one of the listed subcommands followed by
  --help to get help for that subcommand.

  options:
    -h, --help            show this help message and exit

  subcommands:
    {find-untranslated,rebuild-pot,merge,sync,filter,admix,list,trmerge}

find-untranslated
-----------------

::

  usage: i18ndude find-untranslated [-h] [-s] [-n] [files ...]

      Provide a list of ZPT filenames and I will output a report of places
      where I suspect untranslated messages, i.e. tags for which
      "i18n:translate" or "i18n:attributes" are missing.

      If you provide the -s option, the report will only contain a summary
      of errors and warnings for each file (or no output if there are no
      errors or warnings). If you provide the -n option, the report will
      contain only the errors for each file.

      You can mark tags to be ignored for this translation check by
      setting the "i18n:ignore" attribute on the tag. Same for
      attributes with "i18n:ignore-attributes". Note that i18ndude may
      be happy with this, but your template engine may fail when trying
      to render a template containing those ignore hints.  You need
      Chameleon 2.23 or higher, or the to be released zope.tal 4.1.2.
      

  positional arguments:
    files            list of ZPT filenames

  options:
    -h, --help       show this help message and exit
    -s, --silent     The report will only contain a summary of errors and
                     warnings for each file (or no output if there are no errors
                     or warnings).
    -n, --nosummary  The report will contain only the errors for each file.

rebuild-pot
-----------

::

  usage: i18ndude rebuild-pot [-h] [--wrap | --no-wrap] [--width NUMBER] -p
                              filename [-c domain] [-m filename]
                              [--merge2 filename]
                              [--exclude "<ignore1> <ignore2> ..."]
                              [--no-line-numbers] [--line-numbers]
                              [path ...]

      Given a pot-file via the --pot option you can specify one or more
      directories which including all sub-folders will be searched for
      PageTemplates (*.*pt) and Python scripts (*.*py).

      Make sure you have a backup copy of the original pot-file in case
      you need to fill back in ids by hand.

      If you specify a domain in --create I will create the pot file and
      look for messages for that domain.  Otherwise I will take the
      domain from the Domain header in the given pot file and keep the
      headers from the file as base for a new pot file.

      Note that in Python files we simply look for text within an underscore
      method: _("...").  We do not know which domain this is.
      If this finds text from a domain that you do not want to find,
      you should give the underscore method for the unwanted domain
      a different name, for example:

        from zope.i18nmessageid import MessageFactory
        PMF = MessageFactory("plone")
        PMF("...")

      If you give me an additional pot-file with the --merge <filename>
      option, I try to merge these msgids into the target-pot file
      afterwards. If a msgid already exists in the ones I found in the
      ZPTs, I'll warn you and ignore that msgid. I take the mime-header
      from this additional pot-file. If you provide a second pot-file via
      --merge2 <filename> I'll merge this into the first merge's result

      You can also provide a list of filenames (or regular expressions for
      filenames) which should not be included by using the --exclude argument,
      which takes a whitespace delimited list of files (or regular expressions
      for files).

      By default we add a comment showing references to file paths and line numbers
      that contain the message, like this:

          #: ./browser.py:32

      You can suppress the line numbers by using the --no-line-numbers option.
      The default might change in the future.  If you love line numbers, you can
      add --line-numbers to be sure you keep them when you get a newer version
      of i18ndude.  If you specify both options, the last one wins.
      

  positional arguments:
    path

  options:
    -h, --help            show this help message and exit
    --wrap                Wrap long lines.
    --no-wrap             Do not wrap long lines. This is the default.
    --width NUMBER        Set output page width. Default is 79.
    -p filename, --pot filename
    -c domain, --create domain
    -m filename, --merge filename
    --merge2 filename
    --exclude "<ignore1> <ignore2> ..."
    --no-line-numbers
    --line-numbers

merge
-----

::

  usage: i18ndude merge [-h] [--wrap | --no-wrap] [--width NUMBER] -p filename
                        -m filename [--merge2 filename]

      Given a pot-file via the --pot option and a second
      pot-file with the --merge <filename> option, I try to merge
      these msgids into the target-pot file. If a msgid already
      exists, I'll warn you and ignore that msgid.

      If you provide a --merge2 <filename> I'll first merge this one
      in addition to the first one.
      

  options:
    -h, --help            show this help message and exit
    --wrap                Wrap long lines.
    --no-wrap             Do not wrap long lines. This is the default.
    --width NUMBER        Set output page width. Default is 79.
    -p filename, --pot filename
    -m filename, --merge filename
    --merge2 filename

sync
----

::

  usage: i18ndude sync [-h] [--wrap | --no-wrap] [--width NUMBER] -p potfilename
                       pofilename [pofilename ...]

      Given a pot-file with the --pot option and a list of po-files I'll
      remove from the po files those message translations of which the
      msgids are not in the pot-file and add messages that the pot-file has
      but the po-file doesn't.
      

  positional arguments:
    pofilename

  options:
    -h, --help            show this help message and exit
    --wrap                Wrap long lines.
    --no-wrap             Do not wrap long lines. This is the default.
    --width NUMBER        Set output page width. Default is 79.
    -p potfilename, --pot potfilename

filter
------

::

  usage: i18ndude filter [-h] [--wrap | --no-wrap] [--width NUMBER] file1 file2

      Given two pot-files I will write a copy of file1 to stdout with all
      messages removed that are also in file2, i.e. where msgids match.
      

  positional arguments:
    file1
    file2

  options:
    -h, --help      show this help message and exit
    --wrap          Wrap long lines.
    --no-wrap       Do not wrap long lines. This is the default.
    --width NUMBER  Set output page width. Default is 79.

admix
-----

::

  usage: i18ndude admix [-h] [--wrap | --no-wrap] [--width NUMBER] file1 file2

      Given two po-files I will look for translated entries in file2 that
      are untranslated in file1. I add these translations (msgstrs) to
      file1. Note that this will not affect the number of entries in file1.
      The result will be on stdout.
      

  positional arguments:
    file1
    file2

  options:
    -h, --help      show this help message and exit
    --wrap          Wrap long lines.
    --no-wrap       Do not wrap long lines. This is the default.
    --width NUMBER  Set output page width. Default is 79.

list
----

::

  usage: i18ndude list [-h] -p product [product ...] [-t] [--tiered]

      This will create a simple listing that displays how much of the
      combined products pot's is translated for each language. Run this
      from the directory containing the pot-files. The product name is
      normally a domain name.

      By default we show the languages of existing po files,
      ordered by percentage.

      With the --tiered option, we split the languages in three tiers or groups,
      the first two with languages that Plone was traditionally translated in,
      in a hardcoded order, followed by other languages.
      This was the default output for years.
      

  options:
    -h, --help            show this help message and exit
    -p product [product ...], --products product [product ...]
    -t, --table           Output as html table
    --tiered              Show in traditional three-tiered order

trmerge
-------

::

  usage: i18ndude trmerge [-h] [--wrap | --no-wrap] [--width NUMBER] [-i]
                          [--no-override]
                          file1 file2

      Given two po-files I will update all translations from file2 into
      file1. Missing translations are added.

      If a translation was fuzzy in file1, and there is a nonempty translation
      in file2, the fuzzy marker is removed.

      Fuzzy translations in file2 are ignored.

      The result will be on stdout.  If you want to update the first
      file in place, use a temporary file, something like this:

        i18ndude trmerge file1.po file2.po > tmp_merge && mv tmp_merge file1.po
      

  positional arguments:
    file1
    file2

  options:
    -h, --help          show this help message and exit
    --wrap              Wrap long lines.
    --no-wrap           Do not wrap long lines. This is the default.
    --width NUMBER      Set output page width. Default is 79.
    -i, --ignore-extra  Ignore extra messages: do not add msgids that are not in
                        the original po-file. Only update translations for
                        existing msgids.
    --no-override       Do not override translations, only add missing
                        translations.


Changelog
=========

.. You should *NOT* be adding new change log entries to this file.
   You should create a file in the news directory instead.
   For helpful instructions, please see:
   https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst

.. towncrier release notes start

6.2.0 (2024-04-22)
------------------

New features:


- Add support for python 3.12.  [pbauer] (#113)


6.1.0 (2023-07-18)
------------------

New features:


- Let i18n:ignore ignore all translatable strings in its scope. (#109)


Bug fixes:


- Remove Python 2 support code.  Use pyupgrade, isort, black, flake8.
  [maurits] (#23)


6.0.0 (2023-05-30)
------------------

Bug fixes:


- Fix pre-commit integration.
  [gforcada] (#1)


6.0.0a1 (2023-05-08)
--------------------

Breaking changes:


- Drop support for Python 2.
  Require Python 3.8+ (works with PyPy3 as well).
  [gforcada, maurits] (#50)


New features:


- Add pre-commit hook, for now only to find the strings not marked for translation.
  [gforcada] (#50)


Bug fixes:


- Fix encoding problem on `prepare_cli_documentation` command.
  [gforcada] (#101)


5.5.0 (2022-09-19)
------------------

New features:


- Add boolean ``--no-line-numbers`` option to ``rebuild-pot``.
  Use this to prevent including line numbers in pot files.
  The default is to still include them, so no behavior change.
  The default could change in the future.
  If you want to be sure to keep your line numbers in the future, use the new ``--line-numbers`` option.
  [maurits] (#77)


5.4.2 (2022-05-05)
------------------

Bug fixes:


- Leading spaces in comments are kept stable. (#91)
- Test on Python 3.10. No code changes needed.  [maurits] (#310)


5.4.1 (2021-08-30)
------------------

Bug fixes:


- Support the define syntax from Chameleon.
  This is for the unpacking syntax, for example ``tal:define="(text,url) python:view.linkinfo"``.
  This avoids ``TALError: invalid define syntax`` when extracting messages from templates that use this.
  [maurits] (#36)


5.4.0 (2021-05-28)
------------------

New features:


- ``i18ndude rebuild-pot --exclude="name1 name2"`` now also accepts directory names for exclusion.
  Excluding a directory name will exclude all files in and below the given directory,
  but only if the directory name exactly matches a exclusion name (no globs, no substring match).
  This change now also results in the hardcoded exclusions for 'tests' and 'docs' to actually work. (#86)


Bug fixes:


- Test with GitHub Actions instead of Travis CI.
  [maurits] (#83)
- Support Python 3.9.  No code changes were needed.
  [maurits] (#83)
- Do not raise AttributeError when content is None. (#84)


5.3.4 (2020-06-29)
------------------

Bug fixes:


- The list command was wrongly showing 100% translated when the translations were at 99%.
  [vincentfretin] (#81)


5.3.3 (2020-04-22)
------------------

Bug fixes:


- Drop 3.4 and 3.5 support, which we were not testing since a year.
  Test our 3.8 support.
  [maurits] (#79)


5.3.2 (2020-02-25)
------------------

Bug fixes:


- Added hint in ``rebuild-pot`` help about unwanted domains in Python files.
  [maurits] (#49)
- Fixed filter command on Python 3.7, and possibly earlier.
  [maurits] (#75)


5.3.1 (2019-07-30)
------------------

Bug fixes:


- Disallow non-word characters (but do allow dashes) in ``i18n:name``
  attributes when running ``find-untranslated`` code analysis. [gyst] (#71)


5.3.0 (2019-02-07)
------------------

New features:


- Replaced buildout with pip for setting up test environment. No longer test on
  Python 3.4 and 3.5. Do test on 3.7. Current test matrix: 2.7, 3.6, 3.7, pypy,
  pypy3. [maurits] (#66)


Bug fixes:


- When no arguments are given, show the help. This fixes error on some Python
  versions when calling 'bin/i18ndude' without arguments. [maurits] (#68)


5.2.0 (2018-11-09)
------------------

New features:

- Add check for untranslated aria-label attributes on all elements. [janjaapdriessen]

Bug fixes:

- Fixed ``plone.i18n`` import.
  It was a conditional import to change the names of languages in the list, so nothing serious.
  But it always failed.
  [maurits]

- In the readme, suggest ``export PYTHONIOENCODING=utf-8`` to fix ``UnicodeEncodeErrors``.
  (Note: not ``UnicodeDecodeErrors``.)
  Fixes `issue 55 <https://github.com/collective/i18ndude/issues/55>`_.
  [maurits]


5.1.0 (2018-03-23)
------------------

New features:

- In the ``list`` command, show only languages with existing po files,
  ordered by percentage.  A new ``--tiered`` option uses the traditional
  behavior with languages in a specific order in three tiers.
  [maurits]

Bug fixes:

- Sort files that we extract messages from.
  On Linux they were already sorted, but not on Mac, leading to a test failure.
  [maurits]

- Fixed another possible UnicodeDecodeError in find-untranslated.
  [maurits]

- ``find-untranslated`` no longer complains about attributes with chameleon syntax.
  An html tag with ``title="${context/Description}"`` is no longer
  marked as having an untranslated title tag.
  Fixes `issue 53 <https://github.com/collective/i18ndude/issues/53>`_.
  [maurits]


5.0.2 (2018-03-12)
------------------

- Fixed some possible UnicodeDecodeErrors in find-untranslated.
  Fixes `issue 52 <https://github.com/collective/i18ndude/issues/52>`_.
  [maurits]


5.0.1 (2018-03-05)
------------------

- Create universal Python wheel.  [maurits]


5.0.0 (2018-03-05)
------------------

Breaking changes:

- Drop support for python 2.6 and older. Retain python2.7 support.
  [gyst]

New features:

- Support python 3.6, 3.5, 3.4, pypy and pypy3.
  [gyst]

Bug fixes:

- Removed ``ordereddict`` and ```argparse`` dependencies completely.
  [maurits]

- Fixed many unicode/string/bytes handling problems.
  There's probably still some unfixed that need finding, given that
  test coverage is only 63%.
  [gyst]

Todo:

- i18ndude/pygettext.py:159: DeprecationWarning: the imp module is deprecated in favour of importlib. This does not cause any breakage though.


4.3 (2017-07-31)
----------------

New:

- Support Chameleon repeat syntax in templates.
  Fixes `issue #36 <https://github.com/collective/i18ndude/issues/36>`_.
  [maurits]

- Moved ``plone.i18n`` dependency to a ``plone`` extra.
  This is only used for getting language names in the ``list`` command.
  We now fall back to using the language name that is in the ``po`` files.
  Fixes `issue #44 <https://github.com/collective/i18ndude/issues/44>`_.
  [maurits]


4.2 (2017-06-21)
----------------

New:

- In ``find-untranslated``, do not report items that get replaced by Chameleon syntax.
  So ``<span>${view/test}</span>`` will no longer get flagged as missing a translation.
  (Note that you still *can* add ``i18n:translate`` if it makes sense,
  like Plone does for translating the dynamically calculated review state.)
  [Netroxen, maurits]

- Find untranslated attributes now also checks for 'placeholder' attributes on
  input tags.

4.1 (2016-12-02)
----------------

New:

- Allow use of regular expressions for --exclude parameter. For example,
  use ``*.py`` to exclude all python files. This doesn't break existing
  behavior.  Do remember to use quotes around the expression.
  [laulaz, maurits]


4.0.1 (2015-12-03)
------------------

Fixes:

- Fixed some reported line numbers in find-untranslated.
  Fixes issue #34.
  [maurits]


4.0.0 (2015-12-03)
------------------

New:

- Extract strings from zcml.
  Issue #28
  [maurits]

- No longer print two blank lines at the end of .po and .pot files.
  [maurits]

- In the find-untranslated command, first try to parse a template as
  xml, which is good for non-html files.  If that fails, try to parse
  it as html with a little help from the lxml HTMLPaser, which handles
  html5 code much better.  If that fails, use our trusty home grown
  ``common.prepare_xml`` function, which treats everything as old
  html.  Note that we still use ``xml.sax`` as the core parser here.
  Issue #15
  [maurits]

- Ignore hidden files in the find-untranslated command.
  Issue #29
  [maurits]

- Use lxml instead of xml.etree or elementtree for parsing
  GenericSetup xml files.
  [maurits]


3.4.5 (2015-11-05)
------------------

New:

- First try the original zope.tal parser.  Only when this fails we try
  our own parser/generator.
  [maurits]

- Support Chameleon unnamed attributes without crashing.  For example:
  ``tal:attributes="python:{'data-something': 'chameleon-only'}"``
  [maurits]

- Support chameleon attributes tal:switch and tal:case.
  Fixes issue #24.
  [ale-rt]


3.4.4 (2015-11-04)
------------------

Fixes:

- Check ``tal:condition`` correctly when it is in a ``tal:something`` tag.
  [maurits]

- In ``find-untranslated`` only ignore ``tal:condition="nothing"``,
  not other conditions.
  Fixes issue #16.
  [maurits]

- Improved the ``prepare_xml`` function.  This tries to work around
  templates that miss the usual boiler plate, like
  ``xmlns:i18n="http://xml.zope.org/namespaces/i18n"``.  But there
  were some silly errors in it.
  This refs issue #16.
  [maurits]


3.4.3 (2015-09-01)
------------------

- Fix ``nosummary`` option from ``find-untranslated``.
  It was reporting wrong information.
  [gforcada]


3.4.2 (2015-07-16)
------------------

- Fix encoding errors with wrapAndQuoteString.
  [thet]

- Pep8.
  [thet]


3.4.1 (2015-06-25)
------------------

- Releasing as Python wheel too.
  [maurits]

- Fixed wrapping when string contains newline.
  Issue #13
  [maurits]


3.4.0 (2014-11-27)
------------------

- Drop Python 2.6 support.  It may still work, but the tests only run
  on Python 2.7.  Note that it is fine to use one central i18ndude
  command for all your projects, no matter what Python version they
  are using.
  [janjaapdriessen, maurits]

- For the find-untranslated feature, add the possibility to mark a tag to be
  ignored by setting the "i18n:ignore" attribute on the tag. Also works for
  attributes with the "i18n:ignore-attributes" attribute.
  [janjaapdriessen]


3.3.5 (2014-08-05)
------------------

- Avoid AttributeError: 'NoneType' object has no attribute 'comments'
  when a ``.po`` file is missing an empty msgid and msgstr near the
  top.  This is fixed automatically, although it will override some
  headers.
  [maurits]


3.3.4 (2014-07-02)
------------------

- Wrap first line correctly.  Fixes #9.
  [gforcada]


3.3.3 (2013-11-27)
------------------

- Package housekeeping.
  [hvelarde]


3.3.2 (2013-11-27)
------------------

- ``trmerge``: do not override when the mixin translation is fuzzy.
  [maurits]

- ``trmerge``: add ``--no-override`` argument.  This means: do not
  override translations, only add missing translations.
  [maurits]

- ``trmerge``: add ``--ignore-extra`` option.  This ignores extra msgids
  in the second po-file.
  [maurits]


3.3.1 (2013-10-18)
------------------

- Update script.py in some cases "arguments.exclude" is None.
  [giacomos]

- Fixed optional parameter exclude.
  [shylux]


3.3.0 (2013-10-13)
------------------

- Add command line documentation to long description of package.
  [maurits]

- Add options ``--wrap``, ``--no-wrap`` and ``--width=NUMBER`` to all
  commands that write files.  Use these to determine whether long
  lines are wrapped and at which width.  Default width is 79.  By
  default we do NOT wrap, because we have never wrapped before.  This
  may change in the future, so if you *really* want to be sure to not
  wrap when using a future i18ndude version, you can add ``--no-wrap``
  now.
  https://github.com/collective/i18ndude/issues/3
  [maurits]

- Fix the ``list`` command to also work in a ``locales`` structure.
  [maurits]

- Fix an error in the ``merge`` command where the ``--merge`` option
  would be used as value for the ``--merge2`` option as well, if that
  option itself was unused.  This led to unneeded warnings.
  [maurits]

- The ``--create domain`` option of ``rebuild-pot`` is now optional.
  If not given, i18ndude reads the domain from the given ``.pot``
  file.  It was always optional, but the documentation did not show it
  and it did not work.
  [maurits]

- Update the command line options handling.  You can now get the help
  for individual commands by calling them with the ``--help`` option.
  [maurits]

- Return exit code 1 when the called function gives an error.  This
  currently only has an effect when calling ``find-untranslated``.
  https://github.com/collective/i18ndude/issues/1
  [maurits]

- Moved code to https://github.com/collective/i18ndude
  [maurits]

- Backslash escape added to msgid when it includes double quotes.
  [taito]

- Add trmerge command to merge po files. Custom tailored for transifex.
  [do3cc]


3.2.2 (2010-12-11)
------------------

- Encode key to utf-8 for the Merge-Warning message to avoid a
  UnicodeEncodeError.
  [mikerhodes]


3.2.1 (2010-10-31)
------------------

- Fixed making POT file for DOUBLE BYTE strings on default.
  [terapyon]


3.2 (2010-09-04)
----------------

- Replaced internal odict implementation by the ordereddict package.
  (implementation backported from Python 2.7)
  [vincentfretin]


3.1.3 (2010-09-04)
------------------

- Avoid UnicodeDecodeError when printing warning message in add().
  [rnix]


3.1.2 (2010-02-14)
------------------

- elementtree is only required for Python < 2.5.
  [vincentfretin]

- Fixed tests (patch provided by John Trammell).
  [vincentfretin]


3.1.1 (2009-11-22)
------------------

- Strip "src" only once in the pathname for the comments.
  Example: before it generated the following comment
  "#: archetypes.referencebrowserwidget/"
  which was not so useful. Now it generates
  "archetypes.referencebrowserwidget/src/archetypes/referencebrowserwidget/..."
  [vincentfretin]


3.1 (2009-10-31)
----------------

- Support for explicit msgids in GSReader.
  [vincentfretin]

- Better handling of msgid references. Keep all the references in PTReader
  and PYReader. In POWriter, normalize and sort the references, write only
  MAX_OCCUR (default is 3) references.
  You can set MAX_OCCUR=None if you want all references to be written to
  the generated POT file. Only the first reference is written in case of
  several references to the same file but with different line number.
  [vincentfretin]

- Depend now on zope.tal 3.5.2 to print a warning when msgid already exists
  in catalog with a different default message. Simplified PTReader code.
  Check for msgid with different default in GSReader, PYReader and in the
  merged catalog (ptctl, pyctl, gsctl).
  [vincentfretin]

- Fix behaviour when dealing with broken xml files to be parsed.
  [afd]


3.0 (2008-11-13)
----------------

- No changes.
  [hannosch]


For older changes, see ``docs/ChangeLog``.

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/collective/i18ndude",
    "name": "i18ndude",
    "maintainer": "Maurits van Rees",
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": "maurits@vanrees.org",
    "keywords": "Plone i18n zpt",
    "author": "Daniel Nouri",
    "author_email": "plone-i18n@lists.sourceforge.net",
    "download_url": "https://files.pythonhosted.org/packages/2c/d1/b2043823cbc9d7bbed4d17a8d2329fb08a5fdc58605605defd205f8a8d51/i18ndude-6.2.0.tar.gz",
    "platform": null,
    "description": "i18ndude\n========\n\n.. contents::\n\n\nIntroduction\n------------\n\ni18ndude performs various tasks related to ZPT's, Python Scripts and i18n.\n\n.. image:: https://github.com/collective/i18ndude/workflows/Tests/badge.svg\n    :alt: GitHub Actions badge\n    :target: https://github.com/collective/i18ndude/actions\n\n\nCompatibility\n-------------\n\ni18ndude works with Python 3.8-3.11, and PyPy3.\nOlder versions are not supported anymore, use the i18ndude 5.x series\nif you need that.\n\nYou can install ``i18ndude`` with Buildout or ``pip``.\nWith ``pip`` you may want to look at our `requirements.txt <https://github.com/collective/i18ndude/blob/master/requirements.txt>`_.\n\n``UnicodeEncodeError``\n----------------------\n\nWhen running some ``i18ndude`` commands, you might get a ``UnicodeEncodeError``.\nThis can especially happen when ``i18ndude`` prints the result and you redirect the output or pipe it.\nThis is tricky, maybe impossible, to solve in ``i18ndude`` itself.\nSee this related `question on stackoverflow <https://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python>`_.\nThis question points to a solution that you yourself can do when you encounter this.\nIn the (Unix-like) shell, do this::\n\n    export PYTHONIOENCODING=utf-8\n\nThis fixes UnicodeEncodeErrors when piping or redirecting output that contains non-ascii.\nI (Maurits) have this line in my bash profile now.\n\nNote: if you get a ``UnicodeDecodeError``, so 'decode' instead of 'encode', then it may be something that needs fixing in ``i18ndude``.\nPlease `report <https://github.com/collective/i18ndude/issues>`_ it then.\n\nPre commit hook\n---------------\n\nSince version 6 we have a ``pre-commit`` hook available::\n\n    -   repo: https://github.com/collective/i18ndude\n        rev: \"master\"\n        hooks:\n        -   id: i18ndude\n\nFor now it only finds the strings not marked for translation.\n\n\nCommand line interface\n======================\n\nThese are the various command line options.\n\n.. ### AUTOGENERATED FROM HERE ###\n\ni18ndude\n--------\n\n::\n\n  usage: i18ndude [-h]\n                  {find-untranslated,rebuild-pot,merge,sync,filter,admix,list,trmerge}\n                  ...\n\n  i18ndude performs various tasks related to ZPT's, Python Scripts\n  and i18n.\n\n  Its main task is to extract translation strings (msgids) into a\n  .pot file (with the 'rebuild-pot' command), and sync the .pot file\n  with .po files (with the 'sync' command).\n\n  Call i18ndude with one of the listed subcommands followed by\n  --help to get help for that subcommand.\n\n  options:\n    -h, --help            show this help message and exit\n\n  subcommands:\n    {find-untranslated,rebuild-pot,merge,sync,filter,admix,list,trmerge}\n\nfind-untranslated\n-----------------\n\n::\n\n  usage: i18ndude find-untranslated [-h] [-s] [-n] [files ...]\n\n      Provide a list of ZPT filenames and I will output a report of places\n      where I suspect untranslated messages, i.e. tags for which\n      \"i18n:translate\" or \"i18n:attributes\" are missing.\n\n      If you provide the -s option, the report will only contain a summary\n      of errors and warnings for each file (or no output if there are no\n      errors or warnings). If you provide the -n option, the report will\n      contain only the errors for each file.\n\n      You can mark tags to be ignored for this translation check by\n      setting the \"i18n:ignore\" attribute on the tag. Same for\n      attributes with \"i18n:ignore-attributes\". Note that i18ndude may\n      be happy with this, but your template engine may fail when trying\n      to render a template containing those ignore hints.  You need\n      Chameleon 2.23 or higher, or the to be released zope.tal 4.1.2.\n      \n\n  positional arguments:\n    files            list of ZPT filenames\n\n  options:\n    -h, --help       show this help message and exit\n    -s, --silent     The report will only contain a summary of errors and\n                     warnings for each file (or no output if there are no errors\n                     or warnings).\n    -n, --nosummary  The report will contain only the errors for each file.\n\nrebuild-pot\n-----------\n\n::\n\n  usage: i18ndude rebuild-pot [-h] [--wrap | --no-wrap] [--width NUMBER] -p\n                              filename [-c domain] [-m filename]\n                              [--merge2 filename]\n                              [--exclude \"<ignore1> <ignore2> ...\"]\n                              [--no-line-numbers] [--line-numbers]\n                              [path ...]\n\n      Given a pot-file via the --pot option you can specify one or more\n      directories which including all sub-folders will be searched for\n      PageTemplates (*.*pt) and Python scripts (*.*py).\n\n      Make sure you have a backup copy of the original pot-file in case\n      you need to fill back in ids by hand.\n\n      If you specify a domain in --create I will create the pot file and\n      look for messages for that domain.  Otherwise I will take the\n      domain from the Domain header in the given pot file and keep the\n      headers from the file as base for a new pot file.\n\n      Note that in Python files we simply look for text within an underscore\n      method: _(\"...\").  We do not know which domain this is.\n      If this finds text from a domain that you do not want to find,\n      you should give the underscore method for the unwanted domain\n      a different name, for example:\n\n        from zope.i18nmessageid import MessageFactory\n        PMF = MessageFactory(\"plone\")\n        PMF(\"...\")\n\n      If you give me an additional pot-file with the --merge <filename>\n      option, I try to merge these msgids into the target-pot file\n      afterwards. If a msgid already exists in the ones I found in the\n      ZPTs, I'll warn you and ignore that msgid. I take the mime-header\n      from this additional pot-file. If you provide a second pot-file via\n      --merge2 <filename> I'll merge this into the first merge's result\n\n      You can also provide a list of filenames (or regular expressions for\n      filenames) which should not be included by using the --exclude argument,\n      which takes a whitespace delimited list of files (or regular expressions\n      for files).\n\n      By default we add a comment showing references to file paths and line numbers\n      that contain the message, like this:\n\n          #: ./browser.py:32\n\n      You can suppress the line numbers by using the --no-line-numbers option.\n      The default might change in the future.  If you love line numbers, you can\n      add --line-numbers to be sure you keep them when you get a newer version\n      of i18ndude.  If you specify both options, the last one wins.\n      \n\n  positional arguments:\n    path\n\n  options:\n    -h, --help            show this help message and exit\n    --wrap                Wrap long lines.\n    --no-wrap             Do not wrap long lines. This is the default.\n    --width NUMBER        Set output page width. Default is 79.\n    -p filename, --pot filename\n    -c domain, --create domain\n    -m filename, --merge filename\n    --merge2 filename\n    --exclude \"<ignore1> <ignore2> ...\"\n    --no-line-numbers\n    --line-numbers\n\nmerge\n-----\n\n::\n\n  usage: i18ndude merge [-h] [--wrap | --no-wrap] [--width NUMBER] -p filename\n                        -m filename [--merge2 filename]\n\n      Given a pot-file via the --pot option and a second\n      pot-file with the --merge <filename> option, I try to merge\n      these msgids into the target-pot file. If a msgid already\n      exists, I'll warn you and ignore that msgid.\n\n      If you provide a --merge2 <filename> I'll first merge this one\n      in addition to the first one.\n      \n\n  options:\n    -h, --help            show this help message and exit\n    --wrap                Wrap long lines.\n    --no-wrap             Do not wrap long lines. This is the default.\n    --width NUMBER        Set output page width. Default is 79.\n    -p filename, --pot filename\n    -m filename, --merge filename\n    --merge2 filename\n\nsync\n----\n\n::\n\n  usage: i18ndude sync [-h] [--wrap | --no-wrap] [--width NUMBER] -p potfilename\n                       pofilename [pofilename ...]\n\n      Given a pot-file with the --pot option and a list of po-files I'll\n      remove from the po files those message translations of which the\n      msgids are not in the pot-file and add messages that the pot-file has\n      but the po-file doesn't.\n      \n\n  positional arguments:\n    pofilename\n\n  options:\n    -h, --help            show this help message and exit\n    --wrap                Wrap long lines.\n    --no-wrap             Do not wrap long lines. This is the default.\n    --width NUMBER        Set output page width. Default is 79.\n    -p potfilename, --pot potfilename\n\nfilter\n------\n\n::\n\n  usage: i18ndude filter [-h] [--wrap | --no-wrap] [--width NUMBER] file1 file2\n\n      Given two pot-files I will write a copy of file1 to stdout with all\n      messages removed that are also in file2, i.e. where msgids match.\n      \n\n  positional arguments:\n    file1\n    file2\n\n  options:\n    -h, --help      show this help message and exit\n    --wrap          Wrap long lines.\n    --no-wrap       Do not wrap long lines. This is the default.\n    --width NUMBER  Set output page width. Default is 79.\n\nadmix\n-----\n\n::\n\n  usage: i18ndude admix [-h] [--wrap | --no-wrap] [--width NUMBER] file1 file2\n\n      Given two po-files I will look for translated entries in file2 that\n      are untranslated in file1. I add these translations (msgstrs) to\n      file1. Note that this will not affect the number of entries in file1.\n      The result will be on stdout.\n      \n\n  positional arguments:\n    file1\n    file2\n\n  options:\n    -h, --help      show this help message and exit\n    --wrap          Wrap long lines.\n    --no-wrap       Do not wrap long lines. This is the default.\n    --width NUMBER  Set output page width. Default is 79.\n\nlist\n----\n\n::\n\n  usage: i18ndude list [-h] -p product [product ...] [-t] [--tiered]\n\n      This will create a simple listing that displays how much of the\n      combined products pot's is translated for each language. Run this\n      from the directory containing the pot-files. The product name is\n      normally a domain name.\n\n      By default we show the languages of existing po files,\n      ordered by percentage.\n\n      With the --tiered option, we split the languages in three tiers or groups,\n      the first two with languages that Plone was traditionally translated in,\n      in a hardcoded order, followed by other languages.\n      This was the default output for years.\n      \n\n  options:\n    -h, --help            show this help message and exit\n    -p product [product ...], --products product [product ...]\n    -t, --table           Output as html table\n    --tiered              Show in traditional three-tiered order\n\ntrmerge\n-------\n\n::\n\n  usage: i18ndude trmerge [-h] [--wrap | --no-wrap] [--width NUMBER] [-i]\n                          [--no-override]\n                          file1 file2\n\n      Given two po-files I will update all translations from file2 into\n      file1. Missing translations are added.\n\n      If a translation was fuzzy in file1, and there is a nonempty translation\n      in file2, the fuzzy marker is removed.\n\n      Fuzzy translations in file2 are ignored.\n\n      The result will be on stdout.  If you want to update the first\n      file in place, use a temporary file, something like this:\n\n        i18ndude trmerge file1.po file2.po > tmp_merge && mv tmp_merge file1.po\n      \n\n  positional arguments:\n    file1\n    file2\n\n  options:\n    -h, --help          show this help message and exit\n    --wrap              Wrap long lines.\n    --no-wrap           Do not wrap long lines. This is the default.\n    --width NUMBER      Set output page width. Default is 79.\n    -i, --ignore-extra  Ignore extra messages: do not add msgids that are not in\n                        the original po-file. Only update translations for\n                        existing msgids.\n    --no-override       Do not override translations, only add missing\n                        translations.\n\n\nChangelog\n=========\n\n.. You should *NOT* be adding new change log entries to this file.\n   You should create a file in the news directory instead.\n   For helpful instructions, please see:\n   https://github.com/plone/plone.releaser/blob/master/ADD-A-NEWS-ITEM.rst\n\n.. towncrier release notes start\n\n6.2.0 (2024-04-22)\n------------------\n\nNew features:\n\n\n- Add support for python 3.12.  [pbauer] (#113)\n\n\n6.1.0 (2023-07-18)\n------------------\n\nNew features:\n\n\n- Let i18n:ignore ignore all translatable strings in its scope. (#109)\n\n\nBug fixes:\n\n\n- Remove Python 2 support code.  Use pyupgrade, isort, black, flake8.\n  [maurits] (#23)\n\n\n6.0.0 (2023-05-30)\n------------------\n\nBug fixes:\n\n\n- Fix pre-commit integration.\n  [gforcada] (#1)\n\n\n6.0.0a1 (2023-05-08)\n--------------------\n\nBreaking changes:\n\n\n- Drop support for Python 2.\n  Require Python 3.8+ (works with PyPy3 as well).\n  [gforcada, maurits] (#50)\n\n\nNew features:\n\n\n- Add pre-commit hook, for now only to find the strings not marked for translation.\n  [gforcada] (#50)\n\n\nBug fixes:\n\n\n- Fix encoding problem on `prepare_cli_documentation` command.\n  [gforcada] (#101)\n\n\n5.5.0 (2022-09-19)\n------------------\n\nNew features:\n\n\n- Add boolean ``--no-line-numbers`` option to ``rebuild-pot``.\n  Use this to prevent including line numbers in pot files.\n  The default is to still include them, so no behavior change.\n  The default could change in the future.\n  If you want to be sure to keep your line numbers in the future, use the new ``--line-numbers`` option.\n  [maurits] (#77)\n\n\n5.4.2 (2022-05-05)\n------------------\n\nBug fixes:\n\n\n- Leading spaces in comments are kept stable. (#91)\n- Test on Python 3.10. No code changes needed.  [maurits] (#310)\n\n\n5.4.1 (2021-08-30)\n------------------\n\nBug fixes:\n\n\n- Support the define syntax from Chameleon.\n  This is for the unpacking syntax, for example ``tal:define=\"(text,url) python:view.linkinfo\"``.\n  This avoids ``TALError: invalid define syntax`` when extracting messages from templates that use this.\n  [maurits] (#36)\n\n\n5.4.0 (2021-05-28)\n------------------\n\nNew features:\n\n\n- ``i18ndude rebuild-pot --exclude=\"name1 name2\"`` now also accepts directory names for exclusion.\n  Excluding a directory name will exclude all files in and below the given directory,\n  but only if the directory name exactly matches a exclusion name (no globs, no substring match).\n  This change now also results in the hardcoded exclusions for 'tests' and 'docs' to actually work. (#86)\n\n\nBug fixes:\n\n\n- Test with GitHub Actions instead of Travis CI.\n  [maurits] (#83)\n- Support Python 3.9.  No code changes were needed.\n  [maurits] (#83)\n- Do not raise AttributeError when content is None. (#84)\n\n\n5.3.4 (2020-06-29)\n------------------\n\nBug fixes:\n\n\n- The list command was wrongly showing 100% translated when the translations were at 99%.\n  [vincentfretin] (#81)\n\n\n5.3.3 (2020-04-22)\n------------------\n\nBug fixes:\n\n\n- Drop 3.4 and 3.5 support, which we were not testing since a year.\n  Test our 3.8 support.\n  [maurits] (#79)\n\n\n5.3.2 (2020-02-25)\n------------------\n\nBug fixes:\n\n\n- Added hint in ``rebuild-pot`` help about unwanted domains in Python files.\n  [maurits] (#49)\n- Fixed filter command on Python 3.7, and possibly earlier.\n  [maurits] (#75)\n\n\n5.3.1 (2019-07-30)\n------------------\n\nBug fixes:\n\n\n- Disallow non-word characters (but do allow dashes) in ``i18n:name``\n  attributes when running ``find-untranslated`` code analysis. [gyst] (#71)\n\n\n5.3.0 (2019-02-07)\n------------------\n\nNew features:\n\n\n- Replaced buildout with pip for setting up test environment. No longer test on\n  Python 3.4 and 3.5. Do test on 3.7. Current test matrix: 2.7, 3.6, 3.7, pypy,\n  pypy3. [maurits] (#66)\n\n\nBug fixes:\n\n\n- When no arguments are given, show the help. This fixes error on some Python\n  versions when calling 'bin/i18ndude' without arguments. [maurits] (#68)\n\n\n5.2.0 (2018-11-09)\n------------------\n\nNew features:\n\n- Add check for untranslated aria-label attributes on all elements. [janjaapdriessen]\n\nBug fixes:\n\n- Fixed ``plone.i18n`` import.\n  It was a conditional import to change the names of languages in the list, so nothing serious.\n  But it always failed.\n  [maurits]\n\n- In the readme, suggest ``export PYTHONIOENCODING=utf-8`` to fix ``UnicodeEncodeErrors``.\n  (Note: not ``UnicodeDecodeErrors``.)\n  Fixes `issue 55 <https://github.com/collective/i18ndude/issues/55>`_.\n  [maurits]\n\n\n5.1.0 (2018-03-23)\n------------------\n\nNew features:\n\n- In the ``list`` command, show only languages with existing po files,\n  ordered by percentage.  A new ``--tiered`` option uses the traditional\n  behavior with languages in a specific order in three tiers.\n  [maurits]\n\nBug fixes:\n\n- Sort files that we extract messages from.\n  On Linux they were already sorted, but not on Mac, leading to a test failure.\n  [maurits]\n\n- Fixed another possible UnicodeDecodeError in find-untranslated.\n  [maurits]\n\n- ``find-untranslated`` no longer complains about attributes with chameleon syntax.\n  An html tag with ``title=\"${context/Description}\"`` is no longer\n  marked as having an untranslated title tag.\n  Fixes `issue 53 <https://github.com/collective/i18ndude/issues/53>`_.\n  [maurits]\n\n\n5.0.2 (2018-03-12)\n------------------\n\n- Fixed some possible UnicodeDecodeErrors in find-untranslated.\n  Fixes `issue 52 <https://github.com/collective/i18ndude/issues/52>`_.\n  [maurits]\n\n\n5.0.1 (2018-03-05)\n------------------\n\n- Create universal Python wheel.  [maurits]\n\n\n5.0.0 (2018-03-05)\n------------------\n\nBreaking changes:\n\n- Drop support for python 2.6 and older. Retain python2.7 support.\n  [gyst]\n\nNew features:\n\n- Support python 3.6, 3.5, 3.4, pypy and pypy3.\n  [gyst]\n\nBug fixes:\n\n- Removed ``ordereddict`` and ```argparse`` dependencies completely.\n  [maurits]\n\n- Fixed many unicode/string/bytes handling problems.\n  There's probably still some unfixed that need finding, given that\n  test coverage is only 63%.\n  [gyst]\n\nTodo:\n\n- i18ndude/pygettext.py:159: DeprecationWarning: the imp module is deprecated in favour of importlib. This does not cause any breakage though.\n\n\n4.3 (2017-07-31)\n----------------\n\nNew:\n\n- Support Chameleon repeat syntax in templates.\n  Fixes `issue #36 <https://github.com/collective/i18ndude/issues/36>`_.\n  [maurits]\n\n- Moved ``plone.i18n`` dependency to a ``plone`` extra.\n  This is only used for getting language names in the ``list`` command.\n  We now fall back to using the language name that is in the ``po`` files.\n  Fixes `issue #44 <https://github.com/collective/i18ndude/issues/44>`_.\n  [maurits]\n\n\n4.2 (2017-06-21)\n----------------\n\nNew:\n\n- In ``find-untranslated``, do not report items that get replaced by Chameleon syntax.\n  So ``<span>${view/test}</span>`` will no longer get flagged as missing a translation.\n  (Note that you still *can* add ``i18n:translate`` if it makes sense,\n  like Plone does for translating the dynamically calculated review state.)\n  [Netroxen, maurits]\n\n- Find untranslated attributes now also checks for 'placeholder' attributes on\n  input tags.\n\n4.1 (2016-12-02)\n----------------\n\nNew:\n\n- Allow use of regular expressions for --exclude parameter. For example,\n  use ``*.py`` to exclude all python files. This doesn't break existing\n  behavior.  Do remember to use quotes around the expression.\n  [laulaz, maurits]\n\n\n4.0.1 (2015-12-03)\n------------------\n\nFixes:\n\n- Fixed some reported line numbers in find-untranslated.\n  Fixes issue #34.\n  [maurits]\n\n\n4.0.0 (2015-12-03)\n------------------\n\nNew:\n\n- Extract strings from zcml.\n  Issue #28\n  [maurits]\n\n- No longer print two blank lines at the end of .po and .pot files.\n  [maurits]\n\n- In the find-untranslated command, first try to parse a template as\n  xml, which is good for non-html files.  If that fails, try to parse\n  it as html with a little help from the lxml HTMLPaser, which handles\n  html5 code much better.  If that fails, use our trusty home grown\n  ``common.prepare_xml`` function, which treats everything as old\n  html.  Note that we still use ``xml.sax`` as the core parser here.\n  Issue #15\n  [maurits]\n\n- Ignore hidden files in the find-untranslated command.\n  Issue #29\n  [maurits]\n\n- Use lxml instead of xml.etree or elementtree for parsing\n  GenericSetup xml files.\n  [maurits]\n\n\n3.4.5 (2015-11-05)\n------------------\n\nNew:\n\n- First try the original zope.tal parser.  Only when this fails we try\n  our own parser/generator.\n  [maurits]\n\n- Support Chameleon unnamed attributes without crashing.  For example:\n  ``tal:attributes=\"python:{'data-something': 'chameleon-only'}\"``\n  [maurits]\n\n- Support chameleon attributes tal:switch and tal:case.\n  Fixes issue #24.\n  [ale-rt]\n\n\n3.4.4 (2015-11-04)\n------------------\n\nFixes:\n\n- Check ``tal:condition`` correctly when it is in a ``tal:something`` tag.\n  [maurits]\n\n- In ``find-untranslated`` only ignore ``tal:condition=\"nothing\"``,\n  not other conditions.\n  Fixes issue #16.\n  [maurits]\n\n- Improved the ``prepare_xml`` function.  This tries to work around\n  templates that miss the usual boiler plate, like\n  ``xmlns:i18n=\"http://xml.zope.org/namespaces/i18n\"``.  But there\n  were some silly errors in it.\n  This refs issue #16.\n  [maurits]\n\n\n3.4.3 (2015-09-01)\n------------------\n\n- Fix ``nosummary`` option from ``find-untranslated``.\n  It was reporting wrong information.\n  [gforcada]\n\n\n3.4.2 (2015-07-16)\n------------------\n\n- Fix encoding errors with wrapAndQuoteString.\n  [thet]\n\n- Pep8.\n  [thet]\n\n\n3.4.1 (2015-06-25)\n------------------\n\n- Releasing as Python wheel too.\n  [maurits]\n\n- Fixed wrapping when string contains newline.\n  Issue #13\n  [maurits]\n\n\n3.4.0 (2014-11-27)\n------------------\n\n- Drop Python 2.6 support.  It may still work, but the tests only run\n  on Python 2.7.  Note that it is fine to use one central i18ndude\n  command for all your projects, no matter what Python version they\n  are using.\n  [janjaapdriessen, maurits]\n\n- For the find-untranslated feature, add the possibility to mark a tag to be\n  ignored by setting the \"i18n:ignore\" attribute on the tag. Also works for\n  attributes with the \"i18n:ignore-attributes\" attribute.\n  [janjaapdriessen]\n\n\n3.3.5 (2014-08-05)\n------------------\n\n- Avoid AttributeError: 'NoneType' object has no attribute 'comments'\n  when a ``.po`` file is missing an empty msgid and msgstr near the\n  top.  This is fixed automatically, although it will override some\n  headers.\n  [maurits]\n\n\n3.3.4 (2014-07-02)\n------------------\n\n- Wrap first line correctly.  Fixes #9.\n  [gforcada]\n\n\n3.3.3 (2013-11-27)\n------------------\n\n- Package housekeeping.\n  [hvelarde]\n\n\n3.3.2 (2013-11-27)\n------------------\n\n- ``trmerge``: do not override when the mixin translation is fuzzy.\n  [maurits]\n\n- ``trmerge``: add ``--no-override`` argument.  This means: do not\n  override translations, only add missing translations.\n  [maurits]\n\n- ``trmerge``: add ``--ignore-extra`` option.  This ignores extra msgids\n  in the second po-file.\n  [maurits]\n\n\n3.3.1 (2013-10-18)\n------------------\n\n- Update script.py in some cases \"arguments.exclude\" is None.\n  [giacomos]\n\n- Fixed optional parameter exclude.\n  [shylux]\n\n\n3.3.0 (2013-10-13)\n------------------\n\n- Add command line documentation to long description of package.\n  [maurits]\n\n- Add options ``--wrap``, ``--no-wrap`` and ``--width=NUMBER`` to all\n  commands that write files.  Use these to determine whether long\n  lines are wrapped and at which width.  Default width is 79.  By\n  default we do NOT wrap, because we have never wrapped before.  This\n  may change in the future, so if you *really* want to be sure to not\n  wrap when using a future i18ndude version, you can add ``--no-wrap``\n  now.\n  https://github.com/collective/i18ndude/issues/3\n  [maurits]\n\n- Fix the ``list`` command to also work in a ``locales`` structure.\n  [maurits]\n\n- Fix an error in the ``merge`` command where the ``--merge`` option\n  would be used as value for the ``--merge2`` option as well, if that\n  option itself was unused.  This led to unneeded warnings.\n  [maurits]\n\n- The ``--create domain`` option of ``rebuild-pot`` is now optional.\n  If not given, i18ndude reads the domain from the given ``.pot``\n  file.  It was always optional, but the documentation did not show it\n  and it did not work.\n  [maurits]\n\n- Update the command line options handling.  You can now get the help\n  for individual commands by calling them with the ``--help`` option.\n  [maurits]\n\n- Return exit code 1 when the called function gives an error.  This\n  currently only has an effect when calling ``find-untranslated``.\n  https://github.com/collective/i18ndude/issues/1\n  [maurits]\n\n- Moved code to https://github.com/collective/i18ndude\n  [maurits]\n\n- Backslash escape added to msgid when it includes double quotes.\n  [taito]\n\n- Add trmerge command to merge po files. Custom tailored for transifex.\n  [do3cc]\n\n\n3.2.2 (2010-12-11)\n------------------\n\n- Encode key to utf-8 for the Merge-Warning message to avoid a\n  UnicodeEncodeError.\n  [mikerhodes]\n\n\n3.2.1 (2010-10-31)\n------------------\n\n- Fixed making POT file for DOUBLE BYTE strings on default.\n  [terapyon]\n\n\n3.2 (2010-09-04)\n----------------\n\n- Replaced internal odict implementation by the ordereddict package.\n  (implementation backported from Python 2.7)\n  [vincentfretin]\n\n\n3.1.3 (2010-09-04)\n------------------\n\n- Avoid UnicodeDecodeError when printing warning message in add().\n  [rnix]\n\n\n3.1.2 (2010-02-14)\n------------------\n\n- elementtree is only required for Python < 2.5.\n  [vincentfretin]\n\n- Fixed tests (patch provided by John Trammell).\n  [vincentfretin]\n\n\n3.1.1 (2009-11-22)\n------------------\n\n- Strip \"src\" only once in the pathname for the comments.\n  Example: before it generated the following comment\n  \"#: archetypes.referencebrowserwidget/\"\n  which was not so useful. Now it generates\n  \"archetypes.referencebrowserwidget/src/archetypes/referencebrowserwidget/...\"\n  [vincentfretin]\n\n\n3.1 (2009-10-31)\n----------------\n\n- Support for explicit msgids in GSReader.\n  [vincentfretin]\n\n- Better handling of msgid references. Keep all the references in PTReader\n  and PYReader. In POWriter, normalize and sort the references, write only\n  MAX_OCCUR (default is 3) references.\n  You can set MAX_OCCUR=None if you want all references to be written to\n  the generated POT file. Only the first reference is written in case of\n  several references to the same file but with different line number.\n  [vincentfretin]\n\n- Depend now on zope.tal 3.5.2 to print a warning when msgid already exists\n  in catalog with a different default message. Simplified PTReader code.\n  Check for msgid with different default in GSReader, PYReader and in the\n  merged catalog (ptctl, pyctl, gsctl).\n  [vincentfretin]\n\n- Fix behaviour when dealing with broken xml files to be parsed.\n  [afd]\n\n\n3.0 (2008-11-13)\n----------------\n\n- No changes.\n  [hannosch]\n\n\nFor older changes, see ``docs/ChangeLog``.\n",
    "bugtrack_url": null,
    "license": "GPL",
    "summary": "i18ndude performs various tasks related to ZPT's, Python Scripts and i18n.",
    "version": "6.2.0",
    "project_urls": {
        "Homepage": "https://github.com/collective/i18ndude"
    },
    "split_keywords": [
        "plone",
        "i18n",
        "zpt"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "a8f097fca341cc2714746c93e7f82bc9975db3556d73bbe929a9d5aa5a811b32",
                "md5": "05f7924e442edc918dac136683fca393",
                "sha256": "913216401cdb75f8ae6cd719d314a5dc4c8b61bf0c79019f882e9a58bf0dc5af"
            },
            "downloads": -1,
            "filename": "i18ndude-6.2.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "05f7924e442edc918dac136683fca393",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 76075,
            "upload_time": "2024-04-22T09:48:38",
            "upload_time_iso_8601": "2024-04-22T09:48:38.979031Z",
            "url": "https://files.pythonhosted.org/packages/a8/f0/97fca341cc2714746c93e7f82bc9975db3556d73bbe929a9d5aa5a811b32/i18ndude-6.2.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2cd1b2043823cbc9d7bbed4d17a8d2329fb08a5fdc58605605defd205f8a8d51",
                "md5": "10712503d753af4c578e1a01262bb543",
                "sha256": "6479d802445af29cfaa64666c9ab5ffef8cc6bb26fe2cee1e2557d0f27b485a8"
            },
            "downloads": -1,
            "filename": "i18ndude-6.2.0.tar.gz",
            "has_sig": false,
            "md5_digest": "10712503d753af4c578e1a01262bb543",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 87984,
            "upload_time": "2024-04-22T09:48:41",
            "upload_time_iso_8601": "2024-04-22T09:48:41.165079Z",
            "url": "https://files.pythonhosted.org/packages/2c/d1/b2043823cbc9d7bbed4d17a8d2329fb08a5fdc58605605defd205f8a8d51/i18ndude-6.2.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-22 09:48:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "collective",
    "github_project": "i18ndude",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [
        {
            "name": "lxml",
            "specs": []
        },
        {
            "name": "six",
            "specs": []
        },
        {
            "name": "zope.i18nmessageid",
            "specs": []
        },
        {
            "name": "zope.interface",
            "specs": []
        },
        {
            "name": "zope.tal",
            "specs": []
        }
    ],
    "tox": true,
    "lcname": "i18ndude"
}
        
Elapsed time: 0.25576s