OTE events/feeds can carry per-field translations (name/description, keyed by BCP 47 tag), but feed.ics and feed.xml are only ever generated from the primary textLanguage content — build-feed reads translations but never feeds it to the exporters (see packages/build-feed/src/index.ts, around the FEED_CONFIG_FIELDS comment). JSON consumers (e.g. apps/embed) can use translations directly, but ICS/RSS subscribers only ever see one language.
Idea: generate one ICS/RSS file per language present in the feed's translations, so subscribers can pick e.g. feed.en.ics instead of only the primary-language feed.ics.
Open design questions to resolve before implementation:
- Fallback semantics: a given event may have a translation for some languages but not others — does the per-language feed fall back to the primary text for that event, or omit/flag it?
- Which languages to generate: the union of every event's + the feed's own
translations keys? Configurable allow-list in ote.config.json?
- Naming/URL convention:
feed.en.ics vs en/feed.ics — needs to work with build-pages.yml (currently assumes one fixed feed.json/feed.ics/feed.xml) and with apps/preview's URL guessing (pagesUrl/rawUrl/sibling-file logic in apps/preview/src/main.ts), which also assumes fixed filenames.
Scope: this lives entirely in ote-tools (packages/build-feed, the two exporters, build-pages.yml, possibly apps/preview). Consuming repos (forks of ote-template) wouldn't need any changes beyond linking the new files.
Intentionally split out from the Markdown→HTML description rendering work (RSS <description> + ICS X-ALT-DESC) — independent, larger design decision.
OTE events/feeds can carry per-field
translations(name/description, keyed by BCP 47 tag), butfeed.icsandfeed.xmlare only ever generated from the primarytextLanguagecontent —build-feedreadstranslationsbut never feeds it to the exporters (seepackages/build-feed/src/index.ts, around theFEED_CONFIG_FIELDScomment). JSON consumers (e.g.apps/embed) can usetranslationsdirectly, but ICS/RSS subscribers only ever see one language.Idea: generate one ICS/RSS file per language present in the feed's translations, so subscribers can pick e.g.
feed.en.icsinstead of only the primary-languagefeed.ics.Open design questions to resolve before implementation:
translationskeys? Configurable allow-list inote.config.json?feed.en.icsvsen/feed.ics— needs to work withbuild-pages.yml(currently assumes one fixedfeed.json/feed.ics/feed.xml) and withapps/preview's URL guessing (pagesUrl/rawUrl/sibling-file logic inapps/preview/src/main.ts), which also assumes fixed filenames.Scope: this lives entirely in
ote-tools(packages/build-feed, the two exporters,build-pages.yml, possiblyapps/preview). Consuming repos (forks ofote-template) wouldn't need any changes beyond linking the new files.Intentionally split out from the Markdown→HTML description rendering work (RSS
<description>+ ICSX-ALT-DESC) — independent, larger design decision.