3

"time data '2012' does not match format '%d.%m.%Y'"またはのような strftime からのメッセージを翻訳するための最良/最も簡単な方法はどれ"day is out of range for month"ですか?

Flask、Flask-WTForms、および DateField タイプの 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>
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 に答える