Turkish → German dil öğrenme uygulaması. Duolingo tarzı dersler, XP/seri/can sistemi, başarımlar ve günlük görevler.
# Bağımlılıkları yükle
npm install
# Geliştirme sunucusu (cache temizleyerek)
npx expo start -c
# Telefonunda Expo Go uygulamasıyla QR kodu taraGereksinimler:
- Node.js 20+
- Expo SDK 54
- Expo Go (iOS/Android telefonda)
Vogel/
├── app/ # Expo Router sayfaları
│ ├── (tabs)/ # Tab navigator (Harita / Profil / Market / Dersler)
│ ├── lesson/[lessonId].tsx # Ders ekranı (dinamik)
│ ├── onboarding.tsx # İlk açılış akışı
│ ├── settings.tsx # Ayarlar
│ ├── achievements.tsx # Tüm rozetler grid
│ ├── daily-goal.tsx # Günlük hedef ekranı
│ ├── review.tsx # Spaced repetition tekrar
│ └── _layout.tsx # Root layout (StatusBar, GestureHandler, AchievementToast)
└── src/
├── components/ # Tüm UI bileşenleri
│ ├── achievements/ # AchievementToast + Summary
│ ├── exercises/ # MultipleChoice / Translate / Listen / FillBlank / Speak
│ ├── feedback/ # CorrectFeedback / WrongFeedback / Confetti
│ ├── lesson/ # LessonHeader / LessonComplete / GrammarTip / LevelUp
│ ├── map/ # LessonNode / MapPath / SegmentedRing / BirdMascot / LevelTabs
│ ├── profile/ # AvatarCard / XPBar / StatGrid / StreakCalendar / DailyQuestPanel / StreakBanner
│ ├── shop/ # ShopItem / KupaPackage
│ └── ui/ # ConfirmDialog / GlassCard / PrimaryButton / Chip / IconButton
├── data/
│ ├── courses/ # A1, A2, B1, B2, C1 müfredat dosyaları
│ └── achievements.ts # Başarım rozet tanımları
├── i18n/ # TR/EN sözlüğü + useT hook
├── store/ # Zustand store (useUserStore.ts)
├── theme/ # Renk paleti + useThemeColors hook
├── types/ # TypeScript tip tanımları
└── utils/ # exerciseHelpers, sounds (Audio cache)
- Zustand + AsyncStorage persist (
vogel-user-storage, version 6). - Tüm state
useUserStore.tsiçinde. Set'ler için custom serializer/reviver. - Self-healing merge: eski buggy versiyonlarda yanlış cevaplı dersler completed olarak kalmışsa hydration'da otomatik temizlenir.
- Default dark mode. Sistem tema takip edilmez (Appearance API kullanılmaz).
- Renkler
src/theme/colors.ts'de iki palette:dark+light. - Component'lerde
const c = useThemeColors()+makeStyles(c)pattern'i. - Asla module-level
dark.Ximport etme — daima hook ile.
- TR + EN destekli.
src/i18n/index.tstek dosyada sözlük. - Türkçe karakterler doğru: ı, İ, ö, Ö, ü, Ü, ş, Ş, ğ, Ğ, ç, Ç.
- Kullanım:
const t = useT(), sonrat('common.continue')veyat('achievements.summary', { unlocked: 5, total: 18 }). - Yeni metin eklerken hardcoded string yazma — daima sözlüğe ekle.
- Lesson screen
useReducerile tek state (12 useState → 1 dispatch). - Tüm exercise + feedback component'leri
React.memo. - Handler'lar
useCallback+ state bağımlılığı yok → tamamen stable referans. - LessonNode + SegmentedRing memo (haritada 30+ instance var).
- Sounds:
Audio.Soundinstance cache, ilk çalmadan sonra reuse.
- 5 seviye: A1, A2, B1, B2, C1 — toplam ~120 ders, ~500+ kelime, ~150+ cümle.
- Her ders ortalama 7 egzersiz (5 multipleChoice + 2 cümle).
- Almanca isimler artikelli (Der/Die/Das).
- Bazı derslerde
grammarNotealanı var → ders öncesi intro card gösterilir.
- 17 rozet, 4 renk grubu (neon/gold/purple/cyan).
src/data/achievements.ts'de tanımlar (id + iconName + i18n key + check fn + color).- Lesson tamamlandığında
checkAndUnlockAchievements()çağrılır. - Yeni rozet açılınca üstten kayan toast (
AchievementToast, 3.5sn).
- Yanlış cevaplanan egzersizler
reviewItemsmap'inde saklanır. - Her doğru cevapta
strengthartar (max 5), 3 ardışık doğruda kayıttan silinir. app/review.tsxekranıgetDueReviewItems()ile vade gelmiş tekrarları gösterir.
- Her gün 3 random görev (1 ders / 30 XP / 10 doğru cevap gibi).
- Tamamlanınca claim butonu → ödül XP eklenir.
- Tarih değişince otomatik rotasyon (
refreshDailyQuestsIfNeeded).
cd C:\Users\i9pc\Documents\Vogel
npx expo start -cTest akışı:
- Onboarding → günlük hedef seç → ana ekran (Harita)
- Bir derse gir → eğer grammarNote varsa intro card → cevapla → feedback → devam
- Profil → AvatarCard, XPBar, StatGrid, AchievementsSummary, DailyQuestPanel, StreakCalendar görünmeli
- Achievements → /achievements'a git, tüm rozetler grid görünmeli
- Settings → tema değiştir (dark/light), dil değiştir (tr/en)
- Speech.speak (TTS) Android'de bazen kasıyor —
lastSpeakAtRefile 250ms debounce var. - Audio.Sound ilk yüklemede kısa gecikme var — soundCache ile sonraki çalmalar hızlı.
- Level Up Screen aktif tetiklenmiyor — store'da
levelalanı yok, sadece XP/100 hesaplaması var. İlerleyen sürümlerde milestone tetikleyici eklenebilir. - Push Notifications: expo-notifications package kurulu değil. Hatırlatma sistemi için kurulması gerek.
- MatchPairs egzersizi: Type tanımı var ama UI render edilmiyor (lesson screen sadece 5 tip render ediyor: MC/Translate/Listen/FillBlank/Speak).
- Gerçek STT (sesten metne): SpeakExercise'da cloud STT yok; mikrofon kaydı sonrası hedef metni kademe kademe yazıyor (simülasyon).
src/data/courses/tr-de-XX.tsiçinde uygun üniteninlessonsarray'ine ekle.- ID formatı:
tr-de-{level}-u{unitNo}-l{lessonNo}(örntr-de-a1-u2-l3). - Her egzersiz unique ID:
tr-de-a1-u2-l3-e1. - Gramer notu eklemek için
grammarNote: { tr: '...', en: '...' }koy.
src/data/achievements.ts'deACHIEVEMENTSarray'ine yeniAchievementDefinitionekle.src/i18n/index.ts'deachievements.{newRozetId}Titleve{newRozetId}Desckeylerini ekle.checkfonksiyonundaAchievementStateüzerinden koşulu yaz.
src/types/index.ts'deExerciseTypeunion'ına yeni tip ekle ve type tanımı yap.src/components/exercises/NewExercise.tsxoluştur,React.memoile sar.app/lesson/[lessonId].tsx'de render dalını ekle + reducer'a aksiyon ekle.src/utils/exerciseHelpers.ts'degetCorrectAnswerTextveisAnswerCorrectfonksiyonlarına case ekle.
Özel — sahibi: Samet.