SIGN IN SIGN UP

feat(reader): parse and persist feed and entry language from RSS, Atom, and JSON Feed

Reads the language declared by each feed and entry at parse time, persists
it on new `feeds.language` and `entries.language` columns, and exposes both
via the existing Feed/Entry JSON marshalling.

Sources:
- RSS feed: <language>
- RSS item: <dc:language>
- Atom 1.0 feed/entry: xml:lang
- Atom 0.3 feed/entry: xml:lang
- JSON Feed feed/item: "language"

Values are normalized at parse time (trim + lower-case + _ -> -) so they
are directly usable as an HTML lang attribute. No strict BCP-47 validation
is performed: many real feeds use loose values, and silently dropping them
yields worse downstream behaviour than passing them through.

The refresh path treats language as feed/entry-declared metadata and always
trusts the latest fetched value.
B
Bram Duvigneau committed
d456718c05f9c7e2a4fb6e918c6b45935c96d14f
Parent: 4aa60ba
Committed by fguillot <323546+fguillot@users.noreply.github.com> on 7/2/2026, 4:00:17 AM