v0.252.0 — the sentences the program builds follow the language (R-557 slice 2 release A)
gates / gates (push) Successful in 23s
gates / gates (push) Successful in 23s
Slice 1 translated the dashboard's markup. The sentences the program BUILDS were still Hungarian literals in Go, so an English household clicked an English button and was answered in Hungarian. 226 of them move into the bundle here. A flash was the hard part: it travels inside the redirect URL and is rendered by a DIFFERENT request, so it now carries a bundle key plus its parameters. A link minted by an older controller carries prose and is shown verbatim — never a raw key, never dropped. Also converted: page data and view-model text, the internal/api JSON answers, the alert banners (Alert.MessageKey, rendered on the way out of GetAlerts), 237 country names at display, and the four page titles built around an app name (R-566 closed). Hungarian is byte-identical, and that is measured rather than read: scripts/i18n_go_parity.py freezes every Go literal at the base commit (7 467) and refuses a key whose Hungarian is not that text, byte for byte. Three decoys, each seen to convict. Its own first version filtered the capture through an ASCII-Hungarian word list and missed seven real literals — the R-565 class. The filter is gone. Nothing on the wire moved, and wire goldens now hold it there: the report's health warnings and every notify event message stay Hungarian, because the hub MAILS the controller's sentence when it has no entry of its own. Slice 3 (R-558) owns those. MinAgent: 0.131.0 (unchanged). No hub release needed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
@@ -238,7 +238,7 @@ func (s *Server) guestNetSnapshot() stacks.GuestNetSnapshot {
|
||||
|
||||
func (s *Server) sharingPageHandler(w http.ResponseWriter, r *http.Request) {
|
||||
data := s.sharingPageData()
|
||||
if f := strings.TrimSpace(r.URL.Query().Get("flash")); f != "" {
|
||||
if f := s.flashFrom(r, "flash"); f != "" {
|
||||
data["Flash"] = f
|
||||
}
|
||||
s.executeTemplate(w, r, "sharing", data)
|
||||
@@ -246,7 +246,7 @@ func (s *Server) sharingPageHandler(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// sharingRedirect returns to the page with a Hungarian flash.
|
||||
func sharingRedirect(w http.ResponseWriter, r *http.Request, flash string) {
|
||||
http.Redirect(w, r, "/sharing?flash="+urlQueryEscape(flash), http.StatusSeeOther)
|
||||
http.Redirect(w, r, "/sharing?"+flashQuery("flash", flash), http.StatusSeeOther)
|
||||
}
|
||||
|
||||
func urlQueryEscape(s string) string {
|
||||
@@ -265,19 +265,19 @@ func (s *Server) sharingEnableHandler(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
if err := s.settings.SetSMBServerName(name); err != nil {
|
||||
sharingRedirect(w, r, "A mentés nem sikerült.")
|
||||
sharingRedirect(w, r, "flash.sharing.save_failed")
|
||||
return
|
||||
}
|
||||
}
|
||||
if err := s.settings.SetSMBEnabled(enable); err != nil {
|
||||
sharingRedirect(w, r, "A mentés nem sikerült.")
|
||||
sharingRedirect(w, r, "flash.sharing.save_failed")
|
||||
return
|
||||
}
|
||||
if !enable {
|
||||
if err := s.stackMgr.DisableSamba(); err != nil {
|
||||
s.logger.Printf("[WARN] [sharing] disable failed: %v", err)
|
||||
}
|
||||
sharingRedirect(w, r, "A hálózati megosztás kikapcsolva. A mappák és a fájlok megmaradtak.")
|
||||
sharingRedirect(w, r, "flash.sharing.disabled")
|
||||
return
|
||||
}
|
||||
// R-75: the canonical drop-zone share exists whenever sharing is ON — and NEVER before. Enabling
|
||||
@@ -292,10 +292,10 @@ func (s *Server) sharingEnableHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// post that hung for minutes on a first-enable image pull and then flashed „Beállítás mentve."
|
||||
// regardless of whether anything actually came up.
|
||||
if !s.startSambaEnsure() {
|
||||
sharingRedirect(w, r, "A megosztási szolgáltatás előkészítése már folyamatban van.")
|
||||
sharingRedirect(w, r, "flash.sharing.prepare_running")
|
||||
return
|
||||
}
|
||||
sharingRedirect(w, r, "Beállítás mentve. A megosztási szolgáltatás előkészítése folyamatban…")
|
||||
sharingRedirect(w, r, "flash.sharing.saved_preparing")
|
||||
}
|
||||
|
||||
// sharingStatusHandler is the 4b poll target (GET /sharing/status). It carries TWO independent
|
||||
@@ -333,26 +333,26 @@ func (s *Server) sharingPasswordHandler(w http.ResponseWriter, r *http.Request)
|
||||
pw := r.FormValue("smb_password")
|
||||
pw2 := r.FormValue("smb_password_confirm")
|
||||
if len(pw) < 8 {
|
||||
sharingRedirect(w, r, "A jelszónak legalább 8 karakter hosszúnak kell lennie.")
|
||||
sharingRedirect(w, r, "flash.sharing.pw_too_short")
|
||||
return
|
||||
}
|
||||
if pw != pw2 {
|
||||
sharingRedirect(w, r, "A két jelszó nem egyezik.")
|
||||
sharingRedirect(w, r, "flash.sharing.pw_mismatch")
|
||||
return
|
||||
}
|
||||
if err := s.stackMgr.SetSMBPassword(pw); err != nil {
|
||||
s.logger.Printf("[ERROR] [sharing] password apply failed: %v", err)
|
||||
sharingRedirect(w, r, "A jelszó beállítása nem sikerült.")
|
||||
sharingRedirect(w, r, "flash.sharing.pw_set_failed")
|
||||
return
|
||||
}
|
||||
// Setting the password is the moment the stack ACTUALLY first comes up: with UserSet false,
|
||||
// reconcile deliberately deploys nothing, so on a fresh box this — not the enable toggle — is
|
||||
// where the image pull happens. Same detached job, same card.
|
||||
if !s.startSambaEnsure() {
|
||||
sharingRedirect(w, r, "Megosztási jelszó beállítva. Az előkészítés már folyamatban van.")
|
||||
sharingRedirect(w, r, "flash.sharing.pw_set_preparing_already")
|
||||
return
|
||||
}
|
||||
sharingRedirect(w, r, "Megosztási jelszó beállítva. A megosztási szolgáltatás előkészítése folyamatban…")
|
||||
sharingRedirect(w, r, "flash.sharing.pw_set_preparing")
|
||||
}
|
||||
|
||||
// sharingShareCreateHandler creates a share (POST /sharing/shares). Either a NEW folder under
|
||||
@@ -385,7 +385,7 @@ func (s *Server) sharingShareCreateHandler(w http.ResponseWriter, r *http.Reques
|
||||
}
|
||||
if err := os.MkdirAll(dir, 0o775); err != nil {
|
||||
s.logger.Printf("[ERROR] [sharing] mkdir failed: %v", err)
|
||||
sharingRedirect(w, r, "A mappa létrehozása nem sikerült.")
|
||||
sharingRedirect(w, r, "flash.sharing.folder_failed")
|
||||
return
|
||||
}
|
||||
// uid:gid 1000 so apps and both backup tiers see the same ownership as SMB writes.
|
||||
@@ -419,7 +419,7 @@ func (s *Server) sharingShareCreateHandler(w http.ResponseWriter, r *http.Reques
|
||||
if err := s.stackMgr.ReconcileSamba(); err != nil {
|
||||
s.logger.Printf("[WARN] [sharing] reconcile after share create failed: %v", err)
|
||||
}
|
||||
sharingRedirect(w, r, "A megosztás létrehozva.")
|
||||
sharingRedirect(w, r, "flash.sharing.created")
|
||||
}
|
||||
|
||||
// sharingShareDeleteHandler removes a share (POST /sharing/shares/delete). CONFIG ONLY — by
|
||||
@@ -432,7 +432,7 @@ func (s *Server) sharingShareDeleteHandler(w http.ResponseWriter, r *http.Reques
|
||||
// enforcement, and a handler check is not reachability (the v0.70.1 ghost-delete lesson).
|
||||
for _, sh := range s.settings.GetSMBShares() {
|
||||
if strings.EqualFold(sh.Name, name) && sh.System {
|
||||
sharingRedirect(w, r, "Ez a megosztás a rendszer része, nem törölhető.")
|
||||
sharingRedirect(w, r, "flash.sharing.protected")
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -443,7 +443,7 @@ func (s *Server) sharingShareDeleteHandler(w http.ResponseWriter, r *http.Reques
|
||||
if err := s.stackMgr.ReconcileSamba(); err != nil {
|
||||
s.logger.Printf("[WARN] [sharing] reconcile after share delete failed: %v", err)
|
||||
}
|
||||
sharingRedirect(w, r, "A megosztás törölve — a mappa és a fájlok megmaradtak.")
|
||||
sharingRedirect(w, r, "flash.sharing.deleted")
|
||||
}
|
||||
|
||||
// sharingShareOffsiteHandler flips a share's „Felhőmentés" toggle (POST /sharing/shares/offsite).
|
||||
@@ -455,7 +455,7 @@ func (s *Server) sharingShareOffsiteHandler(w http.ResponseWriter, r *http.Reque
|
||||
sharingRedirect(w, r, err.Error())
|
||||
return
|
||||
}
|
||||
sharingRedirect(w, r, "Beállítás mentve.")
|
||||
sharingRedirect(w, r, "flash.sharing.saved")
|
||||
}
|
||||
|
||||
// ServeSharingAPI dispatches the /api/sharing/* XHR endpoints. Registered on the mux in main.go
|
||||
|
||||
Reference in New Issue
Block a user