From ba8356fc0eee876d16c20a191050a968b9efb8ba Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Thu, 9 Apr 2026 00:11:36 +0200
Subject: [PATCH] ui all languages transferred
---
modules/routes/routeI18n.py | 40 +++++++++++++++++++++++++++++++++++++
1 file changed, 40 insertions(+)
diff --git a/modules/routes/routeI18n.py b/modules/routes/routeI18n.py
index 77cf7282..5b4f600b 100644
--- a/modules/routes/routeI18n.py
+++ b/modules/routes/routeI18n.py
@@ -591,6 +591,33 @@ async def create_language_set(
return {"status": "accepted", "code": code}
+def _compute_language_sync_diff(db, code: str) -> dict:
+ """Return key sync metrics before AI translate (no DB writes)."""
+ if code == "xx":
+ raise HTTPException(status_code=400, detail="Das xx-Set wird separat synchronisiert.")
+ rows = db.getRecordset(UiLanguageSet, recordFilter={"id": code})
+ if not rows:
+ raise HTTPException(status_code=404, detail="Sprachset nicht gefunden")
+ xx_entries = _loadMasterXxEntries(db)
+ if not xx_entries:
+ raise HTTPException(status_code=503, detail="Basisset (xx) nicht vorhanden.")
+ row = dict(rows[0])
+ cur_entries = _rowEntries(row)
+ cur_by_key = {e["key"]: e for e in cur_entries}
+ xx_by_key = {e["key"]: e for e in xx_entries}
+ master_keys = set(xx_by_key.keys())
+ current_keys = set(cur_by_key.keys())
+ added_count = len(master_keys - current_keys)
+ removed_count = len(current_keys - master_keys)
+ return {
+ "code": code,
+ "addedCount": added_count,
+ "removedCount": removed_count,
+ "masterEntryCount": len(master_keys),
+ "currentEntryCount": len(current_keys),
+ }
+
+
async def _syncLanguageWithXx(db, code: str, userId: Optional[str], adminUser: Optional[User] = None) -> dict:
"""Synchronise a language set (incl. de) against the xx base set via AI."""
if code == "xx":
@@ -703,6 +730,19 @@ async def update_all_language_sets(
return {"xxSync": xxSync, "updated": results}
+@router.get("/sets/{code}/sync-diff")
+async def get_language_sync_diff(
+ code: str,
+ adminUser: User = Depends(requireSysAdminRole),
+):
+ """How many keys would be added/removed vs xx before running a full sync (SysAdmin)."""
+ c = code.strip().lower()
+ if c in ("update-all", "sync-xx", "sync-de"):
+ raise HTTPException(status_code=400, detail="Ungültiger Sprachcode.")
+ db = getMgmtInterface(adminUser, mandateId=None).db
+ return _compute_language_sync_diff(db, c)
+
+
@router.put("/sets/{code}")
async def update_language_set(
code: str,