From 390f8cb146c69d8d3a0e6e0d76ea3546f30a7611 Mon Sep 17 00:00:00 2001 From: Lukasz Kasprzak Date: Thu, 23 Jul 2026 22:08:56 +0200 Subject: i18n: fix consistency-review gaps in ui_language (en/pl chrome) Closes six findings from review of the ui_language feature so English mode carries no leftover Polish UI text: - Web: interlinear "no verses" note and the empty-day error fragment now route through i18n instead of being unconditionally Polish. - render.GatherVersion/GatherVerses/resolveRef's four lookup/citation- failure blocks are now lang-aware (resolveRef gained a lang param). - i18n.ErrorPrefix/NoReadingsFor lost a stray extra trailing space, restoring the pre-i18n single-space TUI concatenation. - render.LocalizeHeading now matches a heading's actual leading label text against all known modern pl labels, rather than trusting the label keyed by sec.PartID -- fixes split-feast days where PartID is "drugie_czytanie" but the heading still reads "1. czytanie ...". - cli bannerFor is lang-specific again (pl "na", en "for"), restoring pl's exact pre-i18n wording instead of "--" for both languages. - index.html's now follows cfg.UILanguage instead of being hardcoded "pl". gofmt/vet clean, go test ./... green, all three binaries build, no new go.mod deps. Consistency grep across cli/tui/web/render's live source turns up only two non-displayed identifiers (a PartID slug list and a pre-existing incipit-stripping constant on the pl scripture text itself). --- internal/web/server_test.go | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'internal/web/server_test.go') diff --git a/internal/web/server_test.go b/internal/web/server_test.go index 25d21f4..32ee412 100644 --- a/internal/web/server_test.go +++ b/internal/web/server_test.go @@ -227,6 +227,53 @@ func TestServer(t *testing.T) { }) } +// TestRenderOrErrorNoSectionsLang checks the "no readings at all for this +// day" fragment (finding §1) follows lang instead of always being Polish. +func TestRenderOrErrorNoSectionsLang(t *testing.T) { + html := string(renderOrError(nil, nil, "new", "horizontal", "en", nil)) + if !strings.Contains(html, "no readings for this day") { + t.Errorf("en renderOrError(no secs) = %q, want it to contain %q", html, "no readings for this day") + } + if strings.Contains(html, "czyta") { + t.Errorf("en renderOrError(no secs) should not carry Polish wording: %q", html) + } + + html = string(renderOrError(nil, nil, "new", "horizontal", "pl", nil)) + if !strings.Contains(html, "brak czytań na ten dzień") { + t.Errorf("pl renderOrError(no secs) = %q, want it to contain %q", html, "brak czytań na ten dzień") + } +} + +// TestIndexHTMLLangAttribute checks index.html's follows +// cfg.UILanguage (finding §6) instead of being hardcoded "pl". +func TestIndexHTMLLangAttribute(t *testing.T) { + html, err := os.ReadFile("../liturgy/testdata/2026-07-22.html") + if err != nil { + t.Fatal(err) + } + fixtureServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Write(html) + })) + defer fixtureServer.Close() + liturgy.SetBaseURL(fixtureServer.URL + "/liturgia/%s/Ewangelia") + t.Setenv("XDG_CACHE_HOME", t.TempDir()) + + cfg := config.Default() + cfg.UILanguage = "en" + rec := httptest.NewRecorder() + NewServer(cfg).ServeHTTP(rec, httptest.NewRequest("GET", "/?date=2026-07-22&v=wuj", nil)) + if !strings.Contains(rec.Body.String(), ``) { + t.Errorf(`en index page missing : %q`, rec.Body.String()[:min(400, rec.Body.Len())]) + } + + cfg.UILanguage = "pl" + rec = httptest.NewRecorder() + NewServer(cfg).ServeHTTP(rec, httptest.NewRequest("GET", "/?date=2026-07-22&v=wuj", nil)) + if !strings.Contains(rec.Body.String(), ``) { + t.Errorf(`pl index page missing : %q`, rec.Body.String()[:min(400, rec.Body.Len())]) + } +} + // TestChooseListener exercises chooseListener's port-selection logic // directly (no HTTP serving): port==0 prefers defaultWebPort (1099) and // falls back to a free OS port when 1099 is taken, and a non-zero port is -- cgit v1.3