如何翻译日期时间模块引发的异常的文本



从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,消除了请求/响应周期。

啊!

最新更新