The bot's locales/*.json files do not contain the webapp-specific keys (connect, extend_subscription, loading, etc.), so applyI18n was overwriting the localized HTML defaults with raw key names. Merge the bundled FALLBACK_I18N table with whatever the server provides per language, letting server values override but falling back to the in-bundle translations for keys the bot does not ship.