如何制作python';args解析生成非英语文本?

如何制作python';args解析生成非英语文本?,python,internationalization,argparse,Python,Internationalization,Argparse,argparse模块“自动生成帮助和使用信息”。我可以为参数提供非英语名称,并提供非英语帮助文本;但是帮助输出会变成至少两种语言的混合,因为像用法、位置参数、可选参数和这样的术语会自动以英语生成,以显示此帮助消息和退出 如何用翻译替换此英文输出 最好,我希望在脚本中提供翻译,这样脚本无论在哪里启动都会生成相同的输出 编辑:根据Jon Eric的回答,下面是一个示例,其中包含他的解决方案: import gettext def Übersetzung(Text): Text = Text

argparse模块“自动生成帮助和使用信息”。我可以为参数提供非英语名称,并提供非英语帮助文本;但是帮助输出会变成至少两种语言的混合,因为像
用法
位置参数
可选参数
这样的术语会自动以英语生成,以显示此帮助消息和退出

如何用翻译替换此英文输出

最好,我希望在脚本中提供翻译,这样脚本无论在哪里启动都会生成相同的输出

编辑:根据Jon Eric的回答,下面是一个示例,其中包含他的解决方案:

import gettext

def Übersetzung(Text):
    Text = Text.replace("usage", "Verwendung")
    Text = Text.replace("show this help message and exit",
                        "zeige diese Hilfe an und tue nichts weiteres")
    Text = Text.replace("error:", "Fehler:")
    Text = Text.replace("the following arguments are required:",
                        "Die folgenden Argumente müssen angegeben werden:")
    return Text
gettext.gettext = Übersetzung

import argparse

Parser = argparse.ArgumentParser()
Parser.add_argument("Eingabe")
Argumente = Parser.parse_args()

print(Argumente.Eingabe)
另存为
Beispiel.py
将使用
python3 Beispiel.py-h
提供以下帮助输出:

Verwendung: Beispiel.py [-h] Eingabe

positional arguments:
  Eingabe

optional arguments:
  -h, --help  zeige diese Hilfe an und tue nichts weiteres
单程,出自Peter Otten:

我对gettext了解不多,但下面的内容表明 argparse中的字符串已正确包装:

$ cat localize_argparse.py

import gettext

def my_gettext(s):
    return s.upper()
gettext.gettext = my_gettext

import argparse

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-V", action="version")
    args = parser.parse_args()

$ python localize_argparse.py -h USAGE: localize_argparse.py [-h] [-V]

OPTIONAL ARGUMENTS:   -h, --help  SHOW THIS HELP MESSAGE AND EXIT   -V
show program's version number and exit
“-V”选项的解决方法是添加帮助消息 明确地

parser.add_argument("-V", ..., help=_("show..."))
您仍然必须自己提供所有翻译


这里是一个法语翻译的解决方案,其中创建一个转换dict,保存遇到的英语关键字的翻译

def convertArgparseMessages(s):
    subDict = \
    {'positional arguments':'Arguments positionnels',
    'optional arguments':'Arguments optionnels',
    'show this help message and exit':'Affiche ce message et quitte'}
    if s in subDict:
        s = subDict[s]
    return s
gettext.gettext = convertArgparseMessages
import argparse

argparse
使用。 您可以使用此API以相对干净的方式集成对
argparse
的翻译

要执行此操作,请在
argparse
输出任何文本之前(但可能在
导入argparse
之后)调用以下代码:

为了使此解决方案能够工作,您对
argparse
的翻译必须位于
path/to/locale/ll/LC_MESSAGES/argparse.mo
,其中
ll
是当前语言的代码(例如
de
;可以通过设置环境变量
language
)进行配置

如何生成
.mo
文件?
  • pygettext——默认域=argparse/usr/local/lib/python3.5/argparse.py
    • 使用
      argparse.py的实际位置
    • 创建文件
      argparse.pot
  • cp argparse.pot argparse ll.po
    • 使用实际的语言代码,而不是
      ll
  • argparse ll.po中填写缺少的翻译字符串
  • msgfmt argparse-ll.po-o locale/ll/LC_MESSAGES/argparse.mo
  • 有关创建
    .mo
    文件的详细信息,请参阅


    我已将这些说明更详细地发布在我的中。

    我遇到了类似的问题。 几乎所有消息都将按照第5篇文章中的描述正确翻译,但使用
    parser.add_argument()
    添加的帮助消息除外。 您可以通过对argparse使用非基于类的
    gettext
    ,对应用程序使用基于类的
    gettext
    来解决此问题。
    请看一下

    中的app3.py,这里有一个Python模块,用于翻译argparse发出的所有消息。它的目的是为了快速而肮脏地翻译成另一种语言(在我的例子中是法语,但可以根据自己的语言随意调整)。要了解更多的工业多语言方法,请查看优秀的Filip Bartek解决方案

    “”“
    此模块类似于argparse,但使用法语。
    导入它并像使用argparse一样使用它。
    指令:
    首先,将此代码粘贴到一个名为french_argparse.py的单独新文件中
    将此新文件放在main.py文件旁边的同一顶部项目文件夹中。
    然后在main.py文件中,按如下方式导入它:
    >>>将法语_argparse作为argparse导入
    """
    导入gettext
    #################################################################################################################
    #以下翻译为法语,但请随意替换为您自己的翻译
    #许多消息甚至没有翻译,因为它们似乎更适合程序员而不是用户。
    #短语是从代码中提取的(https://github.com/python/cpython/blob/master/Lib/argparse.py)
    #2019年10月
    #################################################################################################################
    __翻译={
    '不明确的选项:%(选项)s可能匹配%(匹配项)s':'选项模糊:%(选项)s parmi%(匹配项)s',
    “参数”-“模式为%r”:“参数”-“模式为%r”,
    '无法合并操作-两个组的名称为%r':'无法合并操作-两个组的名称为%r',
    无法打开“%”(文件名)s':%(错误)s:“无法打开“%”(文件名)s':%(错误)s”,
    “dest=对于像%r这样的选项是必需的”:“dest=对于像%r这样的选项是必需的”,
    “应至少有一个参数”:“au moins un argument est attendu”,
    “最多应包含一个参数”:“au加上un参数”,
    '应为一个参数':'非参数为nécessaire',
    '忽略显式参数%r':'忽略显式参数%r',
    “无效选择:%(值)r(从%(选择项)中选择):“无效选择:%(值)r(parmi%(选择项)”,
    “无效冲突解决值:%r”:“无效冲突解决值:%r”,
    “无效的选项字符串%(选项)r:必须以字符%(前缀\u chars)r开头:”
    “无效的选项字符串%(选项)r:必须以字符%(前缀\u chars)r开头”,
    “无效%(类型)s值:%(值)r':“无效类型%(类型)s:%(值)r',
    “互斥参数必须是可选的”:“互斥参数必须是可选的”,
    “不允许使用参数%s”:“pas permis avec l”参数%s“,
    “其中一个参数%s是必需的”:“au moins un argument requires parmi%s”,
    “可选参数”:“参数选项”,
    “位置参数”:“参数位置”,
    “'required'是位置的无效参数”:“'required'是位置的无效参数”,
    '显示此帮助消息并退出'
    
    import gettext
    
    # Use values that suit your project instead of 'argparse' and 'path/to/locale'
    gettext.bindtextdomain('argparse', 'path/to/locale')
    gettext.textdomain('argparse')