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