diff --git a/locales/cs.yml b/locales/cs.yml index 3fb4faa..ce7a7e6 100644 --- a/locales/cs.yml +++ b/locales/cs.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfiguruj keydr' day_streak: ' | %{days} dni v rade' key_progress: ' Postup klaves %{unlocked}/%{total} (%{mastered} zvladnutych) | Cil %{target} WPM%{streak}' - hint_start: '[1-3] Spustit' - hint_skill_tree: '[t] Strom' - hint_keyboard: '[b] Klavesnice' - hint_stats: '[s] Statistiky' - hint_settings: '[c] Nastaveni' - hint_quit: '[q] Konec' + hint_start: 'Spustit' + hint_skill_tree: 'Strom' + hint_keyboard: 'Klavesnice' + hint_stats: 'Statistiky' + hint_settings: 'Nastaveni' + hint_quit: 'Konec' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Zdroj textu ' footer: '[ESC] Ukoncit cviceni [Backspace] Smazat' keys_reenabled: 'Klavesy obnoveny za %{ms}ms' - hint_end: '[ESC] Ukoncit cviceni' - hint_backspace: '[Backspace] Smazat' + hint_end: 'Ukoncit cviceni' + hint_backspace: 'Smazat' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} spravne)' input_blocked: ' Vstup docasne zablokovany ' input_blocked_ms: '(%{ms}ms zbyva)' - hint_continue: '[c/Enter/Space] Pokracovat' - hint_retry: '[r] Znovu' - hint_menu: '[q] Menu' - hint_stats: '[s] Statistiky' - hint_delete: '[x] Smazat' + hint_continue: 'Pokracovat' + hint_retry: 'Znovu' + hint_menu: 'Menu' + hint_stats: 'Statistiky' + hint_delete: 'Smazat' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Presnost' tab_timing: '[5] Casovani' tab_ngrams: '[6] N-gramy' - hint_back: '[ESC] Zpet' - hint_next_tab: '[Tab] Dalsi karta' - hint_switch_tab: '[1-6] Prepnout kartu' - hint_navigate: '[j/k] Navigovat' - hint_page: '[PgUp/PgDn] Stranka' - hint_delete: '[x] Smazat' + hint_back: 'Zpet' + hint_next_tab: 'Dalsi karta' + hint_switch_tab: 'Prepnout kartu' + hint_navigate: 'Navigovat' + hint_page: 'Stranka' + hint_delete: 'Smazat' summary_title: ' Souhrn ' drills: ' Cviceni: ' avg_wpm: ' Prum WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Cesta importu' import_data: 'Importovat data' import_now: 'Importovat nyni' - hint_save_back: '[ESC] Ulozit a zpet' - hint_change_value: '[Enter/sipky] Zmenit hodnotu' - hint_edit_path: '[Enter na ceste] Upravit' - hint_move: '[←→] Posunout' - hint_tab_complete: '[Tab] Doplnit (na konci)' - hint_confirm: '[Enter] Potvrdit' - hint_cancel: '[Esc] Zrusit' + hint_save_back: 'Ulozit a zpet' + hint_change_value: 'Zmenit hodnotu' + hint_edit_path: 'Upravit' + hint_move: 'Posunout' + hint_tab_complete: 'Doplnit (na konci)' + hint_confirm: 'Potvrdit' + hint_cancel: 'Zrusit' success_title: ' Uspech ' error_title: ' Chyba ' press_any_key: 'Stiskni libovolnou klavesu' @@ -236,9 +236,9 @@ select: cached: ' (v pameti)' disabled_download: ' (vypnuto: nutne stahnout)' download_required: ' (nutne stahnout)' - hint_navigate: '[Nahoru/Dolu/PgUp/PgDn] Navigovat' - hint_confirm: '[Enter] Potvrdit' - hint_back: '[ESC] Zpet' + hint_navigate: 'Navigovat' + hint_confirm: 'Potvrdit' + hint_back: 'Zpet' language_resets_layout: 'Vyber jazyka obnovi rozlozeni klaves na vychozi pro dany jazyk.' layout_no_language_change: 'Zmena rozlozeni nemeni jazyk slovniku.' disabled_network_notice: 'Nektere jazyky jsou vypnute: povolte sitove stahovani v nastaveni.' @@ -267,11 +267,11 @@ skill_tree: level: 'Uroven %{current}/%{total}' level_zero: 'Uroven 0/%{total}' in_focus: ' v zamereni' - hint_navigate: '[↑↓/jk] Navigovat' - hint_scroll: '[PgUp/PgDn nebo Ctrl+U/Ctrl+D] Rolovat' - hint_back: '[q] Zpet' - hint_unlock: '[Enter] Odemknout' - hint_start_drill: '[Enter] Spustit cviceni' + hint_navigate: 'Navigovat' + hint_scroll: 'Rolovat' + hint_back: 'Zpet' + hint_unlock: 'Odemknout' + hint_start_drill: 'Spustit cviceni' unlock_msg_1: 'Po odemknuti bude vychozi adaptivni cviceni zahrovat klavesy z teto vetve.' unlock_msg_2: 'Pokud se chces zamerit jen na tuto vetev, spust cviceni primo ze stromu.' confirm_unlock: 'Odemknout %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Kazda klavesa na klavesnici je na maximalni jistote.' mastery_takes_practice: 'Zbehlost neni cil — vyzaduje prubezne cviceni.' keep_drilling: 'Pokracuj v cviceni pro udrzeni sve urovne.' - hint_skill_tree_continue: '[t] Otevrit strom [Jina klavesa] Pokracovat' + hint_skill_tree_continue: 'Otevrit strom [Jina klavesa] Pokracovat' hint_any_key: 'Stiskni libovolnou klavesu pro pokracovani' input_blocked: 'Vstup docasne zablokovany (%{ms}ms zbyva)' unlock_msg_1: 'Skvela prace! Pokracuj v rozvoji svych dovednosti.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Svalova pamet uzamcena!' mastery_msg_4: 'Dalsi klavesa pokorena!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Vitejte v Adaptivnim cviceni! ' + how_it_works: 'Jak funguje adaptivni cviceni:' + desc_start: 'Zacinas s malou sadou nejbeznejsich pismen.' + desc_progress: 'Jak je pises s jistotou, nove klavesy jsou postupne' + desc_expand: 'odemykany, az zvladnes celou klavesnici.' + target_wpm_label: 'Cilovy WPM:' + target_wpm_desc: 'Ovlivnuje rychlost odemykani — vyssi cile vyzaduji' + target_wpm_default: 'rychlejsi psani. 35 WPM je dobry vychozi bod.' + hint: '[←→] Upravit WPM [Enter/Space] Spustit cviceni' + # Keyboard explorer keyboard: title: ' Klavesnice ' subtitle: 'Stiskni libovolnou klavesu nebo klikni na klavesu' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigovat' - hint_back: '[q/ESC] Zpet' + hint_navigate: 'Navigovat' + hint_back: 'Zpet' key_label: 'Klavesa: ' finger_label: 'Prst: ' hand_left: 'Levy' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Spustit cviceni textu' start_code_drill: 'Spustit cviceni kodu' confirm: 'Potvrdit' - hint_navigate: '[Nahoru/Dolu] Navigovat' - hint_adjust: '[Vlevo/Vpravo] Upravit' - hint_edit: '[Pis/Backspace] Editovat' - hint_confirm: '[Enter] Potvrdit' - hint_cancel: '[ESC] Zrusit' + hint_navigate: 'Navigovat' + hint_adjust: 'Upravit' + hint_edit: 'Editovat' + hint_confirm: 'Potvrdit' + hint_cancel: 'Zrusit' preparing_download: 'Pripravuji stahovani...' download_passage_title: ' Stahuji zdroj textu ' download_code_title: ' Stahuji zdroj kodu ' diff --git a/locales/da.yml b/locales/da.yml index 0801ec5..eafe45c 100644 --- a/locales/da.yml +++ b/locales/da.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigurer keydr' day_streak: ' | %{days} dages raekke' key_progress: ' Tastefremskridt %{unlocked}/%{total} (%{mastered} mestrede) | Maal %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Faerdighedstrae' - hint_keyboard: '[b] Tastatur' - hint_stats: '[s] Statistik' - hint_settings: '[c] Indstillinger' - hint_quit: '[q] Afslut' + hint_start: 'Start' + hint_skill_tree: 'Faerdighedstrae' + hint_keyboard: 'Tastatur' + hint_stats: 'Statistik' + hint_settings: 'Indstillinger' + hint_quit: 'Afslut' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Tekstkilde ' footer: '[ESC] Afslut oevelse [Backspace] Slet' keys_reenabled: 'Taster genaktiveret efter %{ms}ms' - hint_end: '[ESC] Afslut oevelse' - hint_backspace: '[Backspace] Slet' + hint_end: 'Afslut oevelse' + hint_backspace: 'Slet' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} korrekte)' input_blocked: ' Indtastning midlertidigt blokeret ' input_blocked_ms: '(%{ms}ms tilbage)' - hint_continue: '[c/Enter/Space] Fortsaet' - hint_retry: '[r] Proev igen' - hint_menu: '[q] Menu' - hint_stats: '[s] Statistik' - hint_delete: '[x] Slet' + hint_continue: 'Fortsaet' + hint_retry: 'Proev igen' + hint_menu: 'Menu' + hint_stats: 'Statistik' + hint_delete: 'Slet' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Noejagtighed' tab_timing: '[5] Timing' tab_ngrams: '[6] N-grammer' - hint_back: '[ESC] Tilbage' - hint_next_tab: '[Tab] Naeste fane' - hint_switch_tab: '[1-6] Skift fane' - hint_navigate: '[j/k] Naviger' - hint_page: '[PgUp/PgDn] Side' - hint_delete: '[x] Slet' + hint_back: 'Tilbage' + hint_next_tab: 'Naeste fane' + hint_switch_tab: 'Skift fane' + hint_navigate: 'Naviger' + hint_page: 'Side' + hint_delete: 'Slet' summary_title: ' Oversigt ' drills: ' Oevelser: ' avg_wpm: ' Gns. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importsti' import_data: 'Importer data' import_now: 'Importer nu' - hint_save_back: '[ESC] Gem & tilbage' - hint_change_value: '[Enter/pile] AEndr vaerdi' - hint_edit_path: '[Enter paa sti] Rediger' - hint_move: '[←→] Flyt' - hint_tab_complete: '[Tab] Fuldfoer (i slutningen)' - hint_confirm: '[Enter] Bekraeft' - hint_cancel: '[Esc] Annuller' + hint_save_back: 'Gem & tilbage' + hint_change_value: 'AEndr vaerdi' + hint_edit_path: 'Rediger' + hint_move: 'Flyt' + hint_tab_complete: 'Fuldfoer (i slutningen)' + hint_confirm: 'Bekraeft' + hint_cancel: 'Annuller' success_title: ' Succes ' error_title: ' Fejl ' press_any_key: 'Tryk paa en tast' @@ -236,9 +236,9 @@ select: cached: ' (gemt)' disabled_download: ' (deaktiveret: download kraeves)' download_required: ' (download kraeves)' - hint_navigate: '[Op/Ned/PgUp/PgDn] Naviger' - hint_confirm: '[Enter] Bekraeft' - hint_back: '[ESC] Tilbage' + hint_navigate: 'Naviger' + hint_confirm: 'Bekraeft' + hint_back: 'Tilbage' language_resets_layout: 'Sprogvalg nulstiller tastaturlayoutet til sprogets standard.' layout_no_language_change: 'Layoutaendringer aendrer ikke ordbogssproget.' disabled_network_notice: 'Nogle sprog er deaktiverede: aktiver netvaerksdownloads i intro/indstillinger.' @@ -267,11 +267,11 @@ skill_tree: level: 'Niveau %{current}/%{total}' level_zero: 'Niveau 0/%{total}' in_focus: ' i fokus' - hint_navigate: '[↑↓/jk] Naviger' - hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Rul' - hint_back: '[q] Tilbage' - hint_unlock: '[Enter] Laas op' - hint_start_drill: '[Enter] Start oevelse' + hint_navigate: 'Naviger' + hint_scroll: 'Rul' + hint_back: 'Tilbage' + hint_unlock: 'Laas op' + hint_start_drill: 'Start oevelse' unlock_msg_1: 'Efter oplaasning blandes oplaaste taster fra denne gren ind i den adaptive oevelse.' unlock_msg_2: 'Vil du kun oeve denne gren, start en oevelse direkte fra denne gren i Faerdighedstraeet.' confirm_unlock: 'Laas %{branch} op?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillid.' mastery_takes_practice: 'Mestring er ikke en destination — det kraever vedvarende oevelse.' keep_drilling: 'Bliv ved med at oeve for at bevare dit niveau.' - hint_skill_tree_continue: '[t] Faerdighedstrae [Anden tast] Fortsaet' + hint_skill_tree_continue: 'Faerdighedstrae [Anden tast] Fortsaet' hint_any_key: 'Tryk paa en tast for at fortsaette' input_blocked: 'Indtastning midlertidigt blokeret (%{ms}ms tilbage)' unlock_msg_1: 'Godt klaret! Bliv ved med at opbygge dine skrivefaerdigheder.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muskelhukommelse forankret!' mastery_msg_4: 'Endnu en tast erobret!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Velkommen til Adaptiv oevelse! ' + how_it_works: 'Saadan fungerer adaptive oevelser:' + desc_start: 'Du starter med et lille saet af de mest almindelige bogstaver laast op.' + desc_progress: 'Naar du skriver dem med selvtillid, laases nye taster gradvist' + desc_expand: 'op, indtil du har mestret hele tastaturet.' + target_wpm_label: 'Maal-WPM:' + target_wpm_desc: 'Dette paavirker hvor hurtigt taster laases op — hoejere maal kraever' + target_wpm_default: 'hurtigere skrivning. 35 WPM er et godt udgangspunkt, hvis du er usikker.' + hint: '[←→] Juster WPM [Enter/Space] Start oevelse' + # Keyboard explorer keyboard: title: ' Tastatur ' subtitle: 'Tryk paa en tast eller klik paa en tast' - hint_navigate: '[←→↑↓/hjkl/Tab] Naviger' - hint_back: '[q/ESC] Tilbage' + hint_navigate: 'Naviger' + hint_back: 'Tilbage' key_label: 'Tast: ' finger_label: 'Finger: ' hand_left: 'Venstre' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Start tekstoevelse' start_code_drill: 'Start kodeoevelse' confirm: 'Bekraeft' - hint_navigate: '[Op/Ned] Naviger' - hint_adjust: '[Venstre/Hoejre] Juster' - hint_edit: '[Skriv/Backspace] Rediger' - hint_confirm: '[Enter] Bekraeft' - hint_cancel: '[ESC] Annuller' + hint_navigate: 'Naviger' + hint_adjust: 'Juster' + hint_edit: 'Rediger' + hint_confirm: 'Bekraeft' + hint_cancel: 'Annuller' preparing_download: 'Forbereder download...' download_passage_title: ' Downloader tekstkilde ' download_code_title: ' Downloader kodekilde ' diff --git a/locales/de.yml b/locales/de.yml index 657fe21..0dd2d09 100644 --- a/locales/de.yml +++ b/locales/de.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'keydr konfigurieren' day_streak: ' | %{days} Tage Serie' key_progress: ' Tastenfortschritt %{unlocked}/%{total} (%{mastered} gemeistert) | Ziel %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Faehigkeitenbaum' - hint_keyboard: '[b] Tastatur' - hint_stats: '[s] Statistik' - hint_settings: '[c] Einstellungen' - hint_quit: '[q] Beenden' + hint_start: 'Start' + hint_skill_tree: 'Faehigkeitenbaum' + hint_keyboard: 'Tastatur' + hint_stats: 'Statistik' + hint_settings: 'Einstellungen' + hint_quit: 'Beenden' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Textquelle ' footer: '[ESC] Lektion beenden [Backspace] Loeschen' keys_reenabled: 'Tasten nach %{ms}ms wieder aktiv' - hint_end: '[ESC] Lektion beenden' - hint_backspace: '[Backspace] Loeschen' + hint_end: 'Lektion beenden' + hint_backspace: 'Loeschen' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} korrekt)' input_blocked: ' Eingabe voruebergehend blockiert ' input_blocked_ms: '(%{ms}ms verbleibend)' - hint_continue: '[c/Enter/Space] Weiter' - hint_retry: '[r] Wiederholen' - hint_menu: '[q] Menue' - hint_stats: '[s] Statistik' - hint_delete: '[x] Loeschen' + hint_continue: 'Weiter' + hint_retry: 'Wiederholen' + hint_menu: 'Menue' + hint_stats: 'Statistik' + hint_delete: 'Loeschen' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Genauigkeit' tab_timing: '[5] Timing' tab_ngrams: '[6] N-Gramme' - hint_back: '[ESC] Zurueck' - hint_next_tab: '[Tab] Naechster Tab' - hint_switch_tab: '[1-6] Tab wechseln' - hint_navigate: '[j/k] Navigieren' - hint_page: '[PgUp/PgDn] Seite' - hint_delete: '[x] Loeschen' + hint_back: 'Zurueck' + hint_next_tab: 'Naechster Tab' + hint_switch_tab: 'Tab wechseln' + hint_navigate: 'Navigieren' + hint_page: 'Seite' + hint_delete: 'Loeschen' summary_title: ' Zusammenfassung ' drills: ' Lektionen: ' avg_wpm: ' Schnitt WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importpfad' import_data: 'Daten importieren' import_now: 'Jetzt importieren' - hint_save_back: '[ESC] Speichern & zurueck' - hint_change_value: '[Enter/Pfeile] Wert aendern' - hint_edit_path: '[Enter auf Pfad] Bearbeiten' - hint_move: '[←→] Bewegen' - hint_tab_complete: '[Tab] Vervollstaendigen (am Ende)' - hint_confirm: '[Enter] Bestaetigen' - hint_cancel: '[Esc] Abbrechen' + hint_save_back: 'Speichern & zurueck' + hint_change_value: 'Wert aendern' + hint_edit_path: 'Bearbeiten' + hint_move: 'Bewegen' + hint_tab_complete: 'Vervollstaendigen (am Ende)' + hint_confirm: 'Bestaetigen' + hint_cancel: 'Abbrechen' success_title: ' Erfolg ' error_title: ' Fehler ' press_any_key: 'Beliebige Taste druecken' @@ -236,9 +236,9 @@ select: cached: ' (gespeichert)' disabled_download: ' (deaktiviert: Download erforderlich)' download_required: ' (Download erforderlich)' - hint_navigate: '[Auf/Ab/BildAuf/BildAb] Navigieren' - hint_confirm: '[Enter] Bestaetigen' - hint_back: '[ESC] Zurueck' + hint_navigate: 'Navigieren' + hint_confirm: 'Bestaetigen' + hint_back: 'Zurueck' language_resets_layout: 'Die Sprachauswahl setzt das Tastaturlayout auf den Standard der Sprache zurueck.' layout_no_language_change: 'Layoutaenderungen aendern nicht die Woerterbuchsprache.' disabled_network_notice: 'Einige Sprachen sind deaktiviert: Netzwerk-Downloads in Intro/Einstellungen aktivieren.' @@ -267,11 +267,11 @@ skill_tree: level: 'Stufe %{current}/%{total}' level_zero: 'Stufe 0/%{total}' in_focus: ' im Fokus' - hint_navigate: '[↑↓/jk] Navigieren' - hint_scroll: '[BildAuf/BildAb oder Strg+U/Strg+D] Scrollen' - hint_back: '[q] Zurueck' - hint_unlock: '[Enter] Freischalten' - hint_start_drill: '[Enter] Lektion starten' + hint_navigate: 'Navigieren' + hint_scroll: 'Scrollen' + hint_back: 'Zurueck' + hint_unlock: 'Freischalten' + hint_start_drill: 'Lektion starten' unlock_msg_1: 'Nach dem Freischalten werden freigeschaltete Tasten dieses Zweigs in die adaptive Lektion eingemischt.' unlock_msg_2: 'Um nur diesen Zweig zu ueben, starte eine Lektion direkt aus diesem Zweig im Faehigkeitenbaum.' confirm_unlock: '%{branch} freischalten?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Jede Taste auf der Tastatur hat maximale Sicherheit.' mastery_takes_practice: 'Meisterschaft ist kein Ziel — sie erfordert staendiges Ueben.' keep_drilling: 'Uebe weiter, um dein Koennen zu erhalten.' - hint_skill_tree_continue: '[t] Faehigkeitenbaum [Andere Taste] Weiter' + hint_skill_tree_continue: 'Faehigkeitenbaum [Andere Taste] Weiter' hint_any_key: 'Beliebige Taste zum Fortfahren' input_blocked: 'Eingabe voruebergehend blockiert (%{ms}ms verbleibend)' unlock_msg_1: 'Gut gemacht! Baue deine Tippfaehigkeiten weiter aus.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muskelgedaechtnis verankert!' mastery_msg_4: 'Eine weitere Taste bezwungen!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Willkommen zur Adaptiven Lektion! ' + how_it_works: 'Wie adaptive Lektionen funktionieren:' + desc_start: 'Du startest mit einer kleinen Auswahl der haeufigsten Buchstaben.' + desc_progress: 'Je sicherer du sie tippst, desto mehr neue Tasten werden' + desc_expand: 'schrittweise freigeschaltet, bis du die ganze Tastatur beherrschst.' + target_wpm_label: 'Ziel-WPM:' + target_wpm_desc: 'Dies beeinflusst, wie schnell Tasten freigeschaltet werden — hoehere Ziele erfordern' + target_wpm_default: 'schnelleres Tippen. 35 WPM ist ein guter Ausgangspunkt, falls unsicher.' + hint: '[←→] WPM anpassen [Enter/Space] Lektion starten' + # Keyboard explorer keyboard: title: ' Tastatur ' subtitle: 'Druecke eine Taste oder klicke darauf' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigieren' - hint_back: '[q/ESC] Zurueck' + hint_navigate: 'Navigieren' + hint_back: 'Zurueck' key_label: 'Taste: ' finger_label: 'Finger: ' hand_left: 'Links' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Textpassagen-Lektion starten' start_code_drill: 'Code-Lektion starten' confirm: 'Bestaetigen' - hint_navigate: '[Auf/Ab] Navigieren' - hint_adjust: '[Links/Rechts] Anpassen' - hint_edit: '[Tippen/Backspace] Bearbeiten' - hint_confirm: '[Enter] Bestaetigen' - hint_cancel: '[ESC] Abbrechen' + hint_navigate: 'Navigieren' + hint_adjust: 'Anpassen' + hint_edit: 'Bearbeiten' + hint_confirm: 'Bestaetigen' + hint_cancel: 'Abbrechen' preparing_download: 'Download wird vorbereitet...' download_passage_title: ' Textquelle wird heruntergeladen ' download_code_title: ' Code-Quelle wird heruntergeladen ' diff --git a/locales/en.yml b/locales/en.yml index 30f87b0..c293d5a 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configure keydr' day_streak: ' | %{days} day streak' key_progress: ' Key Progress %{unlocked}/%{total} (%{mastered} mastered) | Target %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Skill Tree' - hint_keyboard: '[b] Keyboard' - hint_stats: '[s] Stats' - hint_settings: '[c] Settings' - hint_quit: '[q] Quit' + hint_start: 'Start' + hint_skill_tree: 'Skill Tree' + hint_keyboard: 'Keyboard' + hint_stats: 'Stats' + hint_settings: 'Settings' + hint_quit: 'Quit' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Passage source ' footer: '[ESC] End drill [Backspace] Delete' keys_reenabled: 'Keys re-enabled in %{ms}ms' - hint_end: '[ESC] End drill' - hint_backspace: '[Backspace] Delete' + hint_end: 'End drill' + hint_backspace: 'Delete' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} correct)' input_blocked: ' Input temporarily blocked ' input_blocked_ms: '(%{ms}ms remaining)' - hint_continue: '[c/Enter/Space] Continue' - hint_retry: '[r] Retry' - hint_menu: '[q] Menu' - hint_stats: '[s] Stats' - hint_delete: '[x] Delete' + hint_continue: 'Continue' + hint_retry: 'Retry' + hint_menu: 'Menu' + hint_stats: 'Stats' + hint_delete: 'Delete' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Accuracy' tab_timing: '[5] Timing' tab_ngrams: '[6] N-grams' - hint_back: '[ESC] Back' - hint_next_tab: '[Tab] Next tab' - hint_switch_tab: '[1-6] Switch tab' - hint_navigate: '[j/k] Navigate' - hint_page: '[PgUp/PgDn] Page' - hint_delete: '[x] Delete' + hint_back: 'Back' + hint_next_tab: 'Next tab' + hint_switch_tab: 'Switch tab' + hint_navigate: 'Navigate' + hint_page: 'Page' + hint_delete: 'Delete' summary_title: ' Summary ' drills: ' Drills: ' avg_wpm: ' Avg WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Import Path' import_data: 'Import Data' import_now: 'Import now' - hint_save_back: '[ESC] Save & back' - hint_change_value: '[Enter/arrows] Change value' - hint_edit_path: '[Enter on path] Edit' - hint_move: '[←→] Move' - hint_tab_complete: '[Tab] Complete (at end)' - hint_confirm: '[Enter] Confirm' - hint_cancel: '[Esc] Cancel' + hint_save_back: 'Save & back' + hint_change_value: 'Change value' + hint_edit_path: 'Edit' + hint_move: 'Move' + hint_tab_complete: 'Complete (at end)' + hint_confirm: 'Confirm' + hint_cancel: 'Cancel' success_title: ' Success ' error_title: ' Error ' press_any_key: 'Press any key' @@ -236,9 +236,9 @@ select: cached: ' (cached)' disabled_download: ' (disabled: download required)' download_required: ' (download required)' - hint_navigate: '[Up/Down/PgUp/PgDn] Navigate' - hint_confirm: '[Enter] Confirm' - hint_back: '[ESC] Back' + hint_navigate: 'Navigate' + hint_confirm: 'Confirm' + hint_back: 'Back' language_resets_layout: 'Selecting a language resets keyboard layout to that language''s default.' layout_no_language_change: 'Layout changes do not change dictionary language.' disabled_network_notice: 'Some languages are disabled: enable network downloads in intro/settings.' @@ -267,11 +267,11 @@ skill_tree: level: 'Level %{current}/%{total}' level_zero: 'Level 0/%{total}' in_focus: ' in focus' - hint_navigate: '[↑↓/jk] Navigate' - hint_scroll: '[PgUp/PgDn or Ctrl+U/Ctrl+D] Scroll' - hint_back: '[q] Back' - hint_unlock: '[Enter] Unlock' - hint_start_drill: '[Enter] Start Drill' + hint_navigate: 'Navigate' + hint_scroll: 'Scroll' + hint_back: 'Back' + hint_unlock: 'Unlock' + hint_start_drill: 'Start Drill' unlock_msg_1: 'Once unlocked, the default adaptive drill will mix in keys in this branch that are unlocked.' unlock_msg_2: 'If you want to focus only on this branch, launch a drill directly from this branch in the Skill Tree.' confirm_unlock: 'Unlock %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Every key on the keyboard is at maximum confidence.' mastery_takes_practice: 'Mastery is not a destination — it takes ongoing practice.' keep_drilling: 'Keep drilling to maintain your edge.' - hint_skill_tree_continue: '[t] Open Skill Tree [Any other key] Continue' + hint_skill_tree_continue: 'Open Skill Tree [Any other key] Continue' hint_any_key: 'Press any key to continue' input_blocked: 'Input temporarily blocked (%{ms}ms remaining)' unlock_msg_1: 'Nice work! Keep building your typing skills.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muscle memory locked in!' mastery_msg_4: 'One more key conquered!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Welcome to Adaptive Drill! ' + how_it_works: 'How adaptive drills work:' + desc_start: 'You start with a small set of the most common letters unlocked.' + desc_progress: 'As you type them with confidence, new keys are gradually' + desc_expand: 'unlocked until you''ve mastered the full keyboard.' + target_wpm_label: 'Target WPM:' + target_wpm_desc: 'This affects how quickly keys unlock — higher targets require' + target_wpm_default: 'faster typing. 35 WPM is a good starting point if unsure.' + hint: '[←→] Adjust WPM [Enter/Space] Start drilling' + # Keyboard explorer keyboard: title: ' Keyboard ' subtitle: 'Press any key or click a key' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigate' - hint_back: '[q/ESC] Back' + hint_navigate: 'Navigate' + hint_back: 'Back' key_label: 'Key: ' finger_label: 'Finger: ' hand_left: 'Left' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Start passage drill' start_code_drill: 'Start code drill' confirm: 'Confirm' - hint_navigate: '[Up/Down] Navigate' - hint_adjust: '[Left/Right] Adjust' - hint_edit: '[Type/Backspace] Edit' - hint_confirm: '[Enter] Confirm' - hint_cancel: '[ESC] Cancel' + hint_navigate: 'Navigate' + hint_adjust: 'Adjust' + hint_edit: 'Edit' + hint_confirm: 'Confirm' + hint_cancel: 'Cancel' preparing_download: 'Preparing download...' download_passage_title: ' Downloading Passage Source ' download_code_title: ' Downloading Code Source ' diff --git a/locales/es.yml b/locales/es.yml index 5ff49ce..47c448c 100644 --- a/locales/es.yml +++ b/locales/es.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configurar keydr' day_streak: ' | %{days} días seguidos' key_progress: ' Progreso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Objetivo %{target} WPM%{streak}' - hint_start: '[1-3] Iniciar' - hint_skill_tree: '[t] Árbol de Habilidades' - hint_keyboard: '[b] Teclado' - hint_stats: '[s] Estadísticas' - hint_settings: '[c] Configuración' - hint_quit: '[q] Salir' + hint_start: 'Iniciar' + hint_skill_tree: 'Árbol de Habilidades' + hint_keyboard: 'Teclado' + hint_stats: 'Estadísticas' + hint_settings: 'Configuración' + hint_quit: 'Salir' # Pantalla de ejercicio drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Fuente del pasaje ' footer: '[ESC] Fin [Backspace] Borrar' keys_reenabled: 'Teclas reactivadas en %{ms}ms' - hint_end: '[ESC] Fin del ejercicio' - hint_backspace: '[Backspace] Borrar' + hint_end: 'Fin del ejercicio' + hint_backspace: 'Borrar' # Panel / resultado del ejercicio dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} correctos)' input_blocked: ' Entrada bloqueada temporalmente ' input_blocked_ms: '(%{ms}ms restantes)' - hint_continue: '[c/Enter/Space] Continuar' - hint_retry: '[r] Reintentar' - hint_menu: '[q] Menú' - hint_stats: '[s] Estadísticas' - hint_delete: '[x] Eliminar' + hint_continue: 'Continuar' + hint_retry: 'Reintentar' + hint_menu: 'Menú' + hint_stats: 'Estadísticas' + hint_delete: 'Eliminar' # Barra lateral de estadísticas (durante el ejercicio) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Precisión' tab_timing: '[5] Tiempos' tab_ngrams: '[6] N-gramas' - hint_back: '[ESC] Volver' - hint_next_tab: '[Tab] Siguiente pestaña' - hint_switch_tab: '[1-6] Cambiar pestaña' - hint_navigate: '[j/k] Navegar' - hint_page: '[PgUp/PgDn] Página' - hint_delete: '[x] Eliminar' + hint_back: 'Volver' + hint_next_tab: 'Siguiente pestaña' + hint_switch_tab: 'Cambiar pestaña' + hint_navigate: 'Navegar' + hint_page: 'Página' + hint_delete: 'Eliminar' summary_title: ' Resumen ' drills: ' Ejercicios: ' avg_wpm: ' WPM Prom: ' @@ -200,13 +200,13 @@ settings: import_path: 'Ruta de Importación' import_data: 'Importar Datos' import_now: 'Importar ahora' - hint_save_back: '[ESC] Guardar y volver' - hint_change_value: '[Enter/flechas] Cambiar valor' - hint_edit_path: '[Enter en ruta] Editar' - hint_move: '[←→] Mover' - hint_tab_complete: '[Tab] Completar (al final)' - hint_confirm: '[Enter] Confirmar' - hint_cancel: '[Esc] Cancelar' + hint_save_back: 'Guardar y volver' + hint_change_value: 'Cambiar valor' + hint_edit_path: 'Editar' + hint_move: 'Mover' + hint_tab_complete: 'Completar (al final)' + hint_confirm: 'Confirmar' + hint_cancel: 'Cancelar' success_title: ' Éxito ' error_title: ' Fallo ' press_any_key: 'Presiona cualquier tecla' @@ -236,9 +236,9 @@ select: cached: ' (en caché)' disabled_download: ' (desactivado: requiere descarga)' download_required: ' (requiere descarga)' - hint_navigate: '[Up/Down/PgUp/PgDn] Navegar' - hint_confirm: '[Enter] Confirmar' - hint_back: '[ESC] Volver' + hint_navigate: 'Navegar' + hint_confirm: 'Confirmar' + hint_back: 'Volver' language_resets_layout: 'Seleccionar un idioma restablece la distribución a la predeterminada de ese idioma.' layout_no_language_change: 'Cambiar distribución no cambia el idioma del diccionario.' disabled_network_notice: 'Algunos idiomas están desactivados: activa las descargas en intro/configuración.' @@ -267,11 +267,11 @@ skill_tree: level: 'Nivel %{current}/%{total}' level_zero: 'Nivel 0/%{total}' in_focus: ' en foco' - hint_navigate: '[↑↓/jk] Navegar' - hint_scroll: '[PgUp/PgDn o Ctrl+U/Ctrl+D] Desplazar' - hint_back: '[q] Volver' - hint_unlock: '[Enter] Desbloquear' - hint_start_drill: '[Enter] Iniciar Ejercicio' + hint_navigate: 'Navegar' + hint_scroll: 'Desplazar' + hint_back: 'Volver' + hint_unlock: 'Desbloquear' + hint_start_drill: 'Iniciar Ejercicio' unlock_msg_1: 'Una vez desbloqueado, el ejercicio adaptativo incluirá teclas de esta rama que estén desbloqueadas.' unlock_msg_2: 'Si quieres enfocarte solo en esta rama, inicia un ejercicio directamente desde esta rama en el Árbol de Habilidades.' confirm_unlock: '¿Desbloquear %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Cada tecla del teclado está a máxima confianza.' mastery_takes_practice: 'El dominio no es un destino — requiere práctica continua.' keep_drilling: 'Sigue practicando para mantener tu nivel.' - hint_skill_tree_continue: '[t] Abrir Árbol de Habilidades [Otra tecla] Continuar' + hint_skill_tree_continue: 'Abrir Árbol de Habilidades [Otra tecla] Continuar' hint_any_key: 'Presiona cualquier tecla para continuar' input_blocked: 'Entrada bloqueada temporalmente (%{ms}ms restantes)' unlock_msg_1: '¡Buen trabajo! Sigue mejorando tus habilidades.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: '¡Memoria muscular asegurada!' mastery_msg_4: '¡Una tecla más conquistada!' +# Superposición de introducción al ejercicio adaptativo +adaptive_intro: + title: ' ¡Bienvenido al Ejercicio Adaptativo! ' + how_it_works: 'Cómo funcionan los ejercicios adaptativos:' + desc_start: 'Comienzas con un pequeño conjunto de las letras más comunes desbloqueadas.' + desc_progress: 'A medida que las escribes con confianza, nuevas teclas se desbloquean gradualmente' + desc_expand: 'hasta que dominas el teclado completo.' + target_wpm_label: 'WPM Objetivo:' + target_wpm_desc: 'Esto afecta la velocidad con que se desbloquean las teclas — objetivos más altos requieren' + target_wpm_default: 'escritura más rápida. 35 WPM es un buen punto de partida si no estás seguro.' + hint: '[←→] Ajustar WPM [Enter/Space] Comenzar ejercicio' + # Explorador de teclado keyboard: title: ' Teclado ' subtitle: 'Presiona o haz clic en una tecla' - hint_navigate: '[←→↑↓/hjkl/Tab] Navegar' - hint_back: '[q/ESC] Volver' + hint_navigate: 'Navegar' + hint_back: 'Volver' key_label: 'Tecla: ' finger_label: 'Dedo: ' hand_left: 'Izquierda' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Iniciar ejercicio de pasaje' start_code_drill: 'Iniciar ejercicio de código' confirm: 'Confirmar' - hint_navigate: '[Up/Down] Navegar' - hint_adjust: '[Left/Right] Ajustar' - hint_edit: '[Type/Backspace] Editar' - hint_confirm: '[Enter] Confirmar' - hint_cancel: '[ESC] Cancelar' + hint_navigate: 'Navegar' + hint_adjust: 'Ajustar' + hint_edit: 'Editar' + hint_confirm: 'Confirmar' + hint_cancel: 'Cancelar' preparing_download: 'Preparando descarga...' download_passage_title: ' Descargando Fuente de Pasaje ' download_code_title: ' Descargando Fuente de Código ' diff --git a/locales/et.yml b/locales/et.yml index 303dff5..7b25c2b 100644 --- a/locales/et.yml +++ b/locales/et.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Seadista keydr' day_streak: ' | %{days} päeva järjest' key_progress: ' Klahvide edenemine %{unlocked}/%{total} (%{mastered} omandatud) | Siht %{target} WPM%{streak}' - hint_start: '[1-3] Alusta' - hint_skill_tree: '[t] Oskuste puu' - hint_keyboard: '[b] Klaviatuur' - hint_stats: '[s] Statistika' - hint_settings: '[c] Seaded' - hint_quit: '[q] Välju' + hint_start: 'Alusta' + hint_skill_tree: 'Oskuste puu' + hint_keyboard: 'Klaviatuur' + hint_stats: 'Statistika' + hint_settings: 'Seaded' + hint_quit: 'Välju' # Harjutuse kuva drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Teksti allikas ' footer: '[ESC] Lõpeta harjutus [Backspace] Kustuta' keys_reenabled: 'Klahvid taas lubatud %{ms}ms pärast' - hint_end: '[ESC] Lõpeta harjutus' - hint_backspace: '[Backspace] Kustuta' + hint_end: 'Lõpeta harjutus' + hint_backspace: 'Kustuta' # Tulemuste paneel / harjutuse tulemus dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} õiget)' input_blocked: ' Sisend ajutiselt blokeeritud ' input_blocked_ms: '(%{ms}ms jäänud)' - hint_continue: '[c/Enter/Space] Jätka' - hint_retry: '[r] Uuesti' - hint_menu: '[q] Menüü' - hint_stats: '[s] Statistika' - hint_delete: '[x] Kustuta' + hint_continue: 'Jätka' + hint_retry: 'Uuesti' + hint_menu: 'Menüü' + hint_stats: 'Statistika' + hint_delete: 'Kustuta' # Statistika külgriba (harjutuse ajal) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Täpsus' tab_timing: '[5] Ajastus' tab_ngrams: '[6] N-grammid' - hint_back: '[ESC] Tagasi' - hint_next_tab: '[Tab] Järgmine vahekaart' - hint_switch_tab: '[1-6] Vaheta vahekaart' - hint_navigate: '[j/k] Navigeeri' - hint_page: '[PgUp/PgDn] Lehekülg' - hint_delete: '[x] Kustuta' + hint_back: 'Tagasi' + hint_next_tab: 'Järgmine vahekaart' + hint_switch_tab: 'Vaheta vahekaart' + hint_navigate: 'Navigeeri' + hint_page: 'Lehekülg' + hint_delete: 'Kustuta' summary_title: ' Kokkuvõte ' drills: ' Harjutused: ' avg_wpm: ' Kesk WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Impordi tee' import_data: 'Impordi andmed' import_now: 'Impordi kohe' - hint_save_back: '[ESC] Salvesta ja tagasi' - hint_change_value: '[Enter/nooled] Muuda väärtust' - hint_edit_path: '[Enter teel] Muuda' - hint_move: '[←→] Liigu' - hint_tab_complete: '[Tab] Täienda (lõpus)' - hint_confirm: '[Enter] Kinnita' - hint_cancel: '[Esc] Tühista' + hint_save_back: 'Salvesta ja tagasi' + hint_change_value: 'Muuda väärtust' + hint_edit_path: 'Muuda' + hint_move: 'Liigu' + hint_tab_complete: 'Täienda (lõpus)' + hint_confirm: 'Kinnita' + hint_cancel: 'Tühista' success_title: ' Õnnestus ' error_title: ' Viga ' press_any_key: 'Vajuta suvalist klahvi' @@ -236,9 +236,9 @@ select: cached: ' (puhverdatud)' disabled_download: ' (keelatud: allalaadimine vajalik)' download_required: ' (allalaadimine vajalik)' - hint_navigate: '[Üles/Alla/PgUp/PgDn] Navigeeri' - hint_confirm: '[Enter] Kinnita' - hint_back: '[ESC] Tagasi' + hint_navigate: 'Navigeeri' + hint_confirm: 'Kinnita' + hint_back: 'Tagasi' language_resets_layout: 'Keele valimine lähtestab klahvipaigutuse selle keele vaikimisi paigutusele.' layout_no_language_change: 'Paigutuse muutmine ei muuda sõnastiku keelt.' disabled_network_notice: 'Mõned keeled on keelatud: lubage võrgu allalaadimised sissejuhatuses/seadetes.' @@ -267,11 +267,11 @@ skill_tree: level: 'Tase %{current}/%{total}' level_zero: 'Tase 0/%{total}' in_focus: ' fookuses' - hint_navigate: '[↑↓/jk] Navigeeri' - hint_scroll: '[PgUp/PgDn või Ctrl+U/Ctrl+D] Keri' - hint_back: '[q] Tagasi' - hint_unlock: '[Enter] Ava' - hint_start_drill: '[Enter] Alusta harjutust' + hint_navigate: 'Navigeeri' + hint_scroll: 'Keri' + hint_back: 'Tagasi' + hint_unlock: 'Ava' + hint_start_drill: 'Alusta harjutust' unlock_msg_1: 'Pärast avamist segab vaikimisi kohanduv harjutus selle haru avatud klahve.' unlock_msg_2: 'Kui soovite keskenduda ainult sellele harule, käivitage harjutus otse oskuste puust.' confirm_unlock: 'Avada %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Iga klahv klaviatuuril on maksimaalsel tasemel.' mastery_takes_practice: 'Valdamine pole sihtkoht — see nõuab pidevat harjutamist.' keep_drilling: 'Jätkake harjutamist oma taseme hoidmiseks.' - hint_skill_tree_continue: '[t] Ava oskuste puu [Suvaline klahv] Jätka' + hint_skill_tree_continue: 'Ava oskuste puu [Suvaline klahv] Jätka' hint_any_key: 'Vajuta suvalist klahvi jätkamiseks' input_blocked: 'Sisend ajutiselt blokeeritud (%{ms}ms jäänud)' unlock_msg_1: 'Tubli! Jätkake oma trükkimisoskuste arendamist.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Lihasmälu lukustatud!' mastery_msg_4: 'Veel üks klahv vallutatud!' +# Kohanduva harjutuse sissejuhatuse ülekate +adaptive_intro: + title: ' Tere tulemast Kohanduvasse harjutusse! ' + how_it_works: 'Kuidas kohanduvad harjutused toimivad:' + desc_start: 'Alustad väikese hulga kõige levinumate tähtedega.' + desc_progress: 'Kui trükid neid kindlalt, avatakse uued klahvid järk-järgult' + desc_expand: 'kuni oled omandanud kogu klaviatuuri.' + target_wpm_label: 'Siht-WPM:' + target_wpm_desc: 'See mõjutab klahvide avamise kiirust — kõrgemad sihid nõuavad' + target_wpm_default: 'kiiremat trükkimist. 35 WPM on hea lähtepunkt, kui pole kindel.' + hint: '[←→] Kohanda WPM [Enter/Space] Alusta harjutust' + # Klaviatuuri uurija keyboard: title: ' Klaviatuur ' subtitle: 'Vajuta suvalist klahvi või klõpsa klahvi' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigeeri' - hint_back: '[q/ESC] Tagasi' + hint_navigate: 'Navigeeri' + hint_back: 'Tagasi' key_label: 'Klahv: ' finger_label: 'Sõrm: ' hand_left: 'Vasak' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Alusta tekstiharjutust' start_code_drill: 'Alusta koodi harjutust' confirm: 'Kinnita' - hint_navigate: '[Üles/Alla] Navigeeri' - hint_adjust: '[Vasakule/Paremale] Kohanda' - hint_edit: '[Trüki/Backspace] Muuda' - hint_confirm: '[Enter] Kinnita' - hint_cancel: '[ESC] Tühista' + hint_navigate: 'Navigeeri' + hint_adjust: 'Kohanda' + hint_edit: 'Muuda' + hint_confirm: 'Kinnita' + hint_cancel: 'Tühista' preparing_download: 'Valmistan allalaadimist ette...' download_passage_title: ' Teksti allika allalaadimine ' download_code_title: ' Koodi allika allalaadimine ' diff --git a/locales/fi.yml b/locales/fi.yml index 9075a6c..0e9bfc5 100644 --- a/locales/fi.yml +++ b/locales/fi.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Määritä keydr-asetukset' day_streak: ' | %{days} päivän putki' key_progress: ' Näppäinedistyminen %{unlocked}/%{total} (%{mastered} hallittu) | Tavoite %{target} WPM%{streak}' - hint_start: '[1-3] Aloita' - hint_skill_tree: '[t] Taitopuu' - hint_keyboard: '[b] Näppäimistö' - hint_stats: '[s] Tilastot' - hint_settings: '[c] Asetukset' - hint_quit: '[q] Lopeta' + hint_start: 'Aloita' + hint_skill_tree: 'Taitopuu' + hint_keyboard: 'Näppäimistö' + hint_stats: 'Tilastot' + hint_settings: 'Asetukset' + hint_quit: 'Lopeta' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Tekstilähde ' footer: '[ESC] Lopeta harjoitus [Backspace] Poista' keys_reenabled: 'Näppäimet palautettu %{ms}ms:ssa' - hint_end: '[ESC] Lopeta harjoitus' - hint_backspace: '[Backspace] Poista' + hint_end: 'Lopeta harjoitus' + hint_backspace: 'Poista' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} oikein)' input_blocked: ' Syöte estetty väliaikaisesti ' input_blocked_ms: '(%{ms}ms jäljellä)' - hint_continue: '[c/Enter/Space] Jatka' - hint_retry: '[r] Uudelleen' - hint_menu: '[q] Valikko' - hint_stats: '[s] Tilastot' - hint_delete: '[x] Poista' + hint_continue: 'Jatka' + hint_retry: 'Uudelleen' + hint_menu: 'Valikko' + hint_stats: 'Tilastot' + hint_delete: 'Poista' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Tarkkuus' tab_timing: '[5] Ajoitus' tab_ngrams: '[6] N-grammit' - hint_back: '[ESC] Takaisin' - hint_next_tab: '[Tab] Seuraava välilehti' - hint_switch_tab: '[1-6] Vaihda välilehteä' - hint_navigate: '[j/k] Navigoi' - hint_page: '[PgUp/PgDn] Sivu' - hint_delete: '[x] Poista' + hint_back: 'Takaisin' + hint_next_tab: 'Seuraava välilehti' + hint_switch_tab: 'Vaihda välilehteä' + hint_navigate: 'Navigoi' + hint_page: 'Sivu' + hint_delete: 'Poista' summary_title: ' Yhteenveto ' drills: ' Harjoitukset: ' avg_wpm: ' Ka WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Tuontipolku' import_data: 'Tuo data' import_now: 'Tuo nyt' - hint_save_back: '[ESC] Tallenna ja takaisin' - hint_change_value: '[Enter/nuolet] Muuta arvoa' - hint_edit_path: '[Enter polulla] Muokkaa' - hint_move: '[←→] Siirrä' - hint_tab_complete: '[Tab] Täydennä (lopussa)' - hint_confirm: '[Enter] Vahvista' - hint_cancel: '[Esc] Peruuta' + hint_save_back: 'Tallenna ja takaisin' + hint_change_value: 'Muuta arvoa' + hint_edit_path: 'Muokkaa' + hint_move: 'Siirrä' + hint_tab_complete: 'Täydennä (lopussa)' + hint_confirm: 'Vahvista' + hint_cancel: 'Peruuta' success_title: ' Onnistui ' error_title: ' Virhe ' press_any_key: 'Paina mitä tahansa näppäintä' @@ -236,9 +236,9 @@ select: cached: ' (välimuistissa)' disabled_download: ' (pois käytöstä: lataus vaaditaan)' download_required: ' (lataus vaaditaan)' - hint_navigate: '[Ylös/Alas/PgUp/PgDn] Navigoi' - hint_confirm: '[Enter] Vahvista' - hint_back: '[ESC] Takaisin' + hint_navigate: 'Navigoi' + hint_confirm: 'Vahvista' + hint_back: 'Takaisin' language_resets_layout: 'Kielen valinta palauttaa näppäinasettelun kielen oletukseen.' layout_no_language_change: 'Asettelun muutos ei vaihda sanakirjan kieltä.' disabled_network_notice: 'Jotkin kielet ovat pois käytöstä: ota verkkolataukset käyttöön asetuksissa.' @@ -267,11 +267,11 @@ skill_tree: level: 'Taso %{current}/%{total}' level_zero: 'Taso 0/%{total}' in_focus: ' fokuksessa' - hint_navigate: '[↑↓/jk] Navigoi' - hint_scroll: '[PgUp/PgDn tai Ctrl+U/Ctrl+D] Vieritä' - hint_back: '[q] Takaisin' - hint_unlock: '[Enter] Avaa' - hint_start_drill: '[Enter] Aloita harjoitus' + hint_navigate: 'Navigoi' + hint_scroll: 'Vieritä' + hint_back: 'Takaisin' + hint_unlock: 'Avaa' + hint_start_drill: 'Aloita harjoitus' unlock_msg_1: 'Avaamisen jälkeen mukautuva oletusharjoitus sisällyttää tämän haaran avattuja näppäimiä.' unlock_msg_2: 'Jos haluat keskittyä vain tähän haaraan, aloita harjoitus suoraan taitopuusta.' confirm_unlock: 'Avaa %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Jokainen näppäin näppäimistöllä on maksimivarmuudella.' mastery_takes_practice: 'Hallinta ei ole päämäärä — se vaatii jatkuvaa harjoittelua.' keep_drilling: 'Jatka harjoittelua säilyttääksesi taitosi.' - hint_skill_tree_continue: '[t] Avaa taitopuu [Muu näppäin] Jatka' + hint_skill_tree_continue: 'Avaa taitopuu [Muu näppäin] Jatka' hint_any_key: 'Paina mitä tahansa näppäintä jatkaaksesi' input_blocked: 'Syöte estetty väliaikaisesti (%{ms}ms jäljellä)' unlock_msg_1: 'Hienoa! Jatka kirjoitustaitojesi kehittämistä.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Lihasmuisti lukittuna!' mastery_msg_4: 'Taas yksi näppäin valloitettu!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Tervetuloa Mukautuvaan harjoitukseen! ' + how_it_works: 'Miten mukautuvat harjoitukset toimivat:' + desc_start: 'Aloitat pienellä joukolla yleisimpiä kirjaimia avattuna.' + desc_progress: 'Kun kirjoitat niitä varmasti, uusia näppäimiä avataan vähitellen' + desc_expand: 'kunnes olet hallinnut koko näppäimistön.' + target_wpm_label: 'Tavoite-WPM:' + target_wpm_desc: 'Tämä vaikuttaa näppäinten avausnopeuteen — korkeammat tavoitteet vaativat' + target_wpm_default: 'nopeampaa kirjoittamista. 35 WPM on hyvä lähtökohta, jos et ole varma.' + hint: '[←→] Säädä WPM [Enter/Space] Aloita harjoitus' + # Keyboard explorer keyboard: title: ' Näppäimistö ' subtitle: 'Paina mitä tahansa näppäintä tai klikkaa näppäintä' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigoi' - hint_back: '[q/ESC] Takaisin' + hint_navigate: 'Navigoi' + hint_back: 'Takaisin' key_label: 'Näppäin: ' finger_label: 'Sormi: ' hand_left: 'Vasen' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Aloita tekstiharjoitus' start_code_drill: 'Aloita koodiharjoitus' confirm: 'Vahvista' - hint_navigate: '[Ylös/Alas] Navigoi' - hint_adjust: '[Vasen/Oikea] Säädä' - hint_edit: '[Kirjoita/Backspace] Muokkaa' - hint_confirm: '[Enter] Vahvista' - hint_cancel: '[ESC] Peruuta' + hint_navigate: 'Navigoi' + hint_adjust: 'Säädä' + hint_edit: 'Muokkaa' + hint_confirm: 'Vahvista' + hint_cancel: 'Peruuta' preparing_download: 'Valmistellaan latausta...' download_passage_title: ' Ladataan tekstilähdettä ' download_code_title: ' Ladataan koodilähdettä ' diff --git a/locales/fr.yml b/locales/fr.yml index 9c45bd1..4fe3a67 100644 --- a/locales/fr.yml +++ b/locales/fr.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configurer keydr' day_streak: ' | %{days} jours consécutifs' key_progress: ' Progression %{unlocked}/%{total} (%{mastered} maîtrisées) | Objectif %{target} WPM%{streak}' - hint_start: '[1-3] Démarrer' - hint_skill_tree: '[t] Arbre de Compétences' - hint_keyboard: '[b] Clavier' - hint_stats: '[s] Statistiques' - hint_settings: '[c] Paramètres' - hint_quit: '[q] Quitter' + hint_start: 'Démarrer' + hint_skill_tree: 'Arbre de Compétences' + hint_keyboard: 'Clavier' + hint_stats: 'Statistiques' + hint_settings: 'Paramètres' + hint_quit: 'Quitter' # Écran d'exercice drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Source du passage ' footer: '[ESC] Fin [Backspace] Effacer' keys_reenabled: 'Touches réactivées en %{ms}ms' - hint_end: '[ESC] Fin de l''exercice' - hint_backspace: '[Backspace] Effacer' + hint_end: 'Fin de l''exercice' + hint_backspace: 'Effacer' # Tableau de bord / résultat de l'exercice dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} corrects)' input_blocked: ' Saisie temporairement bloquée ' input_blocked_ms: '(%{ms}ms restantes)' - hint_continue: '[c/Enter/Space] Continuer' - hint_retry: '[r] Réessayer' - hint_menu: '[q] Menu' - hint_stats: '[s] Statistiques' - hint_delete: '[x] Supprimer' + hint_continue: 'Continuer' + hint_retry: 'Réessayer' + hint_menu: 'Menu' + hint_stats: 'Statistiques' + hint_delete: 'Supprimer' # Barre latérale de statistiques (pendant l'exercice) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Précision' tab_timing: '[5] Chronométrage' tab_ngrams: '[6] N-grammes' - hint_back: '[ESC] Retour' - hint_next_tab: '[Tab] Onglet suivant' - hint_switch_tab: '[1-6] Changer d''onglet' - hint_navigate: '[j/k] Naviguer' - hint_page: '[PgUp/PgDn] Défiler' - hint_delete: '[x] Supprimer' + hint_back: 'Retour' + hint_next_tab: 'Onglet suivant' + hint_switch_tab: 'Changer d''onglet' + hint_navigate: 'Naviguer' + hint_page: 'Défiler' + hint_delete: 'Supprimer' summary_title: ' Résumé ' drills: ' Exercices : ' avg_wpm: ' WPM Moy : ' @@ -200,13 +200,13 @@ settings: import_path: 'Chemin d''Import' import_data: 'Importer les Données' import_now: 'Importer maintenant' - hint_save_back: '[ESC] Sauvegarder et retour' - hint_change_value: '[Enter/flèches] Changer la valeur' - hint_edit_path: '[Enter sur chemin] Éditer' - hint_move: '[←→] Déplacer' - hint_tab_complete: '[Tab] Compléter (à la fin)' - hint_confirm: '[Enter] Confirmer' - hint_cancel: '[Esc] Annuler' + hint_save_back: 'Sauvegarder et retour' + hint_change_value: 'Changer la valeur' + hint_edit_path: 'Éditer' + hint_move: 'Déplacer' + hint_tab_complete: 'Compléter (à la fin)' + hint_confirm: 'Confirmer' + hint_cancel: 'Annuler' success_title: ' Succès ' error_title: ' Erreur ' press_any_key: 'Appuyez sur une touche' @@ -236,9 +236,9 @@ select: cached: ' (en cache)' disabled_download: ' (désactivé : téléchargement requis)' download_required: ' (téléchargement requis)' - hint_navigate: '[Up/Down/PgUp/PgDn] Naviguer' - hint_confirm: '[Enter] Confirmer' - hint_back: '[ESC] Retour' + hint_navigate: 'Naviguer' + hint_confirm: 'Confirmer' + hint_back: 'Retour' language_resets_layout: 'Sélectionner une langue réinitialise la disposition à celle par défaut de cette langue.' layout_no_language_change: 'Changer la disposition ne change pas la langue du dictionnaire.' disabled_network_notice: 'Certaines langues sont désactivées : activez les téléchargements dans intro/paramètres.' @@ -267,11 +267,11 @@ skill_tree: level: 'Niveau %{current}/%{total}' level_zero: 'Niveau 0/%{total}' in_focus: ' en focus' - hint_navigate: '[↑↓/jk] Naviguer' - hint_scroll: '[PgUp/PgDn ou Ctrl+U/Ctrl+D] Défiler' - hint_back: '[q] Retour' - hint_unlock: '[Enter] Déverrouiller' - hint_start_drill: '[Enter] Lancer l''Exercice' + hint_navigate: 'Naviguer' + hint_scroll: 'Défiler' + hint_back: 'Retour' + hint_unlock: 'Déverrouiller' + hint_start_drill: 'Lancer l''Exercice' unlock_msg_1: 'Une fois déverrouillé, l''exercice adaptatif inclura les touches de cette branche qui sont déverrouillées.' unlock_msg_2: 'Si vous voulez vous concentrer sur cette branche, lancez un exercice directement depuis cette branche dans l''Arbre de Compétences.' confirm_unlock: 'Déverrouiller %{branch} ?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Chaque touche du clavier est à confiance maximale.' mastery_takes_practice: 'La maîtrise n''est pas une destination — elle nécessite une pratique continue.' keep_drilling: 'Continuez à vous entraîner pour garder votre niveau.' - hint_skill_tree_continue: '[t] Ouvrir l''Arbre de Compétences [Autre touche] Continuer' + hint_skill_tree_continue: 'Ouvrir l''Arbre de Compétences [Autre touche] Continuer' hint_any_key: 'Appuyez sur une touche pour continuer' input_blocked: 'Saisie temporairement bloquée (%{ms}ms restantes)' unlock_msg_1: 'Bon travail ! Continuez à améliorer vos compétences.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Mémoire musculaire acquise !' mastery_msg_4: 'Une touche de plus conquise !' +# Superposition d'introduction à l'exercice adaptatif +adaptive_intro: + title: ' Bienvenue dans l''Exercice Adaptatif ! ' + how_it_works: 'Comment fonctionnent les exercices adaptatifs :' + desc_start: 'Vous commencez avec un petit ensemble des lettres les plus courantes déverrouillées.' + desc_progress: 'Au fur et à mesure que vous les tapez avec confiance, de nouvelles touches se déverrouillent progressivement' + desc_expand: 'jusqu''à ce que vous ayez maîtrisé le clavier complet.' + target_wpm_label: 'WPM Objectif :' + target_wpm_desc: 'Cela influence la vitesse de déverrouillage des touches — des objectifs plus élevés nécessitent' + target_wpm_default: 'une frappe plus rapide. 35 WPM est un bon point de départ si vous n''êtes pas sûr.' + hint: '[←→] Régler WPM [Enter/Space] Commencer l''exercice' + # Explorateur de clavier keyboard: title: ' Clavier ' subtitle: 'Appuyez ou cliquez sur une touche' - hint_navigate: '[←→↑↓/hjkl/Tab] Naviguer' - hint_back: '[q/ESC] Retour' + hint_navigate: 'Naviguer' + hint_back: 'Retour' key_label: 'Touche : ' finger_label: 'Doigt : ' hand_left: 'Gauche' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Lancer l''exercice de passage' start_code_drill: 'Lancer l''exercice de code' confirm: 'Confirmer' - hint_navigate: '[Up/Down] Naviguer' - hint_adjust: '[Left/Right] Ajuster' - hint_edit: '[Type/Backspace] Éditer' - hint_confirm: '[Enter] Confirmer' - hint_cancel: '[ESC] Annuler' + hint_navigate: 'Naviguer' + hint_adjust: 'Ajuster' + hint_edit: 'Éditer' + hint_confirm: 'Confirmer' + hint_cancel: 'Annuler' preparing_download: 'Préparation du téléchargement...' download_passage_title: ' Téléchargement de la Source de Passage ' download_code_title: ' Téléchargement de la Source de Code ' diff --git a/locales/hr.yml b/locales/hr.yml index 617c0fe..837f0cf 100644 --- a/locales/hr.yml +++ b/locales/hr.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigurirajte keydr' day_streak: ' | %{days} dana zaredom' key_progress: ' Napredak tipki %{unlocked}/%{total} (%{mastered} savladano) | Cilj %{target} WPM%{streak}' - hint_start: '[1-3] Pokreni' - hint_skill_tree: '[t] Stablo vještina' - hint_keyboard: '[b] Tipkovnica' - hint_stats: '[s] Statistika' - hint_settings: '[c] Postavke' - hint_quit: '[q] Izlaz' + hint_start: 'Pokreni' + hint_skill_tree: 'Stablo vještina' + hint_keyboard: 'Tipkovnica' + hint_stats: 'Statistika' + hint_settings: 'Postavke' + hint_quit: 'Izlaz' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Izvor teksta ' footer: '[ESC] Završi vježbu [Backspace] Obriši' keys_reenabled: 'Tipke ponovo aktivne za %{ms}ms' - hint_end: '[ESC] Završi vježbu' - hint_backspace: '[Backspace] Obriši' + hint_end: 'Završi vježbu' + hint_backspace: 'Obriši' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} točno)' input_blocked: ' Unos privremeno blokiran ' input_blocked_ms: '(%{ms}ms preostalo)' - hint_continue: '[c/Enter/Space] Nastavi' - hint_retry: '[r] Ponovi' - hint_menu: '[q] Izbornik' - hint_stats: '[s] Statistika' - hint_delete: '[x] Obriši' + hint_continue: 'Nastavi' + hint_retry: 'Ponovi' + hint_menu: 'Izbornik' + hint_stats: 'Statistika' + hint_delete: 'Obriši' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Točnost' tab_timing: '[5] Tajming' tab_ngrams: '[6] N-grami' - hint_back: '[ESC] Natrag' - hint_next_tab: '[Tab] Sljedeća kartica' - hint_switch_tab: '[1-6] Kartica' - hint_navigate: '[j/k] Navigacija' - hint_page: '[PgUp/PgDn] Stranica' - hint_delete: '[x] Obriši' + hint_back: 'Natrag' + hint_next_tab: 'Sljedeća kartica' + hint_switch_tab: 'Kartica' + hint_navigate: 'Navigacija' + hint_page: 'Stranica' + hint_delete: 'Obriši' summary_title: ' Sažetak ' drills: ' Vježbe: ' avg_wpm: ' Prosj. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Putanja uvoza' import_data: 'Uvezi podatke' import_now: 'Uvezi sada' - hint_save_back: '[ESC] Spremi i natrag' - hint_change_value: '[Enter/strelice] Promijeni' - hint_edit_path: '[Enter na putanju] Uredi' - hint_move: '[←→] Pomakni' - hint_tab_complete: '[Tab] Dovrši (na kraju)' - hint_confirm: '[Enter] Potvrdi' - hint_cancel: '[Esc] Odustani' + hint_save_back: 'Spremi i natrag' + hint_change_value: 'Promijeni' + hint_edit_path: 'Uredi' + hint_move: 'Pomakni' + hint_tab_complete: 'Dovrši (na kraju)' + hint_confirm: 'Potvrdi' + hint_cancel: 'Odustani' success_title: ' Uspjeh ' error_title: ' Greška ' press_any_key: 'Pritisnite bilo koju tipku' @@ -236,9 +236,9 @@ select: cached: ' (u predmemoriji)' disabled_download: ' (onemogućeno: potrebno preuzimanje)' download_required: ' (potrebno preuzimanje)' - hint_navigate: '[Gore/Dolje/PgUp/PgDn] Navigacija' - hint_confirm: '[Enter] Potvrdi' - hint_back: '[ESC] Natrag' + hint_navigate: 'Navigacija' + hint_confirm: 'Potvrdi' + hint_back: 'Natrag' language_resets_layout: 'Odabir jezika resetira raspored tipkovnice na zadani za taj jezik.' layout_no_language_change: 'Promjena rasporeda ne mijenja jezik rječnika.' disabled_network_notice: 'Neki jezici su onemogućeni: omogućite mrežna preuzimanja u uvodu/postavkama.' @@ -267,11 +267,11 @@ skill_tree: level: 'Razina %{current}/%{total}' level_zero: 'Razina 0/%{total}' in_focus: ' u fokusu' - hint_navigate: '[↑↓/jk] Navigacija' - hint_scroll: '[PgUp/PgDn ili Ctrl+U/Ctrl+D] Pomicanje' - hint_back: '[q] Natrag' - hint_unlock: '[Enter] Otključaj' - hint_start_drill: '[Enter] Pokreni vježbu' + hint_navigate: 'Navigacija' + hint_scroll: 'Pomicanje' + hint_back: 'Natrag' + hint_unlock: 'Otključaj' + hint_start_drill: 'Pokreni vježbu' unlock_msg_1: 'Nakon otključavanja, zadana prilagodljiva vježba uključit će otključane tipke iz ove grane.' unlock_msg_2: 'Ako se želite usredotočiti samo na ovu granu, pokrenite vježbu izravno iz stabla vještina.' confirm_unlock: 'Otključati %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Svaka tipka na tipkovnici je na maksimalnoj razini pouzdanosti.' mastery_takes_practice: 'Majstorstvo nije odredište — zahtijeva stalnu vježbu.' keep_drilling: 'Nastavite vježbati kako biste održali formu.' - hint_skill_tree_continue: '[t] Otvori stablo vještina [Bilo koja tipka] Nastavi' + hint_skill_tree_continue: 'Otvori stablo vještina [Bilo koja tipka] Nastavi' hint_any_key: 'Pritisnite bilo koju tipku za nastavak' input_blocked: 'Unos privremeno blokiran (%{ms}ms preostalo)' unlock_msg_1: 'Odličan posao! Nastavite graditi vještine tipkanja.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Mišićna memorija zaključana!' mastery_msg_4: 'Još jedna tipka osvojena!' +# Uvodni prekrivač prilagodljive vježbe +adaptive_intro: + title: ' Dobrodošli u Prilagodljivu Vježbu! ' + how_it_works: 'Kako funkcioniraju prilagodljive vježbe:' + desc_start: 'Počinjete s malim skupom najčešćih slova koja su otključana.' + desc_progress: 'Kako ih tipkate s pouzdanošću, nove tipke se postupno' + desc_expand: 'otključavaju dok ne savladate cijelu tipkovnicu.' + target_wpm_label: 'Ciljni WPM:' + target_wpm_desc: 'Ovo utječe na brzinu otključavanja tipki — viši ciljevi zahtijevaju' + target_wpm_default: 'brže tipkanje. 35 WPM je dobro polazište ako niste sigurni.' + hint: '[←→] Podesi WPM [Enter/Space] Počni vježbu' + # Keyboard explorer keyboard: title: ' Tipkovnica ' subtitle: 'Pritisnite bilo koju tipku ili kliknite tipku' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' - hint_back: '[q/ESC] Natrag' + hint_navigate: 'Navigacija' + hint_back: 'Natrag' key_label: 'Tipka: ' finger_label: 'Prst: ' hand_left: 'Lijeva' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Pokreni vježbu teksta' start_code_drill: 'Pokreni vježbu koda' confirm: 'Potvrdi' - hint_navigate: '[Gore/Dolje] Navigacija' - hint_adjust: '[Lijevo/Desno] Prilagodi' - hint_edit: '[Tipkanje/Backspace] Uredi' - hint_confirm: '[Enter] Potvrdi' - hint_cancel: '[ESC] Odustani' + hint_navigate: 'Navigacija' + hint_adjust: 'Prilagodi' + hint_edit: 'Uredi' + hint_confirm: 'Potvrdi' + hint_cancel: 'Odustani' preparing_download: 'Priprema preuzimanja...' download_passage_title: ' Preuzimanje izvora teksta ' download_code_title: ' Preuzimanje izvora koda ' diff --git a/locales/hu.yml b/locales/hu.yml index c0fdb5f..7ebaf81 100644 --- a/locales/hu.yml +++ b/locales/hu.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'keydr konfigurálása' day_streak: ' | %{days} napos sorozat' key_progress: ' Billentyűhaladás %{unlocked}/%{total} (%{mastered} elsajátítva) | Cél %{target} WPM%{streak}' - hint_start: '[1-3] Indítás' - hint_skill_tree: '[t] Képességfa' - hint_keyboard: '[b] Billentyűzet' - hint_stats: '[s] Statisztika' - hint_settings: '[c] Beállítások' - hint_quit: '[q] Kilépés' + hint_start: 'Indítás' + hint_skill_tree: 'Képességfa' + hint_keyboard: 'Billentyűzet' + hint_stats: 'Statisztika' + hint_settings: 'Beállítások' + hint_quit: 'Kilépés' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Szövegforrás ' footer: '[ESC] Gyakorlat vége [Backspace] Törlés' keys_reenabled: 'Billentyűk újra aktívak %{ms}ms múlva' - hint_end: '[ESC] Gyakorlat vége' - hint_backspace: '[Backspace] Törlés' + hint_end: 'Gyakorlat vége' + hint_backspace: 'Törlés' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} helyes)' input_blocked: ' Bevitel ideiglenesen blokkolva ' input_blocked_ms: '(%{ms}ms hátra)' - hint_continue: '[c/Enter/Space] Tovább' - hint_retry: '[r] Újra' - hint_menu: '[q] Menü' - hint_stats: '[s] Statisztika' - hint_delete: '[x] Törlés' + hint_continue: 'Tovább' + hint_retry: 'Újra' + hint_menu: 'Menü' + hint_stats: 'Statisztika' + hint_delete: 'Törlés' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Pontosság' tab_timing: '[5] Időzítés' tab_ngrams: '[6] N-gramok' - hint_back: '[ESC] Vissza' - hint_next_tab: '[Tab] Következő fül' - hint_switch_tab: '[1-6] Fül váltás' - hint_navigate: '[j/k] Navigáció' - hint_page: '[PgUp/PgDn] Lap' - hint_delete: '[x] Törlés' + hint_back: 'Vissza' + hint_next_tab: 'Következő fül' + hint_switch_tab: 'Fül váltás' + hint_navigate: 'Navigáció' + hint_page: 'Lap' + hint_delete: 'Törlés' summary_title: ' Összefoglaló ' drills: ' Gyakorlatok: ' avg_wpm: ' Átl. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importálási útvonal' import_data: 'Adatok importálása' import_now: 'Importálás most' - hint_save_back: '[ESC] Mentés és vissza' - hint_change_value: '[Enter/nyilak] Érték módosítása' - hint_edit_path: '[Enter az útvonalon] Szerkesztés' - hint_move: '[←→] Mozgatás' - hint_tab_complete: '[Tab] Kiegészítés (végén)' - hint_confirm: '[Enter] Megerősítés' - hint_cancel: '[Esc] Mégse' + hint_save_back: 'Mentés és vissza' + hint_change_value: 'Érték módosítása' + hint_edit_path: 'Szerkesztés' + hint_move: 'Mozgatás' + hint_tab_complete: 'Kiegészítés (végén)' + hint_confirm: 'Megerősítés' + hint_cancel: 'Mégse' success_title: ' Sikeres ' error_title: ' Hiba ' press_any_key: 'Nyomjon egy billentyűt' @@ -236,9 +236,9 @@ select: cached: ' (gyorsítótárazva)' disabled_download: ' (letiltva: letöltés szükséges)' download_required: ' (letöltés szükséges)' - hint_navigate: '[Fel/Le/PgUp/PgDn] Navigáció' - hint_confirm: '[Enter] Megerősítés' - hint_back: '[ESC] Vissza' + hint_navigate: 'Navigáció' + hint_confirm: 'Megerősítés' + hint_back: 'Vissza' language_resets_layout: 'A nyelv kiválasztása visszaállítja a billentyűzetkiosztást az adott nyelv alapértelmezésére.' layout_no_language_change: 'A kiosztás módosítása nem változtatja meg a szótár nyelvét.' disabled_network_notice: 'Egyes nyelvek letiltva: engedélyezze a hálózati letöltéseket a bevezetőben/beállításokban.' @@ -267,11 +267,11 @@ skill_tree: level: 'Szint %{current}/%{total}' level_zero: 'Szint 0/%{total}' in_focus: ' fókuszban' - hint_navigate: '[↑↓/jk] Navigáció' - hint_scroll: '[PgUp/PgDn vagy Ctrl+U/Ctrl+D] Görgetés' - hint_back: '[q] Vissza' - hint_unlock: '[Enter] Feloldás' - hint_start_drill: '[Enter] Gyakorlat indítása' + hint_navigate: 'Navigáció' + hint_scroll: 'Görgetés' + hint_back: 'Vissza' + hint_unlock: 'Feloldás' + hint_start_drill: 'Gyakorlat indítása' unlock_msg_1: 'Feloldás után az alapértelmezett adaptív gyakorlat bevonja az ág feloldott billentyűit.' unlock_msg_2: 'Ha csak erre az ágra szeretne összpontosítani, indítson gyakorlatot közvetlenül a képességfából.' confirm_unlock: '%{branch} feloldása?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'A billentyűzet minden billentyűje maximális megbízhatóságú.' mastery_takes_practice: 'Az elsajátítás nem végállomás — folyamatos gyakorlást igényel.' keep_drilling: 'Folytassa a gyakorlást, hogy megőrizze szintjét.' - hint_skill_tree_continue: '[t] Képességfa megnyitása [Bármely billentyű] Tovább' + hint_skill_tree_continue: 'Képességfa megnyitása [Bármely billentyű] Tovább' hint_any_key: 'Nyomjon bármely billentyűt a folytatáshoz' input_blocked: 'Bevitel ideiglenesen blokkolva (%{ms}ms hátra)' unlock_msg_1: 'Szép munka! Fejlessze tovább gépelési készségeit.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Izommemória rögzítve!' mastery_msg_4: 'Még egy billentyű meghódítva!' +# Adaptív gyakorlat bevezető felugró +adaptive_intro: + title: ' Üdvözöljük az Adaptív Gyakorlatban! ' + how_it_works: 'Hogyan működnek az adaptív gyakorlatok:' + desc_start: 'A leggyakoribb betűk egy kis készletével kezd, amelyek fel vannak oldva.' + desc_progress: 'Ahogy magabiztosan gépeli őket, az új billentyűk fokozatosan' + desc_expand: 'feloldódnak, amíg el nem sajátítja a teljes billentyűzetet.' + target_wpm_label: 'Cél WPM:' + target_wpm_desc: 'Ez befolyásolja a billentyűk feloldásának sebességét — magasabb célok' + target_wpm_default: 'gyorsabb gépelést igényelnek. 35 WPM jó kiindulópont, ha bizonytalan.' + hint: '[←→] WPM beállítása [Enter/Space] Gyakorlat indítása' + # Keyboard explorer keyboard: title: ' Billentyűzet ' subtitle: 'Nyomjon meg bármely billentyűt vagy kattintson' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigáció' - hint_back: '[q/ESC] Vissza' + hint_navigate: 'Navigáció' + hint_back: 'Vissza' key_label: 'Billentyű: ' finger_label: 'Ujj: ' hand_left: 'Bal' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Szöveg gyakorlat indítása' start_code_drill: 'Kód gyakorlat indítása' confirm: 'Megerősítés' - hint_navigate: '[Fel/Le] Navigáció' - hint_adjust: '[Bal/Jobb] Állítás' - hint_edit: '[Gépelés/Backspace] Szerkesztés' - hint_confirm: '[Enter] Megerősítés' - hint_cancel: '[ESC] Mégse' + hint_navigate: 'Navigáció' + hint_adjust: 'Állítás' + hint_edit: 'Szerkesztés' + hint_confirm: 'Megerősítés' + hint_cancel: 'Mégse' preparing_download: 'Letöltés előkészítése...' download_passage_title: ' Szövegforrás letöltése ' download_code_title: ' Kódforrás letöltése ' diff --git a/locales/it.yml b/locales/it.yml index 5fe9eca..99a1e9a 100644 --- a/locales/it.yml +++ b/locales/it.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configura keydr' day_streak: ' | %{days} giorni consecutivi' key_progress: ' Progresso Tasti %{unlocked}/%{total} (%{mastered} padroneggiati) | Obiettivo %{target} WPM%{streak}' - hint_start: '[1-3] Avvia' - hint_skill_tree: '[t] Albero delle Abilità' - hint_keyboard: '[b] Tastiera' - hint_stats: '[s] Statistiche' - hint_settings: '[c] Impostazioni' - hint_quit: '[q] Esci' + hint_start: 'Avvia' + hint_skill_tree: 'Albero delle Abilità' + hint_keyboard: 'Tastiera' + hint_stats: 'Statistiche' + hint_settings: 'Impostazioni' + hint_quit: 'Esci' # Schermata esercizio drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Sorgente brano ' footer: '[ESC] Fine [Backspace] Cancella' keys_reenabled: 'Tasti riattivati in %{ms}ms' - hint_end: '[ESC] Fine esercizio' - hint_backspace: '[Backspace] Cancella' + hint_end: 'Fine esercizio' + hint_backspace: 'Cancella' # Pannello / risultato dell'esercizio dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} corretti)' input_blocked: ' Input temporaneamente bloccato ' input_blocked_ms: '(%{ms}ms rimanenti)' - hint_continue: '[c/Enter/Space] Continua' - hint_retry: '[r] Riprova' - hint_menu: '[q] Menu' - hint_stats: '[s] Statistiche' - hint_delete: '[x] Elimina' + hint_continue: 'Continua' + hint_retry: 'Riprova' + hint_menu: 'Menu' + hint_stats: 'Statistiche' + hint_delete: 'Elimina' # Barra laterale statistiche (durante l'esercizio) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Precisione' tab_timing: '[5] Tempistica' tab_ngrams: '[6] N-grammi' - hint_back: '[ESC] Indietro' - hint_next_tab: '[Tab] Scheda successiva' - hint_switch_tab: '[1-6] Cambia scheda' - hint_navigate: '[j/k] Naviga' - hint_page: '[PgUp/PgDn] Pagina' - hint_delete: '[x] Elimina' + hint_back: 'Indietro' + hint_next_tab: 'Scheda successiva' + hint_switch_tab: 'Cambia scheda' + hint_navigate: 'Naviga' + hint_page: 'Pagina' + hint_delete: 'Elimina' summary_title: ' Riepilogo ' drills: ' Esercizi: ' avg_wpm: ' WPM Med: ' @@ -200,13 +200,13 @@ settings: import_path: 'Percorso di Importazione' import_data: 'Importa Dati' import_now: 'Importa ora' - hint_save_back: '[ESC] Salva e indietro' - hint_change_value: '[Enter/frecce] Cambia valore' - hint_edit_path: '[Enter su percorso] Modifica' - hint_move: '[←→] Sposta' - hint_tab_complete: '[Tab] Completa (alla fine)' - hint_confirm: '[Enter] Conferma' - hint_cancel: '[Esc] Annulla' + hint_save_back: 'Salva e indietro' + hint_change_value: 'Cambia valore' + hint_edit_path: 'Modifica' + hint_move: 'Sposta' + hint_tab_complete: 'Completa (alla fine)' + hint_confirm: 'Conferma' + hint_cancel: 'Annulla' success_title: ' Successo ' error_title: ' Errore ' press_any_key: 'Premi un tasto qualsiasi' @@ -236,9 +236,9 @@ select: cached: ' (in cache)' disabled_download: ' (disattivato: download richiesto)' download_required: ' (download richiesto)' - hint_navigate: '[Up/Down/PgUp/PgDn] Naviga' - hint_confirm: '[Enter] Conferma' - hint_back: '[ESC] Indietro' + hint_navigate: 'Naviga' + hint_confirm: 'Conferma' + hint_back: 'Indietro' language_resets_layout: 'Selezionare una lingua reimposta il layout a quello predefinito di quella lingua.' layout_no_language_change: 'Cambiare layout non cambia la lingua del dizionario.' disabled_network_notice: 'Alcune lingue sono disattivate: attiva i download in intro/impostazioni.' @@ -267,11 +267,11 @@ skill_tree: level: 'Livello %{current}/%{total}' level_zero: 'Livello 0/%{total}' in_focus: ' in focus' - hint_navigate: '[↑↓/jk] Naviga' - hint_scroll: '[PgUp/PgDn o Ctrl+U/Ctrl+D] Scorri' - hint_back: '[q] Indietro' - hint_unlock: '[Enter] Sblocca' - hint_start_drill: '[Enter] Avvia Esercizio' + hint_navigate: 'Naviga' + hint_scroll: 'Scorri' + hint_back: 'Indietro' + hint_unlock: 'Sblocca' + hint_start_drill: 'Avvia Esercizio' unlock_msg_1: 'Una volta sbloccato, l''esercizio adattivo includerà i tasti di questo ramo che sono sbloccati.' unlock_msg_2: 'Se vuoi concentrarti solo su questo ramo, avvia un esercizio direttamente da questo ramo nell''Albero delle Abilità.' confirm_unlock: 'Sbloccare %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Ogni tasto della tastiera è a confidenza massima.' mastery_takes_practice: 'La padronanza non è una destinazione — richiede pratica continua.' keep_drilling: 'Continua ad esercitarti per mantenere il tuo livello.' - hint_skill_tree_continue: '[t] Apri Albero delle Abilità [Altro tasto] Continua' + hint_skill_tree_continue: 'Apri Albero delle Abilità [Altro tasto] Continua' hint_any_key: 'Premi un tasto qualsiasi per continuare' input_blocked: 'Input temporaneamente bloccato (%{ms}ms rimanenti)' unlock_msg_1: 'Ottimo lavoro! Continua a migliorare le tue abilità.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Memoria muscolare acquisita!' mastery_msg_4: 'Un altro tasto conquistato!' +# Sovrapposizione introduzione esercizio adattivo +adaptive_intro: + title: ' Benvenuto nell''Esercizio Adattivo! ' + how_it_works: 'Come funzionano gli esercizi adattivi:' + desc_start: 'Inizi con un piccolo insieme delle lettere più comuni sbloccate.' + desc_progress: 'Man mano che le digiti con sicurezza, nuovi tasti vengono gradualmente' + desc_expand: 'sbloccati finché non hai padroneggiato la tastiera completa.' + target_wpm_label: 'WPM Obiettivo:' + target_wpm_desc: 'Questo influenza la velocità di sblocco dei tasti — obiettivi più alti richiedono' + target_wpm_default: 'una digitazione più veloce. 35 WPM è un buon punto di partenza se non sei sicuro.' + hint: '[←→] Regola WPM [Enter/Space] Inizia esercizio' + # Esploratore tastiera keyboard: title: ' Tastiera ' subtitle: 'Premi o clicca su un tasto' - hint_navigate: '[←→↑↓/hjkl/Tab] Naviga' - hint_back: '[q/ESC] Indietro' + hint_navigate: 'Naviga' + hint_back: 'Indietro' key_label: 'Tasto: ' finger_label: 'Dito: ' hand_left: 'Sinistra' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Avvia esercizio di brano' start_code_drill: 'Avvia esercizio di codice' confirm: 'Conferma' - hint_navigate: '[Up/Down] Naviga' - hint_adjust: '[Left/Right] Regola' - hint_edit: '[Type/Backspace] Modifica' - hint_confirm: '[Enter] Conferma' - hint_cancel: '[ESC] Annulla' + hint_navigate: 'Naviga' + hint_adjust: 'Regola' + hint_edit: 'Modifica' + hint_confirm: 'Conferma' + hint_cancel: 'Annulla' preparing_download: 'Preparazione download...' download_passage_title: ' Download Sorgente Brano ' download_code_title: ' Download Sorgente Codice ' diff --git a/locales/lt.yml b/locales/lt.yml index 48ae432..5bf7de9 100644 --- a/locales/lt.yml +++ b/locales/lt.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigūruokite keydr' day_streak: ' | %{days} d. serija' key_progress: ' Klavišų pažanga %{unlocked}/%{total} (%{mastered} įvaldyta) | Tikslas %{target} WPM%{streak}' - hint_start: '[1-3] Pradėti' - hint_skill_tree: '[t] Įgūdžių medis' - hint_keyboard: '[b] Klaviatūra' - hint_stats: '[s] Statistika' - hint_settings: '[c] Nustatymai' - hint_quit: '[q] Išeiti' + hint_start: 'Pradėti' + hint_skill_tree: 'Įgūdžių medis' + hint_keyboard: 'Klaviatūra' + hint_stats: 'Statistika' + hint_settings: 'Nustatymai' + hint_quit: 'Išeiti' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Teksto šaltinis ' footer: '[ESC] Baigti pratybas [Backspace] Trinti' keys_reenabled: 'Klavišai vėl aktyvūs po %{ms}ms' - hint_end: '[ESC] Baigti pratybas' - hint_backspace: '[Backspace] Trinti' + hint_end: 'Baigti pratybas' + hint_backspace: 'Trinti' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} teisingai)' input_blocked: ' Įvestis laikinai blokuota ' input_blocked_ms: '(%{ms}ms liko)' - hint_continue: '[c/Enter/Space] Tęsti' - hint_retry: '[r] Iš naujo' - hint_menu: '[q] Meniu' - hint_stats: '[s] Statistika' - hint_delete: '[x] Trinti' + hint_continue: 'Tęsti' + hint_retry: 'Iš naujo' + hint_menu: 'Meniu' + hint_stats: 'Statistika' + hint_delete: 'Trinti' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Tikslumas' tab_timing: '[5] Laikas' tab_ngrams: '[6] N-gramos' - hint_back: '[ESC] Atgal' - hint_next_tab: '[Tab] Kita kortelė' - hint_switch_tab: '[1-6] Kortelė' - hint_navigate: '[j/k] Navigacija' - hint_page: '[PgUp/PgDn] Puslapis' - hint_delete: '[x] Trinti' + hint_back: 'Atgal' + hint_next_tab: 'Kita kortelė' + hint_switch_tab: 'Kortelė' + hint_navigate: 'Navigacija' + hint_page: 'Puslapis' + hint_delete: 'Trinti' summary_title: ' Santrauka ' drills: ' Pratybos: ' avg_wpm: ' Vid. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importo kelias' import_data: 'Importuoti duomenis' import_now: 'Importuoti dabar' - hint_save_back: '[ESC] Išsaugoti ir atgal' - hint_change_value: '[Enter/rodyklės] Keisti reikšmę' - hint_edit_path: '[Enter ant kelio] Redaguoti' - hint_move: '[←→] Judėti' - hint_tab_complete: '[Tab] Užbaigti (gale)' - hint_confirm: '[Enter] Patvirtinti' - hint_cancel: '[Esc] Atšaukti' + hint_save_back: 'Išsaugoti ir atgal' + hint_change_value: 'Keisti reikšmę' + hint_edit_path: 'Redaguoti' + hint_move: 'Judėti' + hint_tab_complete: 'Užbaigti (gale)' + hint_confirm: 'Patvirtinti' + hint_cancel: 'Atšaukti' success_title: ' Sėkmė ' error_title: ' Klaida ' press_any_key: 'Paspauskite bet kurį klavišą' @@ -236,9 +236,9 @@ select: cached: ' (podėlyje)' disabled_download: ' (išjungta: reikia atsisiųsti)' download_required: ' (reikia atsisiųsti)' - hint_navigate: '[Aukštyn/Žemyn/PgUp/PgDn] Navigacija' - hint_confirm: '[Enter] Patvirtinti' - hint_back: '[ESC] Atgal' + hint_navigate: 'Navigacija' + hint_confirm: 'Patvirtinti' + hint_back: 'Atgal' language_resets_layout: 'Kalbos pasirinkimas atstato klaviatūros išdėstymą į tos kalbos numatytąjį.' layout_no_language_change: 'Išdėstymo pakeitimas nekeičia žodyno kalbos.' disabled_network_notice: 'Kai kurios kalbos išjungtos: įjunkite tinklo atsisiuntimus įvade/nustatymuose.' @@ -267,11 +267,11 @@ skill_tree: level: 'Lygis %{current}/%{total}' level_zero: 'Lygis 0/%{total}' in_focus: ' fokuse' - hint_navigate: '[↑↓/jk] Navigacija' - hint_scroll: '[PgUp/PgDn arba Ctrl+U/Ctrl+D] Slinkti' - hint_back: '[q] Atgal' - hint_unlock: '[Enter] Atrakinti' - hint_start_drill: '[Enter] Pradėti pratybas' + hint_navigate: 'Navigacija' + hint_scroll: 'Slinkti' + hint_back: 'Atgal' + hint_unlock: 'Atrakinti' + hint_start_drill: 'Pradėti pratybas' unlock_msg_1: 'Atrakinus, numatytosios adaptyvios pratybos įtrauks šios šakos atrakintus klavišus.' unlock_msg_2: 'Jei norite sutelkti dėmesį tik į šią šaką, pradėkite pratybas tiesiogiai iš įgūdžių medžio.' confirm_unlock: 'Atrakinti %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Kiekvienas klaviatūros klavišas yra maksimalaus patikimumo.' mastery_takes_practice: 'Meistriškumas nėra tikslas — jis reikalauja nuolatinės praktikos.' keep_drilling: 'Tęskite pratybas, kad išlaikytumėte formą.' - hint_skill_tree_continue: '[t] Atidaryti įgūdžių medį [Bet kuris klavišas] Tęsti' + hint_skill_tree_continue: 'Atidaryti įgūdžių medį [Bet kuris klavišas] Tęsti' hint_any_key: 'Paspauskite bet kurį klavišą tęsti' input_blocked: 'Įvestis laikinai blokuota (%{ms}ms liko)' unlock_msg_1: 'Puiku! Toliau tobulinkite spausdinimo įgūdžius.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Raumenų atmintis užfiksuota!' mastery_msg_4: 'Dar vienas klavišas užkariauta!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Sveiki atvykę į adaptyvias pratybas! ' + how_it_works: 'Kaip veikia adaptyvios pratybos:' + desc_start: 'Pradžioje atrakinamas nedidelis dažniausių raidžių rinkinys.' + desc_progress: 'Kai jas spausdinsite užtikrintai, nauji klavišai palaipsniui' + desc_expand: 'atrakinami, kol įvaldysite visą klaviatūrą.' + target_wpm_label: 'Tikslinis WPM:' + target_wpm_desc: 'Tai lemia, kaip greitai atrakinami klavišai — aukštesni tikslai reikalauja' + target_wpm_default: 'greitesnio spausdinimo. 35 WPM — gera pradžios vieta, jei nesate tikri.' + hint: '[←→] Reguliuoti WPM [Enter/Space] Pradėti pratybas' + # Keyboard explorer keyboard: title: ' Klaviatūra ' subtitle: 'Paspauskite bet kurį klavišą arba spustelėkite' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' - hint_back: '[q/ESC] Atgal' + hint_navigate: 'Navigacija' + hint_back: 'Atgal' key_label: 'Klavišas: ' finger_label: 'Pirštas: ' hand_left: 'Kairė' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Pradėti teksto pratybas' start_code_drill: 'Pradėti kodo pratybas' confirm: 'Patvirtinti' - hint_navigate: '[Aukštyn/Žemyn] Navigacija' - hint_adjust: '[Kairėn/Dešinėn] Reguliuoti' - hint_edit: '[Rašymas/Backspace] Redaguoti' - hint_confirm: '[Enter] Patvirtinti' - hint_cancel: '[ESC] Atšaukti' + hint_navigate: 'Navigacija' + hint_adjust: 'Reguliuoti' + hint_edit: 'Redaguoti' + hint_confirm: 'Patvirtinti' + hint_cancel: 'Atšaukti' preparing_download: 'Ruošiamas atsisiuntimas...' download_passage_title: ' Atsisiunčiamas teksto šaltinis ' download_code_title: ' Atsisiunčiamas kodo šaltinis ' diff --git a/locales/lv.yml b/locales/lv.yml index 6725a17..24cc8bc 100644 --- a/locales/lv.yml +++ b/locales/lv.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigurēt keydr' day_streak: ' | %{days} dienu sērija' key_progress: ' Taustiņu progress %{unlocked}/%{total} (%{mastered} apgūti) | Mērķis %{target} WPM%{streak}' - hint_start: '[1-3] Sākt' - hint_skill_tree: '[t] Prasmju koks' - hint_keyboard: '[b] Tastatūra' - hint_stats: '[s] Statistika' - hint_settings: '[c] Iestatījumi' - hint_quit: '[q] Iziet' + hint_start: 'Sākt' + hint_skill_tree: 'Prasmju koks' + hint_keyboard: 'Tastatūra' + hint_stats: 'Statistika' + hint_settings: 'Iestatījumi' + hint_quit: 'Iziet' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Teksta avots ' footer: '[ESC] Beigt vingrinājumu [Backspace] Dzēst' keys_reenabled: 'Taustiņi atkal aktīvi pēc %{ms}ms' - hint_end: '[ESC] Beigt vingrinājumu' - hint_backspace: '[Backspace] Dzēst' + hint_end: 'Beigt vingrinājumu' + hint_backspace: 'Dzēst' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} pareizi)' input_blocked: ' Ievade īslaicīgi bloķēta ' input_blocked_ms: '(%{ms}ms atlicis)' - hint_continue: '[c/Enter/Space] Turpināt' - hint_retry: '[r] Atkārtot' - hint_menu: '[q] Izvēlne' - hint_stats: '[s] Statistika' - hint_delete: '[x] Dzēst' + hint_continue: 'Turpināt' + hint_retry: 'Atkārtot' + hint_menu: 'Izvēlne' + hint_stats: 'Statistika' + hint_delete: 'Dzēst' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Precizitāte' tab_timing: '[5] Laiki' tab_ngrams: '[6] N-gramas' - hint_back: '[ESC] Atpakaļ' - hint_next_tab: '[Tab] Nākamā cilne' - hint_switch_tab: '[1-6] Cilne' - hint_navigate: '[j/k] Navigācija' - hint_page: '[PgUp/PgDn] Lapa' - hint_delete: '[x] Dzēst' + hint_back: 'Atpakaļ' + hint_next_tab: 'Nākamā cilne' + hint_switch_tab: 'Cilne' + hint_navigate: 'Navigācija' + hint_page: 'Lapa' + hint_delete: 'Dzēst' summary_title: ' Kopsavilkums ' drills: ' Vingrinājumi: ' avg_wpm: ' Vid. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importa ceļš' import_data: 'Importēt datus' import_now: 'Importēt tagad' - hint_save_back: '[ESC] Saglabāt un atpakaļ' - hint_change_value: '[Enter/bultiņas] Mainīt vērtību' - hint_edit_path: '[Enter uz ceļa] Rediģēt' - hint_move: '[←→] Pārvietot' - hint_tab_complete: '[Tab] Pabeigt (beigās)' - hint_confirm: '[Enter] Apstiprināt' - hint_cancel: '[Esc] Atcelt' + hint_save_back: 'Saglabāt un atpakaļ' + hint_change_value: 'Mainīt vērtību' + hint_edit_path: 'Rediģēt' + hint_move: 'Pārvietot' + hint_tab_complete: 'Pabeigt (beigās)' + hint_confirm: 'Apstiprināt' + hint_cancel: 'Atcelt' success_title: ' Veiksmīgi ' error_title: ' Kļūda ' press_any_key: 'Nospiediet jebkuru taustiņu' @@ -236,9 +236,9 @@ select: cached: ' (kešots)' disabled_download: ' (atspējots: nepieciešama lejupielāde)' download_required: ' (nepieciešama lejupielāde)' - hint_navigate: '[Augšup/Lejup/PgUp/PgDn] Navigācija' - hint_confirm: '[Enter] Apstiprināt' - hint_back: '[ESC] Atpakaļ' + hint_navigate: 'Navigācija' + hint_confirm: 'Apstiprināt' + hint_back: 'Atpakaļ' language_resets_layout: 'Valodas izvēle atjauno tastatūras izkārtojumu uz šīs valodas noklusējumu.' layout_no_language_change: 'Izkārtojuma maiņa nemaina vārdnīcas valodu.' disabled_network_notice: 'Dažas valodas atspējotas: iespējojiet tīkla lejupielādes ievadā/iestatījumos.' @@ -267,11 +267,11 @@ skill_tree: level: 'Līmenis %{current}/%{total}' level_zero: 'Līmenis 0/%{total}' in_focus: ' fokusā' - hint_navigate: '[↑↓/jk] Navigācija' - hint_scroll: '[PgUp/PgDn vai Ctrl+U/Ctrl+D] Ritināt' - hint_back: '[q] Atpakaļ' - hint_unlock: '[Enter] Atbloķēt' - hint_start_drill: '[Enter] Sākt vingrinājumu' + hint_navigate: 'Navigācija' + hint_scroll: 'Ritināt' + hint_back: 'Atpakaļ' + hint_unlock: 'Atbloķēt' + hint_start_drill: 'Sākt vingrinājumu' unlock_msg_1: 'Pēc atbloķēšanas noklusējuma adaptīvais vingrinājums iekļaus šī zara atbloķētos taustiņus.' unlock_msg_2: 'Ja vēlaties fokusēties tikai uz šo zaru, sāciet vingrinājumu tieši no prasmju koka.' confirm_unlock: 'Atbloķēt %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Katrs tastatūras taustiņš ir maksimālā uzticamībā.' mastery_takes_practice: 'Meistarība nav galamērķis — tā prasa pastāvīgu praksi.' keep_drilling: 'Turpiniet vingrinājumus, lai uzturētu formu.' - hint_skill_tree_continue: '[t] Atvērt prasmju koku [Jebkurš taustiņš] Turpināt' + hint_skill_tree_continue: 'Atvērt prasmju koku [Jebkurš taustiņš] Turpināt' hint_any_key: 'Nospiediet jebkuru taustiņu lai turpinātu' input_blocked: 'Ievade īslaicīgi bloķēta (%{ms}ms atlicis)' unlock_msg_1: 'Lielisks darbs! Turpiniet veidot rakstīšanas prasmes.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muskuļu atmiņa nostiprināta!' mastery_msg_4: 'Vēl viens taustiņš iekarots!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Laipni lūdzam adaptīvajā vingrinājumā! ' + how_it_works: 'Kā darbojas adaptīvie vingrinājumi:' + desc_start: 'Sākat ar nelielu visbiežāk lietoto burtu kopu.' + desc_progress: 'Kad rakstāt tos pārliecinoši, jauni taustiņi pakāpeniski' + desc_expand: 'tiek atbloķēti, līdz esat apguvis visu tastatūru.' + target_wpm_label: 'Mērķa WPM:' + target_wpm_desc: 'Tas ietekmē, cik ātri taustiņi tiek atbloķēti — augstāki mērķi prasa' + target_wpm_default: 'ātrāku rakstīšanu. 35 WPM ir labs sākumpunkts, ja neesat pārliecināts.' + hint: '[←→] Pielāgot WPM [Enter/Space] Sākt vingrinājumu' + # Keyboard explorer keyboard: title: ' Tastatūra ' subtitle: 'Nospiediet jebkuru taustiņu vai noklikšķiniet' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigācija' - hint_back: '[q/ESC] Atpakaļ' + hint_navigate: 'Navigācija' + hint_back: 'Atpakaļ' key_label: 'Taustiņš: ' finger_label: 'Pirksts: ' hand_left: 'Kreisā' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Sākt teksta vingrinājumu' start_code_drill: 'Sākt koda vingrinājumu' confirm: 'Apstiprināt' - hint_navigate: '[Augšup/Lejup] Navigācija' - hint_adjust: '[Pa kreisi/Pa labi] Pielāgot' - hint_edit: '[Rakstīšana/Backspace] Rediģēt' - hint_confirm: '[Enter] Apstiprināt' - hint_cancel: '[ESC] Atcelt' + hint_navigate: 'Navigācija' + hint_adjust: 'Pielāgot' + hint_edit: 'Rediģēt' + hint_confirm: 'Apstiprināt' + hint_cancel: 'Atcelt' preparing_download: 'Gatavo lejupielādi...' download_passage_title: ' Lejupielādē teksta avotu ' download_code_title: ' Lejupielādē koda avotu ' diff --git a/locales/nb.yml b/locales/nb.yml index eb37495..5747d6f 100644 --- a/locales/nb.yml +++ b/locales/nb.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigurer keydr' day_streak: ' | %{days} dagers rekke' key_progress: ' Tastefremgang %{unlocked}/%{total} (%{mastered} mestret) | Maal %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Ferdighetstre' - hint_keyboard: '[b] Tastatur' - hint_stats: '[s] Statistikk' - hint_settings: '[c] Innstillinger' - hint_quit: '[q] Avslutt' + hint_start: 'Start' + hint_skill_tree: 'Ferdighetstre' + hint_keyboard: 'Tastatur' + hint_stats: 'Statistikk' + hint_settings: 'Innstillinger' + hint_quit: 'Avslutt' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Tekstkilde ' footer: '[ESC] Avslutt oevelse [Backspace] Slett' keys_reenabled: 'Taster reaktivert etter %{ms}ms' - hint_end: '[ESC] Avslutt oevelse' - hint_backspace: '[Backspace] Slett' + hint_end: 'Avslutt oevelse' + hint_backspace: 'Slett' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} korrekte)' input_blocked: ' Inndata midlertidig blokkert ' input_blocked_ms: '(%{ms}ms gjenstaar)' - hint_continue: '[c/Enter/Space] Fortsett' - hint_retry: '[r] Proev igjen' - hint_menu: '[q] Meny' - hint_stats: '[s] Statistikk' - hint_delete: '[x] Slett' + hint_continue: 'Fortsett' + hint_retry: 'Proev igjen' + hint_menu: 'Meny' + hint_stats: 'Statistikk' + hint_delete: 'Slett' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Noeyaktighet' tab_timing: '[5] Timing' tab_ngrams: '[6] N-grammer' - hint_back: '[ESC] Tilbake' - hint_next_tab: '[Tab] Neste fane' - hint_switch_tab: '[1-6] Bytt fane' - hint_navigate: '[j/k] Naviger' - hint_page: '[PgUp/PgDn] Side' - hint_delete: '[x] Slett' + hint_back: 'Tilbake' + hint_next_tab: 'Neste fane' + hint_switch_tab: 'Bytt fane' + hint_navigate: 'Naviger' + hint_page: 'Side' + hint_delete: 'Slett' summary_title: ' Sammendrag ' drills: ' Oevelser: ' avg_wpm: ' Snitt WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importsti' import_data: 'Importer data' import_now: 'Importer naa' - hint_save_back: '[ESC] Lagre & tilbake' - hint_change_value: '[Enter/piler] Endre verdi' - hint_edit_path: '[Enter paa sti] Rediger' - hint_move: '[←→] Flytt' - hint_tab_complete: '[Tab] Fullfaor (paa slutten)' - hint_confirm: '[Enter] Bekreft' - hint_cancel: '[Esc] Avbryt' + hint_save_back: 'Lagre & tilbake' + hint_change_value: 'Endre verdi' + hint_edit_path: 'Rediger' + hint_move: 'Flytt' + hint_tab_complete: 'Fullfaor (paa slutten)' + hint_confirm: 'Bekreft' + hint_cancel: 'Avbryt' success_title: ' Suksess ' error_title: ' Feil ' press_any_key: 'Trykk paa en tast' @@ -236,9 +236,9 @@ select: cached: ' (lagret)' disabled_download: ' (deaktivert: nedlasting kraeves)' download_required: ' (nedlasting kraeves)' - hint_navigate: '[Opp/Ned/PgUp/PgDn] Naviger' - hint_confirm: '[Enter] Bekreft' - hint_back: '[ESC] Tilbake' + hint_navigate: 'Naviger' + hint_confirm: 'Bekreft' + hint_back: 'Tilbake' language_resets_layout: 'Spraakvalg tilbakestiller tastaturoppsett til spraakets standard.' layout_no_language_change: 'Oppsettendringer endrer ikke ordlistespraaket.' disabled_network_notice: 'Noen spraak er deaktivert: aktiver nettverksnedlastinger i intro/innstillinger.' @@ -267,11 +267,11 @@ skill_tree: level: 'Nivaa %{current}/%{total}' level_zero: 'Nivaa 0/%{total}' in_focus: ' i fokus' - hint_navigate: '[↑↓/jk] Naviger' - hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Rull' - hint_back: '[q] Tilbake' - hint_unlock: '[Enter] Laas opp' - hint_start_drill: '[Enter] Start oevelse' + hint_navigate: 'Naviger' + hint_scroll: 'Rull' + hint_back: 'Tilbake' + hint_unlock: 'Laas opp' + hint_start_drill: 'Start oevelse' unlock_msg_1: 'Etter opplaasing blandes oplaaste taster fra denne grenen inn i den adaptive oevelsen.' unlock_msg_2: 'Vil du kun oeve denne grenen, start en oevelse direkte fra denne grenen i Ferdighetstreet.' confirm_unlock: 'Laas opp %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillit.' mastery_takes_practice: 'Mestring er ikke et maal — det krever vedvarende oeving.' keep_drilling: 'Fortsett aa oeve for aa holde deg skarp.' - hint_skill_tree_continue: '[t] Ferdighetstre [Annen tast] Fortsett' + hint_skill_tree_continue: 'Ferdighetstre [Annen tast] Fortsett' hint_any_key: 'Trykk paa en tast for aa fortsette' input_blocked: 'Inndata midlertidig blokkert (%{ms}ms gjenstaar)' unlock_msg_1: 'Bra jobbet! Fortsett aa bygge skriveferdighetene dine.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muskelminne forankret!' mastery_msg_4: 'Enda en tast erobret!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Velkommen til adaptiv oevelse! ' + how_it_works: 'Slik fungerer adaptive oevelser:' + desc_start: 'Du starter med et lite sett av de vanligste bokstavene laast opp.' + desc_progress: 'Etter hvert som du skriver dem med trygghet, laases nye taster gradvis' + desc_expand: 'opp til du har mestret hele tastaturet.' + target_wpm_label: 'Maal-WPM:' + target_wpm_desc: 'Dette pavirker hvor raskt taster laases opp — hoyere maal krever' + target_wpm_default: 'raskere skriving. 35 WPM er et godt utgangspunkt hvis du er usikker.' + hint: '[←→] Juster WPM [Enter/Space] Start oevelse' + # Keyboard explorer keyboard: title: ' Tastatur ' subtitle: 'Trykk paa en tast eller klikk paa en tast' - hint_navigate: '[←→↑↓/hjkl/Tab] Naviger' - hint_back: '[q/ESC] Tilbake' + hint_navigate: 'Naviger' + hint_back: 'Tilbake' key_label: 'Tast: ' finger_label: 'Finger: ' hand_left: 'Venstre' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Start tekstoevelse' start_code_drill: 'Start kodeoevelse' confirm: 'Bekreft' - hint_navigate: '[Opp/Ned] Naviger' - hint_adjust: '[Venstre/Hoeyre] Juster' - hint_edit: '[Skriv/Backspace] Rediger' - hint_confirm: '[Enter] Bekreft' - hint_cancel: '[ESC] Avbryt' + hint_navigate: 'Naviger' + hint_adjust: 'Juster' + hint_edit: 'Rediger' + hint_confirm: 'Bekreft' + hint_cancel: 'Avbryt' preparing_download: 'Forbereder nedlasting...' download_passage_title: ' Laster ned tekstkilde ' download_code_title: ' Laster ned kodekilde ' diff --git a/locales/nl.yml b/locales/nl.yml index 5067018..9dc9544 100644 --- a/locales/nl.yml +++ b/locales/nl.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configureer keydr' day_streak: ' | %{days} dagen reeks' key_progress: ' Toetsvoortgang %{unlocked}/%{total} (%{mastered} beheerst) | Doel %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Vaardigheidsboom' - hint_keyboard: '[b] Toetsenbord' - hint_stats: '[s] Statistieken' - hint_settings: '[c] Instellingen' - hint_quit: '[q] Stoppen' + hint_start: 'Start' + hint_skill_tree: 'Vaardigheidsboom' + hint_keyboard: 'Toetsenbord' + hint_stats: 'Statistieken' + hint_settings: 'Instellingen' + hint_quit: 'Stoppen' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Tekstbron ' footer: '[ESC] Oefening stoppen [Backspace] Wissen' keys_reenabled: 'Toetsen weer actief na %{ms}ms' - hint_end: '[ESC] Oefening stoppen' - hint_backspace: '[Backspace] Wissen' + hint_end: 'Oefening stoppen' + hint_backspace: 'Wissen' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} juist)' input_blocked: ' Invoer tijdelijk geblokkeerd ' input_blocked_ms: '(%{ms}ms resterend)' - hint_continue: '[c/Enter/Space] Doorgaan' - hint_retry: '[r] Opnieuw' - hint_menu: '[q] Menu' - hint_stats: '[s] Statistieken' - hint_delete: '[x] Verwijderen' + hint_continue: 'Doorgaan' + hint_retry: 'Opnieuw' + hint_menu: 'Menu' + hint_stats: 'Statistieken' + hint_delete: 'Verwijderen' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Nauwkeurigheid' tab_timing: '[5] Timing' tab_ngrams: '[6] N-grammen' - hint_back: '[ESC] Terug' - hint_next_tab: '[Tab] Volgend tabblad' - hint_switch_tab: '[1-6] Tabblad wisselen' - hint_navigate: '[j/k] Navigeren' - hint_page: '[PgUp/PgDn] Pagina' - hint_delete: '[x] Verwijderen' + hint_back: 'Terug' + hint_next_tab: 'Volgend tabblad' + hint_switch_tab: 'Tabblad wisselen' + hint_navigate: 'Navigeren' + hint_page: 'Pagina' + hint_delete: 'Verwijderen' summary_title: ' Samenvatting ' drills: ' Oefeningen: ' avg_wpm: ' Gem. WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importpad' import_data: 'Gegevens importeren' import_now: 'Nu importeren' - hint_save_back: '[ESC] Opslaan & terug' - hint_change_value: '[Enter/pijltjes] Waarde wijzigen' - hint_edit_path: '[Enter op pad] Bewerken' - hint_move: '[←→] Verplaatsen' - hint_tab_complete: '[Tab] Aanvullen (aan einde)' - hint_confirm: '[Enter] Bevestigen' - hint_cancel: '[Esc] Annuleren' + hint_save_back: 'Opslaan & terug' + hint_change_value: 'Waarde wijzigen' + hint_edit_path: 'Bewerken' + hint_move: 'Verplaatsen' + hint_tab_complete: 'Aanvullen (aan einde)' + hint_confirm: 'Bevestigen' + hint_cancel: 'Annuleren' success_title: ' Geslaagd ' error_title: ' Fout ' press_any_key: 'Druk op een toets' @@ -236,9 +236,9 @@ select: cached: ' (opgeslagen)' disabled_download: ' (uitgeschakeld: download vereist)' download_required: ' (download vereist)' - hint_navigate: '[Omhoog/Omlaag/PgUp/PgDn] Navigeren' - hint_confirm: '[Enter] Bevestigen' - hint_back: '[ESC] Terug' + hint_navigate: 'Navigeren' + hint_confirm: 'Bevestigen' + hint_back: 'Terug' language_resets_layout: 'Taalselectie herstelt de toetsenbordindeling naar de standaard van die taal.' layout_no_language_change: 'Indelingswijzigingen veranderen de woordenboektaal niet.' disabled_network_notice: 'Sommige talen zijn uitgeschakeld: schakel netwerkdownloads in via intro/instellingen.' @@ -267,11 +267,11 @@ skill_tree: level: 'Niveau %{current}/%{total}' level_zero: 'Niveau 0/%{total}' in_focus: ' in aandacht' - hint_navigate: '[↑↓/jk] Navigeren' - hint_scroll: '[PgUp/PgDn of Ctrl+U/Ctrl+D] Scrollen' - hint_back: '[q] Terug' - hint_unlock: '[Enter] Ontgrendelen' - hint_start_drill: '[Enter] Oefening starten' + hint_navigate: 'Navigeren' + hint_scroll: 'Scrollen' + hint_back: 'Terug' + hint_unlock: 'Ontgrendelen' + hint_start_drill: 'Oefening starten' unlock_msg_1: 'Na ontgrendeling worden ontgrendelde toetsen van deze tak gemengd in de adaptieve oefening.' unlock_msg_2: 'Wil je alleen deze tak oefenen, start dan een oefening direct vanuit deze tak in de Vaardigheidsboom.' confirm_unlock: '%{branch} ontgrendelen?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Elke toets op het toetsenbord heeft maximaal vertrouwen.' mastery_takes_practice: 'Meesterschap is geen bestemming — het vereist voortdurend oefenen.' keep_drilling: 'Blijf oefenen om je niveau te behouden.' - hint_skill_tree_continue: '[t] Vaardigheidsboom [Andere toets] Doorgaan' + hint_skill_tree_continue: 'Vaardigheidsboom [Andere toets] Doorgaan' hint_any_key: 'Druk op een toets om door te gaan' input_blocked: 'Invoer tijdelijk geblokkeerd (%{ms}ms resterend)' unlock_msg_1: 'Goed gedaan! Blijf je typvaardigheden opbouwen.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Spiergeheugen verankerd!' mastery_msg_4: 'Weer een toets veroverd!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Welkom bij de adaptieve oefening! ' + how_it_works: 'Hoe adaptieve oefeningen werken:' + desc_start: 'Je begint met een kleine set van de meest voorkomende letters ontgrendeld.' + desc_progress: 'Naarmate je ze met vertrouwen typt, worden nieuwe toetsen geleidelijk' + desc_expand: 'ontgrendeld totdat je het volledige toetsenbord beheerst.' + target_wpm_label: 'Doel-WPM:' + target_wpm_desc: 'Dit bepaalt hoe snel toetsen ontgrendelen — hogere doelen vereisen' + target_wpm_default: 'sneller typen. 35 WPM is een goed startpunt als je het niet zeker weet.' + hint: '[←→] WPM aanpassen [Enter/Space] Oefening starten' + # Keyboard explorer keyboard: title: ' Toetsenbord ' subtitle: 'Druk op een toets of klik op een toets' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigeren' - hint_back: '[q/ESC] Terug' + hint_navigate: 'Navigeren' + hint_back: 'Terug' key_label: 'Toets: ' finger_label: 'Vinger: ' hand_left: 'Links' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Tekstoefening starten' start_code_drill: 'Code-oefening starten' confirm: 'Bevestigen' - hint_navigate: '[Omhoog/Omlaag] Navigeren' - hint_adjust: '[Links/Rechts] Aanpassen' - hint_edit: '[Typen/Backspace] Bewerken' - hint_confirm: '[Enter] Bevestigen' - hint_cancel: '[ESC] Annuleren' + hint_navigate: 'Navigeren' + hint_adjust: 'Aanpassen' + hint_edit: 'Bewerken' + hint_confirm: 'Bevestigen' + hint_cancel: 'Annuleren' preparing_download: 'Download wordt voorbereid...' download_passage_title: ' Tekstbron downloaden ' download_code_title: ' Codebron downloaden ' diff --git a/locales/pl.yml b/locales/pl.yml index 4e53f73..84b0bff 100644 --- a/locales/pl.yml +++ b/locales/pl.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfiguruj keydr' day_streak: ' | %{days} dni z rzedu' key_progress: ' Postep klawiszy %{unlocked}/%{total} (%{mastered} opanowanych) | Cel %{target} WPM%{streak}' - hint_start: '[1-3] Rozpocznij' - hint_skill_tree: '[t] Drzewo' - hint_keyboard: '[b] Klawiatura' - hint_stats: '[s] Statystyki' - hint_settings: '[c] Ustawienia' - hint_quit: '[q] Wyjdz' + hint_start: 'Rozpocznij' + hint_skill_tree: 'Drzewo' + hint_keyboard: 'Klawiatura' + hint_stats: 'Statystyki' + hint_settings: 'Ustawienia' + hint_quit: 'Wyjdz' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Zrodlo tekstu ' footer: '[ESC] Zakoncz trening [Backspace] Usun' keys_reenabled: 'Klawisze przywrocone w %{ms}ms' - hint_end: '[ESC] Zakoncz trening' - hint_backspace: '[Backspace] Usun' + hint_end: 'Zakoncz trening' + hint_backspace: 'Usun' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} poprawnych)' input_blocked: ' Wejscie tymczasowo zablokowane ' input_blocked_ms: '(%{ms}ms pozostalo)' - hint_continue: '[c/Enter/Space] Kontynuuj' - hint_retry: '[r] Powtorz' - hint_menu: '[q] Menu' - hint_stats: '[s] Statystyki' - hint_delete: '[x] Usun' + hint_continue: 'Kontynuuj' + hint_retry: 'Powtorz' + hint_menu: 'Menu' + hint_stats: 'Statystyki' + hint_delete: 'Usun' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Dokladnosc' tab_timing: '[5] Czas reakcji' tab_ngrams: '[6] N-gramy' - hint_back: '[ESC] Wstecz' - hint_next_tab: '[Tab] Nastepna karta' - hint_switch_tab: '[1-6] Zmien karte' - hint_navigate: '[j/k] Nawiguj' - hint_page: '[PgUp/PgDn] Strona' - hint_delete: '[x] Usun' + hint_back: 'Wstecz' + hint_next_tab: 'Nastepna karta' + hint_switch_tab: 'Zmien karte' + hint_navigate: 'Nawiguj' + hint_page: 'Strona' + hint_delete: 'Usun' summary_title: ' Podsumowanie ' drills: ' Treningi: ' avg_wpm: ' Sr WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Sciezka importu' import_data: 'Importuj dane' import_now: 'Importuj teraz' - hint_save_back: '[ESC] Zapisz i wstecz' - hint_change_value: '[Enter/strzalki] Zmien wartosc' - hint_edit_path: '[Enter na sciezce] Edytuj' - hint_move: '[←→] Przesun' - hint_tab_complete: '[Tab] Uzupelnij (na koncu)' - hint_confirm: '[Enter] Potwierdz' - hint_cancel: '[Esc] Anuluj' + hint_save_back: 'Zapisz i wstecz' + hint_change_value: 'Zmien wartosc' + hint_edit_path: 'Edytuj' + hint_move: 'Przesun' + hint_tab_complete: 'Uzupelnij (na koncu)' + hint_confirm: 'Potwierdz' + hint_cancel: 'Anuluj' success_title: ' Sukces ' error_title: ' Blad ' press_any_key: 'Nacisnij dowolny klawisz' @@ -236,9 +236,9 @@ select: cached: ' (w pamieci podrecznej)' disabled_download: ' (wylaczony: wymagane pobranie)' download_required: ' (wymagane pobranie)' - hint_navigate: '[Gora/Dol/PgUp/PgDn] Nawiguj' - hint_confirm: '[Enter] Potwierdz' - hint_back: '[ESC] Wstecz' + hint_navigate: 'Nawiguj' + hint_confirm: 'Potwierdz' + hint_back: 'Wstecz' language_resets_layout: 'Wybor jezyka resetuje uklad klawiatury do domyslnego dla tego jezyka.' layout_no_language_change: 'Zmiana ukladu nie zmienia jezyka slownika.' disabled_network_notice: 'Niektorej jezyki sa wylaczone: wlacz pobieranie sieciowe w ustawieniach.' @@ -267,11 +267,11 @@ skill_tree: level: 'Poziom %{current}/%{total}' level_zero: 'Poziom 0/%{total}' in_focus: ' w fokusie' - hint_navigate: '[↑↓/jk] Nawiguj' - hint_scroll: '[PgUp/PgDn lub Ctrl+U/Ctrl+D] Przewin' - hint_back: '[q] Wstecz' - hint_unlock: '[Enter] Odblokuj' - hint_start_drill: '[Enter] Rozpocznij trening' + hint_navigate: 'Nawiguj' + hint_scroll: 'Przewin' + hint_back: 'Wstecz' + hint_unlock: 'Odblokuj' + hint_start_drill: 'Rozpocznij trening' unlock_msg_1: 'Po odblokowaniu domyslny trening adaptacyjny bedzie wlaczal klawisze z tej galezi.' unlock_msg_2: 'Jesli chcesz skupic sie tylko na tej galezi, uruchom trening bezposrednio z drzewa.' confirm_unlock: 'Odblokowac %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Kazdy klawisz na klawiaturze jest na maksymalnej pewnosci.' mastery_takes_practice: 'Bieglosc to nie cel — wymaga ciaglej praktyki.' keep_drilling: 'Kontynuuj treningi, aby utrzymac swoj poziom.' - hint_skill_tree_continue: '[t] Otworz drzewo [Inny klawisz] Kontynuuj' + hint_skill_tree_continue: 'Otworz drzewo [Inny klawisz] Kontynuuj' hint_any_key: 'Nacisnij dowolny klawisz, aby kontynuowac' input_blocked: 'Wejscie tymczasowo zablokowane (%{ms}ms pozostalo)' unlock_msg_1: 'Swietna robota! Rozwijaj swoje umiejetnosci pisania.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Pamiec miesniowa zablokowana!' mastery_msg_4: 'Kolejny klawisz podbity!' +# Adaptive drill intro overlay +adaptive_intro: + title: ' Witaj w treningu adaptacyjnym! ' + how_it_works: 'Jak dzialaja treningi adaptacyjne:' + desc_start: 'Zaczynasz z malym zestawem najczestszych liter odblokowanych.' + desc_progress: 'W miare jak piszesz je pewnie, nowe klawisze sa stopniowo' + desc_expand: 'odblokowywane, az opanujesz cala klawiature.' + target_wpm_label: 'Docelowy WPM:' + target_wpm_desc: 'Wplywa to na szybkosc odblokowywania klawiszy — wyzsze cele wymagaja' + target_wpm_default: 'szybszego pisania. 35 WPM to dobry punkt startowy, jesli nie jestes pewien.' + hint: '[←→] Dostosuj WPM [Enter/Space] Rozpocznij trening' + # Keyboard explorer keyboard: title: ' Klawiatura ' subtitle: 'Nacisnij dowolny klawisz lub kliknij klawisz' - hint_navigate: '[←→↑↓/hjkl/Tab] Nawiguj' - hint_back: '[q/ESC] Wstecz' + hint_navigate: 'Nawiguj' + hint_back: 'Wstecz' key_label: 'Klawisz: ' finger_label: 'Palec: ' hand_left: 'Lewy' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Rozpocznij trening tekstu' start_code_drill: 'Rozpocznij trening kodu' confirm: 'Potwierdz' - hint_navigate: '[Gora/Dol] Nawiguj' - hint_adjust: '[Lewo/Prawo] Dostosuj' - hint_edit: '[Pisz/Backspace] Edytuj' - hint_confirm: '[Enter] Potwierdz' - hint_cancel: '[ESC] Anuluj' + hint_navigate: 'Nawiguj' + hint_adjust: 'Dostosuj' + hint_edit: 'Edytuj' + hint_confirm: 'Potwierdz' + hint_cancel: 'Anuluj' preparing_download: 'Przygotowywanie pobierania...' download_passage_title: ' Pobieranie zrodla tekstu ' download_code_title: ' Pobieranie zrodla kodu ' diff --git a/locales/pt.yml b/locales/pt.yml index 4f6a972..086b8a9 100644 --- a/locales/pt.yml +++ b/locales/pt.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configurar keydr' day_streak: ' | %{days} dias seguidos' key_progress: ' Progresso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Meta %{target} WPM%{streak}' - hint_start: '[1-3] Iniciar' - hint_skill_tree: '[t] Árvore de Habilidades' - hint_keyboard: '[b] Teclado' - hint_stats: '[s] Estatísticas' - hint_settings: '[c] Configurações' - hint_quit: '[q] Sair' + hint_start: 'Iniciar' + hint_skill_tree: 'Árvore de Habilidades' + hint_keyboard: 'Teclado' + hint_stats: 'Estatísticas' + hint_settings: 'Configurações' + hint_quit: 'Sair' # Tela de exercício drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Fonte da passagem ' footer: '[ESC] Fim [Backspace] Apagar' keys_reenabled: 'Teclas reativadas em %{ms}ms' - hint_end: '[ESC] Fim do exercício' - hint_backspace: '[Backspace] Apagar' + hint_end: 'Fim do exercício' + hint_backspace: 'Apagar' # Painel / resultado do exercício dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} corretos)' input_blocked: ' Entrada temporariamente bloqueada ' input_blocked_ms: '(%{ms}ms restantes)' - hint_continue: '[c/Enter/Space] Continuar' - hint_retry: '[r] Tentar novamente' - hint_menu: '[q] Menu' - hint_stats: '[s] Estatísticas' - hint_delete: '[x] Excluir' + hint_continue: 'Continuar' + hint_retry: 'Tentar novamente' + hint_menu: 'Menu' + hint_stats: 'Estatísticas' + hint_delete: 'Excluir' # Barra lateral de estatísticas (durante o exercício) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Precisão' tab_timing: '[5] Cronometragem' tab_ngrams: '[6] N-gramas' - hint_back: '[ESC] Voltar' - hint_next_tab: '[Tab] Próxima aba' - hint_switch_tab: '[1-6] Trocar aba' - hint_navigate: '[j/k] Navegar' - hint_page: '[PgUp/PgDn] Página' - hint_delete: '[x] Excluir' + hint_back: 'Voltar' + hint_next_tab: 'Próxima aba' + hint_switch_tab: 'Trocar aba' + hint_navigate: 'Navegar' + hint_page: 'Página' + hint_delete: 'Excluir' summary_title: ' Resumo ' drills: ' Exercícios: ' avg_wpm: ' WPM Méd: ' @@ -200,13 +200,13 @@ settings: import_path: 'Caminho de Importação' import_data: 'Importar Dados' import_now: 'Importar agora' - hint_save_back: '[ESC] Salvar e voltar' - hint_change_value: '[Enter/setas] Alterar valor' - hint_edit_path: '[Enter no caminho] Editar' - hint_move: '[←→] Mover' - hint_tab_complete: '[Tab] Completar (no final)' - hint_confirm: '[Enter] Confirmar' - hint_cancel: '[Esc] Cancelar' + hint_save_back: 'Salvar e voltar' + hint_change_value: 'Alterar valor' + hint_edit_path: 'Editar' + hint_move: 'Mover' + hint_tab_complete: 'Completar (no final)' + hint_confirm: 'Confirmar' + hint_cancel: 'Cancelar' success_title: ' Sucesso ' error_title: ' Erro ' press_any_key: 'Pressione qualquer tecla' @@ -236,9 +236,9 @@ select: cached: ' (em cache)' disabled_download: ' (desativado: download necessário)' download_required: ' (download necessário)' - hint_navigate: '[Up/Down/PgUp/PgDn] Navegar' - hint_confirm: '[Enter] Confirmar' - hint_back: '[ESC] Voltar' + hint_navigate: 'Navegar' + hint_confirm: 'Confirmar' + hint_back: 'Voltar' language_resets_layout: 'Selecionar um idioma redefine o layout para o padrão desse idioma.' layout_no_language_change: 'Alterar layout não muda o idioma do dicionário.' disabled_network_notice: 'Alguns idiomas estão desativados: ative os downloads em intro/configurações.' @@ -267,11 +267,11 @@ skill_tree: level: 'Nível %{current}/%{total}' level_zero: 'Nível 0/%{total}' in_focus: ' em foco' - hint_navigate: '[↑↓/jk] Navegar' - hint_scroll: '[PgUp/PgDn ou Ctrl+U/Ctrl+D] Rolar' - hint_back: '[q] Voltar' - hint_unlock: '[Enter] Desbloquear' - hint_start_drill: '[Enter] Iniciar Exercício' + hint_navigate: 'Navegar' + hint_scroll: 'Rolar' + hint_back: 'Voltar' + hint_unlock: 'Desbloquear' + hint_start_drill: 'Iniciar Exercício' unlock_msg_1: 'Uma vez desbloqueado, o exercício adaptativo incluirá teclas deste ramo que estejam desbloqueadas.' unlock_msg_2: 'Se quiser focar apenas neste ramo, inicie um exercício diretamente deste ramo na Árvore de Habilidades.' confirm_unlock: 'Desbloquear %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Cada tecla do teclado está em confiança máxima.' mastery_takes_practice: 'O domínio não é um destino — requer prática contínua.' keep_drilling: 'Continue praticando para manter seu nível.' - hint_skill_tree_continue: '[t] Abrir Árvore de Habilidades [Outra tecla] Continuar' + hint_skill_tree_continue: 'Abrir Árvore de Habilidades [Outra tecla] Continuar' hint_any_key: 'Pressione qualquer tecla para continuar' input_blocked: 'Entrada temporariamente bloqueada (%{ms}ms restantes)' unlock_msg_1: 'Bom trabalho! Continue melhorando suas habilidades.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Memória muscular adquirida!' mastery_msg_4: 'Mais uma tecla conquistada!' +# Sobreposição de introdução ao exercício adaptativo +adaptive_intro: + title: ' Bem-vindo ao Exercício Adaptativo! ' + how_it_works: 'Como funcionam os exercícios adaptativos:' + desc_start: 'Você começa com um pequeno conjunto das letras mais comuns desbloqueadas.' + desc_progress: 'À medida que as digita com confiança, novas teclas são gradualmente' + desc_expand: 'desbloqueadas até você dominar o teclado completo.' + target_wpm_label: 'WPM Alvo:' + target_wpm_desc: 'Isso afeta a velocidade com que as teclas são desbloqueadas — metas mais altas exigem' + target_wpm_default: 'digitação mais rápida. 35 WPM é um bom ponto de partida se não tiver certeza.' + hint: '[←→] Ajustar WPM [Enter/Space] Começar a praticar' + # Explorador de teclado keyboard: title: ' Teclado ' subtitle: 'Pressione ou clique em uma tecla' - hint_navigate: '[←→↑↓/hjkl/Tab] Navegar' - hint_back: '[q/ESC] Voltar' + hint_navigate: 'Navegar' + hint_back: 'Voltar' key_label: 'Tecla: ' finger_label: 'Dedo: ' hand_left: 'Esquerda' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Iniciar exercício de passagem' start_code_drill: 'Iniciar exercício de código' confirm: 'Confirmar' - hint_navigate: '[Up/Down] Navegar' - hint_adjust: '[Left/Right] Ajustar' - hint_edit: '[Type/Backspace] Editar' - hint_confirm: '[Enter] Confirmar' - hint_cancel: '[ESC] Cancelar' + hint_navigate: 'Navegar' + hint_adjust: 'Ajustar' + hint_edit: 'Editar' + hint_confirm: 'Confirmar' + hint_cancel: 'Cancelar' preparing_download: 'Preparando download...' download_passage_title: ' Baixando Fonte de Passagem ' download_code_title: ' Baixando Fonte de Código ' diff --git a/locales/ro.yml b/locales/ro.yml index 868c462..79292ea 100644 --- a/locales/ro.yml +++ b/locales/ro.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Configureaza keydr' day_streak: ' | %{days} zile consecutive' key_progress: ' Progres taste %{unlocked}/%{total} (%{mastered} stapanite) | Tinta %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Arbore' - hint_keyboard: '[b] Tastatura' - hint_stats: '[s] Statistici' - hint_settings: '[c] Setari' - hint_quit: '[q] Iesire' + hint_start: 'Start' + hint_skill_tree: 'Arbore' + hint_keyboard: 'Tastatura' + hint_stats: 'Statistici' + hint_settings: 'Setari' + hint_quit: 'Iesire' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Sursa text ' footer: '[ESC] Termina exercitiu [Backspace] Sterge' keys_reenabled: 'Taste reactivate in %{ms}ms' - hint_end: '[ESC] Termina exercitiu' - hint_backspace: '[Backspace] Sterge' + hint_end: 'Termina exercitiu' + hint_backspace: 'Sterge' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} corecte)' input_blocked: ' Intrare blocata temporar ' input_blocked_ms: '(%{ms}ms ramas)' - hint_continue: '[c/Enter/Space] Continua' - hint_retry: '[r] Reia' - hint_menu: '[q] Meniu' - hint_stats: '[s] Statistici' - hint_delete: '[x] Sterge' + hint_continue: 'Continua' + hint_retry: 'Reia' + hint_menu: 'Meniu' + hint_stats: 'Statistici' + hint_delete: 'Sterge' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Precizie' tab_timing: '[5] Cronometraj' tab_ngrams: '[6] N-grame' - hint_back: '[ESC] Inapoi' - hint_next_tab: '[Tab] Tab urmator' - hint_switch_tab: '[1-6] Schimba tab' - hint_navigate: '[j/k] Navigheaza' - hint_page: '[PgUp/PgDn] Pagina' - hint_delete: '[x] Sterge' + hint_back: 'Inapoi' + hint_next_tab: 'Tab urmator' + hint_switch_tab: 'Schimba tab' + hint_navigate: 'Navigheaza' + hint_page: 'Pagina' + hint_delete: 'Sterge' summary_title: ' Sumar ' drills: ' Exercitii: ' avg_wpm: ' Med WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Cale import' import_data: 'Importa date' import_now: 'Importa acum' - hint_save_back: '[ESC] Salveaza si inapoi' - hint_change_value: '[Enter/sageti] Schimba valoarea' - hint_edit_path: '[Enter pe cale] Editeaza' - hint_move: '[←→] Muta' - hint_tab_complete: '[Tab] Completeaza (la sfarsit)' - hint_confirm: '[Enter] Confirma' - hint_cancel: '[Esc] Anuleaza' + hint_save_back: 'Salveaza si inapoi' + hint_change_value: 'Schimba valoarea' + hint_edit_path: 'Editeaza' + hint_move: 'Muta' + hint_tab_complete: 'Completeaza (la sfarsit)' + hint_confirm: 'Confirma' + hint_cancel: 'Anuleaza' success_title: ' Succes ' error_title: ' Eroare ' press_any_key: 'Apasa orice tasta' @@ -236,9 +236,9 @@ select: cached: ' (in cache)' disabled_download: ' (dezactivat: descarcare necesara)' download_required: ' (descarcare necesara)' - hint_navigate: '[Sus/Jos/PgUp/PgDn] Navigheaza' - hint_confirm: '[Enter] Confirma' - hint_back: '[ESC] Inapoi' + hint_navigate: 'Navigheaza' + hint_confirm: 'Confirma' + hint_back: 'Inapoi' language_resets_layout: 'Selectarea unei limbi reseteaza aranjamentul la implicit pentru acea limba.' layout_no_language_change: 'Schimbarea aranjamentului nu schimba limba dictionarului.' disabled_network_notice: 'Unele limbi sunt dezactivate: activeaza descarcarile de retea in setari.' @@ -267,11 +267,11 @@ skill_tree: level: 'Nivel %{current}/%{total}' level_zero: 'Nivel 0/%{total}' in_focus: ' in focus' - hint_navigate: '[↑↓/jk] Navigheaza' - hint_scroll: '[PgUp/PgDn sau Ctrl+U/Ctrl+D] Deruleaza' - hint_back: '[q] Inapoi' - hint_unlock: '[Enter] Deblocheaza' - hint_start_drill: '[Enter] Incepe exercitiu' + hint_navigate: 'Navigheaza' + hint_scroll: 'Deruleaza' + hint_back: 'Inapoi' + hint_unlock: 'Deblocheaza' + hint_start_drill: 'Incepe exercitiu' unlock_msg_1: 'Dupa deblocare, exercitiul adaptiv implicit va include taste din aceasta ramura.' unlock_msg_2: 'Daca vrei sa te concentrezi doar pe aceasta ramura, lanseaza un exercitiu direct din arbore.' confirm_unlock: 'Deblocheaza %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Fiecare tasta de pe tastatura este la incredere maxima.' mastery_takes_practice: 'Stapanirea nu este o destinatie — necesita practica continua.' keep_drilling: 'Continua sa exersezi pentru a-ti mentine nivelul.' - hint_skill_tree_continue: '[t] Deschide arborele [Alta tasta] Continua' + hint_skill_tree_continue: 'Deschide arborele [Alta tasta] Continua' hint_any_key: 'Apasa orice tasta pentru a continua' input_blocked: 'Intrare blocata temporar (%{ms}ms ramas)' unlock_msg_1: 'Bine lucrat! Continua sa-ti dezvolti abilitatile.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Memorie musculara fixata!' mastery_msg_4: 'Inca o tasta cucerita!' +# Suprapunere introducere exercitiu adaptiv +adaptive_intro: + title: ' Bine ai venit la exercitiul adaptiv! ' + how_it_works: 'Cum functioneaza exercitiile adaptive:' + desc_start: 'Incepi cu un set mic de litere comune deblocate.' + desc_progress: 'Pe masura ce le tastezi cu incredere, taste noi sunt deblocate treptat' + desc_expand: 'pana cand stapanesti tastatura completa.' + target_wpm_label: 'WPM tinta:' + target_wpm_desc: 'Aceasta afecteaza viteza de deblocare a tastelor — tinte mai mari necesita' + target_wpm_default: 'tastare mai rapida. 35 WPM este un punct bun de start daca nu esti sigur.' + hint: '[←→] Ajusteaza WPM [Enter/Space] Incepe exercitiul' + # Keyboard explorer keyboard: title: ' Tastatura ' subtitle: 'Apasa orice tasta sau click pe o tasta' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigheaza' - hint_back: '[q/ESC] Inapoi' + hint_navigate: 'Navigheaza' + hint_back: 'Inapoi' key_label: 'Tasta: ' finger_label: 'Deget: ' hand_left: 'Stang' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Incepe exercitiu de text' start_code_drill: 'Incepe exercitiu de cod' confirm: 'Confirma' - hint_navigate: '[Sus/Jos] Navigheaza' - hint_adjust: '[Stanga/Dreapta] Ajusteaza' - hint_edit: '[Tasteaza/Backspace] Editeaza' - hint_confirm: '[Enter] Confirma' - hint_cancel: '[ESC] Anuleaza' + hint_navigate: 'Navigheaza' + hint_adjust: 'Ajusteaza' + hint_edit: 'Editeaza' + hint_confirm: 'Confirma' + hint_cancel: 'Anuleaza' preparing_download: 'Se pregateste descarcarea...' download_passage_title: ' Se descarca sursa textului ' download_code_title: ' Se descarca sursa codului ' diff --git a/locales/sl.yml b/locales/sl.yml index 28e9bba..1ca9121 100644 --- a/locales/sl.yml +++ b/locales/sl.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Nastavite keydr' day_streak: ' | %{days} dni zapored' key_progress: ' Napredek tipk %{unlocked}/%{total} (%{mastered} osvojenih) | Cilj %{target} WPM%{streak}' - hint_start: '[1-3] Začni' - hint_skill_tree: '[t] Drevo veščin' - hint_keyboard: '[b] Tipkovnica' - hint_stats: '[s] Statistika' - hint_settings: '[c] Nastavitve' - hint_quit: '[q] Izhod' + hint_start: 'Začni' + hint_skill_tree: 'Drevo veščin' + hint_keyboard: 'Tipkovnica' + hint_stats: 'Statistika' + hint_settings: 'Nastavitve' + hint_quit: 'Izhod' # Zaslon vaje drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Vir odlomka ' footer: '[ESC] Končaj vajo [Backspace] Izbriši' keys_reenabled: 'Tipke ponovno omogočene čez %{ms}ms' - hint_end: '[ESC] Končaj vajo' - hint_backspace: '[Backspace] Izbriši' + hint_end: 'Končaj vajo' + hint_backspace: 'Izbriši' # Nadzorna plošča / rezultat vaje dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} pravilnih)' input_blocked: ' Vnos začasno blokiran ' input_blocked_ms: '(še %{ms}ms)' - hint_continue: '[c/Enter/Space] Nadaljuj' - hint_retry: '[r] Ponovi' - hint_menu: '[q] Meni' - hint_stats: '[s] Statistika' - hint_delete: '[x] Izbriši' + hint_continue: 'Nadaljuj' + hint_retry: 'Ponovi' + hint_menu: 'Meni' + hint_stats: 'Statistika' + hint_delete: 'Izbriši' # Stranska vrstica statistike (med vajo) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Točnost' tab_timing: '[5] Časi' tab_ngrams: '[6] N-grami' - hint_back: '[ESC] Nazaj' - hint_next_tab: '[Tab] Naslednji zavihek' - hint_switch_tab: '[1-6] Preklopi zavihek' - hint_navigate: '[j/k] Navigacija' - hint_page: '[PgUp/PgDn] Stran' - hint_delete: '[x] Izbriši' + hint_back: 'Nazaj' + hint_next_tab: 'Naslednji zavihek' + hint_switch_tab: 'Preklopi zavihek' + hint_navigate: 'Navigacija' + hint_page: 'Stran' + hint_delete: 'Izbriši' summary_title: ' Povzetek ' drills: ' Vaje: ' avg_wpm: ' Povpr WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Pot uvoza' import_data: 'Uvozi podatke' import_now: 'Uvozi zdaj' - hint_save_back: '[ESC] Shrani in nazaj' - hint_change_value: '[Enter/puščice] Spremeni vrednost' - hint_edit_path: '[Enter na poti] Uredi' - hint_move: '[←→] Premik' - hint_tab_complete: '[Tab] Dopolni (na koncu)' - hint_confirm: '[Enter] Potrdi' - hint_cancel: '[Esc] Prekliči' + hint_save_back: 'Shrani in nazaj' + hint_change_value: 'Spremeni vrednost' + hint_edit_path: 'Uredi' + hint_move: 'Premik' + hint_tab_complete: 'Dopolni (na koncu)' + hint_confirm: 'Potrdi' + hint_cancel: 'Prekliči' success_title: ' Uspeh ' error_title: ' Napaka ' press_any_key: 'Pritisnite katerokoli tipko' @@ -236,9 +236,9 @@ select: cached: ' (predpomnjeno)' disabled_download: ' (onemogočeno: potreben prenos)' download_required: ' (potreben prenos)' - hint_navigate: '[Gor/Dol/PgUp/PgDn] Navigacija' - hint_confirm: '[Enter] Potrdi' - hint_back: '[ESC] Nazaj' + hint_navigate: 'Navigacija' + hint_confirm: 'Potrdi' + hint_back: 'Nazaj' language_resets_layout: 'Izbira jezika ponastavi razporeditev tipkovnice na privzeto za ta jezik.' layout_no_language_change: 'Sprememba razporeditve ne spremeni jezika slovarja.' disabled_network_notice: 'Nekateri jeziki so onemogočeni: omogočite omrežne prenose v uvodu/nastavitvah.' @@ -267,11 +267,11 @@ skill_tree: level: 'Raven %{current}/%{total}' level_zero: 'Raven 0/%{total}' in_focus: ' v fokusu' - hint_navigate: '[↑↓/jk] Navigacija' - hint_scroll: '[PgUp/PgDn ali Ctrl+U/Ctrl+D] Pomik' - hint_back: '[q] Nazaj' - hint_unlock: '[Enter] Odkleni' - hint_start_drill: '[Enter] Začni vajo' + hint_navigate: 'Navigacija' + hint_scroll: 'Pomik' + hint_back: 'Nazaj' + hint_unlock: 'Odkleni' + hint_start_drill: 'Začni vajo' unlock_msg_1: 'Ko je odklenjena, bo privzeta prilagodljiva vaja vključevala tipke iz te veje.' unlock_msg_2: 'Če se želite osredotočiti le na to vejo, zaženite vajo neposredno iz drevesa veščin.' confirm_unlock: 'Odkleniti %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Vsaka tipka na tipkovnici je na maksimalnem zaupanju.' mastery_takes_practice: 'Osvojitev ni cilj — zahteva stalno vadbo.' keep_drilling: 'Nadaljujte z vajami, da ohranite prednost.' - hint_skill_tree_continue: '[t] Odpri drevo veščin [Katerakoli tipka] Nadaljuj' + hint_skill_tree_continue: 'Odpri drevo veščin [Katerakoli tipka] Nadaljuj' hint_any_key: 'Pritisnite katerokoli tipko za nadaljevanje' input_blocked: 'Vnos začasno blokiran (še %{ms}ms)' unlock_msg_1: 'Odlično! Nadaljujte z gradenjem veščin tipkanja.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Mišični spomin zaklenjen!' mastery_msg_4: 'Še ena tipka osvojena!' +# Uvodni prekrivnik prilagodljive vaje +adaptive_intro: + title: ' Dobrodošli v prilagodljivi vaji! ' + how_it_works: 'Kako delujejo prilagodljive vaje:' + desc_start: 'Začnete z majhnim naborom najpogostejših odkljenjenih črk.' + desc_progress: 'Ko jih tipkate samozavestno, se nove tipke postopoma' + desc_expand: 'odklenejo, dokler ne obvladate celotne tipkovnice.' + target_wpm_label: 'Ciljni WPM:' + target_wpm_desc: 'To vpliva na hitrost odklepanja tipk — višji cilji zahtevajo' + target_wpm_default: 'hitrejše tipkanje. 35 WPM je dobro izhodišče, če niste prepričani.' + hint: '[←→] Prilagodi WPM [Enter/Space] Začni vajo' + # Raziskovalec tipkovnice keyboard: title: ' Tipkovnica ' subtitle: 'Pritisnite ali kliknite tipko' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' - hint_back: '[q/ESC] Nazaj' + hint_navigate: 'Navigacija' + hint_back: 'Nazaj' key_label: 'Tipka: ' finger_label: 'Prst: ' hand_left: 'Leva' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Začni vajo odlomkov' start_code_drill: 'Začni vajo kode' confirm: 'Potrdi' - hint_navigate: '[Gor/Dol] Navigacija' - hint_adjust: '[Levo/Desno] Prilagodi' - hint_edit: '[Tipkanje/Backspace] Uredi' - hint_confirm: '[Enter] Potrdi' - hint_cancel: '[ESC] Prekliči' + hint_navigate: 'Navigacija' + hint_adjust: 'Prilagodi' + hint_edit: 'Uredi' + hint_confirm: 'Potrdi' + hint_cancel: 'Prekliči' preparing_download: 'Pripravljam prenos...' download_passage_title: ' Prenašanje vira odlomkov ' download_code_title: ' Prenašanje vira kode ' diff --git a/locales/sv.yml b/locales/sv.yml index cf2b26a..81f61c0 100644 --- a/locales/sv.yml +++ b/locales/sv.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'Konfigurera keydr' day_streak: ' | %{days} dagars svit' key_progress: ' Tangentframsteg %{unlocked}/%{total} (%{mastered} behaerskade) | Maal %{target} WPM%{streak}' - hint_start: '[1-3] Start' - hint_skill_tree: '[t] Faerdighetstraed' - hint_keyboard: '[b] Tangentbord' - hint_stats: '[s] Statistik' - hint_settings: '[c] Installningar' - hint_quit: '[q] Avsluta' + hint_start: 'Start' + hint_skill_tree: 'Faerdighetstraed' + hint_keyboard: 'Tangentbord' + hint_stats: 'Statistik' + hint_settings: 'Installningar' + hint_quit: 'Avsluta' # Drill screen drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Textkaella ' footer: '[ESC] Avsluta oevning [Backspace] Radera' keys_reenabled: 'Tangenter aateraktiverade efter %{ms}ms' - hint_end: '[ESC] Avsluta oevning' - hint_backspace: '[Backspace] Radera' + hint_end: 'Avsluta oevning' + hint_backspace: 'Radera' # Dashboard / drill result dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} korrekta)' input_blocked: ' Inmatning tillfalligt blockerad ' input_blocked_ms: '(%{ms}ms aaterstar)' - hint_continue: '[c/Enter/Space] Fortsaett' - hint_retry: '[r] Foersoek igen' - hint_menu: '[q] Meny' - hint_stats: '[s] Statistik' - hint_delete: '[x] Radera' + hint_continue: 'Fortsaett' + hint_retry: 'Foersoek igen' + hint_menu: 'Meny' + hint_stats: 'Statistik' + hint_delete: 'Radera' # Stats sidebar (during drill) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Noggrannhet' tab_timing: '[5] Timing' tab_ngrams: '[6] N-gram' - hint_back: '[ESC] Tillbaka' - hint_next_tab: '[Tab] Naesta flik' - hint_switch_tab: '[1-6] Byt flik' - hint_navigate: '[j/k] Navigera' - hint_page: '[PgUp/PgDn] Sida' - hint_delete: '[x] Radera' + hint_back: 'Tillbaka' + hint_next_tab: 'Naesta flik' + hint_switch_tab: 'Byt flik' + hint_navigate: 'Navigera' + hint_page: 'Sida' + hint_delete: 'Radera' summary_title: ' Sammanfattning ' drills: ' Oevningar: ' avg_wpm: ' Snitt WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'Importsoekvaeg' import_data: 'Importera data' import_now: 'Importera nu' - hint_save_back: '[ESC] Spara & tillbaka' - hint_change_value: '[Enter/pilar] AEndra vaerde' - hint_edit_path: '[Enter paa soekvaeg] Redigera' - hint_move: '[←→] Flytta' - hint_tab_complete: '[Tab] Komplettera (i slutet)' - hint_confirm: '[Enter] Bekraefta' - hint_cancel: '[Esc] Avbryt' + hint_save_back: 'Spara & tillbaka' + hint_change_value: 'AEndra vaerde' + hint_edit_path: 'Redigera' + hint_move: 'Flytta' + hint_tab_complete: 'Komplettera (i slutet)' + hint_confirm: 'Bekraefta' + hint_cancel: 'Avbryt' success_title: ' Lyckades ' error_title: ' Fel ' press_any_key: 'Tryck paa valfri tangent' @@ -236,9 +236,9 @@ select: cached: ' (sparad)' disabled_download: ' (inaktiverad: nedladdning kraevs)' download_required: ' (nedladdning kraevs)' - hint_navigate: '[Upp/Ner/PgUp/PgDn] Navigera' - hint_confirm: '[Enter] Bekraefta' - hint_back: '[ESC] Tillbaka' + hint_navigate: 'Navigera' + hint_confirm: 'Bekraefta' + hint_back: 'Tillbaka' language_resets_layout: 'Spraakval aaterstaeller tangentbordslayouten till spraakens standard.' layout_no_language_change: 'Layoutaendringar aendrar inte ordlistespraaket.' disabled_network_notice: 'Vissa spraak aer inaktiverade: aktivera naetverksnedladdningar i intro/installningar.' @@ -267,11 +267,11 @@ skill_tree: level: 'Nivaa %{current}/%{total}' level_zero: 'Nivaa 0/%{total}' in_focus: ' i fokus' - hint_navigate: '[↑↓/jk] Navigera' - hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Scrolla' - hint_back: '[q] Tillbaka' - hint_unlock: '[Enter] Laas upp' - hint_start_drill: '[Enter] Starta oevning' + hint_navigate: 'Navigera' + hint_scroll: 'Scrolla' + hint_back: 'Tillbaka' + hint_unlock: 'Laas upp' + hint_start_drill: 'Starta oevning' unlock_msg_1: 'Efter upplaasning blandas uplaasta tangenter fraan denna gren in i den adaptiva oevningen.' unlock_msg_2: 'Vill du bara oeva denna gren, starta en oevning direkt fraan denna gren i Faerdighetsgrenen.' confirm_unlock: 'Laas upp %{branch}?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Varje tangent paa tangentbordet har maximalt foertroende.' mastery_takes_practice: 'Behaerskning aer inte en destination — det kraever staendig oevning.' keep_drilling: 'Fortsaett oeva foer att behalla din skaerpa.' - hint_skill_tree_continue: '[t] Faerdighetstraed [Annan tangent] Fortsaett' + hint_skill_tree_continue: 'Faerdighetstraed [Annan tangent] Fortsaett' hint_any_key: 'Tryck paa valfri tangent foer att fortsaetta' input_blocked: 'Inmatning tillfalligt blockerad (%{ms}ms aaterstar)' unlock_msg_1: 'Bra jobbat! Fortsaett bygga dina skrivfaerdigheter.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Muskelminne foerankrat!' mastery_msg_4: 'Annu en tangent eroevrrad!' +# Intro-oeverlagg foer adaptiv oevning +adaptive_intro: + title: ' Vaelkommen till adaptiv oevning! ' + how_it_works: 'Hur adaptiva oevningar fungerar:' + desc_start: 'Du boerjar med en liten uppsaettning av de vanligaste uplaasta bokstaeverna.' + desc_progress: 'Naer du skriver dem med saekerhtet laases nya tangenter gradvis upp' + desc_expand: 'tills du behaerskar hela tangentbordet.' + target_wpm_label: 'Maal-WPM:' + target_wpm_desc: 'Detta paaverkar hur snabbt tangenter laases upp — hoegre maal kraever' + target_wpm_default: 'snabbare skrivande. 35 WPM aer en bra startpunkt om du aer osaeker.' + hint: '[←→] Justera WPM [Enter/Space] Boerja oeva' + # Keyboard explorer keyboard: title: ' Tangentbord ' subtitle: 'Tryck paa en tangent eller klicka paa en tangent' - hint_navigate: '[←→↑↓/hjkl/Tab] Navigera' - hint_back: '[q/ESC] Tillbaka' + hint_navigate: 'Navigera' + hint_back: 'Tillbaka' key_label: 'Tangent: ' finger_label: 'Finger: ' hand_left: 'Vaenster' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Starta textoevning' start_code_drill: 'Starta kodoevning' confirm: 'Bekraefta' - hint_navigate: '[Upp/Ner] Navigera' - hint_adjust: '[Vaenster/Hoeger] Justera' - hint_edit: '[Skriv/Backspace] Redigera' - hint_confirm: '[Enter] Bekraefta' - hint_cancel: '[ESC] Avbryt' + hint_navigate: 'Navigera' + hint_adjust: 'Justera' + hint_edit: 'Redigera' + hint_confirm: 'Bekraefta' + hint_cancel: 'Avbryt' preparing_download: 'Forbereder nedladdning...' download_passage_title: ' Laddar ner textkaella ' download_code_title: ' Laddar ner kodkaella ' diff --git a/locales/tr.yml b/locales/tr.yml index 4c56d04..5fad6dd 100644 --- a/locales/tr.yml +++ b/locales/tr.yml @@ -17,12 +17,12 @@ menu: settings_desc: 'keydr yapılandır' day_streak: ' | %{days} gün seri' key_progress: ' Tuş İlerlemesi %{unlocked}/%{total} (%{mastered} ustalaşmış) | Hedef %{target} WPM%{streak}' - hint_start: '[1-3] Başla' - hint_skill_tree: '[t] Yetenek Ağacı' - hint_keyboard: '[b] Klavye' - hint_stats: '[s] İstatistikler' - hint_settings: '[c] Ayarlar' - hint_quit: '[q] Çıkış' + hint_start: 'Başla' + hint_skill_tree: 'Yetenek Ağacı' + hint_keyboard: 'Klavye' + hint_stats: 'İstatistikler' + hint_settings: 'Ayarlar' + hint_quit: 'Çıkış' # Alıştırma ekranı drill: @@ -40,8 +40,8 @@ drill: passage_source: ' Metin kaynağı ' footer: '[ESC] Alıştırmayı bitir [Backspace] Sil' keys_reenabled: 'Tuşlar %{ms}ms sonra yeniden etkin' - hint_end: '[ESC] Alıştırmayı bitir' - hint_backspace: '[Backspace] Sil' + hint_end: 'Alıştırmayı bitir' + hint_backspace: 'Sil' # Pano / alıştırma sonucu dashboard: @@ -56,11 +56,11 @@ dashboard: correct_detail: ' (%{correct}/%{total} doğru)' input_blocked: ' Giriş geçici olarak engellendi ' input_blocked_ms: '(%{ms}ms kaldı)' - hint_continue: '[c/Enter/Space] Devam' - hint_retry: '[r] Tekrar' - hint_menu: '[q] Menü' - hint_stats: '[s] İstatistikler' - hint_delete: '[x] Sil' + hint_continue: 'Devam' + hint_retry: 'Tekrar' + hint_menu: 'Menü' + hint_stats: 'İstatistikler' + hint_delete: 'Sil' # İstatistik kenar çubuğu (alıştırma sırasında) sidebar: @@ -86,12 +86,12 @@ stats: tab_accuracy: '[4] Doğruluk' tab_timing: '[5] Zamanlama' tab_ngrams: '[6] N-gramlar' - hint_back: '[ESC] Geri' - hint_next_tab: '[Tab] Sonraki sekme' - hint_switch_tab: '[1-6] Sekme değiştir' - hint_navigate: '[j/k] Gezin' - hint_page: '[PgUp/PgDn] Sayfa' - hint_delete: '[x] Sil' + hint_back: 'Geri' + hint_next_tab: 'Sonraki sekme' + hint_switch_tab: 'Sekme değiştir' + hint_navigate: 'Gezin' + hint_page: 'Sayfa' + hint_delete: 'Sil' summary_title: ' Özet ' drills: ' Alıştırmalar: ' avg_wpm: ' Ort WPM: ' @@ -200,13 +200,13 @@ settings: import_path: 'İçe Aktarma Yolu' import_data: 'Veriyi İçe Aktar' import_now: 'Şimdi içe aktar' - hint_save_back: '[ESC] Kaydet ve geri' - hint_change_value: '[Enter/oklar] Değer değiştir' - hint_edit_path: '[Enter yolda] Düzenle' - hint_move: '[←→] Taşı' - hint_tab_complete: '[Tab] Tamamla (sonda)' - hint_confirm: '[Enter] Onayla' - hint_cancel: '[Esc] İptal' + hint_save_back: 'Kaydet ve geri' + hint_change_value: 'Değer değiştir' + hint_edit_path: 'Düzenle' + hint_move: 'Taşı' + hint_tab_complete: 'Tamamla (sonda)' + hint_confirm: 'Onayla' + hint_cancel: 'İptal' success_title: ' Başarılı ' error_title: ' Hata ' press_any_key: 'Herhangi bir tuşa basın' @@ -236,9 +236,9 @@ select: cached: ' (önbelleğe alınmış)' disabled_download: ' (devre dışı: indirme gerekli)' download_required: ' (indirme gerekli)' - hint_navigate: '[Yukarı/Aşağı/PgUp/PgDn] Gezin' - hint_confirm: '[Enter] Onayla' - hint_back: '[ESC] Geri' + hint_navigate: 'Gezin' + hint_confirm: 'Onayla' + hint_back: 'Geri' language_resets_layout: 'Dil seçimi, klavye düzenini o dilin varsayılanına sıfırlar.' layout_no_language_change: 'Düzen değişiklikleri sözlük dilini değiştirmez.' disabled_network_notice: 'Bazı diller devre dışı: giriş/ayarlarda ağ indirmelerini etkinleştirin.' @@ -267,11 +267,11 @@ skill_tree: level: 'Seviye %{current}/%{total}' level_zero: 'Seviye 0/%{total}' in_focus: ' odakta' - hint_navigate: '[↑↓/jk] Gezin' - hint_scroll: '[PgUp/PgDn veya Ctrl+U/Ctrl+D] Kaydır' - hint_back: '[q] Geri' - hint_unlock: '[Enter] Aç' - hint_start_drill: '[Enter] Alıştırma Başlat' + hint_navigate: 'Gezin' + hint_scroll: 'Kaydır' + hint_back: 'Geri' + hint_unlock: 'Aç' + hint_start_drill: 'Alıştırma Başlat' unlock_msg_1: 'Açıldıktan sonra varsayılan uyarlanır alıştırma bu dalın açılmış tuşlarını karıştıracak.' unlock_msg_2: 'Yalnızca bu dala odaklanmak istiyorsanız Yetenek Ağacından doğrudan alıştırma başlatın.' confirm_unlock: '%{branch} açılsın mı?' @@ -328,7 +328,7 @@ milestones: all_mastered_desc: 'Klavyedeki her tuş maksimum güven seviyesinde.' mastery_takes_practice: 'Ustalık bir varış noktası değil — sürekli alıştırma gerektirir.' keep_drilling: 'Avantajınızı korumak için alıştırmaya devam edin.' - hint_skill_tree_continue: '[t] Yetenek Ağacını Aç [Herhangi bir tuş] Devam' + hint_skill_tree_continue: 'Yetenek Ağacını Aç [Herhangi bir tuş] Devam' hint_any_key: 'Devam etmek için herhangi bir tuşa basın' input_blocked: 'Giriş geçici olarak engellendi (%{ms}ms kaldı)' unlock_msg_1: 'Harika! Yazma becerilerinizi geliştirmeye devam edin.' @@ -340,12 +340,24 @@ milestones: mastery_msg_3: 'Kas hafızası kilitlendi!' mastery_msg_4: 'Bir tuş daha fethedildi!' +# Uyarlanır alıştırma giriş katmanı +adaptive_intro: + title: ' Uyarlanır Alıştırmaya Hoş Geldiniz! ' + how_it_works: 'Uyarlanır alıştırmalar nasıl çalışır:' + desc_start: 'En yaygın harflerin küçük bir kümesiyle başlarsınız.' + desc_progress: 'Onları güvenle yazdıkça, yeni tuşlar kademeli olarak' + desc_expand: 'tam klavyeye hakim olana kadar açılır.' + target_wpm_label: 'Hedef WPM:' + target_wpm_desc: 'Bu, tuşların ne kadar hızlı açılacağını etkiler — daha yüksek hedefler gerektirir' + target_wpm_default: 'daha hızlı yazma. Emin değilseniz 35 WPM iyi bir başlangıç noktasıdır.' + hint: '[←→] WPM Ayarla [Enter/Space] Alıştırmaya başla' + # Klavye gezgini keyboard: title: ' Klavye ' subtitle: 'Bir tuşa basın veya tıklayın' - hint_navigate: '[←→↑↓/hjkl/Tab] Gezin' - hint_back: '[q/ESC] Geri' + hint_navigate: 'Gezin' + hint_back: 'Geri' key_label: 'Tuş: ' finger_label: 'Parmak: ' hand_left: 'Sol' @@ -397,11 +409,11 @@ intro: start_passage_drill: 'Metin alıştırmasını başlat' start_code_drill: 'Kod alıştırmasını başlat' confirm: 'Onayla' - hint_navigate: '[Yukarı/Aşağı] Gezin' - hint_adjust: '[Sol/Sağ] Ayarla' - hint_edit: '[Yazma/Backspace] Düzenle' - hint_confirm: '[Enter] Onayla' - hint_cancel: '[ESC] İptal' + hint_navigate: 'Gezin' + hint_adjust: 'Ayarla' + hint_edit: 'Düzenle' + hint_confirm: 'Onayla' + hint_cancel: 'İptal' preparing_download: 'İndirme hazırlanıyor...' download_passage_title: ' Metin Kaynağı İndiriliyor ' download_code_title: ' Kod Kaynağı İndiriliyor ' diff --git a/src/app.rs b/src/app.rs index 1130231..54f5f89 100644 --- a/src/app.rs +++ b/src/app.rs @@ -372,6 +372,7 @@ pub struct App { pub caps_lock: bool, pub keyboard_model: KeyboardModel, pub milestone_queue: VecDeque, + pub show_adaptive_intro: bool, pub settings_confirm_import: bool, pub settings_export_conflict: bool, pub settings_status_message: Option, @@ -577,6 +578,7 @@ impl App { caps_lock: false, keyboard_model, milestone_queue: VecDeque::new(), + show_adaptive_intro: false, settings_confirm_import: false, settings_export_conflict: false, settings_status_message: None, @@ -3036,6 +3038,7 @@ impl App { caps_lock: false, keyboard_model, milestone_queue: VecDeque::new(), + show_adaptive_intro: false, settings_confirm_import: false, settings_export_conflict: false, settings_status_message: None, diff --git a/src/config.rs b/src/config.rs index ce9b9ce..71df719 100644 --- a/src/config.rs +++ b/src/config.rs @@ -44,11 +44,16 @@ pub struct Config { pub code_onboarding_done: bool, #[serde(default = "default_ui_language")] pub ui_language: String, + #[serde(default = "default_adaptive_intro_done")] + pub adaptive_intro_done: bool, } fn default_target_wpm() -> u32 { 35 } +fn default_adaptive_intro_done() -> bool { + false +} fn default_theme() -> String { "terminal-default".to_string() } @@ -124,6 +129,7 @@ impl Default for Config { code_snippets_per_repo: default_code_snippets_per_repo(), code_onboarding_done: default_code_onboarding_done(), ui_language: default_ui_language(), + adaptive_intro_done: default_adaptive_intro_done(), } } } diff --git a/src/main.rs b/src/main.rs index ce30a19..23fca89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -323,6 +323,29 @@ fn handle_key(app: &mut App, key: KeyEvent) { return; } + // Adaptive intro overlay intercepts input before milestone handling. + if app.show_adaptive_intro { + match key.code { + KeyCode::Left => { + app.config.target_wpm = app.config.target_wpm.saturating_sub(5).max(10); + app.key_stats.target_cpm = app.config.target_cpm(); + app.ranked_key_stats.target_cpm = app.config.target_cpm(); + } + KeyCode::Right => { + app.config.target_wpm = (app.config.target_wpm + 5).min(200); + app.key_stats.target_cpm = app.config.target_cpm(); + app.ranked_key_stats.target_cpm = app.config.target_cpm(); + } + _ => { + app.show_adaptive_intro = false; + app.config.adaptive_intro_done = true; + let _ = app.config.save(); + app.start_global_adaptive_drill(); + } + } + return; + } + // Milestone overlays are modal: one key action applies and is consumed. if let Some(milestone) = app.milestone_queue.front() { let open_skill_tree = milestone_supports_skill_tree_shortcut(milestone) @@ -495,9 +518,9 @@ fn milestone_footer_hint_token_at( let inner = Block::bordered().inner(overlay_area); let footer_y = inner.y + inner.height.saturating_sub(1); let footer_area = Rect::new(inner.x, footer_y, inner.width, 1); - let hint_skill_tree = t!("milestones.hint_skill_tree_continue"); + let hint_skill_tree = ui::hint::hint(ui::hint::K_T, t!("milestones.hint_skill_tree_continue").as_ref()); let hint_any_key = t!("milestones.hint_any_key"); - let hints: Vec<&str> = vec![hint_skill_tree.as_ref(), hint_any_key.as_ref()]; + let hints: Vec<&str> = vec![hint_skill_tree.as_str(), hint_any_key.as_ref()]; hint_token_at( footer_area, &hints, @@ -556,7 +579,11 @@ fn handle_mouse(app: &mut App, mouse: MouseEvent) { fn activate_menu_selected(app: &mut App) { match app.menu.selected { 0 => { - app.start_global_adaptive_drill(); + if !app.config.adaptive_intro_done { + app.show_adaptive_intro = true; + } else { + app.start_global_adaptive_drill(); + } } 1 => { if app.config.code_onboarding_done { @@ -587,19 +614,19 @@ fn handle_menu_mouse(app: &mut App, mouse: MouseEvent) { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { let is_secondary = matches!(mouse.kind, MouseEventKind::Down(MouseButton::Right)); let area = terminal_area(); - let mh_start = t!("menu.hint_start"); - let mh_tree = t!("menu.hint_skill_tree"); - let mh_kbd = t!("menu.hint_keyboard"); - let mh_stats = t!("menu.hint_stats"); - let mh_settings = t!("menu.hint_settings"); - let mh_quit = t!("menu.hint_quit"); + let mh_start = ui::hint::hint(ui::hint::K_1_3, t!("menu.hint_start").as_ref()); + let mh_tree = ui::hint::hint(ui::hint::K_T, t!("menu.hint_skill_tree").as_ref()); + let mh_kbd = ui::hint::hint(ui::hint::K_B, t!("menu.hint_keyboard").as_ref()); + let mh_stats = ui::hint::hint(ui::hint::K_S, t!("menu.hint_stats").as_ref()); + let mh_settings = ui::hint::hint(ui::hint::K_C, t!("menu.hint_settings").as_ref()); + let mh_quit = ui::hint::hint(ui::hint::K_Q, t!("menu.hint_quit").as_ref()); let menu_hints: Vec<&str> = vec![ - mh_start.as_ref(), - mh_tree.as_ref(), - mh_kbd.as_ref(), - mh_stats.as_ref(), - mh_settings.as_ref(), - mh_quit.as_ref(), + mh_start.as_str(), + mh_tree.as_str(), + mh_kbd.as_str(), + mh_stats.as_str(), + mh_settings.as_str(), + mh_quit.as_str(), ]; let footer_line_count = pack_hint_lines(&menu_hints, area.width as usize) .len() @@ -677,9 +704,9 @@ fn handle_drill_mouse(app: &mut App, mouse: MouseEvent) { } let layout = AppLayout::new(terminal_area()); if point_in_rect(mouse.column, mouse.row, layout.footer) { - let hint_end = t!("drill.hint_end"); - let hint_bs = t!("drill.hint_backspace"); - let hints: Vec<&str> = vec![hint_end.as_ref(), hint_bs.as_ref()]; + let hint_end = ui::hint::hint(ui::hint::K_ESC, t!("drill.hint_end").as_ref()); + let hint_bs = ui::hint::hint(ui::hint::K_BACKSPACE, t!("drill.hint_backspace").as_ref()); + let hints: Vec<&str> = vec![hint_end.as_str(), hint_bs.as_str()]; if let Some(token) = hint_token_at(layout.footer, &hints, mouse.column, mouse.row) { match token.as_str() { "ESC" => { @@ -739,17 +766,17 @@ fn handle_result_mouse(app: &mut App, mouse: MouseEvent) { let area = terminal_area(); let centered = ui::layout::centered_rect(60, 70, area); let inner = Block::bordered().inner(centered); - let h_cont = t!("dashboard.hint_continue"); - let h_retry = t!("dashboard.hint_retry"); - let h_menu = t!("dashboard.hint_menu"); - let h_stats = t!("dashboard.hint_stats"); - let h_del = t!("dashboard.hint_delete"); + let h_cont = ui::hint::hint(ui::hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref()); + let h_retry = ui::hint::hint(ui::hint::K_R, t!("dashboard.hint_retry").as_ref()); + let h_menu = ui::hint::hint(ui::hint::K_Q, t!("dashboard.hint_menu").as_ref()); + let h_stats = ui::hint::hint(ui::hint::K_S, t!("dashboard.hint_stats").as_ref()); + let h_del = ui::hint::hint(ui::hint::K_X, t!("dashboard.hint_delete").as_ref()); let hints: Vec<&str> = vec![ - h_cont.as_ref(), - h_retry.as_ref(), - h_menu.as_ref(), - h_stats.as_ref(), - h_del.as_ref(), + h_cont.as_str(), + h_retry.as_str(), + h_menu.as_str(), + h_stats.as_str(), + h_del.as_str(), ]; let footer_line_count = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16; let footer_y = inner @@ -852,23 +879,23 @@ fn handle_stats_mouse(app: &mut App, mouse: MouseEvent) { let inner = Block::bordered().inner(area); let width = inner.width as usize; let tab_line_count = wrapped_stats_tab_line_count(width) as u16; - let sh_back = t!("stats.hint_back"); - let sh_next = t!("stats.hint_next_tab"); - let sh_switch = t!("stats.hint_switch_tab"); - let sh_nav = t!("stats.hint_navigate"); - let sh_page = t!("stats.hint_page"); - let sh_del = t!("stats.hint_delete"); + let sh_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("stats.hint_back").as_ref()); + let sh_next = ui::hint::hint(ui::hint::K_TAB, t!("stats.hint_next_tab").as_ref()); + let sh_switch = ui::hint::hint(ui::hint::K_1_6, t!("stats.hint_switch_tab").as_ref()); + let sh_nav = ui::hint::hint(ui::hint::K_J_K, t!("stats.hint_navigate").as_ref()); + let sh_page = ui::hint::hint(ui::hint::K_PGUP_PGDN, t!("stats.hint_page").as_ref()); + let sh_del = ui::hint::hint(ui::hint::K_X, t!("stats.hint_delete").as_ref()); let footer_hints: Vec<&str> = if app.stats_tab == 1 { vec![ - sh_back.as_ref(), - sh_next.as_ref(), - sh_switch.as_ref(), - sh_nav.as_ref(), - sh_page.as_ref(), - sh_del.as_ref(), + sh_back.as_str(), + sh_next.as_str(), + sh_switch.as_str(), + sh_nav.as_str(), + sh_page.as_str(), + sh_del.as_str(), ] } else { - vec![sh_back.as_ref(), sh_next.as_ref(), sh_switch.as_ref()] + vec![sh_back.as_str(), sh_next.as_str(), sh_switch.as_str()] }; let footer_line_count = pack_hint_lines(&footer_hints, width).len().max(1) as u16; let layout = Layout::default() @@ -885,7 +912,7 @@ fn handle_stats_mouse(app: &mut App, mouse: MouseEvent) { let is_secondary = matches!(mouse.kind, MouseEventKind::Down(MouseButton::Right)); if let Some(token) = hint_token_at(layout[2], &footer_hints, mouse.column, mouse.row) { match token.as_str() { - "ESC" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), "Tab" => { app.stats_tab = if is_secondary { if app.stats_tab == 0 { @@ -1181,13 +1208,13 @@ fn handle_settings_mouse(app: &mut App, mouse: MouseEvent) { let inner = Block::bordered().inner(centered); let fields = settings_fields(app); let header_height = if inner.height > 0 { 1 } else { 0 }; - let sfh_save = t!("settings.hint_save_back"); - let sfh_change = t!("settings.hint_change_value"); - let sfh_edit = t!("settings.hint_edit_path"); + let sfh_save = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_save_back").as_ref()); + let sfh_change = ui::hint::hint(ui::hint::K_ENTER_ARROWS, t!("settings.hint_change_value").as_ref()); + let sfh_edit = ui::hint::hint(ui::hint::K_ENTER_ON_PATH, t!("settings.hint_edit_path").as_ref()); let footer_hints: Vec<&str> = vec![ - sfh_save.as_ref(), - sfh_change.as_ref(), - sfh_edit.as_ref(), + sfh_save.as_str(), + sfh_change.as_str(), + sfh_edit.as_str(), ]; let footer_height = if inner.height > header_height { pack_hint_lines(&footer_hints, inner.width as usize) @@ -1207,22 +1234,22 @@ fn handle_settings_mouse(app: &mut App, mouse: MouseEvent) { .split(inner); if is_click && layout[2].height > 0 { - let efh_move = t!("settings.hint_move"); - let efh_tab = t!("settings.hint_tab_complete"); - let efh_confirm = t!("settings.hint_confirm"); - let efh_cancel = t!("settings.hint_cancel"); + let efh_move = ui::hint::hint(ui::hint::K_ARROW_LR, t!("settings.hint_move").as_ref()); + let efh_tab = ui::hint::hint(ui::hint::K_TAB, t!("settings.hint_tab_complete").as_ref()); + let efh_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("settings.hint_confirm").as_ref()); + let efh_cancel = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_cancel").as_ref()); let footer_hints: Vec<&str> = if app.settings_editing_path.is_some() { vec![ - efh_move.as_ref(), - efh_tab.as_ref(), - efh_confirm.as_ref(), - efh_cancel.as_ref(), + efh_move.as_str(), + efh_tab.as_str(), + efh_confirm.as_str(), + efh_cancel.as_str(), ] } else { vec![ - sfh_save.as_ref(), - sfh_change.as_ref(), - sfh_edit.as_ref(), + sfh_save.as_str(), + sfh_change.as_str(), + sfh_edit.as_str(), ] }; if let Some(token) = hint_token_at(layout[2], &footer_hints, mouse.column, mouse.row) { @@ -1250,7 +1277,7 @@ fn handle_settings_mouse(app: &mut App, mouse: MouseEvent) { "Enter" => { handle_settings_key(app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)) } - "Esc" => { + "ESC" => { handle_settings_key(app, KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE)) } _ => {} @@ -1657,11 +1684,11 @@ fn is_dictionary_language_disabled(_app: &App, language_key: &str) -> bool { fn dictionary_language_list_area(area: Rect) -> Rect { let centered = ui::layout::centered_rect(60, 70, area); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); let hint_lines = pack_hint_lines( - &[h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()], + &[h_nav.as_str(), h_confirm.as_str(), h_back.as_str()], inner.width as usize, ); let footer_height = (hint_lines.len() as u16).max(1); @@ -1774,10 +1801,10 @@ fn handle_dictionary_language_mouse(app: &mut App, mouse: MouseEvent) { let area = terminal_area(); let centered = ui::layout::centered_rect(60, 70, area); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let footer_h = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16; let chunks = if inner.height > footer_h { Some( @@ -1794,7 +1821,7 @@ fn handle_dictionary_language_mouse(app: &mut App, mouse: MouseEvent) { { match token.as_str() { "Enter" => confirm_dictionary_language_selection(app), - "ESC" => { + "q/ESC" => { app.go_to_settings(); app.settings_selected = SettingItem::DictionaryLanguage.index(); } @@ -1899,11 +1926,11 @@ fn is_keyboard_layout_disabled(layout_key: &str) -> bool { fn keyboard_layout_list_area(area: Rect) -> Rect { let centered = ui::layout::centered_rect(60, 70, area); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); let hint_lines = pack_hint_lines( - &[h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()], + &[h_nav.as_str(), h_confirm.as_str(), h_back.as_str()], inner.width as usize, ); let footer_height = (hint_lines.len() as u16).max(1); @@ -2003,10 +2030,10 @@ fn handle_keyboard_layout_mouse(app: &mut App, mouse: MouseEvent) { let area = terminal_area(); let centered = ui::layout::centered_rect(60, 70, area); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let footer_h = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16; let chunks = if inner.height > footer_h { Some( @@ -2023,7 +2050,7 @@ fn handle_keyboard_layout_mouse(app: &mut App, mouse: MouseEvent) { { match token.as_str() { "Enter" => confirm_keyboard_layout_selection(app), - "ESC" => { + "q/ESC" => { app.go_to_settings(); app.settings_selected = SettingItem::KeyboardLayout.index(); } @@ -2118,11 +2145,11 @@ fn code_language_list_area(app: &App, area: Rect) -> Rect { let inner = Block::bordered().inner(centered); let options = code_language_options(); let width = inner.width as usize; - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); let hint_lines = pack_hint_lines( - &[h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()], + &[h_nav.as_str(), h_confirm.as_str(), h_back.as_str()], width, ); let disabled_notice_t = t!("select.disabled_network_notice"); @@ -2165,10 +2192,10 @@ fn handle_code_language_mouse(app: &mut App, mouse: MouseEvent) { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { let centered = ui::layout::centered_rect(50, 70, terminal_area()); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let hint_lines = pack_hint_lines(&hints, inner.width as usize); let disabled_notice_t = t!("select.disabled_network_notice"); let disabled_notice = disabled_notice_t.as_ref(); @@ -2205,7 +2232,7 @@ fn handle_code_language_mouse(app: &mut App, mouse: MouseEvent) { KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), ); } - "ESC" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), _ => {} } return; @@ -2310,11 +2337,11 @@ fn passage_book_list_area(app: &App, area: Rect) -> Rect { let inner = Block::bordered().inner(centered); let options = passage_options(); let width = inner.width as usize; - let h_nav_t = t!("select.hint_navigate"); - let h_confirm_t = t!("select.hint_confirm"); - let h_back_t = t!("select.hint_back"); + let h_nav_t = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref()); + let h_confirm_t = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back_t = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); let hint_lines = pack_hint_lines( - &[h_nav_t.as_ref(), h_confirm_t.as_ref(), h_back_t.as_ref()], + &[h_nav_t.as_str(), h_confirm_t.as_str(), h_back_t.as_str()], width, ); let disabled_notice_t = t!("select.disabled_sources_notice"); @@ -2356,10 +2383,10 @@ fn handle_passage_book_mouse(app: &mut App, mouse: MouseEvent) { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { let centered = ui::layout::centered_rect(60, 70, terminal_area()); let inner = Block::bordered().inner(centered); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let hint_lines = pack_hint_lines(&hints, inner.width as usize); let disabled_notice_t = t!("select.disabled_sources_notice"); let disabled_notice = disabled_notice_t.as_ref(); @@ -2394,7 +2421,7 @@ fn handle_passage_book_mouse(app: &mut App, mouse: MouseEvent) { app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), ), - "ESC" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), _ => {} } return; @@ -2543,13 +2570,13 @@ fn intro_field_at_row(base_y: u16, y: u16) -> Option<(usize, bool)> { fn passage_intro_content_area(area: Rect) -> Rect { let centered = ui::layout::centered_rect(75, 80, area); let inner = Block::bordered().inner(centered); - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); let hint_lines = pack_hint_lines( - &[ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()], + &[ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()], inner.width as usize, ); let footer_height = (hint_lines.len() + 1) as u16; @@ -2578,12 +2605,12 @@ fn handle_passage_intro_mouse(app: &mut App, mouse: MouseEvent) { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { let centered = ui::layout::centered_rect(75, 80, terminal_area()); let inner = Block::bordered().inner(centered); - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); - let hints: Vec<&str> = vec![ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()]; + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); + let hints: Vec<&str> = vec![ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()]; let hint_lines = pack_hint_lines(&hints, inner.width as usize); let footer_height = (hint_lines.len() + 1) as u16; if footer_height > 0 && footer_height < inner.height { @@ -2629,7 +2656,7 @@ fn handle_passage_intro_mouse(app: &mut App, mouse: MouseEvent) { app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), ), - "ESC" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), _ => {} } return; @@ -2758,13 +2785,13 @@ fn handle_code_intro_key(app: &mut App, key: KeyEvent) { fn code_intro_content_area(area: Rect) -> Rect { let centered = ui::layout::centered_rect(75, 80, area); let inner = Block::bordered().inner(centered); - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); let hint_lines = pack_hint_lines( - &[ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()], + &[ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()], inner.width as usize, ); let footer_height = (hint_lines.len() + 1) as u16; @@ -2793,12 +2820,12 @@ fn handle_code_intro_mouse(app: &mut App, mouse: MouseEvent) { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { let centered = ui::layout::centered_rect(75, 80, terminal_area()); let inner = Block::bordered().inner(centered); - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); - let hints: Vec<&str> = vec![ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()]; + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); + let hints: Vec<&str> = vec![ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()]; let hint_lines = pack_hint_lines(&hints, inner.width as usize); let footer_height = (hint_lines.len() + 1) as u16; if footer_height > 0 && footer_height < inner.height { @@ -2842,7 +2869,7 @@ fn handle_code_intro_mouse(app: &mut App, mouse: MouseEvent) { app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), ), - "ESC" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), _ => {} } return; @@ -2978,44 +3005,44 @@ fn skill_tree_interactive_areas(app: &App, area: Rect) -> SkillTreeMouseLayout { let bp = branches .get(selected) .map(|id| app.skill_tree.branch_progress(*id)); - let st_nav = t!("skill_tree.hint_navigate"); - let st_scroll = t!("skill_tree.hint_scroll"); - let st_back = t!("skill_tree.hint_back"); - let st_unlock = t!("skill_tree.hint_unlock"); - let st_drill = t!("skill_tree.hint_start_drill"); + let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref()); + let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref()); + let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref()); + let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref()); + let st_drill = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_start_drill").as_ref()); let (footer_hints, footer_notice): (Vec<&str>, Option) = match bp.map(|b| b.status.clone()) { Some(BranchStatus::Locked) => ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], Some(locked_branch_notice(app)), ), Some(BranchStatus::Available) => ( vec![ - st_unlock.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_unlock.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ), Some(BranchStatus::InProgress) => ( vec![ - st_drill.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_drill.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ), _ => ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ), @@ -3169,49 +3196,49 @@ fn handle_skill_tree_mouse(app: &mut App, mouse: MouseEvent) { .skill_tree_selected .min(branches.len().saturating_sub(1)); let bp = app.skill_tree.branch_progress(branches[selected]); - let st_nav = t!("skill_tree.hint_navigate"); - let st_scroll = t!("skill_tree.hint_scroll"); - let st_back = t!("skill_tree.hint_back"); - let st_unlock = t!("skill_tree.hint_unlock"); - let st_drill = t!("skill_tree.hint_start_drill"); + let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref()); + let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref()); + let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref()); + let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref()); + let st_drill = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_start_drill").as_ref()); let (footer_hints, footer_notice): (Vec<&str>, Option) = if *app.skill_tree.branch_status(branches[selected]) == engine::skill_tree::BranchStatus::Locked { ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], Some(locked_branch_notice(app)), ) } else if bp.status == engine::skill_tree::BranchStatus::Available { ( vec![ - st_unlock.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_unlock.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) } else if bp.status == engine::skill_tree::BranchStatus::InProgress { ( vec![ - st_drill.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_drill.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) } else { ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) @@ -3233,17 +3260,9 @@ fn handle_skill_tree_mouse(app: &mut App, mouse: MouseEvent) { inner.width, footer_height, ); - if let Some(token) = hint_token_at( - footer_area, - &footer_hints - .iter() - .map(|s| s.as_ref()) - .collect::>(), - mouse.column, - mouse.row, - ) { + if let Some(token) = hint_token_at(footer_area, &footer_hints, mouse.column, mouse.row) { match token.as_str() { - "q" => app.go_to_menu(), + "q/ESC" => app.go_to_menu(), "Enter" => { let branch_id = branches[selected]; let status = app.skill_tree.branch_status(branch_id).clone(); @@ -3329,49 +3348,49 @@ fn skill_tree_detail_max_scroll(app: &App) -> usize { .skill_tree_selected .min(branches.len().saturating_sub(1)); let bp = app.skill_tree.branch_progress(branches[selected]); - let st_nav = t!("skill_tree.hint_navigate"); - let st_scroll = t!("skill_tree.hint_scroll"); - let st_back = t!("skill_tree.hint_back"); - let st_unlock = t!("skill_tree.hint_unlock"); - let st_drill = t!("skill_tree.hint_start_drill"); + let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref()); + let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref()); + let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref()); + let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref()); + let st_drill = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_start_drill").as_ref()); let (footer_hints, footer_notice): (Vec<&str>, Option) = if *app.skill_tree.branch_status(branches[selected]) == engine::skill_tree::BranchStatus::Locked { ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], Some(locked_branch_notice(app)), ) } else if bp.status == engine::skill_tree::BranchStatus::Available { ( vec![ - st_unlock.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_unlock.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) } else if bp.status == engine::skill_tree::BranchStatus::InProgress { ( vec![ - st_drill.as_ref(), - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_drill.as_str(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) } else { ( vec![ - st_nav.as_ref(), - st_scroll.as_ref(), - st_back.as_ref(), + st_nav.as_str(), + st_scroll.as_str(), + st_back.as_str(), ], None, ) @@ -3433,6 +3452,12 @@ fn render(frame: &mut ratatui::Frame, app: &App) { let bg = Block::default().style(Style::default().bg(colors.bg())); frame.render_widget(bg, area); + // Adaptive intro overlay for first-time adaptive drill users. + if app.show_adaptive_intro { + render_adaptive_intro_overlay(frame, app); + return; + } + // Milestone overlays are modal and shown before the underlying screen. if let Some(milestone) = app.milestone_queue.front() { render_milestone_overlay(frame, app, milestone); @@ -3463,19 +3488,19 @@ fn render_menu(frame: &mut ratatui::Frame, app: &App) { let area = frame.area(); let colors = &app.theme.colors; - let mh_start = t!("menu.hint_start"); - let mh_tree = t!("menu.hint_skill_tree"); - let mh_kbd = t!("menu.hint_keyboard"); - let mh_stats = t!("menu.hint_stats"); - let mh_settings = t!("menu.hint_settings"); - let mh_quit = t!("menu.hint_quit"); + let mh_start = ui::hint::hint(ui::hint::K_1_3, t!("menu.hint_start").as_ref()); + let mh_tree = ui::hint::hint(ui::hint::K_T, t!("menu.hint_skill_tree").as_ref()); + let mh_kbd = ui::hint::hint(ui::hint::K_B, t!("menu.hint_keyboard").as_ref()); + let mh_stats = ui::hint::hint(ui::hint::K_S, t!("menu.hint_stats").as_ref()); + let mh_settings = ui::hint::hint(ui::hint::K_C, t!("menu.hint_settings").as_ref()); + let mh_quit = ui::hint::hint(ui::hint::K_Q, t!("menu.hint_quit").as_ref()); let menu_hints: Vec<&str> = vec![ - mh_start.as_ref(), - mh_tree.as_ref(), - mh_kbd.as_ref(), - mh_stats.as_ref(), - mh_settings.as_ref(), - mh_quit.as_ref(), + mh_start.as_str(), + mh_tree.as_str(), + mh_kbd.as_str(), + mh_stats.as_str(), + mh_settings.as_str(), + mh_quit.as_str(), ]; let footer_lines_vec = pack_hint_lines(&menu_hints, area.width as usize); let footer_line_count = footer_lines_vec.len().max(1) as u16; @@ -3777,6 +3802,88 @@ fn render_drill(frame: &mut ratatui::Frame, app: &App) { } } +fn render_adaptive_intro_overlay(frame: &mut ratatui::Frame, app: &App) { + let area = frame.area(); + let colors = &app.theme.colors; + + let overlay_height = 20u16.min(area.height.saturating_sub(2)); + let overlay_width = 62u16.min(area.width.saturating_sub(4)); + + let left = area.x + (area.width.saturating_sub(overlay_width)) / 2; + let top = area.y + (area.height.saturating_sub(overlay_height)) / 2; + let overlay_area = Rect::new(left, top, overlay_width, overlay_height); + + frame.render_widget(ratatui::widgets::Clear, overlay_area); + + let title_t = t!("adaptive_intro.title"); + let block = Block::bordered() + .title(title_t.as_ref()) + .border_style(Style::default().fg(colors.accent())) + .style(Style::default().bg(colors.bg())); + let inner = block.inner(overlay_area); + block.render(overlay_area, frame.buffer_mut()); + + let mut lines: Vec = Vec::new(); + + lines.push(Line::from("")); + lines.push(Line::from(Span::styled( + format!(" {}", t!("adaptive_intro.how_it_works")), + Style::default() + .fg(colors.accent()) + .add_modifier(Modifier::BOLD), + ))); + lines.push(Line::from("")); + for text in [ + t!("adaptive_intro.desc_start").to_string(), + t!("adaptive_intro.desc_progress").to_string(), + t!("adaptive_intro.desc_expand").to_string(), + ] { + lines.push(Line::from(Span::styled( + format!(" {text}"), + Style::default().fg(colors.fg()), + ))); + } + lines.push(Line::from("")); + + // Target WPM adjuster + let wpm_label = t!("adaptive_intro.target_wpm_label"); + let wpm_value = format!("\u{2190} {} \u{2192}", app.config.target_wpm); + lines.push(Line::from(vec![ + Span::styled( + format!(" {wpm_label} "), + Style::default().fg(colors.fg()).add_modifier(Modifier::BOLD), + ), + Span::styled( + wpm_value, + Style::default() + .fg(colors.accent()) + .add_modifier(Modifier::BOLD), + ), + ])); + lines.push(Line::from("")); + for text in [ + t!("adaptive_intro.target_wpm_desc").to_string(), + t!("adaptive_intro.target_wpm_default").to_string(), + ] { + lines.push(Line::from(Span::styled( + format!(" {text}"), + Style::default().fg(colors.fg()), + ))); + } + lines.push(Line::from("")); + + // Footer hint + lines.push(Line::from(Span::styled( + format!(" {}", t!("adaptive_intro.hint")), + Style::default().fg(colors.text_pending()), + ))); + + frame.render_widget( + Paragraph::new(lines).wrap(Wrap { trim: false }), + inner, + ); +} + fn render_milestone_overlay( frame: &mut ratatui::Frame, app: &App, @@ -4095,7 +4202,7 @@ fn render_milestone_overlay( let footer_text = if let Some(ms) = app.post_drill_input_lock_remaining_ms() { format!(" {}", t!("milestones.input_blocked", ms = ms)) } else if milestone_supports_skill_tree_shortcut(milestone) { - format!(" {}", t!("milestones.hint_skill_tree_continue")) + format!(" {}", ui::hint::hint(ui::hint::K_T, t!("milestones.hint_skill_tree_continue").as_ref())) } else { format!(" {}", t!("milestones.hint_any_key")) }; @@ -5140,7 +5247,7 @@ mod review_tests { // After editing: shows editing hints let output_during = render_settings_to_string(&app); assert!(output_during.contains("[Enter] Confirm")); - assert!(output_during.contains("[Esc] Cancel")); + assert!(output_during.contains("[ESC] Cancel")); assert!(output_during.contains("[Tab] Complete")); } @@ -5637,19 +5744,19 @@ fn render_settings(frame: &mut ratatui::Frame, app: &App) { .as_ref() .map(|(_, input)| input.completion_error) .unwrap_or(false); - let fh_move = t!("settings.hint_move"); - let fh_tab = t!("settings.hint_tab_complete"); - let fh_confirm = t!("settings.hint_confirm"); - let fh_cancel = t!("settings.hint_cancel"); - let fh_save = t!("settings.hint_save_back"); - let fh_change = t!("settings.hint_change_value"); - let fh_edit = t!("settings.hint_edit_path"); + let fh_move = ui::hint::hint(ui::hint::K_ARROW_LR, t!("settings.hint_move").as_ref()); + let fh_tab = ui::hint::hint(ui::hint::K_TAB, t!("settings.hint_tab_complete").as_ref()); + let fh_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("settings.hint_confirm").as_ref()); + let fh_cancel = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_cancel").as_ref()); + let fh_save = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_save_back").as_ref()); + let fh_change = ui::hint::hint(ui::hint::K_ENTER_ARROWS, t!("settings.hint_change_value").as_ref()); + let fh_edit = ui::hint::hint(ui::hint::K_ENTER_ON_PATH, t!("settings.hint_edit_path").as_ref()); let footer_hints: Vec<&str> = if app.is_editing_path() { let mut hints = vec![ - fh_move.as_ref(), - fh_tab.as_ref(), - fh_confirm.as_ref(), - fh_cancel.as_ref(), + fh_move.as_str(), + fh_tab.as_str(), + fh_confirm.as_str(), + fh_cancel.as_str(), ]; if completion_error { hints.push("(cannot read directory)"); @@ -5657,9 +5764,9 @@ fn render_settings(frame: &mut ratatui::Frame, app: &App) { hints } else { vec![ - fh_save.as_ref(), - fh_change.as_ref(), - fh_edit.as_ref(), + fh_save.as_str(), + fh_change.as_str(), + fh_edit.as_str(), ] }; let footer_packed = pack_hint_lines(&footer_hints, inner.width as usize); @@ -5916,10 +6023,10 @@ fn render_dictionary_language_select(frame: &mut ratatui::Frame, app: &App) { block.render(centered, frame.buffer_mut()); let options = language_packs(); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let footer_hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let footer_hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let support_notice_t = t!("select.language_resets_layout"); let support_notice = support_notice_t.as_ref(); let width = inner.width as usize; @@ -6103,10 +6210,10 @@ fn render_keyboard_layout_select(frame: &mut ratatui::Frame, app: &App) { block.render(centered, frame.buffer_mut()); let options = keyboard::model::KeyboardModel::supported_layout_keys(); - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let footer_hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let footer_hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let support_notice_t = t!("select.layout_no_language_change"); let support_notice = support_notice_t.as_ref(); let width = inner.width as usize; @@ -6233,10 +6340,10 @@ fn render_code_language_select(frame: &mut ratatui::Frame, app: &App) { let options = code_language_options(); let cache_dir = &app.config.code_download_dir; - let h_nav = t!("select.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let footer_hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let footer_hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let disabled_notice_t = t!("select.disabled_sources_notice"); let disabled_notice = disabled_notice_t.as_ref(); let has_disabled = !app.config.code_downloads_enabled @@ -6378,10 +6485,10 @@ fn render_passage_book_select(frame: &mut ratatui::Frame, app: &App) { block.render(centered, frame.buffer_mut()); let options = passage_options(); - let h_nav = t!("intro.hint_navigate"); - let h_confirm = t!("select.hint_confirm"); - let h_back = t!("select.hint_back"); - let footer_hints: Vec<&str> = vec![h_nav.as_ref(), h_confirm.as_ref(), h_back.as_ref()]; + let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref()); + let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref()); + let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref()); + let footer_hints: Vec<&str> = vec![h_nav.as_str(), h_confirm.as_str(), h_back.as_str()]; let disabled_notice_t = t!("select.disabled_sources_notice"); let disabled_notice = disabled_notice_t.as_ref(); let has_disabled = !app.config.passage_downloads_enabled @@ -6612,12 +6719,12 @@ fn render_passage_intro(frame: &mut ratatui::Frame, app: &App) { let hint_lines = if app.passage_intro_downloading { Vec::new() } else { - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); - let hints: Vec<&str> = vec![ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()]; + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); + let hints: Vec<&str> = vec![ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()]; pack_hint_lines( &hints, inner.width as usize, @@ -6848,12 +6955,12 @@ fn render_code_intro(frame: &mut ratatui::Frame, app: &App) { let hint_lines = if app.code_intro_downloading { Vec::new() } else { - let ih_nav = t!("intro.hint_navigate"); - let ih_adj = t!("intro.hint_adjust"); - let ih_edit = t!("intro.hint_edit"); - let ih_confirm = t!("intro.hint_confirm"); - let ih_cancel = t!("intro.hint_cancel"); - let hints: Vec<&str> = vec![ih_nav.as_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_cancel.as_ref()]; + let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref()); + let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref()); + let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref()); + let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref()); + let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref()); + let hints: Vec<&str> = vec![ih_nav.as_str(), ih_adj.as_str(), ih_edit.as_str(), ih_confirm.as_str(), ih_cancel.as_str()]; pack_hint_lines( &hints, inner.width as usize, @@ -7099,8 +7206,8 @@ fn handle_keyboard_explorer_mouse(app: &mut App, mouse: MouseEvent) { Constraint::Length(1), ]) .split(area); - let h_back = t!("keyboard.hint_back"); - let footer_hints: Vec<&str> = vec![h_back.as_ref()]; + let h_back = ui::hint::hint(ui::hint::K_ESC, t!("keyboard.hint_back").as_ref()); + let footer_hints: Vec<&str> = vec![h_back.as_str()]; if hint_token_at(layout[3], &footer_hints, mouse.column, mouse.row).is_some() || point_in_rect(mouse.column, mouse.row, layout[3]) { @@ -7188,9 +7295,9 @@ fn render_keyboard_explorer(frame: &mut ratatui::Frame, app: &App) { render_keyboard_detail_panel(frame, app, layout[2]); // Footer - let kbd_back = t!("keyboard.hint_back"); + let kbd_back = ui::hint::hint(ui::hint::K_ESC, t!("keyboard.hint_back").as_ref()); let footer = Paragraph::new(Line::from(vec![Span::styled( - format!(" {} ", kbd_back.as_ref()), + format!(" {} ", kbd_back.as_str()), Style::default().fg(colors.text_pending()), )])); frame.render_widget(footer, layout[3]); diff --git a/src/ui/components/dashboard.rs b/src/ui/components/dashboard.rs index 61f0fdc..056e58b 100644 --- a/src/ui/components/dashboard.rs +++ b/src/ui/components/dashboard.rs @@ -6,6 +6,7 @@ use ratatui::widgets::{Block, Paragraph, Widget}; use crate::i18n::t; use crate::session::result::DrillResult; +use crate::ui::hint; use crate::ui::layout::pack_hint_lines; use crate::ui::theme::Theme; @@ -44,17 +45,17 @@ impl Widget for Dashboard<'_> { let footer_line_count = if self.input_lock_remaining_ms.is_some() { 1u16 } else { - let hint_continue = t!("dashboard.hint_continue"); - let hint_retry = t!("dashboard.hint_retry"); - let hint_menu = t!("dashboard.hint_menu"); - let hint_stats = t!("dashboard.hint_stats"); - let hint_delete = t!("dashboard.hint_delete"); + let hint_continue = hint::hint(hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref()); + let hint_retry = hint::hint(hint::K_R, t!("dashboard.hint_retry").as_ref()); + let hint_menu = hint::hint(hint::K_Q, t!("dashboard.hint_menu").as_ref()); + let hint_stats = hint::hint(hint::K_S, t!("dashboard.hint_stats").as_ref()); + let hint_delete = hint::hint(hint::K_X, t!("dashboard.hint_delete").as_ref()); let hints = [ - hint_continue.as_ref(), - hint_retry.as_ref(), - hint_menu.as_ref(), - hint_stats.as_ref(), - hint_delete.as_ref(), + hint_continue.as_str(), + hint_retry.as_str(), + hint_menu.as_str(), + hint_stats.as_str(), + hint_delete.as_str(), ]; pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16 }; @@ -167,17 +168,17 @@ impl Widget for Dashboard<'_> { ), ])) } else { - let hint_continue = t!("dashboard.hint_continue"); - let hint_retry = t!("dashboard.hint_retry"); - let hint_menu = t!("dashboard.hint_menu"); - let hint_stats = t!("dashboard.hint_stats"); - let hint_delete = t!("dashboard.hint_delete"); + let hint_continue = hint::hint(hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref()); + let hint_retry = hint::hint(hint::K_R, t!("dashboard.hint_retry").as_ref()); + let hint_menu = hint::hint(hint::K_Q, t!("dashboard.hint_menu").as_ref()); + let hint_stats = hint::hint(hint::K_S, t!("dashboard.hint_stats").as_ref()); + let hint_delete = hint::hint(hint::K_X, t!("dashboard.hint_delete").as_ref()); let hints = [ - hint_continue.as_ref(), - hint_retry.as_ref(), - hint_menu.as_ref(), - hint_stats.as_ref(), - hint_delete.as_ref(), + hint_continue.as_str(), + hint_retry.as_str(), + hint_menu.as_str(), + hint_stats.as_str(), + hint_delete.as_str(), ]; let lines: Vec = pack_hint_lines(&hints, inner.width as usize) .into_iter() diff --git a/src/ui/components/skill_tree.rs b/src/ui/components/skill_tree.rs index 517b4a9..e6bdd10 100644 --- a/src/ui/components/skill_tree.rs +++ b/src/ui/components/skill_tree.rs @@ -9,6 +9,7 @@ use crate::engine::key_stats::KeyStatsStore; use crate::engine::skill_tree::{ BranchId, BranchStatus, DrillScope, SkillTree as SkillTreeEngine, get_branch_definition, }; +use crate::ui::hint; use crate::ui::layout::{pack_hint_lines, wrapped_line_count}; use crate::ui::theme::Theme; @@ -137,11 +138,11 @@ impl Widget for SkillTreeWidget<'_> { // Layout: main split (branch list + detail) and footer (adaptive height) let branches = selectable_branches(); - let h_navigate = t!("skill_tree.hint_navigate").to_string(); - let h_scroll = t!("skill_tree.hint_scroll").to_string(); - let h_back = t!("skill_tree.hint_back").to_string(); - let h_unlock = t!("skill_tree.hint_unlock").to_string(); - let h_start_drill = t!("skill_tree.hint_start_drill").to_string(); + let h_navigate = hint::hint(hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref()); + let h_scroll = hint::hint(hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref()); + let h_back = hint::hint(hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref()); + let h_unlock = hint::hint(hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref()); + let h_start_drill = hint::hint(hint::K_ENTER, t!("skill_tree.hint_start_drill").as_ref()); let (footer_hints, footer_notice): (Vec<&str>, Option) = if self.selected < branches.len() { let bp = self.skill_tree.branch_progress(branches[self.selected]); diff --git a/src/ui/components/stats_dashboard.rs b/src/ui/components/stats_dashboard.rs index 59e3c7c..04cb029 100644 --- a/src/ui/components/stats_dashboard.rs +++ b/src/ui/components/stats_dashboard.rs @@ -13,6 +13,7 @@ use crate::keyboard::model::KeyboardModel; use crate::session::result::DrillResult; use crate::ui::components::activity_heatmap::ActivityHeatmap; use crate::i18n::t; +use crate::ui::hint; use crate::ui::layout::pack_hint_lines; use crate::ui::theme::Theme; @@ -1673,20 +1674,20 @@ const TAB_SEPARATOR: &str = " "; fn footer_hints_default() -> Vec { vec![ - t!("stats.hint_back").to_string(), - t!("stats.hint_next_tab").to_string(), - t!("stats.hint_switch_tab").to_string(), + hint::hint(hint::K_Q_ESC, t!("stats.hint_back").as_ref()), + hint::hint(hint::K_TAB, t!("stats.hint_next_tab").as_ref()), + hint::hint(hint::K_1_6, t!("stats.hint_switch_tab").as_ref()), ] } fn footer_hints_history() -> Vec { vec![ - t!("stats.hint_back").to_string(), - t!("stats.hint_next_tab").to_string(), - t!("stats.hint_switch_tab").to_string(), - t!("stats.hint_navigate").to_string(), - t!("stats.hint_page").to_string(), - t!("stats.hint_delete").to_string(), + hint::hint(hint::K_Q_ESC, t!("stats.hint_back").as_ref()), + hint::hint(hint::K_TAB, t!("stats.hint_next_tab").as_ref()), + hint::hint(hint::K_1_6, t!("stats.hint_switch_tab").as_ref()), + hint::hint(hint::K_J_K, t!("stats.hint_navigate").as_ref()), + hint::hint(hint::K_PGUP_PGDN, t!("stats.hint_page").as_ref()), + hint::hint(hint::K_X, t!("stats.hint_delete").as_ref()), ] } diff --git a/src/ui/hint.rs b/src/ui/hint.rs new file mode 100644 index 0000000..3f61222 --- /dev/null +++ b/src/ui/hint.rs @@ -0,0 +1,74 @@ +//! Key token constants for keyboard hint strings. +//! +//! Key names are not translatable — "ESC" is "ESC" in every language — so they +//! live here as constants rather than embedded in locale YAML. Locale files +//! store only the translated label text (e.g. "Back"). Hints are assembled at +//! render time via [`hint`]. +//! +//! Using the same constant in both the hint builder and the mouse-handler match +//! arm keeps the two in sync: changing a keybinding here updates both what the +//! footer displays and what a mouse click on that hint triggers. + +// ── Navigation / back ───────────────────────────────────────────────────────── + +/// ESC only — screens where `q` is reserved for another action (drill, settings, +/// keyboard explorer). +pub const K_ESC: &str = "ESC"; + +/// `q` or ESC — screens where both keys go back (stats, skill tree, select +/// screens, intro screens). +pub const K_Q_ESC: &str = "q/ESC"; + +/// `q` only — menu quit and drill-result "go to menu" (ESC also works on both, +/// but the hint intentionally shows just `q` to keep it short). +pub const K_Q: &str = "q"; + +// ── Universal keys ──────────────────────────────────────────────────────────── +pub const K_ENTER: &str = "Enter"; +pub const K_TAB: &str = "Tab"; +pub const K_BACKSPACE: &str = "Backspace"; + +// ── Menu ────────────────────────────────────────────────────────────────────── +pub const K_1_3: &str = "1-3"; +pub const K_T: &str = "t"; +pub const K_B: &str = "b"; +pub const K_S: &str = "s"; +pub const K_C: &str = "c"; + +// ── Dashboard / drill result ────────────────────────────────────────────────── +pub const K_C_ENTER_SPACE: &str = "c/Enter/Space"; +pub const K_R: &str = "r"; +pub const K_X: &str = "x"; + +// ── Stats ───────────────────────────────────────────────────────────────────── +pub const K_1_6: &str = "1-6"; +pub const K_J_K: &str = "j/k"; +pub const K_PGUP_PGDN: &str = "PgUp/PgDn"; + +// ── Settings ────────────────────────────────────────────────────────────────── +pub const K_ENTER_ARROWS: &str = "Enter/arrows"; +pub const K_ENTER_ON_PATH: &str = "Enter on path"; +pub const K_ARROW_LR: &str = "←→"; + +// ── Select screens ──────────────────────────────────────────────────────────── +pub const K_UP_DOWN_PGUP_PGDN: &str = "Up/Down/PgUp/PgDn"; + +// ── Intro screens ───────────────────────────────────────────────────────────── +pub const K_UP_DOWN: &str = "Up/Down"; +pub const K_LEFT_RIGHT: &str = "Left/Right"; +pub const K_TYPE_BACKSPACE: &str = "Type/Backspace"; + +// ── Skill tree ──────────────────────────────────────────────────────────────── +pub const K_UD_JK: &str = "↑↓/jk"; +pub const K_SCROLL_KEYS: &str = "PgUp/PgDn or Ctrl+U/Ctrl+D"; + +// ── Keyboard explorer ───────────────────────────────────────────────────────── +pub const K_KBD_NAV: &str = "←→↑↓/hjkl/Tab"; + +/// Assembles a single hint entry: `"[key] label"`. +/// +/// The returned `String` owns its content and can be held alongside other hint +/// strings before passing `&str` slices to `pack_hint_lines` / `hint_token_at`. +pub fn hint(key: &str, label: &str) -> String { + format!("[{key}] {label}") +} diff --git a/src/ui/mod.rs b/src/ui/mod.rs index c93e024..606b5a8 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -1,4 +1,5 @@ pub mod components; +pub mod hint; pub mod layout; pub mod line_input; pub mod theme;