From 914482bc76954aef067ac73314a19f415a32c61c Mon Sep 17 00:00:00 2001 From: Baptiste Jonglez Date: Sun, 26 Apr 2020 16:40:35 +0200 Subject: [PATCH] Use Flask-Babel to localize datetime in the History Page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit By formatting datetime on the server, we get nice localized datetime strings that are adapted to the currently-selected language. Example: - English: "Apr 26, 2020, 3:58:54 PM" - French: "26 avr. 2020 à 15:58:54" - German: "26.04.2020, 15:58:54" - Spanish: "26 abr. 2020 15:58:54" - Indonesian: "26 Apr 2020 15.58.54" - Chinese: "2020年4月26日 下午3:58:54" However, there is a downside: time is not adapted to the user timezone. The solution is to define a timezone on the server: we use the server OS timezone by default, and it can be customized through the BABEL_DEFAULT_TIMEZONE setting. It's still not ideal, because it assumes that all users are in the same timezone (the one configured on the server). --- ihatemoney/history.py | 2 +- ihatemoney/run.py | 7 +++++-- ihatemoney/templates/history.html | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ihatemoney/history.py b/ihatemoney/history.py index 801e39e6..3f99420a 100644 --- a/ihatemoney/history.py +++ b/ihatemoney/history.py @@ -82,7 +82,7 @@ def get_history(project, human_readable_names=True): object_str = describe_version(version) common_properties = { - "time": version.transaction.issued_at.strftime("%Y-%m-%dT%H:%M:%SZ"), + "time": version.transaction.issued_at, "operation_type": version.operation_type, "object_type": object_type, "object_desc": object_str, diff --git a/ihatemoney/run.py b/ihatemoney/run.py index 0f32dfb9..1d2a575f 100644 --- a/ihatemoney/run.py +++ b/ihatemoney/run.py @@ -2,6 +2,7 @@ import os import os.path import warnings +from babel.dates import LOCALTZ from flask import Flask, g, render_template, request, session from flask_babel import Babel, format_currency from flask_mail import Mail @@ -150,8 +151,10 @@ def create_app( app.jinja_env.globals["locale_from_iso"] = locale_from_iso app.jinja_env.filters["minimal_round"] = minimal_round - # Translations - babel = Babel(app) + # Translations and time zone (used to display dates). The timezone is + # taken from the BABEL_DEFAULT_TIMEZONE settings, and falls back to + # the local timezone of the server OS by using LOCALTZ. + babel = Babel(app, default_timezone=str(LOCALTZ)) # Undocumented currencyformat filter from flask_babel is forwarding to Babel format_currency # We overwrite it to remove the currency sign ¤ when there is no currency diff --git a/ihatemoney/templates/history.html b/ihatemoney/templates/history.html index d9f2b4d2..d4965d86 100644 --- a/ihatemoney/templates/history.html +++ b/ihatemoney/templates/history.html @@ -161,7 +161,7 @@ {% for event in history %} - + {{ event.time|datetimeformat("medium") }}