avfranco's picture
HF Space deploy snapshot (minimal allow-list)
557ee65
# src/domain/i18n.py
from typing import Dict, Any
# UI Localization Text
UI_TEXT = {
"en": {
"welcome": "Welcome to Runner Intelligence. Upload your first run and the system will begin building your training baseline and generating insights.",
"title": "# 🏃 Runner Agentic Intelligence (Experimental)",
"subtitle": '<span class="muted">Personalized coaching from your training data.</span>',
"workflow": '<span class="muted"><b>Workflow:</b> Upload runs ➔ Get Insights ➔ Review Weekly Plan ➔ Chat with Coach</span><br/><span class="muted"><i>Supported formats: .fit, .fit.gz, .tcx, .tcx.gz, .gpx (max 50MB per file)</i></span><br/><span class="muted">Feedback: <a href="https://github.com/ideas-to-life/runner-agentic-intelligence/issues" target="_blank">GitHub Issues</a> or DM me</span>',
"evolution_workflow": '<span class="muted">Track your evolution. Review your weekly check-in and progress vs last month.</span><br/><span class="muted">Upload new runs anytime — your dashboard updates automatically.</span><br/><span class="muted">Feedback: <a href="https://github.com/ideas-to-life/runner-agentic-intelligence/issues" target="_blank">GitHub Issues</a> or DM me</span>',
"tab_analyse": "Analyse",
"tab_results": "Results",
"tab_coach": "Coach",
"tab_home": "Home",
"tab_intelligence": "Intelligence",
"tab_positioning": "Positioning",
"lbl_your_week": "Your Week",
"lbl_current_state": "Current State",
"lbl_key_insight": "Key Insight",
"lbl_forward_focus": "This week's Focus",
"lbl_details": "Details",
"lbl_coach_brief": "Coach Brief",
"lbl_parsed": "Parsed",
"unit_weeks": "weeks",
"lbl_across": "across",
"lbl_current": "Current",
"lbl_previous": "Previous",
"lbl_distance": "Distance",
"lbl_runs": "Runs",
"lbl_avg_pace": "Avg Pace",
"lbl_consistency": "Consistency",
"goal_status_template": "Your goal trajectory is **{val}**.",
"home_story_template": "You ran **{count}** {unit} this week for a {of} **{dist:.1f} km**.",
"sec_evolution": "📈 Progress vs Last Month",
"sec_checkin": "## 🧠 Weekly Check-In",
"lbl_goal_traj_inline": "**🎯 Trajectory:**",
"lbl_focus_inline": "**🎯 Focus:**",
"sec_snapshot": "## 📅 Current Week Snapshot",
"sec_upload": "🗂️ Upload your training data",
"upload_hints": '<div class="muted" style="margin-bottom: 12px; font-size: 0.9rem;"><ul><li>Best results: upload 4–12 recent runs (or ~2–6 weeks).</li><li>Include HR data if you have it (helps fatigue/risk signals).</li><li>Then click ‘Analyse Data’ to populate Results + Coach context.</li></ul></div>',
"upload_label": "Drag and drop or click to upload",
"btn_analyse": "🚀 Analyse Data",
"btn_reset": "Reset",
"sec_insights": "Coaching Insights",
"lbl_risk": "Safety/Risk Assessment",
"lbl_lever": "Primary Lever",
"sec_plan": "Weekly Training Plan",
"sec_charts": "Trends & Analytics",
"sec_chat": "Ask about your training",
"chat_indicator_no": "⚠️ *Upload and analyze runs to enable chat context.*",
"chat_indicator_yes": "✅ *Chat context enabled.*",
"chat_tip": "Tip: try ‘Plot my pace’ or ‘Show HR chart’ to visualize your data.",
"chat_placeholder": "e.g., How was my pace last week?",
"btn_send": "Send",
"btn_clear": "Clear History",
"lang_label": "Language / Idioma",
"starter_limiter": "Biggest limiter?",
"starter_why": "Why this focus?",
"starter_fatigue": "Fatigue risk?",
"starter_keep": "What to keep doing?",
"chat_starter_limiter": "What is my biggest training limiter?",
"chat_starter_why": "Why did you suggest this training focus?",
"chat_starter_fatigue": "Do you see any signs of overtraining or fatigue?",
"chat_starter_keep": "What aspects of my training should I keep doing?",
"analyse_progress": "Analysing training data...",
"insights_primary_lever_heading": "Primary Lever",
"insights_risk_signal_heading": "Risk Signal",
"insights_key_observations_heading": "Key Observations",
"insights_evidence_label": "Evidence",
"insights_constraint_label": "Constraint",
"insights_no_primary_lever": "No primary lever identified.",
"insights_no_risk": "No elevated risk detected.",
"insights_no_observations": "*No observations provided.*",
"insights_analysis_failed": "*Analysis Failed*",
"insights_analysis_pending": "*Analysis pending...*",
"insights_raw_default": "Raw insights will appear here.",
"plan_week_summary_label": "Week summary:",
"plan_focus_label": "This week's focus:",
"plan_pending": "*Plan will appear here after analysis.*",
"progress_extracting": "Extracting features from run data...",
"progress_generating": "Generating insights and training plan...",
"pipeline_stage_1": "🏃 Uploading runs",
"pipeline_stage_2": "📊 Building weekly snapshot",
"pipeline_stage_3": "📈 Analyzing training trends",
"pipeline_stage_4": "🧠 Generating coach insights",
"pipeline_stage_5": "📋 Preparing training recommendation",
"chat_context_indicator": "🧠 **Using your training insights as context**",
"error_no_runs": "No runs to process.",
"lbl_details": "Details (Risk & Observations)",
"banner_title": "⚠️ Public Preview Information",
"banner_session": "**Session Data**: All uploaded data and chat history are temporary and destroyed after the session.",
"banner_persistence_disabled": "🟡 **Public Preview Mode** — No data is persisted. All uploads and derived metrics are temporary.",
"banner_persistence_enabled": "🟢 **Training History Persistence Enabled** — Weekly snapshots and trends are stored locally.",
"banner_medical": "**Medical Advice**: This system provides coaching insights, NOT medical advice. Consult a professional before starting any training plan.",
"banner_full": "**Full Experience**: For full persistence and local storage, run the app locally from [GitHub](https://github.com/avfranco/runner-agentic-intelligence).",
"insights_timestamp_label": "Insights generated on",
"risk_level_low": "LOW",
"risk_level_medium": "MEDIUM",
"risk_level_high": "HIGH",
"chat_error": "I'm sorry, I'm having trouble processing your request right now.",
"plan_error": "Could not generate plan at this time.",
"tab_profile": "Profile",
"sec_profile": "## Runner Profile (Digital Twin v1)",
"lbl_display_name": "Display Name",
"lbl_age": "Age",
"lbl_experience": "Experience Level",
"lbl_injury_notes": "Injury History / Notes",
"btn_save_profile": "Save Profile",
"profile_saved": "Profile saved successfully!",
"profile_save_error": "Error saving profile.",
"lbl_baseline": "Baseline Weekly Distance (km)",
"lbl_gender": "Gender",
"sec_goal": "Active Goal",
"lbl_goal_type": "Goal Type",
"lbl_target": "Target Value",
"lbl_unit": "Unit",
"lbl_date": "Target Date",
"btn_save_goal": "Set Goal",
"goal_saved": "Goal updated!",
"lbl_progress": "Progress",
"lbl_total_distance": "Distance",
"lbl_distance": "Distance",
"lbl_avg_pace": "Avg Pace",
"lbl_avg_hr": "Avg HR",
"lbl_runs_count": "Runs",
"goal_trajectory_title": "Goal Trajectory",
"goal_status": "Status",
"goal_progress": "Progress",
"goal_next_milestone": "Next Milestone",
"goal_status_ahead": "Ahead",
"goal_status_on_track": "On Track",
"goal_status_behind": "Behind",
"lbl_latest_data": "Latest Data Found",
"lbl_consistency": "Consistency",
"lbl_metric": "Metric",
"lbl_interpreted_delta": "Interpreted Δ",
"performance_first_week_title": "This Week in Running",
"performance_first_week_body": "This is your first recorded week. You’re building your performance baseline. As you log more runs, your trends will become clearer.",
"performance_first_week_focus": "Keep logging your sessions to establish a consistent rhythm.",
"error_insufficient_data": "*Not enough history for period comparison (8 weeks required).*",
"goal_status_on_track": "On Track",
"goal_status_slightly_behind": "Slightly Behind",
"goal_status_behind": "Closing the Gap",
"goal_type_race": "Race/Event",
"goal_type_volume": "Weekly Volume",
"goal_type_pace": "Target Pace",
"unit_km": "km",
"unit_runs": "runs",
"unit_bpm": "bpm",
"unit_pts": "pts",
"unit_spkm": "s/km",
"na": "N/A",
"sec_structure": "Weekly Structure",
"lbl_weekday_runs": "Weekday Runs",
"lbl_long_run": "Long Run",
"lbl_structure_status": "Structure Status",
"lbl_km_remaining": "km remaining",
"lbl_km_remaining_subtext": "{val} km",
"coaching_advice": "Stay consistent this week to close the gap.",
"strong_week": "Strong Week",
"structured_but_light": "Structured but Imcomplete Volume",
"rebuild_week": "Rebuild Week",
"reset_week": "Reset Week",
"status_pending": "Pending",
"status_completed": "Completed",
"current_week_label": "Current Week",
"last_week_label": "Last Week",
"lbl_snapshot_title": "Weekly Snapshot",
"no_data_available": "*No runs logged yet this week.*",
"home_no_goal_banner": "No active goal set. Set a goal to generate your weekly training plan.",
"performance_card_header": "This Week in Running",
"delta_vs_4w": "Δ vs 4W avg",
"focus_label": "Forward Focus",
"no_runs_message": "No runs recorded yet. Looking forward to your first activity!",
"btn_download_card": "Download Performance Card",
"next_run.title": "Next Recommended Run",
"next_run.focus": "Focus",
"next_run.session": "Suggested Session",
"next_run.why": "Why",
"next_run.upload_runs_prompt": "### 🏃 Next Run\n*Upload and analyze runs to see your next recommended session.*",
"next_run.set_goal_prompt": "### 🏃 Next Run\n*Set a goal in your Profile to receive personalized training recommendations.*",
"insights_risk_signal_heading": "Risk Signal",
"insights_key_observations_heading": "Key Observations",
"insights_primary_lever_heading": "Primary Lever",
"lbl_home_week_range": "Current Week",
"lbl_health_signal": "Health Signal",
"lbl_goal_trajectory": "Goal Trajectory",
"lbl_this_week": "This Week",
"lbl_local_folder_path": "Local folder path (Server mode)",
"btn_analyse_folder": "Analyse Folder",
"btn_consult_coach": "Consult your Coach",
"btn_starter_limiter": "Biggest limiter?",
"btn_starter_why": "Why this focus?",
"btn_starter_fatigue": "Fatigue risk?",
"acc_knowledge_base": "Knowledge Base & Templates",
"lbl_category": "Category",
"lbl_template": "Template",
"lbl_preview": "Preview",
"btn_insert_message": "Insert into Message Box",
"acc_adjustments": "Adjustments & Notes",
"lbl_pace_trend": "Pace Trend Analysis",
"lbl_hr_trend": "Heart Rate Analysis",
"lbl_gender_male": "Male",
"lbl_gender_female": "Female",
"lbl_gender_pns": "Prefer not to say",
"lbl_gender_none": "None",
"lbl_exp_beginner": "Beginner",
"lbl_exp_intermediate": "Intermediate",
"lbl_exp_advanced": "Advanced",
"lbl_focus_inline": "**Focus:**",
"lbl_total_of": "total of",
"lbl_more": "more",
"lbl_less": "less",
"lbl_faster": "faster",
"lbl_slower": "slower",
"lbl_that_is": "That's",
"lbl_than_avg": "than your recent average.",
"lbl_pace_was": "Your pace was",
"runner_positioning_title": "Runner Positioning",
"positioning_insufficient_data": "Insufficient data to determine positioning yet.",
"positioning_no_data": "No training data available yet.",
"positioning_context_title": "4-Week Context",
"positioning_state_title": "Training State",
"positioning_summary_title": "Summary",
"positioning_focus_title": "Forward Focus",
"positioning_current_state": "Training State",
"positioning_health_signal": "Health Signal",
"positioning_goal_trajectory": "Goal Trajectory",
"analysis_pending": "Analysis pending...",
"analysis_failed": "Analysis failed.",
# Health signals
"health_stable": "Stable",
"health_overreaching": "Under High Load",
"health_strain": "Strain Detected",
# Position status
"position_advancing": "Advancing",
"position_stable": "Stable",
"position_drifting": "Drifting",
# Goal trajectory
"trajectory_improving": "Progressing",
"trajectory_maintaining": "Holding steady",
"trajectory_declining": "Losing ground",
# Focus guidance
"focus_recovery": "Prioritize recovery and absorb recent load.",
"focus_build": "Continue building volume gradually.",
"focus_maintenance": "Maintain current structure and protect consistency.",
"focus_reduce_load": "Reduce load to prevent strain.",
# Positioning v1 Status Names
"positioning_status_constructive_adaptation": "Constructive Adaptation",
"positioning_status_productive_load": "Productive Load",
"positioning_status_strain": "Compensatory Strain",
"positioning_status_plateau": "Plateau",
# Positioning v1 Headlines
"positioning_headline_constructive_adaptation": "Your training is driving clear constructive adaptation.",
"positioning_headline_productive_load": "You protected your baseline this week but did not drive new adaptation.",
"positioning_headline_strain": "Current load is exceeding your capacity to absorb it safely.",
"positioning_headline_plateau": "Training has stabilized after a reduction in volume and frequency. Intensity may now be insufficient to stimulate further adaptation.",
# Rationales
"positioning_rationale_constructive_adaptation": "Load is increasing while maintaining consistency.",
"positioning_rationale_productive_load": "Maintaining load and protecting baseline.",
"positioning_rationale_strain": "Load increase is outpacing cardiovascular adaptation.",
"positioning_rationale_plateau": "Training has stabilized.",
# Forward Focus
"positioning_forward_focus_constructive_adaptation": "Maintain recent volume and allow adaptation to solidify.",
"positioning_forward_focus_productive_load": "Reinforce frequency consistency this week.",
"positioning_forward_focus_strain": "Prioritize active recovery and reduce non-essential session load.",
"positioning_forward_focus_plateau": "Introduce localized intensity spikes to challenge the baseline.",
"positioning_status_baseline": "Baseline Building",
"positioning_headline_baseline": "Your training baseline is being established.",
"positioning_rationale_baseline": "Initial week(s) of training detected. Collecting data to establish trends.",
"positioning_forward_focus_baseline": "Establish consistent easy runs this week.",
"positioning_trajectory_baseline": "Not enough history yet to assess training trends.",
"trajectory_no_goal": "No active goal",
"trajectory_establishing": "Establishing baseline",
# Trajectory
"positioning_trajectory_building": "Building: If this pattern continues, you are on track to exceed recent benchmarks.",
"positioning_trajectory_stable": "Stable: You are maintaining your level, ideal for long-term health.",
"positioning_trajectory_fatigue": "Fatigue Risk: If this pattern continues, performance may decline without recovery.",
"positioning_trajectory_plateau": "Training load has stabilized and adaptation appears to have plateaued.",
# Phases
"positioning_phase_title": "Training Phase",
"positioning_phase_base": "Base Phase",
"positioning_phase_build": "Build Phase",
"positioning_phase_peak": "Peak Phase",
"positioning_phase_recovery": "Recovery Phase",
"positioning_phase_plateau": "Plateau Phase",
# Evidence
"positioning_evidence_title": "Evidence Breakdown",
"positioning_evidence_distance": "Distance",
"positioning_evidence_hr": "HR variance",
"positioning_evidence_frequency": "Frequency",
"positioning_evidence_consistency": "Consistency",
"positioning_not_enough_history": "Not enough training history to determine positioning yet.",
"positioning_evidence_pace_improved": "Pace improved",
"positioning_evidence_pace_worsened": "Pace worsened",
# Training Recommendations
"rec_title": "🎯 Training Recommendation",
"rec_lbl_focus": "**Focus:**",
"rec_lbl_session": "**Suggested Session:**",
"rec_lbl_explanation": "**Explanation:**",
"rec_focus_protect_recovery": "Protect Recovery",
"rec_focus_build_endurance": "Build Endurance",
"rec_focus_introduce_intensity": "Introduce Intensity",
"rec_focus_maintain_consistency": "Maintain Consistency",
"rec_session_easy_run": "Easy Recovery Run",
"rec_session_long_run": "Aerobic Long Run",
"rec_session_tempo_intervals": "Tempo Intervals",
"rec_session_steady_run": "20-minute easy run",
"rec_desc_protect_recovery": "Your indicators suggest accumulated fatigue. Prioritize low-intensity movement to allow cardiovascular and structural recovery.",
"rec_desc_build_endurance": "Stability in your recent markers shows you are ready to expand your aerobic base. Focus on extending duration at a comfortable effort.",
"rec_desc_introduce_intensity": "Your capacity for adaptation is high right now. Introducing controlled intensity will help break through current performance plateaus.",
"rec_desc_maintain_consistency": "Focus on protecting your current training rhythm. Consistency is your most powerful lever right now.",
},
"pt-BR": {
"welcome": "Bem-vindo ao Runner Intelligence. Envie sua primeira corrida e o sistema começará a construir sua base de treinamento e gerar insights.",
"title": "# 🏃 Runner Inteligência Agêntica (Experimental)",
"subtitle": '<span class="muted">Treinamento personalizado a partir dos seus dados.</span>',
"workflow": '<span class="muted"><b>Fluxo:</b> Enviar corridas ➔ Ver Insights ➔ Plano Semanal ➔ Chat com Treinador</span><br/><span class="muted"><i>Formatos: .fit, .fit.gz, .tcx, .tcx.gz, .gpx (max 50MB)</i></span><br/><span class="muted">Feedback: <a href="https://github.com/ideas-to-life/runner-agentic-intelligence/issues" target="_blank">GitHub Issues</a></span>',
"evolution_workflow": '<span class="muted">Acompanhe sua evolução. Revise seu check-in semanal e progresso vs mês passado.</span><br/><span class="muted">Envie novas corridas a qualquer momento — seu painel será atualizado automaticamente.</span><br/><span class="muted">Feedback: <a href="https://github.com/ideas-to-life/runner-agentic-intelligence/issues" target="_blank">GitHub Issues</a></span>',
"tab_analyse": "Analisar",
"tab_results": "Resultados",
"tab_coach": "Treinador",
"tab_home": "Início",
"tab_intelligence": "Inteligência",
"tab_positioning": "Posicionamento",
"lbl_your_week": "Sua Semana",
"lbl_coach_brief": "Resumo do Treinador",
"lbl_parsed": "Processadas",
"unit_weeks": "semanas",
"lbl_across": "ao longo de",
"lbl_current": "Atual",
"lbl_previous": "Passada",
"lbl_distance": "Distância",
"lbl_runs": "Corridas",
"lbl_avg_pace": "Ritmo Médio",
"lbl_consistency": "Consistência",
"goal_status_template": "Sua meta está **{val}**.",
"home_story_template": "Você correu **{count}** {unit} esta semana, em um {of} **{dist:.1f} km**.",
"lbl_current_state": "Estado Atual",
"lbl_key_insight": "Insight Principal",
"lbl_forward_focus": "Foco da Semana",
"lbl_details": "Detalhes",
"sec_evolution": "📈 Progresso vs Mês Passado",
"sec_checkin": "Check-In Semanal",
"lbl_goal_traj_inline": "**🎯 Trajetória:**",
"lbl_focus_inline": "**🎯 Foco:**",
"sec_snapshot": "Snapshot da Semana Atual",
"sec_upload": "🗂️ Envie seus dados de treino",
"upload_hints": '<div class="muted" style="margin-bottom: 12px; font-size: 0.9rem;"><ul><li>Melhores resultados: envie 4–12 corridas recentes (ou ~2–6 semanas).</li><li>Inclua dados de FC se tiver (ajuda com sinais de fadiga/risco).</li><li>Depois clique em ‘Analisar Dados’ para gerar Resultados e contexto.</li></ul></div>',
"upload_label": "Arraste e solte ou clique para enviar",
"btn_analyse": "🚀 Analisar Dados",
"btn_reset": "Reiniciar",
"sec_insights": "Insights do Treinador",
"lbl_risk": "Avaliação de Risco/Segurança",
"lbl_lever": "Alavanca Principal",
"sec_plan": "Plano de Treino Semanal",
"sec_charts": "Tendências e Análises",
"sec_chat": "Pergunte sobre seu treino",
"chat_indicator_no": "⚠️ *Envie e analise corridas para habilitar o contexto do chat.*",
"chat_indicator_yes": "✅ *Contexto do chat habilitado.*",
"chat_tip": "Dica: tente ‘Plotar meu ritmo’ ou ‘Mostrar gráfico de FC’ para visualizar seus dados.",
"chat_placeholder": "ex: Como foi meu ritmo semana passada?",
"btn_send": "Enviar",
"btn_clear": "Limpar Histórico",
"lang_label": "Language / Idioma",
"starter_limiter": "Maior limitador?",
"starter_why": "Por que este foco?",
"starter_fatigue": "Risco de fadiga?",
"starter_keep": "O que manter?",
"chat_starter_limiter": "Qual é o meu maior limitador de treino?",
"chat_starter_why": "Por que você sugeriu este foco de treinamento?",
"chat_starter_fatigue": "Você vê algum sinal de excesso de treino ou fadiga?",
"chat_starter_keep": "Quais aspectos do meu treino devo continuar fazendo?",
"analyse_progress": "Análise dos dados de treino em andamento...",
"insights_primary_lever_heading": "Alavanca Principal",
"insights_risk_signal_heading": "Sinal de Risco",
"insights_key_observations_heading": "Observações Principais",
"insights_evidence_label": "Evidências",
"insights_constraint_label": "Restrição",
"insights_no_primary_lever": "Nenhuma alavanca principal identificada.",
"insights_no_risk": "Nenhum risco elevado detectado.",
"insights_no_observations": "*Nenhuma observação fornecida.*",
"insights_analysis_failed": "*Falha na Análise*",
"insights_analysis_pending": "*Análise pendente...*",
"insights_raw_default": "Os insights brutos aparecerão aqui.",
"plan_week_summary_label": "Resumo da semana:",
"plan_focus_label": "Foco desta semana:",
"plan_pending": "*O plano aparecerá aqui após a análise.*",
"progress_extracting": "Extraindo características dos dados de corrida...",
"progress_generating": "Gerando insights e plano de treinamento...",
"pipeline_stage_1": "🏃 Enviando corridas",
"pipeline_stage_2": "📊 Construindo snapshot semanal",
"pipeline_stage_3": "📈 Analisando tendências de treino",
"pipeline_stage_4": "🧠 Gerando insights do treinador",
"pipeline_stage_5": "📋 Preparando recomendação de treino",
"chat_context_indicator": "🧠 **Usando seus insights de treinamento como contexto**",
"error_no_runs": "Nenhuma corrida para processar.",
"lbl_details": "Detalhes (Risco e Observações)",
"banner_title": "⚠️ Informações do Public Preview",
"banner_session": "**Dados da Sessão**: Todos os dados enviados e histórico de chat são temporários e apagados após a sessão.",
"banner_persistence_disabled": "🟡 **Modo Public Preview** — Nenhum dado é persistido. Todos os envios e métricas derivadas são temporários.",
"banner_persistence_enabled": "🟢 **Persistência de Histórico Ativada** — Snapshots semanais e tendências são armazenados localmente.",
"banner_medical": "**Aviso Médico**: Este sistema fornece insights de treinamento, NÃO aconselhamento médico. Consulte um profissional antes de iniciar qualquer plano de treino.",
"banner_full": "**Experiência Completa**: Para persistência total e armazenamento local, execute o app localmente a partir do [GitHub](https://github.com/avfranco/runner-agentic-intelligence).",
"insights_timestamp_label": "Insights gerados em",
"risk_level_low": "BAIXO",
"risk_level_medium": "MÉDIO",
"risk_level_high": "ALTO",
"chat_error": "Desculpe, estou com problemas para processar seu pedido agora.",
"plan_error": "Não foi possível gerar o plano neste momento.",
"tab_profile": "Perfil",
"sec_profile": "## Perfil do Corredor (Gêmeo Digital v1)",
"lbl_display_name": "Nome de Exibição",
"lbl_age": "Idade",
"lbl_experience": "Nível de Experiência",
"lbl_injury_notes": "Histórico de Lesões / Notas",
"btn_save_profile": "Salvar Perfil",
"profile_saved": "Perfil salvo com sucesso!",
"profile_save_error": "Erro ao salvar perfil.",
"lbl_baseline": "Distância Semanal Base (km)",
"lbl_gender": "Gênero",
"sec_goal": "Objetivo Atual",
"lbl_goal_type": "Tipo de Objetivo",
"lbl_target": "Valor Alvo",
"lbl_unit": "Unidade",
"lbl_date": "Data Alvo",
"btn_save_goal": "Definir Objetivo",
"goal_saved": "Objetivo atualizado!",
"lbl_progress": "Progresso",
"lbl_total_distance": "Distância",
"lbl_distance": "Distância",
"lbl_avg_pace": "Ritmo Médio",
"lbl_avg_hr": "FC Média",
"lbl_runs_count": "Corridas",
"goal_trajectory_title": "Trajetória da Meta",
"goal_status": "Status",
"goal_progress": "Progresso",
"goal_next_milestone": "Próximo Marco",
"goal_status_ahead": "Adiantado",
"goal_status_on_track": "No Caminho",
"goal_status_behind": "Atrasado",
"lbl_latest_data": "Últimos Dados Encontrados",
"lbl_consistency": "Consistência",
"lbl_metric": "Métrica",
"lbl_interpreted_delta": "Δ Interpretado",
"performance_first_week_title": "Esta Semana nas Corridas",
"performance_first_week_body": "Esta é a sua primeira semana registrada. Você está construindo sua base de performance. Conforme você registrar mais corridas, suas tendências ficarão mais claras.",
"performance_first_week_focus": "Continue registrando suas sessões para estabelecer um ritmo consistente.",
"error_insufficient_data": "*Histórico insuficiente para comparação (8 semanas necessárias).*",
"goal_status_on_track": "No Caminho",
"goal_status_slightly_behind": "Um Pouco Abaixo",
"goal_status_behind": "Em Progresso para a Meta",
"goal_type_race": "Prova/Evento",
"goal_type_volume": "Volume Semanal",
"goal_type_pace": "Ritmo Alvo",
"unit_km": "km",
"unit_runs": "corridas",
"unit_bpm": "bpm",
"unit_pts": "pts",
"unit_spkm": "s/km",
"na": "N/A",
"sec_structure": "Estrutura Semanal",
"lbl_weekday_runs": "Corridas Semanais",
"lbl_long_run": "Longão",
"lbl_structure_status": "Status da Estrutura",
"lbl_km_remaining": "km restantes",
"lbl_km_remaining_subtext": "{val} km",
"coaching_advice": "Mantenha a consistência esta semana para fechar a meta.",
"strong_week": "Semana Forte",
"structured_but_light": "Estruturada, mas Leve",
"rebuild_week": "Reconstrução",
"reset_week": "Recuperação/Reset",
"status_pending": "Pendente",
"status_completed": "Concluído",
"current_week_label": "Semana Atual",
"last_week_label": "Semana Passada",
"lbl_snapshot_title": "Snapshot da Semana Atual",
"no_data_available": "*Nenhuma corrida registrada esta semana ainda.*",
"home_no_goal_banner": "Nenhum objetivo ativo definido. Defina um objetivo para gerar seu plano de treino semanal.",
"performance_card_header": "Esta Semana nas Corridas",
"delta_vs_4w": "Δ vs méd. 4s",
"focus_label": "Foco à Frente",
"no_runs_message": "Nenhuma corrida registrada ainda. No aguardo da sua primeira atividade!",
"btn_download_card": "Baixar Card de Performance",
"next_run.title": "Próxima Corrida Recomendada",
"next_run.focus": "Foco",
"next_run.session": "Sessão Sugerida",
"next_run.why": "Por quê",
"next_run.upload_runs_prompt": "### 🏃 Próxima Corrida\n*Envie e analise suas corridas para ver sua próxima sessão recomendada.*",
"next_run.set_goal_prompt": "### 🏃 Próxima Corrida\n*Defina um objetivo no seu Perfil para receber recomendações de treino personalizadas.*",
"insights_risk_signal_heading": "Sinal de Risco",
"insights_key_observations_heading": "Observações Principais",
"insights_primary_lever_heading": "Alavanca Principal",
"lbl_home_week_range": "Semana Atual",
"lbl_health_signal": "Sinal de Saúde",
"lbl_goal_trajectory": "Trajetória da Meta",
"lbl_this_week": "Esta Semana",
"lbl_local_folder_path": "Caminho da pasta local (Modo servidor)",
"btn_analyse_folder": "Analisar Pasta",
"btn_consult_coach": "Consultar seu Treinador",
"btn_starter_limiter": "Maior limitador?",
"btn_starter_why": "Por que este foco?",
"btn_starter_fatigue": "Risco de fadiga?",
"acc_knowledge_base": "Base de Conhecimento e Modelos",
"lbl_category": "Categoria",
"lbl_template": "Modelo",
"lbl_preview": "Pré-visualização",
"btn_insert_message": "Inserir na Caixa de Mensagem",
"acc_adjustments": "Ajustes e Notas",
"lbl_pace_trend": "Análise de Tendência de Ritmo",
"lbl_hr_trend": "Análise de Frequência Cardíaca",
"lbl_gender_male": "Masculino",
"lbl_gender_female": "Feminino",
"lbl_gender_pns": "Prefiro não dizer",
"lbl_gender_none": "Nenhum",
"lbl_exp_beginner": "Iniciante",
"lbl_exp_intermediate": "Intermediário",
"lbl_exp_advanced": "Avançado",
"lbl_focus_inline": "**Foco:**",
"lbl_total_of": "total de",
"lbl_more": "mais",
"lbl_less": "menos",
"lbl_faster": "mais rápido",
"lbl_slower": "mais lento",
"lbl_that_is": "Isso é",
"lbl_than_avg": "que sua média recente.",
"lbl_pace_was": "Seu ritmo foi",
"runner_positioning_title": "Posicionamento do Corredor",
"positioning_insufficient_data": "Dados insuficientes para determinar o posicionamento ainda.",
"positioning_no_data": "Nenhum dado de treino disponível ainda.",
"positioning_context_title": "Contexto de 4 Semanas",
"positioning_state_title": "Estado do Treino",
"positioning_summary_title": "Resumo",
"positioning_focus_title": "Foco Recomendado",
"positioning_current_state": "Estado do Treino",
"positioning_health_signal": "Sinal de Saúde",
"positioning_goal_trajectory": "Trajetória do Objetivo",
"positioning_trajectory": "Trajetória",
"positioning_insights": "Insights",
"analysis_pending": "Análise pendente...",
"analysis_failed": "Falha na análise.",
# Health signals
"health_stable": "Estável",
"health_overreaching": "Carga Elevada",
"health_strain": "Sinais de Sobrecarga",
# Position status
"position_advancing": "Avançando",
"position_stable": "Estável",
"position_drifting": "Perdendo Ritmo",
# Goal trajectory
"trajectory_improving": "Progredindo",
"trajectory_maintaining": "Mantendo",
"trajectory_declining": "Regredindo",
# Focus guidance
"focus_recovery": "Priorize a recuperação e absorva a carga recente.",
"focus_build": "Continue aumentando o volume gradualmente.",
"focus_maintenance": "Mantenha a estrutura atual e proteja a consistência.",
"focus_reduce_load": "Reduza a carga para evitar sobrecarga.",
# Positioning v1 Status Names
"positioning_status_constructive_adaptation": "Adaptação Construtiva",
"positioning_status_productive_load": "Carga Produtiva",
"positioning_status_strain": "Sobrecarga Compensatória",
"positioning_status_plateau": "Platô",
# Positioning v1 Headlines
"positioning_headline_constructive_adaptation": "Seu treino está gerando uma adaptação construtiva clara.",
"positioning_headline_productive_load": "Você protegeu sua base esta semana, mas não gerou nova adaptação.",
"positioning_headline_strain": "A carga atual está excedendo sua capacidade de absorção segura.",
"positioning_headline_plateau": "O treino estabilizou, mas a intensidade pode ser insuficiente para evolução.",
# Rationales
"positioning_rationale_constructive_adaptation": "A carga está aumentando enquanto a consistência se mantém.",
"positioning_rationale_productive_load": "Mantendo a carga e protegendo a base.",
"positioning_rationale_strain": "O aumento da carga está superando a adaptação cardiovascular.",
"positioning_rationale_plateau": "O treinamento estabilizou.",
# Forward Focus
"positioning_forward_focus_constructive_adaptation": "Mantenha o volume recente e permita que a adaptação se consolide.",
"positioning_forward_focus_productive_load": "Reforce a consistência de frequência esta semana.",
"positioning_forward_focus_strain": "Priorize a recuperação ativa e reduza a carga de sessões não essenciais.",
"positioning_forward_focus_plateau": "Introduza picos de intensidade localizados para desafiar sua base.",
"positioning_status_baseline": "Construindo Base",
"positioning_headline_baseline": "Sua base de treinamento está sendo estabelecida.",
"positioning_rationale_baseline": "Semana(s) inicial(is) detectada(s). Coletando dados para estabelecer tendências.",
"positioning_forward_focus_baseline": "Estabeleça corridas leves consistentes esta semana.",
"positioning_trajectory_baseline": "Histórico insuficiente para avaliar tendências de treino.",
"trajectory_no_goal": "Sem objetivo ativo",
"trajectory_establishing": "Estabelecendo base",
# Trajectory
"positioning_trajectory_building": "Construção: Se este padrão continuar, você está no caminho para superar marcas recentes.",
"positioning_trajectory_stable": "Estável: Você está mantendo seu nível, ideal para a saúde de longo prazo.",
"positioning_trajectory_fatigue": "Risco de Fadiga: Se este padrão continuar, a performance pode cair sem recuperação.",
"positioning_trajectory_plateau": "A carga de treino estabilizou e a adaptação parece ter atingido um platô.",
# Phases
"positioning_phase_title": "Fase de Treino",
"positioning_phase_base": "Fase de Base",
"positioning_phase_build": "Fase de Construção",
"positioning_phase_peak": "Fase de Pico",
"positioning_phase_recovery": "Fase de Recuperação",
"positioning_phase_plateau": "Fase de Platô",
# Evidence
"positioning_evidence_title": "Detalhamento de Evidências",
"positioning_evidence_distance": "Distância",
"positioning_evidence_hr": "Variância de FC",
"positioning_evidence_frequency": "Frequência",
"positioning_evidence_consistency": "Consistência",
"positioning_not_enough_history": "Histórico de treino insuficiente para determinar o posicionamento ainda.",
"positioning_evidence_pace_improved": "Pace melhorou",
"positioning_evidence_pace_worsened": "Pace piorou",
# Training Recommendations
"rec_title": "🎯 Recomendação de Treino",
"rec_lbl_focus": "**Foco:**",
"rec_lbl_session": "**Sessão Sugerida:**",
"rec_lbl_explanation": "**Explicação:**",
"rec_focus_protect_recovery": "Proteger Recuperação",
"rec_focus_build_endurance": "Construir Resistência",
"rec_focus_introduce_intensity": "Introduzir Intensidade",
"rec_focus_maintain_consistency": "Manter Consistência",
"rec_session_easy_run": "Corrida de Recuperação Leve",
"rec_session_long_run": "Longão Aeróbico",
"rec_session_tempo_intervals": "Intervalado de Tempo",
"rec_session_steady_run": "Corrida Leve de 20 minutos",
"rec_desc_protect_recovery": "Seus indicadores sugerem fadiga acumulada. Priorize movimentos de baixa intensidade para permitir a recuperação cardiovascular e estrutural.",
"rec_desc_build_endurance": "A estabilidade nos seus marcadores recentes mostra que você está pronto para expandir sua base aeróbica. Foque em estender a duração em um esforço confortável.",
"rec_desc_introduce_intensity": "Sua capacidade de adaptação está alta agora. Introduzir intensidade controlada ajudará a superar os patamares atuais de performance.",
"rec_desc_maintain_consistency": "Foque em proteger seu ritmo de treino atual. A consistência é sua alavanca mais poderosa agora.",
},
}
def get_text(key: str, language: str = "en") -> str:
"""Retrieves localized text for a given key and language."""
lang_batch = UI_TEXT.get(language, UI_TEXT["en"])
return lang_batch.get(key, UI_TEXT["en"].get(key, key))