@hmyapps/i18n
v1.1.0
Published
Lightweight i18n for Haaremy apps — reads language from SSO JWT claim
Readme
@hmyapps/i18n
Leichtgewichtige i18n-Lösung für alle Haaremy-Apps. Liest Sprache aus dem SSO-JWT-Claim language (de/en).
Architektur
/opt/hmyI18n/
locales/
common/{de,en}.json # Shared: Buttons, Auth, Footer, Legal
hmyportal/{de,en}.json # Portal-spezifisch
hmysso/{de,en}.json # SSO-spezifisch
hmywiki/{de,en}.json # Wiki-spezifisch
hmyfiles/{de,en}.json # Files-spezifisch
...
src/
index.ts # Server/Bun runtime
browser.ts # Browser / statische AppsVerwendung (Bun/Hono Server)
import { createT, langFromJwt } from "@hmyapps/i18n";
// In Hono Middleware:
app.use("*", async (c, next) => {
const jwt = c.req.header("Authorization")?.replace("Bearer ", "") || "";
const lang = langFromJwt(jwt) || "de";
c.set("t", createT(lang, ["common", "hmywiki"]));
await next();
});
// In Handler:
const t = c.get("t");
return c.json({ message: t("app.success") });Verwendung (Browser / statische HTML)
<script type="module">
import { initI18n, t, langFromJwt } from "/@hmyapps/i18n/browser";
const lang = langFromJwt(localStorage.getItem("hmy_access_token") || "");
await initI18n(lang, ["/locales/common/de.json"]);
document.querySelector("#save-btn").textContent = t("app.save");
</script>Verwendung (Python/Jinja2 SSO)
# app/i18n.py
import json, functools
from pathlib import Path
LOCALES_DIR = Path("/opt/hmyI18n/locales")
@functools.lru_cache(maxsize=20)
def _load(lang: str, ns: str) -> dict:
p = LOCALES_DIR / ns / f"{lang}.json"
try:
return json.loads(p.read_text())
except Exception:
return {}
def make_t(lang: str, namespaces=("common", "hmysso")):
maps = [_load(lang, ns) for ns in namespaces]
fallback = [_load("de", ns) for ns in namespaces]
def t(key: str, **kwargs) -> str:
for m in maps:
if key in m:
return m[key].format(**kwargs)
for m in fallback:
if key in m:
return m[key].format(**kwargs)
return key
return t
# In FastAPI:
# lang = getattr(current_user, "language", "de") or "de"
# t = make_t(lang)
# templates.TemplateResponse(..., {"t": t, ...})JWT-Claim
SSO-JWT enthält language: "de" | "en". Wird bei /me PATCH /preferences gesetzt.
Neue Sprache hinzufügen
- JSON-Dateien für neue Sprache erstellen (z.B.
fr.json) - SSO
language-Validation erweitern:^(de|en|fr)$ langFromJwtinsrc/index.ts+src/browser.tsanpassen- Neu bauen + publizieren:
cd /opt/hmyI18n && bun run build && npm publish
