翻译argparse的内部字符串

时间:2016-01-05 14:52:11

标签: python python-3.x argparse

如何翻译Python的argparse模块字符串?

例如,当您显示帮助时,它显示"usage: ",字符串可翻译,但我不知道如何在我的程序中执行此操作。

这是argparse.py的源代码部分:

def _format_usage(self, usage, actions, groups, prefix):
        if prefix is None:
            prefix = _('usage: ')

我无法追踪设置此前缀的方式,我认为这是内部的。

我不想将.mo文件附加到系统中的某个位置。理想情况下,翻译应该存在于我的程序目录中,或者更好地存储在源代码中。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

运行以下内容:

import argparse

class MyHelpFormatter(argparse.HelpFormatter):
    def __init__(self, *args, **kwargs):
        super(MyHelpFormatter, self).__init__(*args, **kwargs)

    def _format_usage(self, usage, actions, groups, prefix):
        return super(MyHelpFormatter, self)._format_usage(
            usage, actions, groups, prefix if prefix else "bla: ")

class MyArgumentParser(argparse.ArgumentParser):
    def __init__(self, *args, **kwargs):
        kwargs['formatter_class']=MyHelpFormatter
        super(MyArgumentParser, self).__init__(*args, **kwargs)


p = MyArgumentParser(description='Foo')
p.add_argument('foo', type=str)
print p.parse_args()

打印

python myargparse.py  --help
bla: myargparse.py [-h] foo

Foo

positional arguments:
  foo

optional arguments:
  -h, --help  show this help message and exit

_('usage: ')引用gettext。在argparse.py,在顶部,您有:

from gettext import gettext as _

你可以用gettext稍微捣乱。

给出.po文件:

msgid "usage: "
msgstr "foobar: "

您可以将其转换为.mo文件(例如here)。

之后(其中./foo/LC_MESSAGES/messages.mo是编译.po的结果):

~/Desktop> find . -name *mo
./foo/LC_MESSAGES/messages.mo
~/Desktop> cat myargparse2.py
import argparse
import gettext
gettext.bindtextdomain(gettext.textdomain(), '.')
p = argparse.ArgumentParser(description='Foo')
p.add_argument('foo', type=str)
print p.parse_args()
~/Desktop> LANGUAGE=foo python myargparse2.py
foobar: myargparse2.py [-h] foo
myargparse2.py: error: too few arguments

使用您想要的语言而不是foo

答案 1 :(得分:0)

根据弗拉德的回答,我缩短了时间:

class CustomHelpFormatter(argparse.HelpFormatter):
    def __init__(self, *args, **kwargs):
        super(CustomHelpFormatter, self).__init__(*args, **kwargs)

    def _format_usage(self, usage, actions, groups, prefix):
        return super(CustomHelpFormatter, self)._format_usage(
            usage, actions, groups, prefix if prefix else "Uso: ")


if __name__ == "__main__":

    parser = argparse.ArgumentParser(prog="jcheq.py",
                                     usage="%(prog)s [opciones] [paths...]\nThe paths are optional; if not given . is "
                                           "used.",
                                     add_help=False,
                                     formatter_class=CustomHelpFormatter)