diff --git a/babel.cfg b/babel.cfg new file mode 100644 index 0000000..0cc0bac --- /dev/null +++ b/babel.cfg @@ -0,0 +1,3 @@ +[python: **.py] +[jinja2: **/templates/**.html] +extensions=jinja2.ext.autoescape,jinja2.ext.with_ \ No newline at end of file diff --git a/filters.py b/filters.py deleted file mode 100644 index 65145aa..0000000 --- a/filters.py +++ /dev/null @@ -1,8 +0,0 @@ -from flask import render_template -from objects import glob - -@glob.app.context_processor -def locale(): - def _locale(lang, key): - return glob.langs[lang][key] if key in glob.langs[lang] else key - return dict(locale = _locale) \ No newline at end of file diff --git a/forms/login.py b/forms/login.py index b95dd09..9a11244 100644 --- a/forms/login.py +++ b/forms/login.py @@ -6,14 +6,14 @@ from flask_login import UserMixin from objects import glob class BillForm(Form): - payment_to = StringField("lbl_to", [validators.DataRequired()]) - description = TextAreaField("lbl_desc", render_kw = { + payment_to = StringField("Payment to", [validators.DataRequired()]) + description = TextAreaField("Description", render_kw = { "cols": 55, "rows": 8 }) - sum = DecimalField("lbl_sum") - kid = IntegerField("lbl_id") - date_due = DateField("lbl_date") + sum = DecimalField("Sum") + kid = IntegerField("KID") + date_due = DateField("Date due") class LoginForm(Form): email = StringField("Email", [ diff --git a/locale/en/bills.json b/locale/en/bills.json deleted file mode 100644 index b8fe2b9..0000000 --- a/locale/en/bills.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "lbl_to": "Payment to", - "lbl_desc": "Description", - "lbl_sum": "Sum", - "lbl_id": "KID", - "lbl_date": "Date due", - "lbl_status": "Payment status" -} \ No newline at end of file diff --git a/locale/en/etc.buttons.json b/locale/en/etc.buttons.json deleted file mode 100644 index 396be21..0000000 --- a/locale/en/etc.buttons.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "add": "Add", - "close": "Close" -} \ No newline at end of file diff --git a/locale/en/layout.side_nav.json b/locale/en/layout.side_nav.json deleted file mode 100644 index 4c93dde..0000000 --- a/locale/en/layout.side_nav.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "lnk_dashboard": "Dashboard", - "lnk_bills": "Bills", - "lnk_receipts": "Receipts", - "lnk_warranties": "Warranties", - "ttl_economical": "Economical" -} \ No newline at end of file diff --git a/locale/no/bills.json b/locale/no/bills.json deleted file mode 100644 index c8403fb..0000000 --- a/locale/no/bills.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "lbl_to": "Betaling til", - "lbl_desc": "Tekst", - "lbl_sum": "Sum", - "lbl_id": "KID", - "lbl_date": "Forfallsdato", - "lbl_status": "Betalingsstatus" -} \ No newline at end of file diff --git a/locale/no/etc.buttons.json b/locale/no/etc.buttons.json deleted file mode 100644 index 367c2ca..0000000 --- a/locale/no/etc.buttons.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "add": "Legg til", - "close": "Lukk" -} \ No newline at end of file diff --git a/locale/no/layout.side_nav.json b/locale/no/layout.side_nav.json deleted file mode 100644 index 35d28ab..0000000 --- a/locale/no/layout.side_nav.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "lnk_dashboard": "Dashbord", - "lnk_bills": "Regninger", - "lnk_receipts": "Kvitteringer", - "lnk_warranties": "Garantier", - "ttl_economical": "Økonomisk" -} \ No newline at end of file diff --git a/localizer.py b/localizer.py new file mode 100644 index 0000000..547183b --- /dev/null +++ b/localizer.py @@ -0,0 +1,17 @@ +from flask import g, request, session +from flask_babel import Babel + +from objects import glob + +babel = Babel(glob.app) + +LANGUAGES = { + "en": "English", + "no": "Norwegian" +} + +@babel.localeselector +def get_locale(): + if request.args.get("lang"): + session["lang"] = request.args.get("lang") if request.args.get("lang") in LANGUAGES.keys() else "en" + return session.get("lang", "en") diff --git a/main.py b/main.py index 2d65b9b..d1f7bb2 100644 --- a/main.py +++ b/main.py @@ -5,8 +5,9 @@ from objects import glob # Global sharing of python objects in a manageable way glob.app = Flask(__name__) glob.app.secret_key = "E2FGrJXLtOxPh70Q" +import localizer # Initialize localization (Babel) import routes # All flask app routes -import filters # All flask app filters +# import filters # All flask app filters if glob.config["git"]["auto_pull_and_restart"]: # Only used on the VPS (Do not enable in config) @glob.app.route(glob.config["git"]["webhook_endpoint"], methods = ["POST"]) diff --git a/objects/glob.py b/objects/glob.py index 24e8d8e..1400ea4 100644 --- a/objects/glob.py +++ b/objects/glob.py @@ -10,8 +10,6 @@ import bcrypt app = None # main.py -> Flask App sql_conn = None -langs = {} - # ------------------------------------------------------------------------------ # Global variables that initializes on first load of module @@ -22,19 +20,6 @@ if not os.path.isfile("config.json"): with open("config.json", "r") as f: config = json.load(f) -path = "locale" -for l in os.listdir(path): - langs[l] = {} - _path = "%s/%s" % (path, l) - for f in os.listdir(_path): - _f = "%s/%s" % (_path, f) - with open(_f, "r", encoding = "UTF-8") as j: - pnd = json.load(j) - for k in pnd.keys(): - if k in langs[l]: - raise Exception("Duplicate localization entries found in file %s" % _f) - langs[l] = {**langs[l], **pnd} - def make_sql_connection(): return mysql.connector.connect(**config["mysql"]) diff --git a/routes.py b/routes.py index bfb894d..a761569 100644 --- a/routes.py +++ b/routes.py @@ -6,6 +6,8 @@ from forms.login import LoginForm, RegisterForm, BillForm, User, register_accoun from objects import glob # Global sharing of python objects in a manageable way +from flask_babel import gettext + login_manager = flask_login.LoginManager() login_manager.init_app(glob.app) login_manager.login_view = "login" @@ -65,7 +67,7 @@ def receipts(): @glob.app.route("/login", methods = ["GET", "POST"]) def login(): if flask_login.current_user.is_authenticated: - flash("Already logged in", "info") + flash(gettext("Already logged in"), "info") return redirect(url_for("dashboard")) form = LoginForm(request.form) @@ -73,20 +75,20 @@ def login(): try: user = User((form.email.data, form.password.data)) except Exception as e: - flash(str(e), "danger") + flash(gettext(str(e)), "danger") return render_template("login.html", form=form) flask_login.login_user(user) logged_in_users.append(user) - flash("Logged in", "success") + flash(gettext("Logged in"), "success") return redirect(url_for("dashboard")) return render_template("login.html", form=form) @glob.app.route("/register", methods = ["GET", "POST"]) def register(): if flask_login.current_user.is_authenticated: - flash("Already logged in", "info") + flash(gettext("Already logged in"), "info") return redirect(url_for("dashboard")) form = RegisterForm(request.form) @@ -94,10 +96,10 @@ def register(): try: register_account(form.email.data, form.password.data, form.firstname.data, form.surname.data) except Exception as e: - flash(str(e), "danger") + flash(gettext(str(e)), "danger") return render_template("register.html", form=form) - flash("User registered", "success") + flash(gettext("User registered"), "success") return redirect(url_for("login")) return render_template("register.html", form=form) @@ -105,12 +107,12 @@ def register(): @flask_login.login_required def logout(): flask_login.logout_user() - flash("Logged out", "success") + flash(gettext("Logged out"), "success") return redirect(url_for("login")) @glob.app.errorhandler(401) def unauthorized_handler_err(): - flash("Login is required", "danger") + flash(gettext("Login is required"), "danger") unauthorized_handler() @login_manager.user_loader @@ -122,4 +124,3 @@ def load_user(uuid): @login_manager.unauthorized_handler def unauthorized_handler(): return redirect(url_for("login")) - diff --git a/templates/layout/dash.html b/templates/layout/dash.html index 8dd8046..55a17b3 100644 --- a/templates/layout/dash.html +++ b/templates/layout/dash.html @@ -1,12 +1,10 @@ -{% set LANG = "no" %} - {% include 'layout/includes/boot-head.html' %} {% if title %} - Husstanden - {{ locale(LANG, title) }} + Husstanden - {{ _(title) | title }} {% else %} Husstanden {% endif %} diff --git a/templates/layout/includes/side_nav.html b/templates/layout/includes/side_nav.html index f819b34..6b83349 100644 --- a/templates/layout/includes/side_nav.html +++ b/templates/layout/includes/side_nav.html @@ -105,29 +105,29 @@
- {{ locale(LANG, "lnk_dashboard") }} + {{ _("Dashboard") }}
-

{{ locale(LANG, "ttl_economical") }}

+

{{ _("Economical") }}

- {{ locale(LANG, "lnk_bills") }} + {{ _("Bills") }}
- {{ locale(LANG, "lnk_receipts") }} + {{ _("Receipts") }} diff --git a/templates/layout/includes/top_nav.html b/templates/layout/includes/top_nav.html index a7e6482..fcfef00 100644 --- a/templates/layout/includes/top_nav.html +++ b/templates/layout/includes/top_nav.html @@ -1,7 +1,7 @@