You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
argparse doesn't offer localization interface for "version" action #60990
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.
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.
proski commented on Feb 21, 2015
proskimannequin
Mannequin
More actions
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.
jdetrey commented on Aug 8, 2021
jdetreymannequin
Mannequin
More actions
Dear all,
As commented on PR 12711 (#12711 (review)), 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.
I believe this should be closed, as #12711 was merged. However, per comments on that PR, I've created a separate issue to track adding translation tests (#124295).
If anyone disagrees, please let me know, and we can re-open/re-scope this issue.
Activity
thorsten commentedon Dec 26, 2012
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.
BreamoreBoy commentedon Jul 13, 2014
@thorsten sorry about the delay involved here.
paulj3 commentedon Jul 14, 2014
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.
proski commentedon Feb 21, 2015
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.
jdetrey commentedon Aug 8, 2021
Dear all,
As commented on PR 12711 (#12711 (review)), there is a slight issue with the proposed patch, as it translates the
--versionhelp string as soon as theargparsemodule is imported (at which point the programmer might not have correctly initialized thegettextglobal domain yet). The suggested modification of PR 12711 should fix this, so that the translation only happens when an instance of_VersionActionis actually created: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
argparsedoes not itself provide any translation, it is up to the programmers to providegettexttranslations forargparsestrings as well. Adding the call to_()here seems harmless to me:gettexttranslation string for "show program's version number and exit", it will be used, as expected;In any case, my guess is that localized programs already explicitly pass a localized help string to the
_VersionActionconstructor in order to circumvent the nonlocalized default help string:These programs should also remain completely unaffected by this change.
Thanks!
Kind regards,
Jérémie.
savannahostrowski commentedon Sep 20, 2024
I believe this should be closed, as #12711 was merged. However, per comments on that PR, I've created a separate issue to track adding translation tests (#124295).
If anyone disagrees, please let me know, and we can re-open/re-scope this issue.