# 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": 'Personalized coaching from your training data.', "workflow": 'Workflow: Upload runs ➔ Get Insights ➔ Review Weekly Plan ➔ Chat with Coach
Supported formats: .fit, .fit.gz, .tcx, .tcx.gz, .gpx (max 50MB per file)
Feedback: GitHub Issues or DM me', "evolution_workflow": 'Track your evolution. Review your weekly check-in and progress vs last month.
Upload new runs anytime — your dashboard updates automatically.
Feedback: GitHub Issues or DM me', "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": '
', "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": 'Treinamento personalizado a partir dos seus dados.', "workflow": 'Fluxo: Enviar corridas ➔ Ver Insights ➔ Plano Semanal ➔ Chat com Treinador
Formatos: .fit, .fit.gz, .tcx, .tcx.gz, .gpx (max 50MB)
Feedback: GitHub Issues', "evolution_workflow": 'Acompanhe sua evolução. Revise seu check-in semanal e progresso vs mês passado.
Envie novas corridas a qualquer momento — seu painel será atualizado automaticamente.
Feedback: GitHub Issues', "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": '
', "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))