feat(wikijs): German default locale, migrate content de, Berlin timezone

The content is German but was bound to the 'en' locale, the site default
language was English, and system accounts defaulted to America/New_York.

- ensure_locale: set default locale to 'de' (live via updateLocale) and
  migrate all pages en->de via pages.migrateToLocale, then rebuild page tree
  and search index only when something was migrated.
- Navigation tree now stored under locale 'de' so getTree finds it for the
  now-German pages.
- ensure_timezones: set guest + admin system accounts to Europe/Berlin
  (new auto-provisioned users still inherit the core-hardcoded NY default).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Thore Cimbal
2026-08-14 12:00:00 +00:00
co-authored by Claude Opus 4.8
parent 9f8eed3193
commit 2250969e4a
+61 -1
View File
@@ -310,8 +310,10 @@ def set_navigation(jwt: str):
]
gql('mutation($m:NavigationMode!){navigation{updateConfig(mode:$m){responseResult{succeeded}}}}',
jwt, {"m": "STATIC"})
# Nav-Baum unter der Standard-Locale 'de' (die Seiten liegen nach der Migration unter
# de; getTree wird mit der Seiten-Locale abgefragt — ein en-Baum bliebe unsichtbar).
gql('mutation($t:[NavigationTreeInput]!){navigation{updateTree(tree:$t)'
'{responseResult{succeeded message}}}}', jwt, {"t": [{"locale": "en", "items": items}]})
'{responseResult{succeeded message}}}}', jwt, {"t": [{"locale": "de", "items": items}]})
log("Navigation gesetzt (Custom-Sidebar; Betrieb nur für Admins)")
@@ -344,6 +346,62 @@ def ensure_html_rendering(jwt: str):
log("HTML-Rendering aktiviert (markdownCore.allowHTML) — Neustart nötig auf frischer Instanz")
def ensure_locale(jwt: str):
# Deutsch als Standardsprache: die Inhalte sind deutsch, hingen aber an 'en'.
# updateLocale lädt live (setCurrentLocale + refreshNamespaces, KEIN Neustart);
# namespacing bleibt aus (eine Sprache, saubere /<pfad>-URLs), 'en' bleibt als
# Namespace registriert.
loc = gql('{localization{locales{code isInstalled} config{locale namespaces}}}',
jwt)["localization"]
installed = {l["code"] for l in loc["locales"] if l["isInstalled"]}
if "de" not in installed:
# de muss in der locales-Tabelle liegen (updateLocale liest dort isRTL). Auf
# frischen Instanzen ggf. herunterladen (braucht Egress) — weich, kein Hard-Fail.
try:
gql('mutation{localization{downloadLocale(locale:"de")'
'{responseResult{succeeded message}}}}', jwt)
log("Locale 'de' heruntergeladen")
except Exception as e: # noqa: BLE001
log(f"WARN: downloadLocale(de) fehlgeschlagen ({e}) — Locale-Umstellung übersprungen")
return
if loc["config"]["locale"] != "de":
ns = sorted(set((loc["config"].get("namespaces") or []) + ["de", "en"]))
gql('mutation($l:String!,$a:Boolean!,$n:Boolean!,$ns:[String]!){localization{'
'updateLocale(locale:$l,autoUpdate:$a,namespacing:$n,namespaces:$ns)'
'{responseResult{succeeded message}}}}',
jwt, {"l": "de", "a": True, "n": False, "ns": ns})
log("Standardsprache auf Deutsch gesetzt (de)")
# Inhalte en->de migrieren (patcht nur die pages-Tabelle; das ist auch Wiki.js'
# eigener Locale-Migrationsweg, kollisions-sicher via whereNotExists). Danach Tree
# + Suchindex neu bauen, aber NUR wenn wirklich migriert wurde — sonst teurer No-op
# bei jedem Job-Lauf. (git-storage-Frontmatter der Altdateien bleibt 'en' und heilt
# beim nächsten Bearbeiten; dormante Dateien werden nicht re-importiert.)
m = gql('mutation{pages{migrateToLocale(sourceLocale:"en",targetLocale:"de")'
'{responseResult{succeeded message} count}}}', jwt)["pages"]["migrateToLocale"]
if (m.get("count") or 0) > 0:
gql('mutation{pages{rebuildTree{responseResult{succeeded}}}}', jwt)
gql('mutation{search{rebuildIndex{responseResult{succeeded}}}}', jwt)
log(f"Inhalte nach de migriert ({m['count']} Seiten) + Tree/Suchindex neu gebaut")
else:
log("Locale-Migration: keine en-Seiten offen (bereits de)")
def ensure_timezones(jwt: str):
# Systemkonten auf Europe/Berlin statt Wiki.js-Default America/New_York: guest
# (id 2, treibt die anonyme/Standard-Anzeige) + der Admin. Menschliche OIDC-Nutzer
# setzen ihre TZ im Profil; NEUE Nutzer erben aber weiter den im Core hardcodierten
# New_York-Default (server/core/auth.js) — nur per Fork-Patch änderbar, nicht per
# Config. update patcht nur das timezone-Feld (kein Nulling, groups nur bei Array).
ids = {2} # guest
for u in gql("{users{list{id email}}}", jwt)["users"]["list"]:
if u["email"] == ADMIN_EMAIL:
ids.add(u["id"])
for uid in sorted(ids):
gql('mutation($id:Int!){users{update(id:$id,timezone:"Europe/Berlin")'
'{responseResult{succeeded message}}}}', jwt, {"id": uid})
log(f"Zeitzone Europe/Berlin für Systemkonten gesetzt (ids {sorted(ids)})")
def group_id(jwt: str, name: str):
for g in gql("{groups{list{id name}}}", jwt)["groups"]["list"]:
if g["name"] == name:
@@ -395,9 +453,11 @@ def main():
ensure_oidc(jwt)
set_hide_local(jwt)
ensure_theming(jwt)
ensure_locale(jwt) # Deutsch als Default + Inhalte en->de migrieren (vor der Nav)
set_navigation(jwt)
ensure_html_rendering(jwt)
ensure_git_storage(jwt)
ensure_timezones(jwt) # Systemkonten auf Europe/Berlin
log("fertig — Wiki.js konfiguriert")