如何翻译datetime模块抛出的异常文本?

时间:2012-07-21 16:48:31

标签: python internationalization flask strftime wtforms

哪种翻译来自strftime的消息最好/最简单,如"time data '2012' does not match format '%d.%m.%Y'""day is out of range for month"

我问,因为我已经使用DateField类型的Flask,Flask-WTForms和Fields编写了一个应用程序。对于我使用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>

1 个答案:

答案 0 :(得分: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到提供者,消除了请求/响应周期。

HTH!