- Validate static t() keys even under a dynamic prefix (dynamic prefixes now
only affect the unused calc, not missing) — Copilot
- Strip JS/TS/JSX comments before scanning so keys in comments aren't counted
as usage — CodeRabbit
- Run i18n:check as part of \un run test\ so local mirrors CI — CodeRabbit
- Fix stale 'all locale files' comment (fixer is source-only) — Copilot
Dependency-free Bun script (bun run i18n:check, added to the linting matrix):
flags keys referenced in code but missing from en.json, and keys in en.json
referenced nowhere. Handles dynamic t(\prefix.\\) and keys stored as string
constants (exact delimited-literal match). Source-only: only en.json is
checked/edited; Crowdin syncs the other locales. Planned-feature keys are
allow-listed in scripts/i18n-keys.config.json.
Build #9 proved `-weak_framework SwiftUICore` does NOT bypass the allowed-client
check, and applying it to the tvOS app target regressed tvOS — reverted that
plugin (withSwiftUICoreWeakLink).
Confirmed root cause from build #8/#9 logs: both iOS jobs fail at the app
*executable* link (`Ld … Streamyfin`), not at any pod. SwiftUI was split into
SwiftUI + SwiftUICore on iOS 26; the SwiftUI pods emit a `-framework SwiftUICore`
autolink directive that, under use_frameworks :static, is inherited by the app's
static link, and the app isn't an allowed client of the private SwiftUICore.tbd.
Fix: in the pod post_install, compile pods with
`-Xfrontend -disable-autolink-framework -Xfrontend SwiftUICore` so they stop
emitting that direct autolink. SwiftUICore symbols then resolve through SwiftUI's
re-export (SwiftUI.tbd re-exports SwiftUICore). Scoped to phone
(ENV['EXPO_TV'] != '1') to leave the green tvOS build untouched.
Also harden scripts/ios/build-ios.ts: displayBuildError now surfaces the
"Undefined symbols for architecture …" linker block, which the error:-only
pattern filter was swallowing (so unsigned-build failures show the real symbol).