summaryrefslogtreecommitdiff
path: root/internal/render/render.go
diff options
context:
space:
mode:
authorLukasz Kasprzak <lukas@labunix.xyz>2026-07-23 21:51:40 +0200
committerLukasz Kasprzak <lukas@labunix.xyz>2026-07-23 21:51:40 +0200
commit4c776396115c8120c3e1cb8fda993449fcdcd326 (patch)
tree0144fb325663dde063057a5ec568c59d4cbe79da /internal/render/render.go
parentbfa8df7b36ccbd44703e0705d51a2ed553a23164 (diff)
downloadlectio-4c776396115c8120c3e1cb8fda993449fcdcd326.tar.gz
lectio-4c776396115c8120c3e1cb8fda993449fcdcd326.zip
i18n: ui_language config (default en) for UI chrome across cli/tui/web; version labels localised
Diffstat (limited to 'internal/render/render.go')
-rw-r--r--internal/render/render.go66
1 files changed, 48 insertions, 18 deletions
diff --git a/internal/render/render.go b/internal/render/render.go
index b8d778c..c5a2ab0 100644
--- a/internal/render/render.go
+++ b/internal/render/render.go
@@ -9,17 +9,43 @@ import (
"strings"
"github.com/lukaszkasprzak/lectio/internal/bible"
+ "github.com/lukaszkasprzak/lectio/internal/i18n"
"github.com/lukaszkasprzak/lectio/internal/liturgy"
)
-// versionLabels names each version for column headers / prose. Ported
-// verbatim from ewangelia.py VERSION_LABELS.
-var versionLabels = map[string]string{
- "pl": "Polski (niedziela.pl)",
- "wuj": "Wujek (pol.)",
- "vul": "Wulgata (lac.)",
- "grb": "Grecki",
- "drb": "Douay-Rheims (ang.)",
+// versionLabel returns version's column-header/prose label in lang (see
+// internal/i18n.Get), falling back to the bare version code if lang has no
+// entry for it. lang="pl" reproduces ewangelia.py's original VERSION_LABELS
+// exactly.
+func versionLabel(version, lang string) string {
+ if l, ok := i18n.Get(lang).Version[version]; ok {
+ return l
+ }
+ return version
+}
+
+// LocalizeHeading swaps a modern (niedziela.pl) section heading's leading
+// label word for its lang translation, keeping the rest of the heading (the
+// parenthetical citation, exactly as scraped) untouched: e.g.
+// "Ewangelia (J 20, 1. 11-18)" with partID "ewangelia" and lang "en" becomes
+// "Gospel (J 20, 1. 11-18)". It only ever localises the label word, never
+// the citation or the verse text.
+//
+// It is a safe no-op (returns heading unchanged) unless all of: lang is
+// "en", partID names a known modern-lectionary part (see
+// internal/i18n.UI.PartLabel), and heading actually starts with that part's
+// Polish label -- which excludes traditional (missalemeum) headings, already
+// in the requested language, and anything unrecognised.
+func LocalizeHeading(heading, partID, lang string) string {
+ if lang != "en" {
+ return heading
+ }
+ plLabel, ok := i18n.Get("pl").PartLabel[partID]
+ if !ok || !strings.HasPrefix(heading, plLabel) {
+ return heading
+ }
+ enLabel := i18n.Get(lang).PartLabel[partID]
+ return enLabel + heading[len(plLabel):]
}
// versionSystem maps a bible version to the Psalter system bible.ToEnglishRef
@@ -49,8 +75,10 @@ const incipit = "Słowa Ewangelii"
// lectionary selects how sec.Citation is read: "new" (modern/niedziela.pl)
// citations are Polish and go through bible.ToEnglishRef; "traditional"
// (missalemeum) citations are already English kjv-style and are used as-is.
-func GatherVersion(version string, sec liturgy.Section, lectionary string) (label string, blocks []string) {
- label = versionLabels[version]
+// lang selects the UI chrome language the label comes from (see
+// internal/i18n); it never affects the verse text/citation itself.
+func GatherVersion(version string, sec liturgy.Section, lectionary, lang string) (label string, blocks []string) {
+ label = versionLabel(version, lang)
if version == "pl" {
return label, gatherPL(sec)
}
@@ -105,9 +133,10 @@ func resolveRef(version string, sec liturgy.Section, lectionary string) (string,
// GatherVerses returns one version's verses for a section as raw bible.Verse
// structs (for column/interlinear alignment). versified is false for "pl"
// (paragraph text, no verse numbers) and on any resolution/lookup failure --
-// callers fall back to GatherVersion's string blocks for those.
-func GatherVerses(version string, sec liturgy.Section, lectionary string) (label string, verses []bible.Verse, versified bool) {
- label = versionLabels[version]
+// callers fall back to GatherVersion's string blocks for those. lang selects
+// the UI chrome language the label comes from, same as GatherVersion.
+func GatherVerses(version string, sec liturgy.Section, lectionary, lang string) (label string, verses []bible.Verse, versified bool) {
+ label = versionLabel(version, lang)
if version == "pl" {
return label, nil, false
}
@@ -177,16 +206,17 @@ func OfflineVersions(versions []string) []string {
}
// Compare lays the versions of one reading section out as parallel columns,
-// side by side, wrapped to fit width. Ports render_compare.
-func Compare(secs []liturgy.Section, versions []string, width int, lectionary string) string {
+// side by side, wrapped to fit width. Ports render_compare. lang selects the
+// column-header label language (see GatherVersion).
+func Compare(secs []liturgy.Section, versions []string, width int, lectionary, lang string) string {
var out []string
for _, sec := range secs {
- out = append(out, compareSection(sec, versions, width, lectionary))
+ out = append(out, compareSection(sec, versions, width, lectionary, lang))
}
return strings.Join(out, "\n\n")
}
-func compareSection(sec liturgy.Section, versions []string, width int, lectionary string) string {
+func compareSection(sec liturgy.Section, versions []string, width int, lectionary, lang string) string {
type column struct {
label string
lines []string
@@ -205,7 +235,7 @@ func compareSection(sec liturgy.Section, versions []string, width int, lectionar
cols := make([]column, 0, n)
height := 0
for _, v := range versions {
- label, blocks := GatherVersion(v, sec, lectionary)
+ label, blocks := GatherVersion(v, sec, lectionary, lang)
var lines []string
for _, b := range blocks {
lines = append(lines, strings.Split(wrap(b, w), "\n")...)