从strftime(如"time data '2012' does not match format '%d.%m.%Y'"
或"day is out of range for month"
)翻译消息的最佳/最简单方法是什么?
我问是因为我已经用Flask、Flask WTForms和DateField类型的字段编写了一个应用程序。对于其他消息,我使用了Flask-Babel/gettext,但这个错误消息似乎是直接来自不使用gettext的strftime。
谢谢!
2012-07-24:添加一些示例代码(请尝试使用类似"2012-2-30"的日期):
from flask import Flask, render_template
from flask.ext.wtf import Form, DateField
class DateForm(Form):
date = DateField(u"Date")
DEBUG = True
SECRET_KEY = 'secret'
app = Flask(__name__)
app.config.from_object(__name__)
@app.route("/", methods=("GET", "POST",))
def index():
form = DateForm()
if form.validate_on_submit():
pass
return render_template("simple.html", form=form)
if __name__ == "__main__":
app.run()
模板"simple.html":
<!DOCTYPE html>
<html>
<body>
<form method="POST" enctype="multipart/form-data">
{% if form.date.errors %}
{{ form.errors }}
{% endif %}
{{ form.hidden_tag() }}
{{ form.date.label }}
{{ form.date|safe }}
<input type="submit" value="Submit">
</form>
</body>
</html>
简短版本:您不应该:异常是指根据执行的,而不是翻译的
在概念上,面向用户的消息和面向开发人员的消息之间存在差异(如运行时异常)。
翻译异常和翻译if ... then ... else
结构一样有意义:开发人员应该知道语言,而不需要翻译它
虽然在大多数情况下,异常是由错误引起的(因此在部署的代码中不应该存在),但在某些情况下,它们可能预示着程序的生理状况。如果这种情况需要用户执行操作,那么代码应该捕获有问题的异常,并向用户显示对她/他有意义的消息。一个例子:
知道:
>>> 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...'
请注意,我们只捕获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,消除了请求/响应周期。
啊!