Add adaptive drill intro, refactor key hints

This commit is contained in:
2026-04-17 20:35:23 +00:00
parent f855fa5606
commit b5ba61a3a3
29 changed files with 1611 additions and 1165 deletions

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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ä '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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 '

View File

@@ -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ıı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 '

View File

@@ -372,6 +372,7 @@ pub struct App {
pub caps_lock: bool,
pub keyboard_model: KeyboardModel,
pub milestone_queue: VecDeque<KeyMilestonePopup>,
pub show_adaptive_intro: bool,
pub settings_confirm_import: bool,
pub settings_export_conflict: bool,
pub settings_status_message: Option<StatusMessage>,
@@ -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,

View File

@@ -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(),
}
}
}

View File

@@ -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<String>) =
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<String>) =
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::<Vec<&str>>(),
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<String>) =
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<Line> = 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]);

View File

@@ -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<Line> = pack_hint_lines(&hints, inner.width as usize)
.into_iter()

View File

@@ -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<String>) =
if self.selected < branches.len() {
let bp = self.skill_tree.branch_progress(branches[self.selected]);

View File

@@ -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<String> {
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<String> {
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()),
]
}

74
src/ui/hint.rs Normal file
View File

@@ -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}")
}

View File

@@ -1,4 +1,5 @@
pub mod components;
pub mod hint;
pub mod layout;
pub mod line_input;
pub mod theme;