1165 lines
60 KiB
JavaScript
1165 lines
60 KiB
JavaScript
const translations = {
|
||
de: {
|
||
// ── Navigation / Header ──────────────────────────────────────────────────
|
||
'nav.logged_in': 'Angemeldet',
|
||
'nav.assessments': 'Bewertungen',
|
||
'nav.analysis': 'Analyse',
|
||
'nav.profile': 'Profil',
|
||
'nav.sign_out': 'Abmelden',
|
||
'nav.theme_dark': 'Dark Mode',
|
||
'nav.theme_light': 'Light Mode',
|
||
'nav.analysis_disabled': 'Analyse ist während der Bearbeitung deaktiviert',
|
||
'nav.analysis_open': 'Analyse öffnen',
|
||
'nav.profile_disabled': 'Profil ist während der Bearbeitung deaktiviert',
|
||
'nav.profile_open': 'Profil öffnen',
|
||
|
||
// ── Profil ───────────────────────────────────────────────────────────────
|
||
'profile.title_label': 'Benutzerprofil',
|
||
'profile.title': 'Profil verwalten',
|
||
'profile.description': 'Name, Vorname, Mailadresse, Land und die Sichtbarkeit deiner Testfreigaben werden hier gepflegt.',
|
||
'profile.loading': 'Profil wird geladen...',
|
||
'profile.first_name': 'Vorname',
|
||
'profile.first_name_placeholder': 'Max',
|
||
'profile.last_name': 'Nachname',
|
||
'profile.last_name_placeholder': 'Mustermann',
|
||
'profile.email': 'Mailadresse',
|
||
'profile.email_hint': 'Wenn du die Mailadresse änderst, wird dir eine Bestätigung an die neue Adresse gesendet.',
|
||
'profile.country': 'Land',
|
||
'profile.country_none': 'Kein Land ausgewählt',
|
||
'profile.country_hint': 'Dein Land',
|
||
'profile.display': 'Anzeige',
|
||
'profile.display_hint': 'Sprache, in der die Anwendung angezeigt wird.',
|
||
'profile.rank': 'Rang Anzeige',
|
||
'profile.rank_placeholder': 'Platzhalter',
|
||
'profile.rank_hint': 'Hier kann später der Ranglistenplatz des Benutzers angezeigt werden.',
|
||
'profile.tests_visible_title': 'Tests sichtbar',
|
||
'profile.tests_visible_desc': 'Ist dieser Schalter aktiv, funktionieren deine Freigabelinks. Wenn du ihn deaktivierst, bleiben vorhandene Links gespeichert, sind aber nicht mehr öffentlich sichtbar.',
|
||
'profile.visible': 'Sichtbar',
|
||
'profile.not_visible': 'Nicht sichtbar',
|
||
'profile.account_id': 'Konto-ID',
|
||
'profile.delete': 'Profil löschen',
|
||
'profile.deleting': 'Löscht...',
|
||
'profile.save': 'Profil speichern',
|
||
'profile.saving': 'Speichert...',
|
||
'profile.saved': 'Profil gespeichert.',
|
||
'profile.saved_email': 'Profil gespeichert. Die neue Mailadresse muss ggf. noch per E-Mail bestätigt werden.',
|
||
'profile.error_save': 'Profil konnte nicht gespeichert werden.',
|
||
'profile.error_delete': 'Profil konnte nicht gelöscht werden.',
|
||
'profile.delete_confirm': 'Profil wirklich löschen?\n\nDabei werden alle Tests dieses Benutzers sowie vorhandene Analysepläne dauerhaft entfernt.',
|
||
'profile.deleted': 'Profil und alle Tests wurden gelöscht. Das Konto bleibt bestehen und kann neu eingerichtet werden.',
|
||
|
||
// ── PAT Test Manager (Toast-Meldungen) ───────────────────────────────────
|
||
'patmgr.saved': 'Erfolgreich gespeichert!',
|
||
'patmgr.finalized': 'Bewertung wurde final abgeschlossen und ist jetzt nur noch lesbar.',
|
||
'patmgr.fill_name_date': 'Bitte Name und Datum ausfüllen bevor Sie speichern',
|
||
'patmgr.share_copied': 'Freigabelink für "{label}" wurde in die Zwischenablage kopiert.',
|
||
'patmgr.share_localhost_hint': 'Hinweis: Der Link zeigt aktuell auf localhost und ist nur erreichbar, wenn die App von außen erreichbar ist.',
|
||
'patmgr.share_link_label': 'Freigabelink für "{label}"',
|
||
'patmgr.share_error': 'Freigabelink konnte nicht erstellt werden: {error}',
|
||
'patmgr.unshare_success': 'Freigabe für "{label}" wurde aufgehoben.',
|
||
'patmgr.unshare_error': 'Freigabe konnte nicht aufgehoben werden: {error}',
|
||
'patmgr.profile_loading': 'Profil wird noch geladen. Bitte versuche es gleich noch einmal.',
|
||
'patmgr.enable_visible': 'Aktiviere im Profil zuerst "Tests sichtbar", bevor du Tests teilst.',
|
||
'patmgr.save_before_share': 'Bitte den Test zuerst speichern, bevor du ihn teilen kannst.',
|
||
'patmgr.save_for_share': 'Bitte erst speichern, damit der aktuelle Stand geteilt wird.',
|
||
'patmgr.save_first': 'Bitte zuerst speichern',
|
||
'patmgr.profile_loading_btn': 'Profil wird geladen',
|
||
'patmgr.enable_visible_btn': 'Aktiviere im Profil "Tests sichtbar"',
|
||
|
||
// ── PAT Liste ────────────────────────────────────────────────────────────
|
||
'patlist.title': 'PAT Test Manager',
|
||
'patlist.new_assessment': 'Neue Bewertung',
|
||
'patlist.filter_name': 'Nach Name filtern',
|
||
'patlist.filter_date': 'Nach Datum filtern',
|
||
'patlist.col_name': 'Name',
|
||
'patlist.col_date': 'Datum',
|
||
'patlist.col_result': 'Ergebnis',
|
||
'patlist.date_placeholder': 'tt.mm.jjjj',
|
||
'patlist.prev_month': 'Vorheriger Monat',
|
||
'patlist.next_month': 'Nächster Monat',
|
||
'patlist.today': 'Heute',
|
||
'patlist.delete': 'Löschen',
|
||
'patlist.open_assessments': 'Noch offene Bewertungen',
|
||
'patlist.no_open': 'Keine offenen Bewertungen mit den aktuellen Suchfiltern gefunden',
|
||
'patlist.closed_assessments': 'Abgeschlossene Bewertungen',
|
||
'patlist.no_closed': 'Keine abgeschlossenen Bewertungen mit den aktuellen Suchfiltern gefunden',
|
||
'patlist.no_assessments': 'Noch keine Bewertungen vorhanden',
|
||
'patlist.no_assessments_hint': 'Lege oben eine neue Bewertung an und wähle dabei PAT Start, PAT 1, PAT 2 oder PAT 3',
|
||
'patlist.share_active': 'Freigabe aktiv',
|
||
'patlist.share_paused': 'Freigabe pausiert',
|
||
'patlist.finalized': 'Final abgeschlossen',
|
||
'patlist.open': 'Öffnen',
|
||
'patlist.count': 'Anzahl: {count}',
|
||
'patlist.days': 'Mo Di Mi Do Fr Sa So',
|
||
|
||
// ── PAT Detail ───────────────────────────────────────────────────────────
|
||
'detail.back': '← Zurück zur Übersicht',
|
||
'detail.unsaved': '● Ungespeicherte Änderungen',
|
||
'detail.finalized': 'Final abgeschlossen',
|
||
'detail.share_active': 'Freigabe aktiv',
|
||
'detail.share_paused': 'Freigabe pausiert',
|
||
'detail.save': 'Speichern',
|
||
'detail.finalize': 'Final Abschließen',
|
||
'detail.pdf': 'PDF',
|
||
'detail.share': 'Teilen',
|
||
'detail.unshare': 'Freigabe aufheben',
|
||
'detail.readonly': 'Nur Lese-Modus',
|
||
'detail.readonly_hint': 'Diese Bewertung wurde final abgeschlossen und kann nicht mehr bearbeitet werden.',
|
||
'detail.date_name': 'Datum / Name',
|
||
'detail.name_placeholder': 'Name',
|
||
'detail.col_avg_target': 'Durchschnitt Soll {soll}',
|
||
'detail.col_actual': 'Ist',
|
||
'detail.col_factor': 'Faktor',
|
||
'detail.col_points': 'Points',
|
||
'detail.col_result': 'Ergebnis',
|
||
|
||
// ── Speichern-Dialog ─────────────────────────────────────────────────────
|
||
'savedialog.title': 'Ungespeicherte Änderungen',
|
||
'savedialog.message': 'Sie haben ungespeicherte Änderungen. Möchten Sie diese speichern?',
|
||
'savedialog.yes': 'Ja, speichern',
|
||
'savedialog.no': 'Nein, verwerfen',
|
||
'savedialog.cancel': 'Abbrechen',
|
||
|
||
// ── Analyse ──────────────────────────────────────────────────────────────
|
||
'analysis.title': 'Analyse',
|
||
'analysis.priority_title': 'Wo solltest du besser werden?',
|
||
'analysis.priority_desc': 'Priorisierung nach Gap × Faktor × Konstanz basierend auf den letzten 5 Assessments.',
|
||
'analysis.assessments_count': 'Assessments: {count}',
|
||
'analysis.window': 'Analysefenster: {count}/5',
|
||
'analysis.limited_data': 'Begrenzte Datenbasis',
|
||
'analysis.no_data': 'Noch keine Daten für die Analyse',
|
||
'analysis.no_data_hint': 'Lege zuerst eine Bewertung im Bereich "Bewertungen" an.',
|
||
'analysis.no_type_data': 'Keine Bewertungen für {patType}',
|
||
'analysis.no_type_hint': 'Wähle einen anderen PAT-Typ oder erstelle eine neue Bewertung.',
|
||
|
||
// ── Schwächen ────────────────────────────────────────────────────────────
|
||
'weakness.no_data': 'Keine Schwächen-Daten verfügbar.',
|
||
'weakness.title': 'Top-3 Schwächen',
|
||
'weakness.gap': 'Gap: {score}',
|
||
'weakness.consistency': 'Konstanz: {score}',
|
||
'weakness.trend': 'Trend: {score}',
|
||
|
||
// ── Stärken ──────────────────────────────────────────────────────────────
|
||
'strength.no_data': 'Keine Stärken-Daten verfügbar.',
|
||
'strength.title': 'Top-3 Stärken',
|
||
'strength.actual': 'Ist: {score}',
|
||
'strength.target': 'Soll: {score}',
|
||
'strength.trend': 'Trend: {score}',
|
||
|
||
// ── Trainingsplan ────────────────────────────────────────────────────────
|
||
'training.title': 'Trainingsplan ({patType})',
|
||
'training.hint': '1 aktiver Plan + Historie, Session-Status: offen / erledigt / übersprungen.',
|
||
'training.reload': 'Neu laden',
|
||
'training.duration': 'Dauer',
|
||
'training.2weeks': '2 Wochen',
|
||
'training.4weeks': '4 Wochen',
|
||
'training.6weeks': '6 Wochen',
|
||
'training.sessions_per_week': 'Einheiten/Woche',
|
||
'training.generate': 'Plan (neu) generieren',
|
||
'training.save_draft': 'Entwurf speichern',
|
||
'training.saving': 'Speichert…',
|
||
'training.draft_created': 'Neuer Entwurf erstellt. Du kannst jetzt Intensität und Übungen je Session anpassen.',
|
||
'training.create_draft_first': 'Erstelle zuerst einen Entwurf.',
|
||
'training.save_error': 'Trainingsplan konnte nicht gespeichert werden.',
|
||
'training.save_success': 'Trainingsplan gespeichert. Der vorherige aktive Plan wurde archiviert.',
|
||
'training.week_session': 'Woche {weekNo} · Einheit {sessionNo}',
|
||
'training.main_exercise': 'Hauptübung',
|
||
'training.side_exercises': 'Nebenübungen, getrennt mit Komma',
|
||
'training.high': 'hoch',
|
||
'training.medium': 'mittel',
|
||
'training.easy': 'leicht',
|
||
'training.draft_label': 'Entwurf (teilweise editierbar)',
|
||
'training.sessions_info': 'Sessions: {count} · hoch {high} · mittel {medium} · leicht {easy}',
|
||
'training.active_plan': 'Aktiver Plan',
|
||
'training.loading': 'Lädt…',
|
||
'training.no_active': 'Noch kein aktiver Trainingsplan vorhanden.',
|
||
'training.generated': 'Generiert: {date} · {weeks} Wochen · {sessions} Einheiten/Woche',
|
||
'training.week_short': 'W{weekNo} · E{sessionNo}',
|
||
'training.status_open': 'offen',
|
||
'training.status_done': 'erledigt',
|
||
'training.status_skipped': 'übersprungen',
|
||
'training.note': 'Notiz',
|
||
'training.history': 'Plan-Historie',
|
||
'training.no_history': 'Keine archivierten Pläne vorhanden.',
|
||
|
||
// ── Gap-Chart ────────────────────────────────────────────────────────────
|
||
'gapchart.no_data': 'Kein Gap-Chart verfügbar.',
|
||
'gapchart.title': 'Gap-Bar-Chart (Priorität)',
|
||
'gapchart.aria': 'Gap-Balkendiagramm',
|
||
|
||
// ── Live Übersicht ───────────────────────────────────────────────────────
|
||
'live.title': 'Live Übersicht',
|
||
'live.stats_title': 'Aktuelle Statistik',
|
||
'live.basis': 'Basis: alle Bewertungen, geladen beim Seitenaufruf',
|
||
'live.loading': 'Lädt…',
|
||
'live.timestamp': 'Stand: jetzt',
|
||
'live.no_data': 'Noch keine Bewertungen vorhanden. Lege eine neue Bewertung an, um hier Live-Werte zu sehen.',
|
||
'live.count': 'Bewertungen',
|
||
'live.count_desc': 'In der PAT Datenbank hinterlegt',
|
||
'live.avg_points': 'Ø Gesamtpunkte',
|
||
'live.avg_desc': 'Durchschnitt aller Assessments',
|
||
'live.last': 'Letzte Bewertung',
|
||
'live.unnamed': 'Unbenannt',
|
||
'live.top': 'Top Ergebnis',
|
||
|
||
// ── Geteilte Bewertung ───────────────────────────────────────────────────
|
||
'shared.missing_token': 'Freigabelink fehlt.',
|
||
'shared.invalid': 'Dieser Freigabelink ist ungültig, deaktiviert oder aktuell nicht öffentlich sichtbar.',
|
||
'shared.load_error': 'Geteilter Test konnte nicht geladen werden.',
|
||
'shared.loading': 'Geteilter Test wird geladen...',
|
||
'shared.label': 'Freigabe',
|
||
'shared.not_available': 'Geteilter Test nicht verfügbar',
|
||
'shared.title': 'Geteilter Test',
|
||
'shared.default_name': 'PAT Test',
|
||
'shared.hint': 'Dieser Link zeigt nur diesen einen Test im Nur-Lesen-Modus.',
|
||
'shared.date': 'Datum',
|
||
'shared.total_points': 'Gesamtpunkte',
|
||
'shared.rating': 'Bewertung',
|
||
'shared.target_factor': 'Soll {soll} · Faktor {faktor}',
|
||
'shared.col_points': 'Points',
|
||
'shared.col_values': 'Werte',
|
||
'shared.col_avg': 'Durchschnitt',
|
||
'shared.col_target': 'Soll',
|
||
'shared.col_factor': 'Faktor',
|
||
'shared.col_result': 'Ergebnis',
|
||
|
||
// ── Anmeldung ────────────────────────────────────────────────────────────
|
||
'auth.title': 'PAT Stats',
|
||
'auth.subtitle': 'Anmelden oder registrieren',
|
||
'auth.description': 'Melde dich mit deinem PAT-Test Konto an, um deine Bewertungen sicher zu verwalten.',
|
||
'auth.login_tab': 'Login',
|
||
'auth.register_tab': 'Registrieren',
|
||
'auth.email': 'E-Mail',
|
||
'auth.password': 'Passwort',
|
||
'auth.login_success': 'Erfolgreich angemeldet',
|
||
'auth.register_success': 'Registrierung abgeschlossen. Prüfe dein Postfach zur Bestätigung.',
|
||
'auth.sending': 'Wird gesendet...',
|
||
'auth.login_btn': 'Einloggen',
|
||
'auth.register_btn': 'Konto erstellen',
|
||
'auth.back': 'Zurück',
|
||
},
|
||
|
||
en: {
|
||
'nav.logged_in': 'Signed in',
|
||
'nav.assessments': 'Assessments',
|
||
'nav.analysis': 'Analysis',
|
||
'nav.profile': 'Profile',
|
||
'nav.sign_out': 'Sign out',
|
||
'nav.theme_dark': 'Dark Mode',
|
||
'nav.theme_light': 'Light Mode',
|
||
'nav.analysis_disabled': 'Analysis is disabled while editing',
|
||
'nav.analysis_open': 'Open analysis',
|
||
'nav.profile_disabled': 'Profile is disabled while editing',
|
||
'nav.profile_open': 'Open profile',
|
||
|
||
'profile.title_label': 'User Profile',
|
||
'profile.title': 'Manage Profile',
|
||
'profile.description': 'Manage your first name, last name, email address, country and the visibility of your shared tests here.',
|
||
'profile.loading': 'Loading profile...',
|
||
'profile.first_name': 'First name',
|
||
'profile.first_name_placeholder': 'John',
|
||
'profile.last_name': 'Last name',
|
||
'profile.last_name_placeholder': 'Doe',
|
||
'profile.email': 'Email address',
|
||
'profile.email_hint': 'If you change your email address, a confirmation will be sent to the new address.',
|
||
'profile.country': 'Country',
|
||
'profile.country_none': 'No country selected',
|
||
'profile.country_hint': 'Your country',
|
||
'profile.display': 'Display',
|
||
'profile.display_hint': 'Language in which the application is displayed.',
|
||
'profile.rank': 'Rank Display',
|
||
'profile.rank_placeholder': 'Placeholder',
|
||
'profile.rank_hint': 'The user\'s ranking position will be displayed here later.',
|
||
'profile.tests_visible_title': 'Tests visible',
|
||
'profile.tests_visible_desc': 'When this toggle is active, your share links work. If you deactivate it, existing links are saved but no longer publicly visible.',
|
||
'profile.visible': 'Visible',
|
||
'profile.not_visible': 'Not visible',
|
||
'profile.account_id': 'Account ID',
|
||
'profile.delete': 'Delete profile',
|
||
'profile.deleting': 'Deleting...',
|
||
'profile.save': 'Save profile',
|
||
'profile.saving': 'Saving...',
|
||
'profile.saved': 'Profile saved.',
|
||
'profile.saved_email': 'Profile saved. The new email address may still need to be confirmed via email.',
|
||
'profile.error_save': 'Profile could not be saved.',
|
||
'profile.error_delete': 'Profile could not be deleted.',
|
||
'profile.delete_confirm': 'Really delete profile?\n\nThis will permanently remove all tests for this user and any existing analysis plans.',
|
||
'profile.deleted': 'Profile and all tests have been deleted. The account remains and can be set up again.',
|
||
|
||
'patmgr.saved': 'Successfully saved!',
|
||
'patmgr.finalized': 'Assessment has been finalized and is now read-only.',
|
||
'patmgr.fill_name_date': 'Please fill in name and date before saving',
|
||
'patmgr.share_copied': 'Share link for "{label}" copied to clipboard.',
|
||
'patmgr.share_localhost_hint': 'Note: The link currently points to localhost and is only accessible if the app is reachable from outside.',
|
||
'patmgr.share_link_label': 'Share link for "{label}"',
|
||
'patmgr.share_error': 'Share link could not be created: {error}',
|
||
'patmgr.unshare_success': 'Share for "{label}" has been revoked.',
|
||
'patmgr.unshare_error': 'Share could not be revoked: {error}',
|
||
'patmgr.profile_loading': 'Profile is still loading. Please try again in a moment.',
|
||
'patmgr.enable_visible': 'Enable "Tests visible" in your profile before sharing tests.',
|
||
'patmgr.save_before_share': 'Please save the test first before sharing it.',
|
||
'patmgr.save_for_share': 'Please save first so the current state is shared.',
|
||
'patmgr.save_first': 'Please save first',
|
||
'patmgr.profile_loading_btn': 'Profile loading',
|
||
'patmgr.enable_visible_btn': 'Enable "Tests visible" in profile',
|
||
|
||
'patlist.title': 'PAT Test Manager',
|
||
'patlist.new_assessment': 'New Assessment',
|
||
'patlist.filter_name': 'Filter by name',
|
||
'patlist.filter_date': 'Filter by date',
|
||
'patlist.col_name': 'Name',
|
||
'patlist.col_date': 'Date',
|
||
'patlist.col_result': 'Result',
|
||
'patlist.date_placeholder': 'dd.mm.yyyy',
|
||
'patlist.prev_month': 'Previous month',
|
||
'patlist.next_month': 'Next month',
|
||
'patlist.today': 'Today',
|
||
'patlist.delete': 'Delete',
|
||
'patlist.open_assessments': 'Open assessments',
|
||
'patlist.no_open': 'No open assessments found with the current filters',
|
||
'patlist.closed_assessments': 'Finalized assessments',
|
||
'patlist.no_closed': 'No finalized assessments found with the current filters',
|
||
'patlist.no_assessments': 'No assessments yet',
|
||
'patlist.no_assessments_hint': 'Create a new assessment above and choose PAT Start, PAT 1, PAT 2 or PAT 3',
|
||
'patlist.share_active': 'Share active',
|
||
'patlist.share_paused': 'Share paused',
|
||
'patlist.finalized': 'Finalized',
|
||
'patlist.open': 'Open',
|
||
'patlist.count': 'Count: {count}',
|
||
'patlist.days': 'Mo Tu We Th Fr Sa Su',
|
||
|
||
'detail.back': '← Back to overview',
|
||
'detail.unsaved': '● Unsaved changes',
|
||
'detail.finalized': 'Finalized',
|
||
'detail.share_active': 'Share active',
|
||
'detail.share_paused': 'Share paused',
|
||
'detail.save': 'Save',
|
||
'detail.finalize': 'Finalize',
|
||
'detail.pdf': 'PDF',
|
||
'detail.share': 'Share',
|
||
'detail.unshare': 'Revoke share',
|
||
'detail.readonly': 'Read-only mode',
|
||
'detail.readonly_hint': 'This assessment has been finalized and can no longer be edited.',
|
||
'detail.date_name': 'Date / Name',
|
||
'detail.name_placeholder': 'Name',
|
||
'detail.col_avg_target': 'Avg. target {soll}',
|
||
'detail.col_actual': 'Actual',
|
||
'detail.col_factor': 'Factor',
|
||
'detail.col_points': 'Points',
|
||
'detail.col_result': 'Result',
|
||
|
||
'savedialog.title': 'Unsaved changes',
|
||
'savedialog.message': 'You have unsaved changes. Would you like to save them?',
|
||
'savedialog.yes': 'Yes, save',
|
||
'savedialog.no': 'No, discard',
|
||
'savedialog.cancel': 'Cancel',
|
||
|
||
'analysis.title': 'Analysis',
|
||
'analysis.priority_title': 'Where should you improve?',
|
||
'analysis.priority_desc': 'Prioritized by Gap × Factor × Consistency based on the last 5 assessments.',
|
||
'analysis.assessments_count': 'Assessments: {count}',
|
||
'analysis.window': 'Analysis window: {count}/5',
|
||
'analysis.limited_data': 'Limited data basis',
|
||
'analysis.no_data': 'No data for analysis yet',
|
||
'analysis.no_data_hint': 'Create an assessment in the "Assessments" section first.',
|
||
'analysis.no_type_data': 'No assessments for {patType}',
|
||
'analysis.no_type_hint': 'Choose a different PAT type or create a new assessment.',
|
||
|
||
'weakness.no_data': 'No weakness data available.',
|
||
'weakness.title': 'Top 3 Weaknesses',
|
||
'weakness.gap': 'Gap: {score}',
|
||
'weakness.consistency': 'Consistency: {score}',
|
||
'weakness.trend': 'Trend: {score}',
|
||
|
||
'strength.no_data': 'No strength data available.',
|
||
'strength.title': 'Top 3 Strengths',
|
||
'strength.actual': 'Actual: {score}',
|
||
'strength.target': 'Target: {score}',
|
||
'strength.trend': 'Trend: {score}',
|
||
|
||
'training.title': 'Training Plan ({patType})',
|
||
'training.hint': '1 active plan + history, session status: open / done / skipped.',
|
||
'training.reload': 'Reload',
|
||
'training.duration': 'Duration',
|
||
'training.2weeks': '2 weeks',
|
||
'training.4weeks': '4 weeks',
|
||
'training.6weeks': '6 weeks',
|
||
'training.sessions_per_week': 'Sessions/week',
|
||
'training.generate': 'Generate plan',
|
||
'training.save_draft': 'Save draft',
|
||
'training.saving': 'Saving…',
|
||
'training.draft_created': 'New draft created. You can now adjust intensity and exercises per session.',
|
||
'training.create_draft_first': 'Create a draft first.',
|
||
'training.save_error': 'Training plan could not be saved.',
|
||
'training.save_success': 'Training plan saved. The previous active plan has been archived.',
|
||
'training.week_session': 'Week {weekNo} · Session {sessionNo}',
|
||
'training.main_exercise': 'Main exercise',
|
||
'training.side_exercises': 'Side exercises, separated by comma',
|
||
'training.high': 'high',
|
||
'training.medium': 'medium',
|
||
'training.easy': 'easy',
|
||
'training.draft_label': 'Draft (partially editable)',
|
||
'training.sessions_info': 'Sessions: {count} · high {high} · medium {medium} · easy {easy}',
|
||
'training.active_plan': 'Active Plan',
|
||
'training.loading': 'Loading…',
|
||
'training.no_active': 'No active training plan yet.',
|
||
'training.generated': 'Generated: {date} · {weeks} weeks · {sessions} sessions/week',
|
||
'training.week_short': 'W{weekNo} · S{sessionNo}',
|
||
'training.status_open': 'open',
|
||
'training.status_done': 'done',
|
||
'training.status_skipped': 'skipped',
|
||
'training.note': 'Note',
|
||
'training.history': 'Plan history',
|
||
'training.no_history': 'No archived plans available.',
|
||
|
||
'gapchart.no_data': 'No gap chart available.',
|
||
'gapchart.title': 'Gap Bar Chart (Priority)',
|
||
'gapchart.aria': 'Gap bar chart',
|
||
|
||
'live.title': 'Live Overview',
|
||
'live.stats_title': 'Current Statistics',
|
||
'live.basis': 'Based on all assessments, loaded on page open',
|
||
'live.loading': 'Loading…',
|
||
'live.timestamp': 'As of: now',
|
||
'live.no_data': 'No assessments yet. Create a new assessment to see live values here.',
|
||
'live.count': 'Assessments',
|
||
'live.count_desc': 'Stored in the PAT database',
|
||
'live.avg_points': 'Avg. total points',
|
||
'live.avg_desc': 'Average of all assessments',
|
||
'live.last': 'Latest assessment',
|
||
'live.unnamed': 'Unnamed',
|
||
'live.top': 'Top result',
|
||
|
||
'shared.missing_token': 'Share link missing.',
|
||
'shared.invalid': 'This share link is invalid, disabled or currently not publicly visible.',
|
||
'shared.load_error': 'Shared test could not be loaded.',
|
||
'shared.loading': 'Loading shared test...',
|
||
'shared.label': 'Share',
|
||
'shared.not_available': 'Shared test not available',
|
||
'shared.title': 'Shared Test',
|
||
'shared.default_name': 'PAT Test',
|
||
'shared.hint': 'This link shows only this one test in read-only mode.',
|
||
'shared.date': 'Date',
|
||
'shared.total_points': 'Total points',
|
||
'shared.rating': 'Rating',
|
||
'shared.target_factor': 'Target {soll} · Factor {faktor}',
|
||
'shared.col_points': 'Points',
|
||
'shared.col_values': 'Values',
|
||
'shared.col_avg': 'Average',
|
||
'shared.col_target': 'Target',
|
||
'shared.col_factor': 'Factor',
|
||
'shared.col_result': 'Result',
|
||
|
||
'auth.title': 'PAT Stats',
|
||
'auth.subtitle': 'Sign in or register',
|
||
'auth.description': 'Sign in with your PAT Test account to securely manage your assessments.',
|
||
'auth.login_tab': 'Login',
|
||
'auth.register_tab': 'Register',
|
||
'auth.email': 'Email',
|
||
'auth.password': 'Password',
|
||
'auth.login_success': 'Successfully signed in',
|
||
'auth.register_success': 'Registration complete. Check your inbox for confirmation.',
|
||
'auth.sending': 'Sending...',
|
||
'auth.login_btn': 'Sign in',
|
||
'auth.register_btn': 'Create account',
|
||
'auth.back': 'Back',
|
||
},
|
||
|
||
it: {
|
||
'nav.logged_in': 'Connesso',
|
||
'nav.assessments': 'Valutazioni',
|
||
'nav.analysis': 'Analisi',
|
||
'nav.profile': 'Profilo',
|
||
'nav.sign_out': 'Esci',
|
||
'nav.theme_dark': 'Modalità scura',
|
||
'nav.theme_light': 'Modalità chiara',
|
||
'nav.analysis_disabled': 'L\'analisi è disabilitata durante la modifica',
|
||
'nav.analysis_open': 'Apri analisi',
|
||
'nav.profile_disabled': 'Il profilo è disabilitato durante la modifica',
|
||
'nav.profile_open': 'Apri profilo',
|
||
|
||
'profile.title_label': 'Profilo utente',
|
||
'profile.title': 'Gestisci profilo',
|
||
'profile.description': 'Gestisci qui nome, cognome, indirizzo email, paese e la visibilità delle tue condivisioni di test.',
|
||
'profile.loading': 'Caricamento profilo...',
|
||
'profile.first_name': 'Nome',
|
||
'profile.first_name_placeholder': 'Mario',
|
||
'profile.last_name': 'Cognome',
|
||
'profile.last_name_placeholder': 'Rossi',
|
||
'profile.email': 'Indirizzo email',
|
||
'profile.email_hint': 'Se cambi l\'indirizzo email, riceverai una conferma al nuovo indirizzo.',
|
||
'profile.country': 'Paese',
|
||
'profile.country_none': 'Nessun paese selezionato',
|
||
'profile.country_hint': 'Il tuo paese',
|
||
'profile.display': 'Visualizzazione',
|
||
'profile.display_hint': 'Lingua in cui viene visualizzata l\'applicazione.',
|
||
'profile.rank': 'Classifica',
|
||
'profile.rank_placeholder': 'Segnaposto',
|
||
'profile.rank_hint': 'Qui verrà visualizzata in seguito la posizione in classifica dell\'utente.',
|
||
'profile.tests_visible_title': 'Test visibili',
|
||
'profile.tests_visible_desc': 'Quando questo interruttore è attivo, i tuoi link di condivisione funzionano. Se lo disattivi, i link esistenti vengono salvati ma non sono più visibili pubblicamente.',
|
||
'profile.visible': 'Visibile',
|
||
'profile.not_visible': 'Non visibile',
|
||
'profile.account_id': 'ID account',
|
||
'profile.delete': 'Elimina profilo',
|
||
'profile.deleting': 'Eliminazione...',
|
||
'profile.save': 'Salva profilo',
|
||
'profile.saving': 'Salvataggio...',
|
||
'profile.saved': 'Profilo salvato.',
|
||
'profile.saved_email': 'Profilo salvato. Il nuovo indirizzo email potrebbe dover essere ancora confermato via email.',
|
||
'profile.error_save': 'Impossibile salvare il profilo.',
|
||
'profile.error_delete': 'Impossibile eliminare il profilo.',
|
||
'profile.delete_confirm': 'Eliminare davvero il profilo?\n\nTutti i test di questo utente e i piani di analisi esistenti verranno rimossi definitivamente.',
|
||
'profile.deleted': 'Profilo e tutti i test sono stati eliminati. L\'account rimane e può essere configurato nuovamente.',
|
||
|
||
'patmgr.saved': 'Salvato con successo!',
|
||
'patmgr.finalized': 'La valutazione è stata finalizzata ed è ora in sola lettura.',
|
||
'patmgr.fill_name_date': 'Compila nome e data prima di salvare',
|
||
'patmgr.share_copied': 'Link di condivisione per "{label}" copiato negli appunti.',
|
||
'patmgr.share_localhost_hint': 'Nota: Il link punta attualmente a localhost ed è accessibile solo se l\'app è raggiungibile dall\'esterno.',
|
||
'patmgr.share_link_label': 'Link di condivisione per "{label}"',
|
||
'patmgr.share_error': 'Impossibile creare il link di condivisione: {error}',
|
||
'patmgr.unshare_success': 'Condivisione per "{label}" revocata.',
|
||
'patmgr.unshare_error': 'Impossibile revocare la condivisione: {error}',
|
||
'patmgr.profile_loading': 'Il profilo è ancora in caricamento. Riprova tra poco.',
|
||
'patmgr.enable_visible': 'Attiva "Test visibili" nel profilo prima di condividere i test.',
|
||
'patmgr.save_before_share': 'Salva prima il test prima di condividerlo.',
|
||
'patmgr.save_for_share': 'Salva prima in modo che lo stato attuale venga condiviso.',
|
||
'patmgr.save_first': 'Salva prima',
|
||
'patmgr.profile_loading_btn': 'Profilo in caricamento',
|
||
'patmgr.enable_visible_btn': 'Attiva "Test visibili" nel profilo',
|
||
|
||
'patlist.title': 'PAT Test Manager',
|
||
'patlist.new_assessment': 'Nuova valutazione',
|
||
'patlist.filter_name': 'Filtra per nome',
|
||
'patlist.filter_date': 'Filtra per data',
|
||
'patlist.col_name': 'Nome',
|
||
'patlist.col_date': 'Data',
|
||
'patlist.col_result': 'Risultato',
|
||
'patlist.date_placeholder': 'gg.mm.aaaa',
|
||
'patlist.prev_month': 'Mese precedente',
|
||
'patlist.next_month': 'Mese successivo',
|
||
'patlist.today': 'Oggi',
|
||
'patlist.delete': 'Elimina',
|
||
'patlist.open_assessments': 'Valutazioni aperte',
|
||
'patlist.no_open': 'Nessuna valutazione aperta trovata con i filtri attuali',
|
||
'patlist.closed_assessments': 'Valutazioni finalizzate',
|
||
'patlist.no_closed': 'Nessuna valutazione finalizzata trovata con i filtri attuali',
|
||
'patlist.no_assessments': 'Nessuna valutazione ancora',
|
||
'patlist.no_assessments_hint': 'Crea una nuova valutazione sopra e scegli PAT Start, PAT 1, PAT 2 o PAT 3',
|
||
'patlist.share_active': 'Condivisione attiva',
|
||
'patlist.share_paused': 'Condivisione in pausa',
|
||
'patlist.finalized': 'Finalizzato',
|
||
'patlist.open': 'Apri',
|
||
'patlist.count': 'Numero: {count}',
|
||
'patlist.days': 'Lu Ma Me Gi Ve Sa Do',
|
||
|
||
'detail.back': '← Torna alla panoramica',
|
||
'detail.unsaved': '● Modifiche non salvate',
|
||
'detail.finalized': 'Finalizzato',
|
||
'detail.share_active': 'Condivisione attiva',
|
||
'detail.share_paused': 'Condivisione in pausa',
|
||
'detail.save': 'Salva',
|
||
'detail.finalize': 'Finalizza',
|
||
'detail.pdf': 'PDF',
|
||
'detail.share': 'Condividi',
|
||
'detail.unshare': 'Revoca condivisione',
|
||
'detail.readonly': 'Sola lettura',
|
||
'detail.readonly_hint': 'Questa valutazione è stata finalizzata e non può più essere modificata.',
|
||
'detail.date_name': 'Data / Nome',
|
||
'detail.name_placeholder': 'Nome',
|
||
'detail.col_avg_target': 'Media obiettivo {soll}',
|
||
'detail.col_actual': 'Effettivo',
|
||
'detail.col_factor': 'Fattore',
|
||
'detail.col_points': 'Punti',
|
||
'detail.col_result': 'Risultato',
|
||
|
||
'savedialog.title': 'Modifiche non salvate',
|
||
'savedialog.message': 'Hai modifiche non salvate. Vuoi salvarle?',
|
||
'savedialog.yes': 'Sì, salva',
|
||
'savedialog.no': 'No, scarta',
|
||
'savedialog.cancel': 'Annulla',
|
||
|
||
'analysis.title': 'Analisi',
|
||
'analysis.priority_title': 'Dove dovresti migliorare?',
|
||
'analysis.priority_desc': 'Priorità secondo Gap × Fattore × Costanza basata sugli ultimi 5 assessment.',
|
||
'analysis.assessments_count': 'Valutazioni: {count}',
|
||
'analysis.window': 'Finestra analisi: {count}/5',
|
||
'analysis.limited_data': 'Base dati limitata',
|
||
'analysis.no_data': 'Nessun dato per l\'analisi',
|
||
'analysis.no_data_hint': 'Crea prima una valutazione nella sezione "Valutazioni".',
|
||
'analysis.no_type_data': 'Nessuna valutazione per {patType}',
|
||
'analysis.no_type_hint': 'Scegli un altro tipo PAT o crea una nuova valutazione.',
|
||
|
||
'weakness.no_data': 'Nessun dato sui punti deboli disponibile.',
|
||
'weakness.title': 'Top 3 Punti deboli',
|
||
'weakness.gap': 'Gap: {score}',
|
||
'weakness.consistency': 'Costanza: {score}',
|
||
'weakness.trend': 'Tendenza: {score}',
|
||
|
||
'strength.no_data': 'Nessun dato sui punti di forza disponibile.',
|
||
'strength.title': 'Top 3 Punti di forza',
|
||
'strength.actual': 'Effettivo: {score}',
|
||
'strength.target': 'Obiettivo: {score}',
|
||
'strength.trend': 'Tendenza: {score}',
|
||
|
||
'training.title': 'Piano di allenamento ({patType})',
|
||
'training.hint': '1 piano attivo + cronologia, stato sessione: aperto / completato / saltato.',
|
||
'training.reload': 'Ricarica',
|
||
'training.duration': 'Durata',
|
||
'training.2weeks': '2 settimane',
|
||
'training.4weeks': '4 settimane',
|
||
'training.6weeks': '6 settimane',
|
||
'training.sessions_per_week': 'Sessioni/settimana',
|
||
'training.generate': 'Genera piano',
|
||
'training.save_draft': 'Salva bozza',
|
||
'training.saving': 'Salvataggio…',
|
||
'training.draft_created': 'Nuova bozza creata. Puoi ora regolare intensità ed esercizi per sessione.',
|
||
'training.create_draft_first': 'Crea prima una bozza.',
|
||
'training.save_error': 'Impossibile salvare il piano di allenamento.',
|
||
'training.save_success': 'Piano di allenamento salvato. Il piano attivo precedente è stato archiviato.',
|
||
'training.week_session': 'Settimana {weekNo} · Sessione {sessionNo}',
|
||
'training.main_exercise': 'Esercizio principale',
|
||
'training.side_exercises': 'Esercizi secondari, separati da virgola',
|
||
'training.high': 'alto',
|
||
'training.medium': 'medio',
|
||
'training.easy': 'facile',
|
||
'training.draft_label': 'Bozza (parzialmente modificabile)',
|
||
'training.sessions_info': 'Sessioni: {count} · alto {high} · medio {medium} · facile {easy}',
|
||
'training.active_plan': 'Piano attivo',
|
||
'training.loading': 'Caricamento…',
|
||
'training.no_active': 'Nessun piano di allenamento attivo.',
|
||
'training.generated': 'Generato: {date} · {weeks} settimane · {sessions} sessioni/settimana',
|
||
'training.week_short': 'S{weekNo} · E{sessionNo}',
|
||
'training.status_open': 'aperto',
|
||
'training.status_done': 'completato',
|
||
'training.status_skipped': 'saltato',
|
||
'training.note': 'Nota',
|
||
'training.history': 'Cronologia piani',
|
||
'training.no_history': 'Nessun piano archiviato disponibile.',
|
||
|
||
'gapchart.no_data': 'Nessun grafico gap disponibile.',
|
||
'gapchart.title': 'Grafico Gap (Priorità)',
|
||
'gapchart.aria': 'Grafico a barre gap',
|
||
|
||
'live.title': 'Panoramica live',
|
||
'live.stats_title': 'Statistiche attuali',
|
||
'live.basis': 'Base: tutte le valutazioni, caricate all\'apertura della pagina',
|
||
'live.loading': 'Caricamento…',
|
||
'live.timestamp': 'Aggiornato: ora',
|
||
'live.no_data': 'Nessuna valutazione ancora. Crea una nuova valutazione per vedere i valori live.',
|
||
'live.count': 'Valutazioni',
|
||
'live.count_desc': 'Salvate nel database PAT',
|
||
'live.avg_points': 'Ø Punti totali',
|
||
'live.avg_desc': 'Media di tutti gli assessment',
|
||
'live.last': 'Ultima valutazione',
|
||
'live.unnamed': 'Senza nome',
|
||
'live.top': 'Risultato migliore',
|
||
|
||
'shared.missing_token': 'Link di condivisione mancante.',
|
||
'shared.invalid': 'Questo link di condivisione non è valido, è disabilitato o non è attualmente visibile pubblicamente.',
|
||
'shared.load_error': 'Impossibile caricare il test condiviso.',
|
||
'shared.loading': 'Caricamento test condiviso...',
|
||
'shared.label': 'Condivisione',
|
||
'shared.not_available': 'Test condiviso non disponibile',
|
||
'shared.title': 'Test condiviso',
|
||
'shared.default_name': 'PAT Test',
|
||
'shared.hint': 'Questo link mostra solo questo test in modalità sola lettura.',
|
||
'shared.date': 'Data',
|
||
'shared.total_points': 'Punti totali',
|
||
'shared.rating': 'Valutazione',
|
||
'shared.target_factor': 'Obiettivo {soll} · Fattore {faktor}',
|
||
'shared.col_points': 'Punti',
|
||
'shared.col_values': 'Valori',
|
||
'shared.col_avg': 'Media',
|
||
'shared.col_target': 'Obiettivo',
|
||
'shared.col_factor': 'Fattore',
|
||
'shared.col_result': 'Risultato',
|
||
|
||
'auth.title': 'PAT Stats',
|
||
'auth.subtitle': 'Accedi o registrati',
|
||
'auth.description': 'Accedi con il tuo account PAT Test per gestire le tue valutazioni in modo sicuro.',
|
||
'auth.login_tab': 'Login',
|
||
'auth.register_tab': 'Registrati',
|
||
'auth.email': 'Email',
|
||
'auth.password': 'Password',
|
||
'auth.login_success': 'Accesso effettuato con successo',
|
||
'auth.register_success': 'Registrazione completata. Controlla la tua casella di posta per la conferma.',
|
||
'auth.sending': 'Invio in corso...',
|
||
'auth.login_btn': 'Accedi',
|
||
'auth.register_btn': 'Crea account',
|
||
'auth.back': 'Indietro',
|
||
},
|
||
|
||
es: {
|
||
'nav.logged_in': 'Conectado',
|
||
'nav.assessments': 'Evaluaciones',
|
||
'nav.analysis': 'Análisis',
|
||
'nav.profile': 'Perfil',
|
||
'nav.sign_out': 'Cerrar sesión',
|
||
'nav.theme_dark': 'Modo oscuro',
|
||
'nav.theme_light': 'Modo claro',
|
||
'nav.analysis_disabled': 'El análisis está deshabilitado durante la edición',
|
||
'nav.analysis_open': 'Abrir análisis',
|
||
'nav.profile_disabled': 'El perfil está deshabilitado durante la edición',
|
||
'nav.profile_open': 'Abrir perfil',
|
||
|
||
'profile.title_label': 'Perfil de usuario',
|
||
'profile.title': 'Gestionar perfil',
|
||
'profile.description': 'Administra aquí tu nombre, apellido, dirección de correo, país y la visibilidad de tus comparticiones de pruebas.',
|
||
'profile.loading': 'Cargando perfil...',
|
||
'profile.first_name': 'Nombre',
|
||
'profile.first_name_placeholder': 'Juan',
|
||
'profile.last_name': 'Apellido',
|
||
'profile.last_name_placeholder': 'García',
|
||
'profile.email': 'Dirección de correo',
|
||
'profile.email_hint': 'Si cambias tu dirección de correo, se enviará una confirmación a la nueva dirección.',
|
||
'profile.country': 'País',
|
||
'profile.country_none': 'Ningún país seleccionado',
|
||
'profile.country_hint': 'Tu país',
|
||
'profile.display': 'Visualización',
|
||
'profile.display_hint': 'Idioma en el que se muestra la aplicación.',
|
||
'profile.rank': 'Posición en el ranking',
|
||
'profile.rank_placeholder': 'Marcador de posición',
|
||
'profile.rank_hint': 'Aquí se mostrará más adelante la posición en el ranking del usuario.',
|
||
'profile.tests_visible_title': 'Pruebas visibles',
|
||
'profile.tests_visible_desc': 'Cuando este interruptor está activo, tus enlaces de compartición funcionan. Si lo desactivas, los enlaces existentes se guardan pero ya no son visibles públicamente.',
|
||
'profile.visible': 'Visible',
|
||
'profile.not_visible': 'No visible',
|
||
'profile.account_id': 'ID de cuenta',
|
||
'profile.delete': 'Eliminar perfil',
|
||
'profile.deleting': 'Eliminando...',
|
||
'profile.save': 'Guardar perfil',
|
||
'profile.saving': 'Guardando...',
|
||
'profile.saved': 'Perfil guardado.',
|
||
'profile.saved_email': 'Perfil guardado. Es posible que la nueva dirección de correo deba confirmarse por correo electrónico.',
|
||
'profile.error_save': 'No se pudo guardar el perfil.',
|
||
'profile.error_delete': 'No se pudo eliminar el perfil.',
|
||
'profile.delete_confirm': '¿Realmente eliminar el perfil?\n\nEsto eliminará permanentemente todas las pruebas de este usuario y los planes de análisis existentes.',
|
||
'profile.deleted': 'El perfil y todas las pruebas han sido eliminados. La cuenta permanece y puede volver a configurarse.',
|
||
|
||
'patmgr.saved': '¡Guardado con éxito!',
|
||
'patmgr.finalized': 'La evaluación ha sido finalizada y ahora es de solo lectura.',
|
||
'patmgr.fill_name_date': 'Por favor, completa nombre y fecha antes de guardar',
|
||
'patmgr.share_copied': 'Enlace de compartición para "{label}" copiado al portapapeles.',
|
||
'patmgr.share_localhost_hint': 'Nota: El enlace apunta actualmente a localhost y solo es accesible si la app es alcanzable desde fuera.',
|
||
'patmgr.share_link_label': 'Enlace de compartición para "{label}"',
|
||
'patmgr.share_error': 'No se pudo crear el enlace de compartición: {error}',
|
||
'patmgr.unshare_success': 'Compartición para "{label}" revocada.',
|
||
'patmgr.unshare_error': 'No se pudo revocar la compartición: {error}',
|
||
'patmgr.profile_loading': 'El perfil aún se está cargando. Por favor, inténtalo de nuevo en un momento.',
|
||
'patmgr.enable_visible': 'Activa "Pruebas visibles" en tu perfil antes de compartir pruebas.',
|
||
'patmgr.save_before_share': 'Por favor, guarda la prueba primero antes de compartirla.',
|
||
'patmgr.save_for_share': 'Por favor, guarda primero para que se comparta el estado actual.',
|
||
'patmgr.save_first': 'Por favor, guarda primero',
|
||
'patmgr.profile_loading_btn': 'Cargando perfil',
|
||
'patmgr.enable_visible_btn': 'Activa "Pruebas visibles" en el perfil',
|
||
|
||
'patlist.title': 'PAT Test Manager',
|
||
'patlist.new_assessment': 'Nueva evaluación',
|
||
'patlist.filter_name': 'Filtrar por nombre',
|
||
'patlist.filter_date': 'Filtrar por fecha',
|
||
'patlist.col_name': 'Nombre',
|
||
'patlist.col_date': 'Fecha',
|
||
'patlist.col_result': 'Resultado',
|
||
'patlist.date_placeholder': 'dd.mm.aaaa',
|
||
'patlist.prev_month': 'Mes anterior',
|
||
'patlist.next_month': 'Mes siguiente',
|
||
'patlist.today': 'Hoy',
|
||
'patlist.delete': 'Eliminar',
|
||
'patlist.open_assessments': 'Evaluaciones abiertas',
|
||
'patlist.no_open': 'No se encontraron evaluaciones abiertas con los filtros actuales',
|
||
'patlist.closed_assessments': 'Evaluaciones finalizadas',
|
||
'patlist.no_closed': 'No se encontraron evaluaciones finalizadas con los filtros actuales',
|
||
'patlist.no_assessments': 'Aún no hay evaluaciones',
|
||
'patlist.no_assessments_hint': 'Crea una nueva evaluación arriba y elige PAT Start, PAT 1, PAT 2 o PAT 3',
|
||
'patlist.share_active': 'Compartición activa',
|
||
'patlist.share_paused': 'Compartición pausada',
|
||
'patlist.finalized': 'Finalizado',
|
||
'patlist.open': 'Abrir',
|
||
'patlist.count': 'Cantidad: {count}',
|
||
'patlist.days': 'Lu Ma Mi Ju Vi Sá Do',
|
||
|
||
'detail.back': '← Volver a la vista general',
|
||
'detail.unsaved': '● Cambios sin guardar',
|
||
'detail.finalized': 'Finalizado',
|
||
'detail.share_active': 'Compartición activa',
|
||
'detail.share_paused': 'Compartición pausada',
|
||
'detail.save': 'Guardar',
|
||
'detail.finalize': 'Finalizar',
|
||
'detail.pdf': 'PDF',
|
||
'detail.share': 'Compartir',
|
||
'detail.unshare': 'Revocar compartición',
|
||
'detail.readonly': 'Solo lectura',
|
||
'detail.readonly_hint': 'Esta evaluación ha sido finalizada y ya no puede editarse.',
|
||
'detail.date_name': 'Fecha / Nombre',
|
||
'detail.name_placeholder': 'Nombre',
|
||
'detail.col_avg_target': 'Promedio objetivo {soll}',
|
||
'detail.col_actual': 'Real',
|
||
'detail.col_factor': 'Factor',
|
||
'detail.col_points': 'Puntos',
|
||
'detail.col_result': 'Resultado',
|
||
|
||
'savedialog.title': 'Cambios sin guardar',
|
||
'savedialog.message': 'Tienes cambios sin guardar. ¿Deseas guardarlos?',
|
||
'savedialog.yes': 'Sí, guardar',
|
||
'savedialog.no': 'No, descartar',
|
||
'savedialog.cancel': 'Cancelar',
|
||
|
||
'analysis.title': 'Análisis',
|
||
'analysis.priority_title': '¿Dónde deberías mejorar?',
|
||
'analysis.priority_desc': 'Priorizado por Gap × Factor × Consistencia basado en las últimas 5 evaluaciones.',
|
||
'analysis.assessments_count': 'Evaluaciones: {count}',
|
||
'analysis.window': 'Ventana de análisis: {count}/5',
|
||
'analysis.limited_data': 'Base de datos limitada',
|
||
'analysis.no_data': 'Aún no hay datos para el análisis',
|
||
'analysis.no_data_hint': 'Crea primero una evaluación en la sección "Evaluaciones".',
|
||
'analysis.no_type_data': 'No hay evaluaciones para {patType}',
|
||
'analysis.no_type_hint': 'Elige otro tipo PAT o crea una nueva evaluación.',
|
||
|
||
'weakness.no_data': 'No hay datos de puntos débiles disponibles.',
|
||
'weakness.title': 'Top 3 Puntos débiles',
|
||
'weakness.gap': 'Gap: {score}',
|
||
'weakness.consistency': 'Consistencia: {score}',
|
||
'weakness.trend': 'Tendencia: {score}',
|
||
|
||
'strength.no_data': 'No hay datos de puntos fuertes disponibles.',
|
||
'strength.title': 'Top 3 Puntos fuertes',
|
||
'strength.actual': 'Real: {score}',
|
||
'strength.target': 'Objetivo: {score}',
|
||
'strength.trend': 'Tendencia: {score}',
|
||
|
||
'training.title': 'Plan de entrenamiento ({patType})',
|
||
'training.hint': '1 plan activo + historial, estado de sesión: abierto / completado / omitido.',
|
||
'training.reload': 'Recargar',
|
||
'training.duration': 'Duración',
|
||
'training.2weeks': '2 semanas',
|
||
'training.4weeks': '4 semanas',
|
||
'training.6weeks': '6 semanas',
|
||
'training.sessions_per_week': 'Sesiones/semana',
|
||
'training.generate': 'Generar plan',
|
||
'training.save_draft': 'Guardar borrador',
|
||
'training.saving': 'Guardando…',
|
||
'training.draft_created': 'Nuevo borrador creado. Ahora puedes ajustar la intensidad y los ejercicios por sesión.',
|
||
'training.create_draft_first': 'Crea primero un borrador.',
|
||
'training.save_error': 'No se pudo guardar el plan de entrenamiento.',
|
||
'training.save_success': 'Plan de entrenamiento guardado. El plan activo anterior ha sido archivado.',
|
||
'training.week_session': 'Semana {weekNo} · Sesión {sessionNo}',
|
||
'training.main_exercise': 'Ejercicio principal',
|
||
'training.side_exercises': 'Ejercicios secundarios, separados por coma',
|
||
'training.high': 'alto',
|
||
'training.medium': 'medio',
|
||
'training.easy': 'fácil',
|
||
'training.draft_label': 'Borrador (parcialmente editable)',
|
||
'training.sessions_info': 'Sesiones: {count} · alto {high} · medio {medium} · fácil {easy}',
|
||
'training.active_plan': 'Plan activo',
|
||
'training.loading': 'Cargando…',
|
||
'training.no_active': 'Aún no hay plan de entrenamiento activo.',
|
||
'training.generated': 'Generado: {date} · {weeks} semanas · {sessions} sesiones/semana',
|
||
'training.week_short': 'S{weekNo} · E{sessionNo}',
|
||
'training.status_open': 'abierto',
|
||
'training.status_done': 'completado',
|
||
'training.status_skipped': 'omitido',
|
||
'training.note': 'Nota',
|
||
'training.history': 'Historial de planes',
|
||
'training.no_history': 'No hay planes archivados disponibles.',
|
||
|
||
'gapchart.no_data': 'No hay gráfico de gap disponible.',
|
||
'gapchart.title': 'Gráfico de Gap (Prioridad)',
|
||
'gapchart.aria': 'Gráfico de barras de gap',
|
||
|
||
'live.title': 'Vista en vivo',
|
||
'live.stats_title': 'Estadísticas actuales',
|
||
'live.basis': 'Base: todas las evaluaciones, cargadas al abrir la página',
|
||
'live.loading': 'Cargando…',
|
||
'live.timestamp': 'Actualizado: ahora',
|
||
'live.no_data': 'Aún no hay evaluaciones. Crea una nueva evaluación para ver valores en vivo aquí.',
|
||
'live.count': 'Evaluaciones',
|
||
'live.count_desc': 'Almacenadas en la base de datos PAT',
|
||
'live.avg_points': 'Ø Puntos totales',
|
||
'live.avg_desc': 'Promedio de todas las evaluaciones',
|
||
'live.last': 'Última evaluación',
|
||
'live.unnamed': 'Sin nombre',
|
||
'live.top': 'Mejor resultado',
|
||
|
||
'shared.missing_token': 'Falta el enlace de compartición.',
|
||
'shared.invalid': 'Este enlace de compartición no es válido, está desactivado o no es visible públicamente.',
|
||
'shared.load_error': 'No se pudo cargar el test compartido.',
|
||
'shared.loading': 'Cargando test compartido...',
|
||
'shared.label': 'Compartición',
|
||
'shared.not_available': 'Test compartido no disponible',
|
||
'shared.title': 'Test compartido',
|
||
'shared.default_name': 'PAT Test',
|
||
'shared.hint': 'Este enlace muestra solo este test en modo de solo lectura.',
|
||
'shared.date': 'Fecha',
|
||
'shared.total_points': 'Puntos totales',
|
||
'shared.rating': 'Evaluación',
|
||
'shared.target_factor': 'Objetivo {soll} · Factor {faktor}',
|
||
'shared.col_points': 'Puntos',
|
||
'shared.col_values': 'Valores',
|
||
'shared.col_avg': 'Promedio',
|
||
'shared.col_target': 'Objetivo',
|
||
'shared.col_factor': 'Factor',
|
||
'shared.col_result': 'Resultado',
|
||
|
||
'auth.title': 'PAT Stats',
|
||
'auth.subtitle': 'Iniciar sesión o registrarse',
|
||
'auth.description': 'Inicia sesión con tu cuenta PAT Test para gestionar tus evaluaciones de forma segura.',
|
||
'auth.login_tab': 'Login',
|
||
'auth.register_tab': 'Registrarse',
|
||
'auth.email': 'Correo electrónico',
|
||
'auth.password': 'Contraseña',
|
||
'auth.login_success': 'Sesión iniciada con éxito',
|
||
'auth.register_success': 'Registro completado. Revisa tu bandeja de entrada para confirmar.',
|
||
'auth.sending': 'Enviando...',
|
||
'auth.login_btn': 'Iniciar sesión',
|
||
'auth.register_btn': 'Crear cuenta',
|
||
'auth.back': 'Volver',
|
||
},
|
||
|
||
pt: {
|
||
'nav.logged_in': 'Conectado',
|
||
'nav.assessments': 'Avaliações',
|
||
'nav.analysis': 'Análise',
|
||
'nav.profile': 'Perfil',
|
||
'nav.sign_out': 'Sair',
|
||
'nav.theme_dark': 'Modo escuro',
|
||
'nav.theme_light': 'Modo claro',
|
||
'nav.analysis_disabled': 'A análise está desativada durante a edição',
|
||
'nav.analysis_open': 'Abrir análise',
|
||
'nav.profile_disabled': 'O perfil está desativado durante a edição',
|
||
'nav.profile_open': 'Abrir perfil',
|
||
|
||
'profile.title_label': 'Perfil do utilizador',
|
||
'profile.title': 'Gerir perfil',
|
||
'profile.description': 'Gira aqui o seu nome, apelido, endereço de e-mail, país e a visibilidade das suas partilhas de testes.',
|
||
'profile.loading': 'A carregar perfil...',
|
||
'profile.first_name': 'Nome próprio',
|
||
'profile.first_name_placeholder': 'João',
|
||
'profile.last_name': 'Apelido',
|
||
'profile.last_name_placeholder': 'Silva',
|
||
'profile.email': 'Endereço de e-mail',
|
||
'profile.email_hint': 'Se alterar o endereço de e-mail, será enviada uma confirmação para o novo endereço.',
|
||
'profile.country': 'País',
|
||
'profile.country_none': 'Nenhum país selecionado',
|
||
'profile.country_hint': 'O seu país',
|
||
'profile.display': 'Exibição',
|
||
'profile.display_hint': 'Idioma em que a aplicação é exibida.',
|
||
'profile.rank': 'Classificação',
|
||
'profile.rank_placeholder': 'Marcador',
|
||
'profile.rank_hint': 'Aqui será exibida posteriormente a posição do utilizador no ranking.',
|
||
'profile.tests_visible_title': 'Testes visíveis',
|
||
'profile.tests_visible_desc': 'Quando este interruptor está ativo, os seus links de partilha funcionam. Se o desativar, os links existentes são guardados mas deixam de ser visíveis publicamente.',
|
||
'profile.visible': 'Visível',
|
||
'profile.not_visible': 'Não visível',
|
||
'profile.account_id': 'ID da conta',
|
||
'profile.delete': 'Eliminar perfil',
|
||
'profile.deleting': 'A eliminar...',
|
||
'profile.save': 'Guardar perfil',
|
||
'profile.saving': 'A guardar...',
|
||
'profile.saved': 'Perfil guardado.',
|
||
'profile.saved_email': 'Perfil guardado. O novo endereço de e-mail pode ainda precisar de confirmação por e-mail.',
|
||
'profile.error_save': 'Não foi possível guardar o perfil.',
|
||
'profile.error_delete': 'Não foi possível eliminar o perfil.',
|
||
'profile.delete_confirm': 'Eliminar realmente o perfil?\n\nIsso removerá permanentemente todos os testes deste utilizador e os planos de análise existentes.',
|
||
'profile.deleted': 'Perfil e todos os testes foram eliminados. A conta permanece e pode ser configurada novamente.',
|
||
|
||
'patmgr.saved': 'Guardado com sucesso!',
|
||
'patmgr.finalized': 'A avaliação foi finalizada e agora é somente leitura.',
|
||
'patmgr.fill_name_date': 'Por favor, preencha nome e data antes de guardar',
|
||
'patmgr.share_copied': 'Link de partilha para "{label}" copiado para a área de transferência.',
|
||
'patmgr.share_localhost_hint': 'Nota: O link aponta atualmente para localhost e só é acessível se a app estiver acessível externamente.',
|
||
'patmgr.share_link_label': 'Link de partilha para "{label}"',
|
||
'patmgr.share_error': 'Não foi possível criar o link de partilha: {error}',
|
||
'patmgr.unshare_success': 'Partilha para "{label}" revogada.',
|
||
'patmgr.unshare_error': 'Não foi possível revogar a partilha: {error}',
|
||
'patmgr.profile_loading': 'O perfil ainda está a carregar. Por favor, tente novamente em breve.',
|
||
'patmgr.enable_visible': 'Ative "Testes visíveis" no perfil antes de partilhar testes.',
|
||
'patmgr.save_before_share': 'Por favor, guarde o teste primeiro antes de o partilhar.',
|
||
'patmgr.save_for_share': 'Por favor, guarde primeiro para que o estado atual seja partilhado.',
|
||
'patmgr.save_first': 'Por favor, guarde primeiro',
|
||
'patmgr.profile_loading_btn': 'A carregar perfil',
|
||
'patmgr.enable_visible_btn': 'Ative "Testes visíveis" no perfil',
|
||
|
||
'patlist.title': 'PAT Test Manager',
|
||
'patlist.new_assessment': 'Nova avaliação',
|
||
'patlist.filter_name': 'Filtrar por nome',
|
||
'patlist.filter_date': 'Filtrar por data',
|
||
'patlist.col_name': 'Nome',
|
||
'patlist.col_date': 'Data',
|
||
'patlist.col_result': 'Resultado',
|
||
'patlist.date_placeholder': 'dd.mm.aaaa',
|
||
'patlist.prev_month': 'Mês anterior',
|
||
'patlist.next_month': 'Próximo mês',
|
||
'patlist.today': 'Hoje',
|
||
'patlist.delete': 'Eliminar',
|
||
'patlist.open_assessments': 'Avaliações abertas',
|
||
'patlist.no_open': 'Nenhuma avaliação aberta encontrada com os filtros atuais',
|
||
'patlist.closed_assessments': 'Avaliações finalizadas',
|
||
'patlist.no_closed': 'Nenhuma avaliação finalizada encontrada com os filtros atuais',
|
||
'patlist.no_assessments': 'Ainda não há avaliações',
|
||
'patlist.no_assessments_hint': 'Crie uma nova avaliação acima e escolha PAT Start, PAT 1, PAT 2 ou PAT 3',
|
||
'patlist.share_active': 'Partilha ativa',
|
||
'patlist.share_paused': 'Partilha pausada',
|
||
'patlist.finalized': 'Finalizado',
|
||
'patlist.open': 'Abrir',
|
||
'patlist.count': 'Quantidade: {count}',
|
||
'patlist.days': 'Se Te Qu Qu Se Sá Do',
|
||
|
||
'detail.back': '← Voltar à vista geral',
|
||
'detail.unsaved': '● Alterações não guardadas',
|
||
'detail.finalized': 'Finalizado',
|
||
'detail.share_active': 'Partilha ativa',
|
||
'detail.share_paused': 'Partilha pausada',
|
||
'detail.save': 'Guardar',
|
||
'detail.finalize': 'Finalizar',
|
||
'detail.pdf': 'PDF',
|
||
'detail.share': 'Partilhar',
|
||
'detail.unshare': 'Revogar partilha',
|
||
'detail.readonly': 'Somente leitura',
|
||
'detail.readonly_hint': 'Esta avaliação foi finalizada e já não pode ser editada.',
|
||
'detail.date_name': 'Data / Nome',
|
||
'detail.name_placeholder': 'Nome',
|
||
'detail.col_avg_target': 'Média objetivo {soll}',
|
||
'detail.col_actual': 'Real',
|
||
'detail.col_factor': 'Fator',
|
||
'detail.col_points': 'Pontos',
|
||
'detail.col_result': 'Resultado',
|
||
|
||
'savedialog.title': 'Alterações não guardadas',
|
||
'savedialog.message': 'Tem alterações não guardadas. Deseja guardá-las?',
|
||
'savedialog.yes': 'Sim, guardar',
|
||
'savedialog.no': 'Não, descartar',
|
||
'savedialog.cancel': 'Cancelar',
|
||
|
||
'analysis.title': 'Análise',
|
||
'analysis.priority_title': 'Onde deve melhorar?',
|
||
'analysis.priority_desc': 'Priorizado por Gap × Fator × Consistência com base nas últimas 5 avaliações.',
|
||
'analysis.assessments_count': 'Avaliações: {count}',
|
||
'analysis.window': 'Janela de análise: {count}/5',
|
||
'analysis.limited_data': 'Base de dados limitada',
|
||
'analysis.no_data': 'Ainda não há dados para a análise',
|
||
'analysis.no_data_hint': 'Crie primeiro uma avaliação na secção "Avaliações".',
|
||
'analysis.no_type_data': 'Sem avaliações para {patType}',
|
||
'analysis.no_type_hint': 'Escolha outro tipo PAT ou crie uma nova avaliação.',
|
||
|
||
'weakness.no_data': 'Sem dados de pontos fracos disponíveis.',
|
||
'weakness.title': 'Top 3 Pontos fracos',
|
||
'weakness.gap': 'Gap: {score}',
|
||
'weakness.consistency': 'Consistência: {score}',
|
||
'weakness.trend': 'Tendência: {score}',
|
||
|
||
'strength.no_data': 'Sem dados de pontos fortes disponíveis.',
|
||
'strength.title': 'Top 3 Pontos fortes',
|
||
'strength.actual': 'Real: {score}',
|
||
'strength.target': 'Objetivo: {score}',
|
||
'strength.trend': 'Tendência: {score}',
|
||
|
||
'training.title': 'Plano de treino ({patType})',
|
||
'training.hint': '1 plano ativo + histórico, estado da sessão: aberto / concluído / ignorado.',
|
||
'training.reload': 'Recarregar',
|
||
'training.duration': 'Duração',
|
||
'training.2weeks': '2 semanas',
|
||
'training.4weeks': '4 semanas',
|
||
'training.6weeks': '6 semanas',
|
||
'training.sessions_per_week': 'Sessões/semana',
|
||
'training.generate': 'Gerar plano',
|
||
'training.save_draft': 'Guardar rascunho',
|
||
'training.saving': 'A guardar…',
|
||
'training.draft_created': 'Novo rascunho criado. Pode agora ajustar intensidade e exercícios por sessão.',
|
||
'training.create_draft_first': 'Crie primeiro um rascunho.',
|
||
'training.save_error': 'Não foi possível guardar o plano de treino.',
|
||
'training.save_success': 'Plano de treino guardado. O plano ativo anterior foi arquivado.',
|
||
'training.week_session': 'Semana {weekNo} · Sessão {sessionNo}',
|
||
'training.main_exercise': 'Exercício principal',
|
||
'training.side_exercises': 'Exercícios secundários, separados por vírgula',
|
||
'training.high': 'alto',
|
||
'training.medium': 'médio',
|
||
'training.easy': 'fácil',
|
||
'training.draft_label': 'Rascunho (parcialmente editável)',
|
||
'training.sessions_info': 'Sessões: {count} · alto {high} · médio {medium} · fácil {easy}',
|
||
'training.active_plan': 'Plano ativo',
|
||
'training.loading': 'A carregar…',
|
||
'training.no_active': 'Ainda não há plano de treino ativo.',
|
||
'training.generated': 'Gerado: {date} · {weeks} semanas · {sessions} sessões/semana',
|
||
'training.week_short': 'S{weekNo} · E{sessionNo}',
|
||
'training.status_open': 'aberto',
|
||
'training.status_done': 'concluído',
|
||
'training.status_skipped': 'ignorado',
|
||
'training.note': 'Nota',
|
||
'training.history': 'Histórico de planos',
|
||
'training.no_history': 'Sem planos arquivados disponíveis.',
|
||
|
||
'gapchart.no_data': 'Sem gráfico de gap disponível.',
|
||
'gapchart.title': 'Gráfico de Gap (Prioridade)',
|
||
'gapchart.aria': 'Gráfico de barras de gap',
|
||
|
||
'live.title': 'Vista em direto',
|
||
'live.stats_title': 'Estatísticas atuais',
|
||
'live.basis': 'Base: todas as avaliações, carregadas ao abrir a página',
|
||
'live.loading': 'A carregar…',
|
||
'live.timestamp': 'Atualizado: agora',
|
||
'live.no_data': 'Ainda não há avaliações. Crie uma nova avaliação para ver valores em direto aqui.',
|
||
'live.count': 'Avaliações',
|
||
'live.count_desc': 'Guardadas na base de dados PAT',
|
||
'live.avg_points': 'Ø Pontos totais',
|
||
'live.avg_desc': 'Média de todas as avaliações',
|
||
'live.last': 'Última avaliação',
|
||
'live.unnamed': 'Sem nome',
|
||
'live.top': 'Melhor resultado',
|
||
|
||
'shared.missing_token': 'Link de partilha em falta.',
|
||
'shared.invalid': 'Este link de partilha é inválido, está desativado ou não está atualmente visível publicamente.',
|
||
'shared.load_error': 'Não foi possível carregar o teste partilhado.',
|
||
'shared.loading': 'A carregar teste partilhado...',
|
||
'shared.label': 'Partilha',
|
||
'shared.not_available': 'Teste partilhado não disponível',
|
||
'shared.title': 'Teste partilhado',
|
||
'shared.default_name': 'PAT Test',
|
||
'shared.hint': 'Este link mostra apenas este teste em modo de somente leitura.',
|
||
'shared.date': 'Data',
|
||
'shared.total_points': 'Pontos totais',
|
||
'shared.rating': 'Avaliação',
|
||
'shared.target_factor': 'Objetivo {soll} · Fator {faktor}',
|
||
'shared.col_points': 'Pontos',
|
||
'shared.col_values': 'Valores',
|
||
'shared.col_avg': 'Média',
|
||
'shared.col_target': 'Objetivo',
|
||
'shared.col_factor': 'Fator',
|
||
'shared.col_result': 'Resultado',
|
||
|
||
'auth.title': 'PAT Stats',
|
||
'auth.subtitle': 'Entrar ou registar',
|
||
'auth.description': 'Entre com a sua conta PAT Test para gerir as suas avaliações de forma segura.',
|
||
'auth.login_tab': 'Login',
|
||
'auth.register_tab': 'Registar',
|
||
'auth.email': 'E-mail',
|
||
'auth.password': 'Palavra-passe',
|
||
'auth.login_success': 'Sessão iniciada com sucesso',
|
||
'auth.register_success': 'Registo concluído. Verifique a sua caixa de entrada para confirmação.',
|
||
'auth.sending': 'A enviar...',
|
||
'auth.login_btn': 'Entrar',
|
||
'auth.register_btn': 'Criar conta',
|
||
'auth.back': 'Voltar',
|
||
},
|
||
};
|
||
|
||
const SUPPORTED_LANGUAGES = ['de', 'en', 'it', 'es', 'pt'];
|
||
|
||
export function getTranslator(language) {
|
||
const lang = SUPPORTED_LANGUAGES.includes(language) ? language : 'de';
|
||
const dict = translations[lang];
|
||
const fallback = translations.de;
|
||
|
||
return (key, vars) => {
|
||
let str = dict[key] ?? fallback[key] ?? key;
|
||
if (vars) {
|
||
str = str.replace(/\{(\w+)\}/g, (_, k) => (vars[k] !== undefined ? vars[k] : `{${k}}`));
|
||
}
|
||
return str;
|
||
};
|
||
}
|
||
|
||
export { SUPPORTED_LANGUAGES };
|
||
export default translations;
|