classification
Title: argparse doesn't offer localization interface for "version" action
Type: behavior Stage: patch review
Components: Library (Lib) Versions: Python 3.11, Python 3.10, Python 3.9, Python 3.8, Python 3.7, Python 3.6
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: bethard, jdetrey, paul.j3, proski, thorsten
Priority: normal Keywords: patch

Created on 2012-12-26 13:19 by thorsten, last changed 2021-08-08 13:35 by jdetrey.

Files
File name Uploaded Description Edit
patch_1.diff paul.j3, 2014-07-14 06:15 review
Pull Requests
URL Status Linked Edit
PR 12711 open eamanu, 2019-04-07 02:53
Messages (5)
msg178209 - (view) Author: Thorsten Kampe (thorsten) Date: 2012-12-26 13:19
The - deprecated - "version" keyword for argparse.ArgumentParser allowed for localization of the "show program's version number and exit" help text for -v/--version (output of "-h"/"--help")

The new version action for add_argument does not allow this - resulting in a partially translated output for the -v/--version option.
msg222932 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2014-07-13 14:29
@Thorsten sorry about the delay involved here.
msg222997 - (view) Author: paul j3 (paul.j3) * (Python triager) Date: 2014-07-14 06:15
In this patch I added the '_()' localization to the '_VersionAction' default 'help'.

While this is a straight forward change, I haven't tested it.  It does run test_argparse.py, but that doesn't have any tests for localization.

According to the discussion here:
https://mail.python.org/pipermail/python-dev/2010-May/100215.html
this default help was originally None, and adding this string was seen
as a worthwhile convenience.  Localization was not considered.

Does this use of _() really save the user effort?  May be it would if they are already using the depricated version.  Otherwise they could just give the version argument their own non default help line.  I haven't used localization enough to know.
msg236350 - (view) Author: Pavel Roskin (proski) Date: 2015-02-21 04:30
I have tested the patch. It fixes the problem for me.

You are right, new programs would just supply translated help to the version action. No effort would be saved.

But the programs updated from the deprecated syntax may rely on a separate string list for translating strings found in argparse.py. They would lose the translation for the "--version" help without any warning. 
Debugging and fixing that would take some effort.
msg399214 - (view) Author: Jérémie Detrey (jdetrey) * Date: 2021-08-08 13:34
Dear all,

As commented on PR 12711 (https://github.com/python/cpython/pull/12711#pullrequestreview-724899323), there is a slight issue with the proposed patch, as it translates the `--version` help string as soon as the `argparse` module is imported (at which point the programmer might not have correctly initialized the `gettext` global domain yet). The suggested modification of PR 12711 should fix this, so that the translation only happens when an instance of `_VersionAction` is actually created:
```
diff a/Lib/argparse.py b/Lib/argparse.py
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1042,7 +1042,9 @@ def __init__(self,
                  version=None,
                  dest=SUPPRESS,
                  default=SUPPRESS,
-                 help="show program's version number and exit"):
+                 help=None):
+        if help is None:
+            help = _("show program's version number and exit")
         super(_VersionAction, self).__init__(
             option_strings=option_strings,
             dest=dest,
```

However, I'm not sure I understand correctly Pavel's comment as to why merging this patch would make some old programs lose their translation for this string: since `argparse` does not itself provide any translation, it is up to the programmers to provide `gettext` translations for `argparse` strings as well. Adding the call to `_()` here seems harmless to me:
- if a program already has a `gettext` translation string for "show program's version number and exit", it will be used, as expected;
- otherwise, if it hasn't (and relies on other mechanisms to translate this string), the string will remain untranslated, and the "custom" translation mechanisms will be able to process it as before.

In any case, my guess is that localized programs already explicitly pass a localized help string to the `_VersionAction` constructor in order to circumvent the nonlocalized default help string:
```
parser.add_argument('-V', action='version', version='%(prog)s 3.9',
                    help=_("show program's version number and exit"))
```
These programs should also remain completely unaffected by this change.

Thanks!

Kind regards,
Jérémie.
History
Date User Action Args
2021-08-08 13:35:06jdetreysetversions: + Python 3.6, Python 3.7, Python 3.8, Python 3.9, Python 3.10, Python 3.11, - Python 2.7, Python 3.4, Python 3.5
2021-08-08 13:34:47jdetreysetnosy: + jdetrey
messages: + msg399214
2019-04-07 02:53:53eamanusetstage: patch review
pull_requests: + pull_request12637
2019-03-15 22:47:55BreamoreBoysetnosy: - BreamoreBoy
2015-02-21 04:30:53proskisetnosy: + proski
messages: + msg236350
2014-07-14 06:15:59paul.j3setfiles: + patch_1.diff
keywords: + patch
messages: + msg222997
2014-07-13 14:29:16BreamoreBoysetnosy: + BreamoreBoy, paul.j3

messages: + msg222932
versions: + Python 3.4, Python 3.5, - Python 3.3
2012-12-26 13:41:24r.david.murraysetnosy: + bethard
2012-12-26 13:19:58thorstencreate