UI/UX pass: i18n completion, responsive fixes, cleanup
Deploy Iddaai Frontend / build-and-deploy (push) Successful in 2m37s

- Fix flex 'align=flex-start' shrinking content to min width in column
  mode on matches, dashboard, and coupon-builder layouts (mobile/tablet
  cards now span full width)
- Localize all user-facing hardcoded Turkish strings: lineups card,
  odds card, v28 odds band panel, team/league pages, teams search,
  auth toasts, league headers (new keys in tr/en messages)
- Populate empty predictions.prediction-reasons group (20 veto reasons)
  and missing predictions.ui keys so the EN locale gets full coverage
- Use the active locale for all date formatting instead of hardcoded
  tr-TR (match card, match detail, team detail)
- Replace raw native date input with Chakra Input (dark mode + theming)
- Rename match-detail first tab from 'Tüm Maçlar' to 'Genel Bakış'
- Fix '4 maçlar' grammar with a proper {count} maç message
- Delete dead 3300-line Chakra showcase component (home-card.tsx)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-06-10 16:55:52 +03:00
parent 095992ad26
commit 5dc3d7e3a3
20 changed files with 407 additions and 3463 deletions
+126 -7
View File
@@ -38,7 +38,9 @@
"login-success": "Login successful!",
"register-success": "Registration successful!",
"login-required-title": "Login Required",
"login-required-message": "Please sign in or create an account to view match analysis."
"login-required-message": "Please sign in or create an account to view match analysis.",
"login-error": "Login failed!",
"register-error": "Registration failed!"
},
"all-right-reserved": "All rights reserved.",
"privacy-policy": "Privacy Policy",
@@ -155,7 +157,26 @@
"penalty": "Penalty",
"half-time": "1st Half",
"second-half": "2nd Half",
"assist": "Assist"
"assist": "Assist",
"live-odds": "Live Betting Odds",
"lineup-official-xi": "Official Starting XI",
"lineup-confirmed-squad": "Confirmed Squad",
"lineup-confirmed": "Confirmed",
"lineup-confirmed-live-desc": "The lineup has been officially confirmed.",
"lineup-participation-desc": "Lineup taken from match participation data.",
"lineup-probable-squad": "Probable Squad",
"lineup-probable": "Probable",
"lineup-probable-desc": "Probable lineup based on starting XI data from recent matches. The AI analysis is based on this squad.",
"lineup-info": "Lineup Info",
"lineup-pending": "Awaiting Lineup",
"lineup-pending-desc": "The lineup has not been announced yet. The AI analysis is based on overall team strength and statistics.",
"lineup-tbd": "Lineup not yet known",
"lineup-tbd-sub": "Will be updated close to kick-off",
"lineup-not-announced": "Lineup Not Announced Yet",
"lineup-not-announced-desc": "{home} and {away} lineups will be updated close to kick-off. The AI analysis is based on team statistics and balance of strength.",
"overview": "Overview",
"match-count": "{count} matches",
"odds-legend": "% = model's calibrated hit probability · ↓↑ = opening→closing movement"
},
"predictions": {
"title": "Predictions",
@@ -223,7 +244,27 @@
"no_bet_conditions_met": "The algorithm could not find a safe/valuable bet for this match.",
"insufficient_play_score": "Model signal is below the threshold.",
"no_ev_edge_minimum_stake": "Passed safety gates but no mathematical edge — minimum stake applied.",
"upset_risk_detected": "High upset risk detected, proceed with caution."
"upset_risk_detected": "High upset risk detected, proceed with caution.",
"confidence_interval_too_wide": "The confidence interval is too wide.",
"confidence_band_low": "The confidence band is low.",
"draw_probability_elevated": "The draw probability looks elevated.",
"balanced_match_risk": "The match looks balanced; there is upset risk.",
"high_total_goal_volatility": "High goal tempo increases the upset risk.",
"mutual_goal_pressure": "Both teams are generating goal threat.",
"late_goal_swing_risk": "High risk of a late goal or score swing.",
"live_match_open_state": "The live match has turned completely open.",
"live_match_active_state": "The live match is more active than expected.",
"live_state_impossible_market": "The live match state invalidates this market.",
"live_score_exceeds_under_line": "The live score is very close to or past the under line.",
"score_model_conflicts_with_under_pick": "The score and xG model conflict with this under pick.",
"score_model_conflicts_with_over_pick": "The score and xG model conflict with this over pick.",
"market_stack_conflict_over25": "The over 2.5 signal conflicts with this market.",
"market_stack_conflict_btts": "The BTTS signal conflicts with this market.",
"live_total_goals_close_to_line": "The live total goals are too close to this line.",
"score_model_conflicts_with_btts_no": "The score and xG model conflict with the BTTS-No pick.",
"score_model_conflicts_with_draw_pick": "The score model does not support the draw pick.",
"score_model_conflicts_with_home_pick": "The score model does not support the home pick.",
"score_model_conflicts_with_away_pick": "The score model does not support the away pick."
},
"ev-edge": "Theoretical Edge",
"implied-prob": "Market Probability",
@@ -360,7 +401,11 @@
"confidence-medium": "Medium",
"confidence-low": "Low",
"confidence-unknown": "Unknown",
"info": "Info"
"info": "Info",
"unified-confidence": "Confidence Score",
"underdog-ref-tooltip": "Model probability of the underdog side (informational)",
"trap-tooltip": "The market is overconfident",
"no-value-tooltip": "Model agrees with the favourite but the odds are too low"
}
},
"coupons": {
@@ -487,7 +532,8 @@
"freq-mode-active": "Frequency Engine active",
"ai-mode-active": "AI Engine active",
"engine-mode-label": "Engine Mode",
"engine-mode-help": "AI: Gemini-based AI prediction. Frequency: Database-driven statistical analysis."
"engine-mode-help": "AI: Gemini-based AI prediction. Frequency: Database-driven statistical analysis.",
"all-markets-scanned": "All markets will be scanned"
},
"profile": {
"title": "Profile",
@@ -519,7 +565,14 @@
"leagues": "Leagues",
"countries-leagues": "Countries & Leagues",
"search-at-least-2": "Type at least 2 characters to search teams.",
"all": "All"
"all": "All",
"back-to-leagues": "Back to Leagues",
"league-not-found": "League Not Found",
"past-matches": "Past Matches",
"not-found": "Not Found",
"no-leagues-found": "No leagues match the selected criteria.",
"team-not-found": "Team Not Found",
"no-teams-found": "No team found matching \"{query}\"."
},
"h2h": {
"title": "Head to Head",
@@ -809,5 +862,71 @@
"remaining": "remaining"
}
},
"refund-policy": "Refund Policy"
"refund-policy": "Refund Policy",
"teams": {
"search-placeholder": "Type a team name... (min 2 characters)",
"search-hint": "Type the name of the team you are looking for",
"search-example": "E.g.: Galatasaray, Barcelona, Manchester City",
"no-results": "No results found",
"upcoming": "Upcoming",
"not-found": "Team not found",
"matches-count": "Matches",
"upcoming-matches": "Upcoming Matches",
"past-matches": "Past Matches",
"page-info": "Page {page}/{totalPages} • {total} matches in total",
"no-past-matches-season": "No past matches found for this season"
},
"v28": {
"avg-cards": "Avg: {avg} cards",
"band": "Band",
"cards-analysis": "Cards Analysis",
"combined-over-rate": "Combined OVER Rate",
"combined-weighting": "Weighted 60% referee + 40% teams",
"confirmations": "Confirm",
"engines-agree": "Engines Agree",
"engines-disagree": "Engines Disagree",
"ft": "FT",
"ht": "HT",
"htft-info": "Historical hit rates of half-time/full-time combinations within a similar odds band.",
"htft-title": "HT/FT Combinations",
"insufficient": "LOW DATA",
"insufficient-data": "Insufficient data — not enough match samples yet.",
"label-away": "FT Away",
"label-btts_yes": "BTTS Yes",
"label-cards_over": "Cards Over",
"label-dc_12": "DC 12",
"label-dc_1x": "DC 1X",
"label-dc_x2": "DC X2",
"label-home": "FT Home",
"label-ht_away": "HT Away",
"label-ht_home": "HT Home",
"label-ht_ou05_over": "HT Over 0.5",
"label-ht_ou15_over": "HT Over 1.5",
"label-htft_11": "HT/FT 1/1",
"label-htft_12": "HT/FT 1/2",
"label-htft_1x": "HT/FT 1/X",
"label-htft_21": "HT/FT 2/1",
"label-htft_22": "HT/FT 2/2",
"label-htft_2x": "HT/FT 2/X",
"label-htft_x1": "HT/FT X/1",
"label-htft_x2": "HT/FT X/2",
"label-htft_xx": "HT/FT X/X",
"label-oe_odd": "Odd",
"label-ou15_over": "Over 1.5",
"label-ou25_over": "Over 2.5",
"label-ou35_over": "Over 3.5",
"matches-count": "{count} matches",
"odds": "Odds",
"over-rate": "Over rate",
"panel-info": "Statistical analysis of results that occurred at similar odds in past matches. Includes Triple Value, Cards Profile, and HT/FT combinations.",
"panel-title": "V28 Odds Band Analysis",
"pass": "PASS",
"referee-profile": "Referee Profile",
"strongest": "Strongest",
"team-profile": "Team Profile",
"triple-value-info": "Comparison of model probability, odds-band statistics, and market odds. A positive edge means the model sees an advantage.",
"triple-value-title": "Value Detection (Triple Value)",
"value": "VALUE",
"value-signals": "{count} Value Signals"
}
}
+126 -7
View File
@@ -38,7 +38,9 @@
"login-success": "Giriş başarılı!",
"register-success": "Kayıt başarılı!",
"login-required-title": "Giriş Yapmanız Gerekiyor",
"login-required-message": "Maç analizlerini görüntülemek için lütfen giriş yapın veya hesap oluşturun."
"login-required-message": "Maç analizlerini görüntülemek için lütfen giriş yapın veya hesap oluşturun.",
"login-error": "Giriş yapılamadı!",
"register-error": "Kayıt yapılamadı!"
},
"all-right-reserved": "Tüm hakları saklıdır.",
"privacy-policy": "Gizlilik Politikası",
@@ -155,7 +157,26 @@
"penalty": "Penaltı",
"half-time": "İlk Yarı",
"second-half": "İkinci Yarı",
"assist": "Asist"
"assist": "Asist",
"live-odds": "Canlı İddaa Oranları",
"lineup-official-xi": "Resmi İlk 11",
"lineup-confirmed-squad": "Onaylı Kadro",
"lineup-confirmed": "Onaylı",
"lineup-confirmed-live-desc": "Kadro resmi olarak onaylandı.",
"lineup-participation-desc": "Kadro maç katılım verilerinden alındı.",
"lineup-probable-squad": "Muhtemel Kadro",
"lineup-probable": "Muhtemel",
"lineup-probable-desc": "Son maçlardaki ilk 11 verilerine dayalı muhtemel kadro. AI analizi bu kadro üzerinden yapılmaktadır.",
"lineup-info": "Kadro Bilgisi",
"lineup-pending": "Kadro Bekleniyor",
"lineup-pending-desc": "Kadro henüz açıklanmadı. AI analizi, takımların genel güç dengesi ve istatistiklerine dayalı olarak üretilmiştir.",
"lineup-tbd": "Kadro henüz belli değil",
"lineup-tbd-sub": "Maç saatine yakın güncellenecek",
"lineup-not-announced": "Kadro Henüz Açıklanmadı",
"lineup-not-announced-desc": "{home} ve {away} kadroları maç saatine yakın güncellenecektir. AI analizi, takım istatistikleri ve güç dengesi üzerinden yapılmaktadır.",
"overview": "Genel Bakış",
"match-count": "{count} maç",
"odds-legend": "%= modelin tutma olasılığı (kalibre) · ↓↑ = açılış→kapanış hareketi"
},
"predictions": {
"title": "Tahminler",
@@ -223,7 +244,27 @@
"missing_spread_odds": "Handikap oranları eksik.",
"no_bet_conditions_met": "Algoritma bu maç için güvenli/değerli bir bahis önerisi bulamadı.",
"insufficient_play_score": "Model sinyali eşiğin altında kaldı.",
"no_ev_edge_minimum_stake": "Güvenlik kontrollerini geçti ancak matematik avantaj yok — minimum bahis uygulandı."
"no_ev_edge_minimum_stake": "Güvenlik kontrollerini geçti ancak matematik avantaj yok — minimum bahis uygulandı.",
"confidence_interval_too_wide": "Güven aralığı fazla geniş.",
"confidence_band_low": "Güven bandı düşük.",
"draw_probability_elevated": "Beraberlik olasılığı yükselmiş görünüyor.",
"balanced_match_risk": "Maç dengeli görünüyor, sürpriz riski var.",
"high_total_goal_volatility": "Yüksek gol temposu sürpriz riskini artırıyor.",
"mutual_goal_pressure": "İki takım da gol tehdidi üretiyor.",
"late_goal_swing_risk": "Geç gol veya skor kırılması riski yüksek.",
"live_match_open_state": "Canlı maç tamamen açık oyuna dönmüş durumda.",
"live_match_active_state": "Canlı maç beklenenden daha hareketli ilerliyor.",
"live_state_impossible_market": "Canlı maç durumu bu marketi geçersiz kılıyor.",
"live_score_exceeds_under_line": "Canlı skor, alt seçeneğinin üst sınırına çok yaklaştı veya geçti.",
"score_model_conflicts_with_under_pick": "Skor ve xG modeli bu alt seçeneğiyle çelişiyor.",
"score_model_conflicts_with_over_pick": "Skor ve xG modeli bu üst seçeneğiyle çelişiyor.",
"market_stack_conflict_over25": "2.5 üst sinyali bu marketle çelişiyor.",
"market_stack_conflict_btts": "KG Var sinyali bu marketle çelişiyor.",
"live_total_goals_close_to_line": "Canlı toplam gol sayısı bu çizgiye fazla yaklaştı.",
"score_model_conflicts_with_btts_no": "Skor ve xG modeli KG Yok seçeneğiyle çelişiyor.",
"score_model_conflicts_with_draw_pick": "Skor modeli beraberlik seçeneğini desteklemiyor.",
"score_model_conflicts_with_home_pick": "Skor modeli ev sahibi seçeneğini desteklemiyor.",
"score_model_conflicts_with_away_pick": "Skor modeli deplasman seçeneğini desteklemiyor."
},
"ev-edge": "Teorik Avantaj",
"implied-prob": "Piyasa Olasılığı",
@@ -360,7 +401,11 @@
"confidence-medium": "Orta",
"confidence-low": "Düşük",
"confidence-unknown": "Belirsiz",
"info": "Bilgi"
"info": "Bilgi",
"unified-confidence": "Güven Skoru",
"underdog-ref-tooltip": "Underdog tarafının model olasılığı (bilgi amaçlı)",
"trap-tooltip": "Piyasa aşırı güveniyor",
"no-value-tooltip": "Model favoriyle hemfikir ama oran çok düşük"
}
},
"coupons": {
@@ -487,7 +532,8 @@
"freq-mode-active": "Frekans Motoru aktif",
"ai-mode-active": "AI Motoru aktif",
"engine-mode-label": "Motor Seçimi",
"engine-mode-help": "AI: Gemini tabanlı yapay zeka tahmini. Frekans: Veritabanı tabanlı istatistiksel analiz."
"engine-mode-help": "AI: Gemini tabanlı yapay zeka tahmini. Frekans: Veritabanı tabanlı istatistiksel analiz.",
"all-markets-scanned": "Tüm marketler taranacak"
},
"profile": {
"title": "Profil",
@@ -519,7 +565,14 @@
"leagues": "Ligler",
"countries-leagues": "Ülkeler & Ligler",
"search-at-least-2": "Takım aramak için en az 2 karakter yazın.",
"all": "Tümü"
"all": "Tümü",
"back-to-leagues": "Liglere Dön",
"league-not-found": "Lig Bulunamadı",
"past-matches": "Geçmiş Maçlar",
"not-found": "Bulunamadı",
"no-leagues-found": "Seçili kriterlere uygun lig bulunamadı.",
"team-not-found": "Takım Bulunamadı",
"no-teams-found": "\"{query}\" aramasıyla eşleşen bir takım bulunamadı."
},
"h2h": {
"title": "Karşılıklı Karşılaşma",
@@ -809,5 +862,71 @@
"remaining": "kalan"
}
},
"refund-policy": "İade Politikası"
"refund-policy": "İade Politikası",
"teams": {
"search-placeholder": "Takım adı yazın... (min 2 karakter)",
"search-hint": "Aramak istediğiniz takımın adını yazın",
"search-example": "Örnek: Galatasaray, Barcelona, Manchester City",
"no-results": "Sonuç bulunamadı",
"upcoming": "Yaklaşan",
"not-found": "Takım bulunamadı",
"matches-count": "Maç",
"upcoming-matches": "Yaklaşan Maçlar",
"past-matches": "Geçmiş Maçlar",
"page-info": "Sayfa {page}/{totalPages} • Toplam {total} maç",
"no-past-matches-season": "Bu sezonda geçmiş maç bulunamadı"
},
"v28": {
"avg-cards": "Ort: {avg} kart",
"band": "Band",
"cards-analysis": "Kart Analizi",
"combined-over-rate": "Kombine ÜST Oranı",
"combined-weighting": "%60 Hakem + %40 Takım ağırlıklı",
"confirmations": "Onay",
"engines-agree": "Motorlar Uyumlu",
"engines-disagree": "Motorlar Farklı",
"ft": "MS",
"ht": "İY",
"htft-info": "İlk yarı sonucu ve maç sonucu kombinasyonlarının tarihsel oran bandındaki gerçekleşme oranları.",
"htft-title": "İY/MS Kombinasyonları",
"insufficient": "YETERSİZ",
"insufficient-data": "Yetersiz veri — henüz yeterli maç örneği bulunamadı.",
"label-away": "MS Dep",
"label-btts_yes": "KG Var",
"label-cards_over": "Kart ÜST",
"label-dc_12": "ÇŞ 12",
"label-dc_1x": "ÇŞ 1X",
"label-dc_x2": "ÇŞ X2",
"label-home": "MS Ev",
"label-ht_away": "İY Dep",
"label-ht_home": "İY Ev",
"label-ht_ou05_over": "İY ÜST 0.5",
"label-ht_ou15_over": "İY ÜST 1.5",
"label-htft_11": "İY/MS 1/1",
"label-htft_12": "İY/MS 1/2",
"label-htft_1x": "İY/MS 1/X",
"label-htft_21": "İY/MS 2/1",
"label-htft_22": "İY/MS 2/2",
"label-htft_2x": "İY/MS 2/X",
"label-htft_x1": "İY/MS X/1",
"label-htft_x2": "İY/MS X/2",
"label-htft_xx": "İY/MS X/X",
"label-oe_odd": "Tek",
"label-ou15_over": "ÜST 1.5",
"label-ou25_over": "ÜST 2.5",
"label-ou35_over": "ÜST 3.5",
"matches-count": "{count} maç",
"odds": "Oran",
"over-rate": "Üst oranı",
"panel-info": "Geçmiş maçlarda benzer oranlarda gerçekleşen sonuçların istatistiksel analizi. Triple Value, Kart Profili ve İY/MS kombinasyonlarını içerir.",
"panel-title": "V28 Oran Bandı Analizi",
"pass": "PAS",
"referee-profile": "Hakem Profili",
"strongest": "En güçlü",
"team-profile": "Takım Profili",
"triple-value-info": "Model olasılığı, oran bandı istatistiği ve piyasa oranı karşılaştırması. Edge pozitifse model avantaj görüyor demektir.",
"triple-value-title": "Değer Tespiti (Triple Value)",
"value": "DEĞER",
"value-signals": "{count} Değer Sinyali"
}
}