Skip to content

pygettext: Extend support for specifying custom keywords #130453

Open

Description

@tomasr8

Feature or enhancement

Proposal:

pygettext already allows specifying custom keywords in a limited fashion. For example, specifying --keyword=foo will
look for functions named foo in addition to the default keywords (gettext, etc..).

However, the CLI currently only allows specifying single-argument functions (i.e. gettext('foo')). It is not possible to add
keywords that take msgid_plural or msgctxt or both.

Both xgettext and babel support this with a simple keywordspec syntax that defines the function name and argument positions of msgid, msgid_plural and msgctxt.

For example, --keyword:foo:1c,2 defines a pgettext-like function where the msgctxt is the first argument and msgid is the second argument, e.g. foo('context', 'message').

It is also possible to use t to only match functions with that exact number of arguments. For example, foo:1,1t only matches foo('bar') but not foo('bar', 'baz').

I propose to support this in pygettext as well. For that we will need to:

  • Support the keyword spec syntax when specifying keywords. I suggest skipping the t specifier for now.
  • Support specifying multiple --keyword arguments with the same function name (this will require some internal changes, as those are stored in a dictionary with the function name as the key).
  • Support the t specifier.

Has this already been discussed elsewhere?

This is a minor feature, which does not need previous discussion elsewhere

Links to previous discussion of this feature:

No response

Linked PRs

Activity

  1. self-assigned this
    on Feb 22, 2025
  2. added
    triagedThe issue has been accepted as valid by a triager.
    on Feb 22, 2025
  3. added a commit that references this issue on Feb 25, 2025
  4. tomasr8 commented on Feb 25, 2025

    @tomasr8
    MemberAuthor

    The first PR (with the most changes) was merged, but there is more work needed. I'll reuse this issue for the followup PRs :)

  5. serhiy-storchaka commented on Feb 25, 2025

    @serhiy-storchaka
    Member

    Note also that --keyword without argument and --keyword= resets keywords to default. I am not sure whether we should support this or not.

    More important, currently in pygettext the defaults take precedence over --keyword arguments, so you cannot override defaults. This does not look right. How is with this in xgettext?

  6. tomasr8 commented on Feb 28, 2025

    @tomasr8
    MemberAuthor

    Note also that --keyword without argument and --keyword= resets keywords to default. I am not sure whether we should support this or not.

    Not sure either to be honest.

    More important, currently in pygettext the defaults take precedence over --keyword arguments, so you cannot override defaults. This does not look right. How is with this in xgettext ?

    Both babel and xgettext let you do that. For example for xgettext --keyword='_:1,2' and this input file

    _('foo', 'foos', 1)

    xgettext will extract

    msgid "foo"
    msgid_plural "foos"
    msgstr[0] ""
    msgstr[1] ""

    while pygettext will extract

    msgid "foo"
    msgstr ""

    i.e. the default keyword takes precedence. I'll fix it.

  7. added a commit that references this issue on Mar 3, 2025
  8. added a commit that references this issue on Apr 10, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

triagedThe issue has been accepted as valid by a triager.type-featureA feature request or enhancement

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions