Skip to content

Commit 2dcab79

Browse files
committed
Improve keyword merging
1 parent 4aa5151 commit 2dcab79

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

Lib/test/test_tools/test_i18n.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,15 +528,22 @@ def test_process_keywords(self):
528528
(['foo', 'foo:1,2'], True),
529529
(['foo'], False),
530530
(['_:1,2', '_:1c,2,3', 'pgettext'], False),
531+
# Duplicate entries
532+
(['foo', 'foo'], True),
533+
(['_'], False)
531534
)
532535
expected = (
533536
{'foo': [{'msgid': 0}]},
534537
{'_': [{'msgid': 0, 'msgid_plural': 1}]},
535538
{'foo': [{'msgid': 0}, {'msgid': 0, 'msgid_plural': 1}]},
536539
default_keywords | {'foo': [{'msgid': 0}]},
537540
default_keywords | {'_': [{'msgid': 0, 'msgid_plural': 1},
538-
{'msgctxt': 0, 'msgid': 1, 'msgid_plural': 2}],
539-
'pgettext': [{'msgid': 0}]},
541+
{'msgctxt': 0, 'msgid': 1, 'msgid_plural': 2},
542+
{'msgid': 0}],
543+
'pgettext': [{'msgid': 0},
544+
{'msgctxt': 0, 'msgid': 1}]},
545+
{'foo': [{'msgid': 0}]},
546+
default_keywords,
540547
)
541548
for (keywords, no_default_keywords), expected in zip(inputs, expected):
542549
with self.subTest(keywords=keywords,

Tools/i18n/pygettext.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,8 @@ def unparse_spec(name, spec):
391391

392392

393393
def process_keywords(keywords, *, no_default_keywords):
394-
custom_keywords_list = [parse_spec(spec) for spec in keywords]
394+
custom_keywords_list = [parse_spec(spec) for
395+
spec in dict.fromkeys(keywords)]
395396
custom_keywords = {}
396397
for name, spec in custom_keywords_list:
397398
if name not in custom_keywords:
@@ -401,9 +402,13 @@ def process_keywords(keywords, *, no_default_keywords):
401402
if no_default_keywords:
402403
return custom_keywords
403404

404-
default_keywords = {name: [spec] for name, spec in DEFAULTKEYWORDS.items()}
405405
# custom keywords override default keywords
406-
return default_keywords | custom_keywords
406+
for name, spec in DEFAULTKEYWORDS.items():
407+
if name not in custom_keywords:
408+
custom_keywords[name] = []
409+
if spec not in custom_keywords[name]:
410+
custom_keywords[name].append(spec)
411+
return custom_keywords
407412

408413

409414
@dataclass(frozen=True)

0 commit comments

Comments
 (0)