Translate the whole site to English: English routes with 301 redirects from the Dutch paths, English UI, docs, seeds and captions, one-time live content migration
This commit is contained in:
+28
-26
@@ -32,22 +32,23 @@ from molodetz.responses import json_error, wants_json
|
||||
from molodetz.routers import (
|
||||
auth,
|
||||
avatar,
|
||||
binnen,
|
||||
docs,
|
||||
flyers,
|
||||
health,
|
||||
home,
|
||||
join,
|
||||
legacy,
|
||||
memes,
|
||||
mensen,
|
||||
notifications,
|
||||
people,
|
||||
posts,
|
||||
presence,
|
||||
privacy,
|
||||
profile,
|
||||
rol,
|
||||
roll,
|
||||
seo,
|
||||
standaard,
|
||||
voorwaarden,
|
||||
standard,
|
||||
terms,
|
||||
)
|
||||
from molodetz.routers import admin
|
||||
from molodetz.bootstrap import bootstrap_content
|
||||
@@ -138,16 +139,17 @@ app.include_router(profile.router, prefix="/profile")
|
||||
app.include_router(notifications.router, prefix="/notifications")
|
||||
app.include_router(presence.router, prefix="/presence")
|
||||
app.include_router(posts.router, prefix="/posts")
|
||||
app.include_router(rol.router, prefix="/rol")
|
||||
app.include_router(standaard.router, prefix="/standaard")
|
||||
app.include_router(roll.router, prefix="/roll")
|
||||
app.include_router(standard.router, prefix="/standard")
|
||||
app.include_router(flyers.router, prefix="/flyers")
|
||||
app.include_router(memes.router, prefix="/memes")
|
||||
app.include_router(mensen.router, prefix="/mensen")
|
||||
app.include_router(binnen.router, prefix="/binnen")
|
||||
app.include_router(voorwaarden.router, prefix="/voorwaarden")
|
||||
app.include_router(people.router, prefix="/people")
|
||||
app.include_router(join.router, prefix="/join")
|
||||
app.include_router(terms.router, prefix="/terms")
|
||||
app.include_router(privacy.router, prefix="/privacy")
|
||||
app.include_router(health.router, prefix="/health")
|
||||
app.include_router(seo.router)
|
||||
app.include_router(legacy.router)
|
||||
app.include_router(docs.router)
|
||||
app.include_router(home.router)
|
||||
|
||||
@@ -247,9 +249,9 @@ async def rate_limit_middleware(request: Request, call_next):
|
||||
retry = max(1, int(window - (now - bucket[0])))
|
||||
record(request, "security.ratelimit.exceeded", result="denied", payload={"ip": key})
|
||||
if wants_json(request):
|
||||
response = json_error(429, "Te veel verzoeken", retry_after=retry)
|
||||
response = json_error(429, "Too many requests", retry_after=retry)
|
||||
else:
|
||||
response = PlainTextResponse("Te veel verzoeken. Probeer het zo opnieuw.", status_code=429)
|
||||
response = PlainTextResponse("Too many requests. Try again in a moment.", status_code=429)
|
||||
response.headers["Retry-After"] = str(retry)
|
||||
return response
|
||||
bucket.append(now)
|
||||
@@ -263,14 +265,14 @@ async def maintenance_middleware(request: Request, call_next):
|
||||
return await call_next(request)
|
||||
if request.url.path.startswith(MAINTENANCE_ALLOWED_PREFIXES) or is_admin(get_current_user(request)):
|
||||
return await call_next(request)
|
||||
message = get_setting("maintenance_message", "Onderhoud")
|
||||
message = get_setting("maintenance_message", "Maintenance")
|
||||
record(request, "security.maintenance.blocked", result="denied")
|
||||
if wants_json(request):
|
||||
return json_error(503, message)
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"error.html",
|
||||
{"status_code": 503, "message": message, "seo": {"title": "Onderhoud", "robots": "noindex,nofollow"}},
|
||||
{"status_code": 503, "message": message, "seo": {"title": "Maintenance", "robots": "noindex,nofollow"}},
|
||||
status_code=503,
|
||||
)
|
||||
|
||||
@@ -282,9 +284,9 @@ async def terms_middleware(request: Request, call_next):
|
||||
user = get_current_user(request)
|
||||
version = get_setting("terms_version", "1")
|
||||
if user is not None and str(user.get("terms_version") or "") != str(version):
|
||||
target = f"/voorwaarden?next={request.url.path}"
|
||||
target = f"/terms?next={request.url.path}"
|
||||
if wants_json(request):
|
||||
return json_error(403, "Accepteer eerst de voorwaarden", code="terms_required", redirect=target, terms_version=version)
|
||||
return json_error(403, "Accept the terms first", code="terms_required", redirect=target, terms_version=version)
|
||||
return RedirectResponse(target, status_code=303)
|
||||
return await call_next(request)
|
||||
|
||||
@@ -379,22 +381,22 @@ async def http_exception_handler(request: Request, exc: HTTPException):
|
||||
if wants_json(request) or request.headers.get("x-api-key") or request.headers.get("authorization"):
|
||||
return json_error(exc.status_code, str(exc.detail))
|
||||
if exc.status_code == 404:
|
||||
message = friendly_message() if get_setting("friendly_404", "1") == "1" else "Niet gevonden."
|
||||
message = friendly_message() if get_setting("friendly_404", "1") == "1" else "Not found."
|
||||
return _error_page(request, 404, message)
|
||||
return _error_page(request, exc.status_code, str(exc.detail), headers=getattr(exc, "headers", None))
|
||||
|
||||
|
||||
@app.exception_handler(404)
|
||||
async def not_found_handler(request: Request, exc):
|
||||
return await http_exception_handler(request, HTTPException(404, "Niet gevonden"))
|
||||
return await http_exception_handler(request, HTTPException(404, "Not found"))
|
||||
|
||||
|
||||
@app.exception_handler(500)
|
||||
async def server_error_handler(request: Request, exc):
|
||||
logger.error("unhandled error: %s", "".join(traceback.format_exception(exc)))
|
||||
if wants_json(request):
|
||||
return json_error(500, "Interne fout")
|
||||
return _error_page(request, 500, "Er ging iets mis aan onze kant.")
|
||||
return json_error(500, "Internal error")
|
||||
return _error_page(request, 500, "Something broke on our side.")
|
||||
|
||||
|
||||
AUTH_TEMPLATES = {"/auth/login": "auth/login.html"}
|
||||
@@ -405,9 +407,9 @@ def _friendly_messages(errors):
|
||||
for error in errors:
|
||||
loc = [str(part) for part in error.get("loc", ()) if part not in ("body", "query")]
|
||||
field = loc[-1] if loc else "body"
|
||||
message = str(error.get("msg", "Ongeldige invoer")).replace("Value error, ", "")
|
||||
message = str(error.get("msg", "Invalid input")).replace("Value error, ", "")
|
||||
if field == "password" and "at least" in message:
|
||||
message = "Wachtwoord moet 6 tot 128 tekens zijn."
|
||||
message = "Password must be 6 to 128 characters."
|
||||
fields.append(field)
|
||||
messages.append(f"{field}: {message}" if field != "body" else message)
|
||||
return fields, messages
|
||||
@@ -425,16 +427,16 @@ async def validation_handler(request: Request, exc: RequestValidationError):
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
template,
|
||||
{"errors": messages, "form": echoed, "next": echoed.get("next"), "seo": {"title": "Inloggen", "robots": "noindex,nofollow"}},
|
||||
{"errors": messages, "form": echoed, "next": echoed.get("next"), "seo": {"title": "Log in", "robots": "noindex,nofollow"}},
|
||||
status_code=400,
|
||||
)
|
||||
if request.url.path == "/binnen":
|
||||
if request.url.path == "/join":
|
||||
form = await request.form()
|
||||
echoed = {key: value for key, value in form.items() if isinstance(value, str)}
|
||||
return templates.TemplateResponse(
|
||||
request,
|
||||
"binnen.html",
|
||||
{"errors": messages, "form": echoed, "submitted": False, "seo": {"title": "Binnen", "robots": "index,follow"}},
|
||||
"join.html",
|
||||
{"errors": messages, "form": echoed, "submitted": False, "seo": {"title": "Join", "robots": "index,follow"}},
|
||||
status_code=400,
|
||||
)
|
||||
return RedirectResponse(safe_next(request.headers.get("referer", "").replace(str(request.base_url).rstrip("/"), ""), "/"), status_code=303)
|
||||
|
||||
Reference in New Issue
Block a user