Python 如何翻译datetime模块引发的异常的文本?

Python 如何翻译datetime模块引发的异常的文本?,python,internationalization,flask,strftime,wtforms,Python,Internationalization,Flask,Strftime,Wtforms,翻译来自strftime的消息的最佳/最简单的方法是什么,如“时间数据'2012'与格式'%d.%m.%Y'不匹配”或“日期超出月份范围” 我之所以这么问,是因为我写了一个应用程序,其中包含来自DateField类型的Flask、Flask表单和字段。对于其他消息,我使用了blackbabel/gettext,但是这个错误消息似乎是直接来自strftime的,strftime不使用gettext 谢谢 2012-07-24:添加一些示例代码(请使用“2012-2-30”之类的日期进行尝试): 模

翻译来自strftime的消息的最佳/最简单的方法是什么,如
“时间数据'2012'与格式'%d.%m.%Y'不匹配”
“日期超出月份范围”

我之所以这么问,是因为我写了一个应用程序,其中包含来自DateField类型的Flask、Flask表单和字段。对于其他消息,我使用了blackbabel/gettext,但是这个错误消息似乎是直接来自strftime的,strftime不使用gettext

谢谢

2012-07-24:添加一些示例代码(请使用“2012-2-30”之类的日期进行尝试):

模板“simple.html”:


{%if form.date.errors%}
{{form.errors}}
{%endif%}
{{form.hidden_tag()}}
{{form.date.label}
{{form.date | safe}}

简短的版本:您不应该:异常是要处理的,而不是翻译的。

从概念上讲,针对用户的消息和针对开发人员的消息(如运行时异常)之间存在差异

如果。。。然后。。。else构造:开发人员应该了解编程语言,而不需要翻译

虽然在大多数情况下,异常都是由bug引起的(因此部署的代码中不应该存在),但在某些情况下,它们可能表示程序的生理状况。如果此条件需要用户执行操作,则代码应捕获有问题的异常,并向用户提供对其有意义的消息。例如:

知道:

>>> int('text')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'text'
请注意,我们只捕获
ValueError
,因为这是我们软件的唯一“生理”情况。任何其他异常都会使程序崩溃,因为它代表了开发人员没有考虑的情况

关于验证的一句话:如果您的场景是用户必须以特定格式插入日期,那么最好在尝试处理之前验证其输入。然后,上述示例应变为:

>>> while True:
...     n = raw_input('What do you want to multiply 10 for?  ')
...     if not all((c in '0123456789' for c in n)):
...         print 'You should provide an integer number...'
...         continue
...     print 'The result is: %d' % (10 * int(n))
在python中,捕获异常还是验证输入主要取决于风格(在其他语言中可能不是这样,因为有时异常处理比检查条件慢得多),而在web开发中,也习惯于捕获异常或验证输入(即,另外检查输入服务器端,您应该始终这样做)使用javascript验证输入客户端,因为这样可以为用户节省时间,为提供者节省CPU,消除请求/响应周期


HTH!

这是否意味着我不能使用WTForms中的
日期字段
,我必须使用正常的
文本字段
,并编写我自己的验证器?@rmweiss-我对WTForms没有直接经验,但只是浏览了他们的文档(=我可能完全错了)似乎可以将任意多个验证器链接到一个字段,因此我将使用来检查格式。HTH!实际上,查看代码,它抛出的唯一错误似乎是可翻译的-因此@rmweiss的错误必须来自其代码中的其他地方。添加了一个使用(Flask-)的代码示例WTF形成并生成日期为“2012-2-30”的错误消息。
>>> int('text')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: 'text'
>>> while True:
...     n = raw_input('What do you want to multiply 10 for?  ')
...     try:
...         print 'The result is: %d' % (10 * int(n))
...     except ValueError:
...         print 'You should provide an integer number...'
>>> while True:
...     n = raw_input('What do you want to multiply 10 for?  ')
...     if not all((c in '0123456789' for c in n)):
...         print 'You should provide an integer number...'
...         continue
...     print 'The result is: %d' % (10 * int(n))