3

哪种是从 strftime 中翻译消息的最佳/最简单的方法,例如"time data '2012' does not match format '%d.%m.%Y'"or "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>
4

1 回答 1

1

简短的版本:你不应该:例外是要被处理,而不是被翻译的。

在为用户准备的消息和为开发人员准备的消息之间存在概念上的差异(如运行时异常)。

翻译异常与翻译结构一样有意义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,消除请求/响应周期。

于 2012-07-21T22:49:08.757 回答