Add i18n support for French and German with browser language detection
CI / test-and-package (push) Successful in 35s
CI / test-and-package (push) Successful in 35s
This commit is contained in:
@@ -23,6 +23,7 @@ from models import (
|
||||
delete_household,
|
||||
count_household_users,
|
||||
)
|
||||
from i18n import t
|
||||
|
||||
meals_bp = Blueprint("meals", __name__)
|
||||
|
||||
@@ -60,7 +61,7 @@ def dashboard():
|
||||
try:
|
||||
today = datetime.strptime(date_str, "%Y-%m-%d").date()
|
||||
except ValueError:
|
||||
flash("Invalid date format. Use YYYY-MM-DD.", "error")
|
||||
flash(t("Invalid date format. Use YYYY-MM-DD."), "error")
|
||||
|
||||
if household_id is None:
|
||||
session.clear()
|
||||
@@ -87,27 +88,27 @@ def respond():
|
||||
date_str = request.form.get("date", date.today().isoformat())
|
||||
|
||||
if meal_type not in ("lunch", "dinner"):
|
||||
flash("Invalid meal type.", "error")
|
||||
flash(t("Invalid meal type."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
if status not in ("yes", "no"):
|
||||
flash("Invalid status.", "error")
|
||||
flash(t("Invalid status."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
try:
|
||||
target_date = datetime.strptime(date_str, "%Y-%m-%d").date()
|
||||
except ValueError:
|
||||
flash("Invalid date.", "error")
|
||||
flash(t("Invalid date."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
if target_date < date.today():
|
||||
flash("Cannot change responses for past dates.", "error")
|
||||
flash(t("Cannot change responses for past dates."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
periods = ensure_meal_periods(target_date)
|
||||
period = next((p for p in periods if p["meal_type"] == meal_type), None)
|
||||
if period is None:
|
||||
flash("Meal period not found.", "error")
|
||||
flash(t("Meal period not found."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
upsert_response(session["user_id"], period["id"], status)
|
||||
@@ -147,7 +148,7 @@ def delete_account():
|
||||
user = get_user_by_id(session["user_id"])
|
||||
|
||||
if not check_password_hash(user["password_hash"], password):
|
||||
flash("Incorrect password. Account not deleted.", "error")
|
||||
flash(t("Incorrect password. Account not deleted."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
household_id = session["household_id"]
|
||||
@@ -157,10 +158,10 @@ def delete_account():
|
||||
# If admin is the last user, delete the household too
|
||||
if is_admin and user_count == 1:
|
||||
delete_household(household_id)
|
||||
flash("Your account and household have been deleted.", "success")
|
||||
flash(t("Your account and household have been deleted."), "success")
|
||||
else:
|
||||
delete_user(session["user_id"])
|
||||
flash("Your account has been deleted.", "success")
|
||||
flash(t("Your account has been deleted."), "success")
|
||||
|
||||
# Clear auth keys but keep the session so flash survives the redirect
|
||||
for key in ("user_id", "username", "is_admin", "household_id", "household_name"):
|
||||
@@ -173,20 +174,20 @@ def delete_account():
|
||||
def admin_remove_user(user_id):
|
||||
"""Admin removes a user from the household."""
|
||||
if not session["is_admin"]:
|
||||
flash("Only admins can remove users.", "error")
|
||||
flash(t("Only admins can remove users."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
user = get_user_by_id(user_id)
|
||||
if user is None or user["household_id"] != session["household_id"]:
|
||||
flash("User not found in your household.", "error")
|
||||
flash(t("User not found in your household."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
if user["is_admin"]:
|
||||
flash("Cannot remove the admin. Transfer admin role first or delete the household.", "error")
|
||||
flash(t("Cannot remove the admin. Transfer admin role first or delete the household."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
delete_user(user_id)
|
||||
flash(f"User '{user['username']}' has been removed.", "success")
|
||||
flash(t("User '{name}' has been removed.", name=user["username"]), "success")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
|
||||
@@ -195,18 +196,18 @@ def admin_remove_user(user_id):
|
||||
def admin_delete_household():
|
||||
"""Admin deletes the entire household."""
|
||||
if not session["is_admin"]:
|
||||
flash("Only admins can delete the household.", "error")
|
||||
flash(t("Only admins can delete the household."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
password = request.form.get("password", "")
|
||||
user = get_user_by_id(session["user_id"])
|
||||
|
||||
if not check_password_hash(user["password_hash"], password):
|
||||
flash("Incorrect password. Household not deleted.", "error")
|
||||
flash(t("Incorrect password. Household not deleted."), "error")
|
||||
return redirect(url_for("meals.dashboard"))
|
||||
|
||||
delete_household(session["household_id"])
|
||||
flash("Household and all members have been deleted.", "success")
|
||||
flash(t("Household and all members have been deleted."), "success")
|
||||
for key in ("user_id", "username", "is_admin", "household_id", "household_name"):
|
||||
session.pop(key, None)
|
||||
return redirect(url_for("auth.login"))
|
||||
|
||||
Reference in New Issue
Block a user