UI/UX pass: i18n completion, responsive fixes, cleanup
Deploy Iddaai Frontend / build-and-deploy (push) Successful in 2m37s
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:
+126
-7
@@ -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
@@ -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"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user