diff --git a/Lib/test/test_tools/i18n_data/noheader.pot b/Lib/test/test_tools/i18n_data/noheader.pot new file mode 100644 index 00000000000000..834006e42732e5 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/noheader.pot @@ -0,0 +1,8 @@ +#: noheader.py:3 +msgid "Foo" +msgstr "" + +#: noheader.py:5 +msgid "Bar" +msgstr "" + diff --git a/Lib/test/test_tools/i18n_data/noheader.py b/Lib/test/test_tools/i18n_data/noheader.py new file mode 100644 index 00000000000000..23971799af23c6 --- /dev/null +++ b/Lib/test/test_tools/i18n_data/noheader.py @@ -0,0 +1,5 @@ +from gettext import gettext as _ + +_('Foo') + +_('Bar') diff --git a/Lib/test/test_tools/test_i18n.py b/Lib/test/test_tools/test_i18n.py index 8416b1bad825eb..649150a27efb39 100644 --- a/Lib/test/test_tools/test_i18n.py +++ b/Lib/test/test_tools/test_i18n.py @@ -593,6 +593,7 @@ def extract_from_snapshots(): 'custom_keywords.py': ('--keyword=foo', '--keyword=nfoo:1,2', '--keyword=pfoo:1c,2', '--keyword=npfoo:1c,2,3', '--keyword=_:1,2'), + 'noheader.py': ('--omit-header',), 'multiple_keywords.py': ('--keyword=foo:1c,2,3', '--keyword=foo:1c,2', '--keyword=foo:1,2', # repeat a keyword to make sure it is extracted only once diff --git a/Misc/NEWS.d/next/Tools-Demos/2025-02-27-19-00-00.gh-issue-130647.uwda2h.rst b/Misc/NEWS.d/next/Tools-Demos/2025-02-27-19-00-00.gh-issue-130647.uwda2h.rst new file mode 100644 index 00000000000000..4e8c1e3f883fb5 --- /dev/null +++ b/Misc/NEWS.d/next/Tools-Demos/2025-02-27-19-00-00.gh-issue-130647.uwda2h.rst @@ -0,0 +1 @@ +Add ``--omit-header`` option to :program:`pygettext`. diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py index f46b05067d7fde..b9878d9b1c8059 100755 --- a/Tools/i18n/pygettext.py +++ b/Tools/i18n/pygettext.py @@ -124,6 +124,15 @@ --width=columns Set width of output to columns. + --omit-header + Do not write header to file. + + This is useful for testing purposes because it eliminates a source of + variance for generated .mo files. + + Note: Using this option may lead to an error during compilation or other + manipulation if the resulting file is not entirely in ASCII. + -x filename --exclude-file=filename Specify a file that contains a list of strings that are not be @@ -629,9 +638,11 @@ def _is_string_const(self, node): def write_pot_file(messages, options, fp): timestamp = time.strftime('%Y-%m-%d %H:%M%z') encoding = fp.encoding if fp.encoding else 'UTF-8' - print(pot_header % {'time': timestamp, 'version': __version__, - 'charset': encoding, - 'encoding': '8bit'}, file=fp) + + if not options.omit_header: + print(pot_header % {'time': timestamp, 'version': __version__, + 'charset': encoding, + 'encoding': '8bit'}, file=fp) # Sort locations within each message by filename and lineno sorted_keys = [ @@ -691,7 +702,7 @@ def main(): ['extract-all', 'add-comments=?', 'default-domain=', 'escape', 'help', 'keyword=', 'no-default-keywords', 'add-location', 'no-location', 'output=', 'output-dir=', - 'style=', 'verbose', 'version', 'width=', 'exclude-file=', + 'style=', 'verbose', 'version', 'width=', 'omit-header', 'exclude-file=', 'docstrings', 'no-docstrings', ]) except getopt.error as msg: @@ -712,6 +723,7 @@ class Options: locationstyle = GNU verbose = 0 width = 78 + omit_header = False excludefilename = '' docstrings = 0 nodocstrings = {} @@ -764,6 +776,8 @@ class Options: options.width = int(arg) except ValueError: usage(1, f'--width argument must be an integer: {arg}') + elif opt in ('--omit-header',): + options.omit_header = True elif opt in ('-x', '--exclude-file'): options.excludefilename = arg elif opt in ('-X', '--no-docstrings'):