chahinebrini
2e409efaf0
feat(onboarding/android + backend/lyra-i18n): platform-dispatch + post-catalog scaffold
Android-Onboarding (Platform.OS dispatch in ProtectionSlide):
- Neue Phasen für Android: preexplain_vpn → preexplain_a11y → a11y_pending
- AppState-Listener: nach Settings-Rückkehr auto-poll isAccessibilityEnabled
→ wenn live, armTamperLock + finish (kein Fokus-Klick nötig)
- onboardingAssets: 8 neue Mappings (android_vpn + android_a11y × 4 Locales)
- Screenshots: vpn-permission + a11y-rebreak-row pro Locale
- Locale-Keys: protection_url_android, protection_lock_android, cta_open_a11y,
cta_check_a11y, dialog_button_vpn_ok, dialog_button_a11y_toggle, tap_marker_hint_*
Lyra-Post i18n Phase 1 (Scaffold, feature-flag OFF by default):
- schema.prisma: CommunityPost.i18nKey String? (nullable)
- migration 20260517_add_lyra_post_i18n_key: ALTER TABLE ADD COLUMN i18n_key
(NICHT auto-deployed — `prisma migrate deploy` als separater Step)
- server/lib/lyraPostCatalog.ts: 15 Templates skelettiert + pickRandomTemplate
- cron/lyra-post: USE_TEMPLATE_CATALOG=true Branch → speichert i18nKey;
default false → LLM-Path unverändert (zero-risk-deployment)
- community.createPost: optionaler i18nKey-Parameter
- posts.get: i18nKey in API-Response
- PostCard: 3-Zeilen-Branch — i18nKey ? t('lyra_posts.'+id) : content
- stores/community: i18nKey?: string|null im Interface
- de.json: lyra_posts-Block mit 15 IDs + DE-Texten
Single-Banner-Verhalten auf Android verifiziert:
lockedIn=urlFilter && appDeletionLock funktioniert weiter — auf Android
alias appDeletionLock ← tamperLock; onboarding arms tamperLock, also
nach onboarding-done direkt ProtectionLockedCard sichtbar.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-17 23:48:25 +02:00
..
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-07 21:14:06 +02:00
2026-05-08 22:30:03 +02:00
2026-05-08 19:31:28 +02:00
2026-05-09 23:48:11 +02:00
2026-05-09 22:28:07 +02:00
2026-05-09 15:55:28 +02:00
2026-05-09 15:48:35 +02:00
2026-05-09 15:48:35 +02:00
2026-05-09 16:28:36 +02:00
2026-05-11 04:06:49 +02:00
2026-05-11 04:40:32 +02:00
2026-05-11 17:19:37 +02:00
2026-05-11 16:23:02 +02:00
2026-05-13 16:35:18 +02:00
2026-05-13 19:13:24 +02:00
2026-05-13 16:35:18 +02:00
2026-05-13 19:06:01 +02:00
2026-05-13 21:04:14 +02:00
2026-05-14 22:05:35 +02:00
2026-05-14 22:05:35 +02:00
2026-05-15 21:16:05 +02:00
2026-05-15 22:41:17 +02:00
2026-05-16 21:00:20 +02:00
2026-05-16 01:53:03 +02:00
2026-05-16 10:04:34 +02:00
2026-05-16 00:29:35 +02:00
2026-05-16 02:24:42 +02:00
2026-05-16 08:50:04 +02:00
2026-05-17 15:52:53 +02:00
2026-05-17 23:48:25 +02:00
2026-05-17 19:05:37 +02:00
2026-05-17 22:39:18 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00
2026-05-06 07:13:43 +02:00