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' settings_desc: 'Konfiguruj keydr'
day_streak: ' | %{days} dni v rade' day_streak: ' | %{days} dni v rade'
key_progress: ' Postup klaves %{unlocked}/%{total} (%{mastered} zvladnutych) | Cil %{target} WPM%{streak}' key_progress: ' Postup klaves %{unlocked}/%{total} (%{mastered} zvladnutych) | Cil %{target} WPM%{streak}'
hint_start: '[1-3] Spustit' hint_start: 'Spustit'
hint_skill_tree: '[t] Strom' hint_skill_tree: 'Strom'
hint_keyboard: '[b] Klavesnice' hint_keyboard: 'Klavesnice'
hint_stats: '[s] Statistiky' hint_stats: 'Statistiky'
hint_settings: '[c] Nastaveni' hint_settings: 'Nastaveni'
hint_quit: '[q] Konec' hint_quit: 'Konec'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Zdroj textu ' passage_source: ' Zdroj textu '
footer: '[ESC] Ukoncit cviceni [Backspace] Smazat' footer: '[ESC] Ukoncit cviceni [Backspace] Smazat'
keys_reenabled: 'Klavesy obnoveny za %{ms}ms' keys_reenabled: 'Klavesy obnoveny za %{ms}ms'
hint_end: '[ESC] Ukoncit cviceni' hint_end: 'Ukoncit cviceni'
hint_backspace: '[Backspace] Smazat' hint_backspace: 'Smazat'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} spravne)' correct_detail: ' (%{correct}/%{total} spravne)'
input_blocked: ' Vstup docasne zablokovany ' input_blocked: ' Vstup docasne zablokovany '
input_blocked_ms: '(%{ms}ms zbyva)' input_blocked_ms: '(%{ms}ms zbyva)'
hint_continue: '[c/Enter/Space] Pokracovat' hint_continue: 'Pokracovat'
hint_retry: '[r] Znovu' hint_retry: 'Znovu'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statistiky' hint_stats: 'Statistiky'
hint_delete: '[x] Smazat' hint_delete: 'Smazat'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Presnost' tab_accuracy: '[4] Presnost'
tab_timing: '[5] Casovani' tab_timing: '[5] Casovani'
tab_ngrams: '[6] N-gramy' tab_ngrams: '[6] N-gramy'
hint_back: '[ESC] Zpet' hint_back: 'Zpet'
hint_next_tab: '[Tab] Dalsi karta' hint_next_tab: 'Dalsi karta'
hint_switch_tab: '[1-6] Prepnout kartu' hint_switch_tab: 'Prepnout kartu'
hint_navigate: '[j/k] Navigovat' hint_navigate: 'Navigovat'
hint_page: '[PgUp/PgDn] Stranka' hint_page: 'Stranka'
hint_delete: '[x] Smazat' hint_delete: 'Smazat'
summary_title: ' Souhrn ' summary_title: ' Souhrn '
drills: ' Cviceni: ' drills: ' Cviceni: '
avg_wpm: ' Prum WPM: ' avg_wpm: ' Prum WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Cesta importu' import_path: 'Cesta importu'
import_data: 'Importovat data' import_data: 'Importovat data'
import_now: 'Importovat nyni' import_now: 'Importovat nyni'
hint_save_back: '[ESC] Ulozit a zpet' hint_save_back: 'Ulozit a zpet'
hint_change_value: '[Enter/sipky] Zmenit hodnotu' hint_change_value: 'Zmenit hodnotu'
hint_edit_path: '[Enter na ceste] Upravit' hint_edit_path: 'Upravit'
hint_move: '[←→] Posunout' hint_move: 'Posunout'
hint_tab_complete: '[Tab] Doplnit (na konci)' hint_tab_complete: 'Doplnit (na konci)'
hint_confirm: '[Enter] Potvrdit' hint_confirm: 'Potvrdit'
hint_cancel: '[Esc] Zrusit' hint_cancel: 'Zrusit'
success_title: ' Uspech ' success_title: ' Uspech '
error_title: ' Chyba ' error_title: ' Chyba '
press_any_key: 'Stiskni libovolnou klavesu' press_any_key: 'Stiskni libovolnou klavesu'
@@ -236,9 +236,9 @@ select:
cached: ' (v pameti)' cached: ' (v pameti)'
disabled_download: ' (vypnuto: nutne stahnout)' disabled_download: ' (vypnuto: nutne stahnout)'
download_required: ' (nutne stahnout)' download_required: ' (nutne stahnout)'
hint_navigate: '[Nahoru/Dolu/PgUp/PgDn] Navigovat' hint_navigate: 'Navigovat'
hint_confirm: '[Enter] Potvrdit' hint_confirm: 'Potvrdit'
hint_back: '[ESC] Zpet' hint_back: 'Zpet'
language_resets_layout: 'Vyber jazyka obnovi rozlozeni klaves na vychozi pro dany jazyk.' language_resets_layout: 'Vyber jazyka obnovi rozlozeni klaves na vychozi pro dany jazyk.'
layout_no_language_change: 'Zmena rozlozeni nemeni jazyk slovniku.' layout_no_language_change: 'Zmena rozlozeni nemeni jazyk slovniku.'
disabled_network_notice: 'Nektere jazyky jsou vypnute: povolte sitove stahovani v nastaveni.' disabled_network_notice: 'Nektere jazyky jsou vypnute: povolte sitove stahovani v nastaveni.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Uroven %{current}/%{total}' level: 'Uroven %{current}/%{total}'
level_zero: 'Uroven 0/%{total}' level_zero: 'Uroven 0/%{total}'
in_focus: ' v zamereni' in_focus: ' v zamereni'
hint_navigate: '[↑↓/jk] Navigovat' hint_navigate: 'Navigovat'
hint_scroll: '[PgUp/PgDn nebo Ctrl+U/Ctrl+D] Rolovat' hint_scroll: 'Rolovat'
hint_back: '[q] Zpet' hint_back: 'Zpet'
hint_unlock: '[Enter] Odemknout' hint_unlock: 'Odemknout'
hint_start_drill: '[Enter] Spustit cviceni' hint_start_drill: 'Spustit cviceni'
unlock_msg_1: 'Po odemknuti bude vychozi adaptivni cviceni zahrovat klavesy z teto vetve.' 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.' unlock_msg_2: 'Pokud se chces zamerit jen na tuto vetev, spust cviceni primo ze stromu.'
confirm_unlock: 'Odemknout %{branch}?' confirm_unlock: 'Odemknout %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Kazda klavesa na klavesnici je na maximalni jistote.' all_mastered_desc: 'Kazda klavesa na klavesnici je na maximalni jistote.'
mastery_takes_practice: 'Zbehlost neni cil — vyzaduje prubezne cviceni.' mastery_takes_practice: 'Zbehlost neni cil — vyzaduje prubezne cviceni.'
keep_drilling: 'Pokracuj v cviceni pro udrzeni sve urovne.' 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' hint_any_key: 'Stiskni libovolnou klavesu pro pokracovani'
input_blocked: 'Vstup docasne zablokovany (%{ms}ms zbyva)' input_blocked: 'Vstup docasne zablokovany (%{ms}ms zbyva)'
unlock_msg_1: 'Skvela prace! Pokracuj v rozvoji svych dovednosti.' unlock_msg_1: 'Skvela prace! Pokracuj v rozvoji svych dovednosti.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Svalova pamet uzamcena!' mastery_msg_3: 'Svalova pamet uzamcena!'
mastery_msg_4: 'Dalsi klavesa pokorena!' 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 explorer
keyboard: keyboard:
title: ' Klavesnice ' title: ' Klavesnice '
subtitle: 'Stiskni libovolnou klavesu nebo klikni na klavesu' subtitle: 'Stiskni libovolnou klavesu nebo klikni na klavesu'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigovat' hint_navigate: 'Navigovat'
hint_back: '[q/ESC] Zpet' hint_back: 'Zpet'
key_label: 'Klavesa: ' key_label: 'Klavesa: '
finger_label: 'Prst: ' finger_label: 'Prst: '
hand_left: 'Levy' hand_left: 'Levy'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Spustit cviceni textu' start_passage_drill: 'Spustit cviceni textu'
start_code_drill: 'Spustit cviceni kodu' start_code_drill: 'Spustit cviceni kodu'
confirm: 'Potvrdit' confirm: 'Potvrdit'
hint_navigate: '[Nahoru/Dolu] Navigovat' hint_navigate: 'Navigovat'
hint_adjust: '[Vlevo/Vpravo] Upravit' hint_adjust: 'Upravit'
hint_edit: '[Pis/Backspace] Editovat' hint_edit: 'Editovat'
hint_confirm: '[Enter] Potvrdit' hint_confirm: 'Potvrdit'
hint_cancel: '[ESC] Zrusit' hint_cancel: 'Zrusit'
preparing_download: 'Pripravuji stahovani...' preparing_download: 'Pripravuji stahovani...'
download_passage_title: ' Stahuji zdroj textu ' download_passage_title: ' Stahuji zdroj textu '
download_code_title: ' Stahuji zdroj kodu ' download_code_title: ' Stahuji zdroj kodu '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigurer keydr' settings_desc: 'Konfigurer keydr'
day_streak: ' | %{days} dages raekke' day_streak: ' | %{days} dages raekke'
key_progress: ' Tastefremskridt %{unlocked}/%{total} (%{mastered} mestrede) | Maal %{target} WPM%{streak}' key_progress: ' Tastefremskridt %{unlocked}/%{total} (%{mastered} mestrede) | Maal %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Faerdighedstrae' hint_skill_tree: 'Faerdighedstrae'
hint_keyboard: '[b] Tastatur' hint_keyboard: 'Tastatur'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_settings: '[c] Indstillinger' hint_settings: 'Indstillinger'
hint_quit: '[q] Afslut' hint_quit: 'Afslut'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Tekstkilde ' passage_source: ' Tekstkilde '
footer: '[ESC] Afslut oevelse [Backspace] Slet' footer: '[ESC] Afslut oevelse [Backspace] Slet'
keys_reenabled: 'Taster genaktiveret efter %{ms}ms' keys_reenabled: 'Taster genaktiveret efter %{ms}ms'
hint_end: '[ESC] Afslut oevelse' hint_end: 'Afslut oevelse'
hint_backspace: '[Backspace] Slet' hint_backspace: 'Slet'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} korrekte)' correct_detail: ' (%{correct}/%{total} korrekte)'
input_blocked: ' Indtastning midlertidigt blokeret ' input_blocked: ' Indtastning midlertidigt blokeret '
input_blocked_ms: '(%{ms}ms tilbage)' input_blocked_ms: '(%{ms}ms tilbage)'
hint_continue: '[c/Enter/Space] Fortsaet' hint_continue: 'Fortsaet'
hint_retry: '[r] Proev igen' hint_retry: 'Proev igen'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_delete: '[x] Slet' hint_delete: 'Slet'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Noejagtighed' tab_accuracy: '[4] Noejagtighed'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-grammer' tab_ngrams: '[6] N-grammer'
hint_back: '[ESC] Tilbage' hint_back: 'Tilbage'
hint_next_tab: '[Tab] Naeste fane' hint_next_tab: 'Naeste fane'
hint_switch_tab: '[1-6] Skift fane' hint_switch_tab: 'Skift fane'
hint_navigate: '[j/k] Naviger' hint_navigate: 'Naviger'
hint_page: '[PgUp/PgDn] Side' hint_page: 'Side'
hint_delete: '[x] Slet' hint_delete: 'Slet'
summary_title: ' Oversigt ' summary_title: ' Oversigt '
drills: ' Oevelser: ' drills: ' Oevelser: '
avg_wpm: ' Gns. WPM: ' avg_wpm: ' Gns. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importsti' import_path: 'Importsti'
import_data: 'Importer data' import_data: 'Importer data'
import_now: 'Importer nu' import_now: 'Importer nu'
hint_save_back: '[ESC] Gem & tilbage' hint_save_back: 'Gem & tilbage'
hint_change_value: '[Enter/pile] AEndr vaerdi' hint_change_value: 'AEndr vaerdi'
hint_edit_path: '[Enter paa sti] Rediger' hint_edit_path: 'Rediger'
hint_move: '[←→] Flyt' hint_move: 'Flyt'
hint_tab_complete: '[Tab] Fuldfoer (i slutningen)' hint_tab_complete: 'Fuldfoer (i slutningen)'
hint_confirm: '[Enter] Bekraeft' hint_confirm: 'Bekraeft'
hint_cancel: '[Esc] Annuller' hint_cancel: 'Annuller'
success_title: ' Succes ' success_title: ' Succes '
error_title: ' Fejl ' error_title: ' Fejl '
press_any_key: 'Tryk paa en tast' press_any_key: 'Tryk paa en tast'
@@ -236,9 +236,9 @@ select:
cached: ' (gemt)' cached: ' (gemt)'
disabled_download: ' (deaktiveret: download kraeves)' disabled_download: ' (deaktiveret: download kraeves)'
download_required: ' (download kraeves)' download_required: ' (download kraeves)'
hint_navigate: '[Op/Ned/PgUp/PgDn] Naviger' hint_navigate: 'Naviger'
hint_confirm: '[Enter] Bekraeft' hint_confirm: 'Bekraeft'
hint_back: '[ESC] Tilbage' hint_back: 'Tilbage'
language_resets_layout: 'Sprogvalg nulstiller tastaturlayoutet til sprogets standard.' language_resets_layout: 'Sprogvalg nulstiller tastaturlayoutet til sprogets standard.'
layout_no_language_change: 'Layoutaendringer aendrer ikke ordbogssproget.' layout_no_language_change: 'Layoutaendringer aendrer ikke ordbogssproget.'
disabled_network_notice: 'Nogle sprog er deaktiverede: aktiver netvaerksdownloads i intro/indstillinger.' disabled_network_notice: 'Nogle sprog er deaktiverede: aktiver netvaerksdownloads i intro/indstillinger.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Niveau %{current}/%{total}' level: 'Niveau %{current}/%{total}'
level_zero: 'Niveau 0/%{total}' level_zero: 'Niveau 0/%{total}'
in_focus: ' i fokus' in_focus: ' i fokus'
hint_navigate: '[↑↓/jk] Naviger' hint_navigate: 'Naviger'
hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Rul' hint_scroll: 'Rul'
hint_back: '[q] Tilbage' hint_back: 'Tilbage'
hint_unlock: '[Enter] Laas op' hint_unlock: 'Laas op'
hint_start_drill: '[Enter] Start oevelse' hint_start_drill: 'Start oevelse'
unlock_msg_1: 'Efter oplaasning blandes oplaaste taster fra denne gren ind i den adaptive 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.' unlock_msg_2: 'Vil du kun oeve denne gren, start en oevelse direkte fra denne gren i Faerdighedstraeet.'
confirm_unlock: 'Laas %{branch} op?' confirm_unlock: 'Laas %{branch} op?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillid.' all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillid.'
mastery_takes_practice: 'Mestring er ikke en destination — det kraever vedvarende oevelse.' mastery_takes_practice: 'Mestring er ikke en destination — det kraever vedvarende oevelse.'
keep_drilling: 'Bliv ved med at oeve for at bevare dit niveau.' 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' hint_any_key: 'Tryk paa en tast for at fortsaette'
input_blocked: 'Indtastning midlertidigt blokeret (%{ms}ms tilbage)' input_blocked: 'Indtastning midlertidigt blokeret (%{ms}ms tilbage)'
unlock_msg_1: 'Godt klaret! Bliv ved med at opbygge dine skrivefaerdigheder.' unlock_msg_1: 'Godt klaret! Bliv ved med at opbygge dine skrivefaerdigheder.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Muskelhukommelse forankret!' mastery_msg_3: 'Muskelhukommelse forankret!'
mastery_msg_4: 'Endnu en tast erobret!' 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 explorer
keyboard: keyboard:
title: ' Tastatur ' title: ' Tastatur '
subtitle: 'Tryk paa en tast eller klik paa en tast' subtitle: 'Tryk paa en tast eller klik paa en tast'
hint_navigate: '[←→↑↓/hjkl/Tab] Naviger' hint_navigate: 'Naviger'
hint_back: '[q/ESC] Tilbage' hint_back: 'Tilbage'
key_label: 'Tast: ' key_label: 'Tast: '
finger_label: 'Finger: ' finger_label: 'Finger: '
hand_left: 'Venstre' hand_left: 'Venstre'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Start tekstoevelse' start_passage_drill: 'Start tekstoevelse'
start_code_drill: 'Start kodeoevelse' start_code_drill: 'Start kodeoevelse'
confirm: 'Bekraeft' confirm: 'Bekraeft'
hint_navigate: '[Op/Ned] Naviger' hint_navigate: 'Naviger'
hint_adjust: '[Venstre/Hoejre] Juster' hint_adjust: 'Juster'
hint_edit: '[Skriv/Backspace] Rediger' hint_edit: 'Rediger'
hint_confirm: '[Enter] Bekraeft' hint_confirm: 'Bekraeft'
hint_cancel: '[ESC] Annuller' hint_cancel: 'Annuller'
preparing_download: 'Forbereder download...' preparing_download: 'Forbereder download...'
download_passage_title: ' Downloader tekstkilde ' download_passage_title: ' Downloader tekstkilde '
download_code_title: ' Downloader kodekilde ' download_code_title: ' Downloader kodekilde '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'keydr konfigurieren' settings_desc: 'keydr konfigurieren'
day_streak: ' | %{days} Tage Serie' day_streak: ' | %{days} Tage Serie'
key_progress: ' Tastenfortschritt %{unlocked}/%{total} (%{mastered} gemeistert) | Ziel %{target} WPM%{streak}' key_progress: ' Tastenfortschritt %{unlocked}/%{total} (%{mastered} gemeistert) | Ziel %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Faehigkeitenbaum' hint_skill_tree: 'Faehigkeitenbaum'
hint_keyboard: '[b] Tastatur' hint_keyboard: 'Tastatur'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_settings: '[c] Einstellungen' hint_settings: 'Einstellungen'
hint_quit: '[q] Beenden' hint_quit: 'Beenden'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Textquelle ' passage_source: ' Textquelle '
footer: '[ESC] Lektion beenden [Backspace] Loeschen' footer: '[ESC] Lektion beenden [Backspace] Loeschen'
keys_reenabled: 'Tasten nach %{ms}ms wieder aktiv' keys_reenabled: 'Tasten nach %{ms}ms wieder aktiv'
hint_end: '[ESC] Lektion beenden' hint_end: 'Lektion beenden'
hint_backspace: '[Backspace] Loeschen' hint_backspace: 'Loeschen'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} korrekt)' correct_detail: ' (%{correct}/%{total} korrekt)'
input_blocked: ' Eingabe voruebergehend blockiert ' input_blocked: ' Eingabe voruebergehend blockiert '
input_blocked_ms: '(%{ms}ms verbleibend)' input_blocked_ms: '(%{ms}ms verbleibend)'
hint_continue: '[c/Enter/Space] Weiter' hint_continue: 'Weiter'
hint_retry: '[r] Wiederholen' hint_retry: 'Wiederholen'
hint_menu: '[q] Menue' hint_menu: 'Menue'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_delete: '[x] Loeschen' hint_delete: 'Loeschen'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Genauigkeit' tab_accuracy: '[4] Genauigkeit'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-Gramme' tab_ngrams: '[6] N-Gramme'
hint_back: '[ESC] Zurueck' hint_back: 'Zurueck'
hint_next_tab: '[Tab] Naechster Tab' hint_next_tab: 'Naechster Tab'
hint_switch_tab: '[1-6] Tab wechseln' hint_switch_tab: 'Tab wechseln'
hint_navigate: '[j/k] Navigieren' hint_navigate: 'Navigieren'
hint_page: '[PgUp/PgDn] Seite' hint_page: 'Seite'
hint_delete: '[x] Loeschen' hint_delete: 'Loeschen'
summary_title: ' Zusammenfassung ' summary_title: ' Zusammenfassung '
drills: ' Lektionen: ' drills: ' Lektionen: '
avg_wpm: ' Schnitt WPM: ' avg_wpm: ' Schnitt WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importpfad' import_path: 'Importpfad'
import_data: 'Daten importieren' import_data: 'Daten importieren'
import_now: 'Jetzt importieren' import_now: 'Jetzt importieren'
hint_save_back: '[ESC] Speichern & zurueck' hint_save_back: 'Speichern & zurueck'
hint_change_value: '[Enter/Pfeile] Wert aendern' hint_change_value: 'Wert aendern'
hint_edit_path: '[Enter auf Pfad] Bearbeiten' hint_edit_path: 'Bearbeiten'
hint_move: '[←→] Bewegen' hint_move: 'Bewegen'
hint_tab_complete: '[Tab] Vervollstaendigen (am Ende)' hint_tab_complete: 'Vervollstaendigen (am Ende)'
hint_confirm: '[Enter] Bestaetigen' hint_confirm: 'Bestaetigen'
hint_cancel: '[Esc] Abbrechen' hint_cancel: 'Abbrechen'
success_title: ' Erfolg ' success_title: ' Erfolg '
error_title: ' Fehler ' error_title: ' Fehler '
press_any_key: 'Beliebige Taste druecken' press_any_key: 'Beliebige Taste druecken'
@@ -236,9 +236,9 @@ select:
cached: ' (gespeichert)' cached: ' (gespeichert)'
disabled_download: ' (deaktiviert: Download erforderlich)' disabled_download: ' (deaktiviert: Download erforderlich)'
download_required: ' (Download erforderlich)' download_required: ' (Download erforderlich)'
hint_navigate: '[Auf/Ab/BildAuf/BildAb] Navigieren' hint_navigate: 'Navigieren'
hint_confirm: '[Enter] Bestaetigen' hint_confirm: 'Bestaetigen'
hint_back: '[ESC] Zurueck' hint_back: 'Zurueck'
language_resets_layout: 'Die Sprachauswahl setzt das Tastaturlayout auf den Standard der Sprache zurueck.' language_resets_layout: 'Die Sprachauswahl setzt das Tastaturlayout auf den Standard der Sprache zurueck.'
layout_no_language_change: 'Layoutaenderungen aendern nicht die Woerterbuchsprache.' layout_no_language_change: 'Layoutaenderungen aendern nicht die Woerterbuchsprache.'
disabled_network_notice: 'Einige Sprachen sind deaktiviert: Netzwerk-Downloads in Intro/Einstellungen aktivieren.' disabled_network_notice: 'Einige Sprachen sind deaktiviert: Netzwerk-Downloads in Intro/Einstellungen aktivieren.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Stufe %{current}/%{total}' level: 'Stufe %{current}/%{total}'
level_zero: 'Stufe 0/%{total}' level_zero: 'Stufe 0/%{total}'
in_focus: ' im Fokus' in_focus: ' im Fokus'
hint_navigate: '[↑↓/jk] Navigieren' hint_navigate: 'Navigieren'
hint_scroll: '[BildAuf/BildAb oder Strg+U/Strg+D] Scrollen' hint_scroll: 'Scrollen'
hint_back: '[q] Zurueck' hint_back: 'Zurueck'
hint_unlock: '[Enter] Freischalten' hint_unlock: 'Freischalten'
hint_start_drill: '[Enter] Lektion starten' hint_start_drill: 'Lektion starten'
unlock_msg_1: 'Nach dem Freischalten werden freigeschaltete Tasten dieses Zweigs in die adaptive Lektion eingemischt.' 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.' unlock_msg_2: 'Um nur diesen Zweig zu ueben, starte eine Lektion direkt aus diesem Zweig im Faehigkeitenbaum.'
confirm_unlock: '%{branch} freischalten?' confirm_unlock: '%{branch} freischalten?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Jede Taste auf der Tastatur hat maximale Sicherheit.' all_mastered_desc: 'Jede Taste auf der Tastatur hat maximale Sicherheit.'
mastery_takes_practice: 'Meisterschaft ist kein Ziel — sie erfordert staendiges Ueben.' mastery_takes_practice: 'Meisterschaft ist kein Ziel — sie erfordert staendiges Ueben.'
keep_drilling: 'Uebe weiter, um dein Koennen zu erhalten.' 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' hint_any_key: 'Beliebige Taste zum Fortfahren'
input_blocked: 'Eingabe voruebergehend blockiert (%{ms}ms verbleibend)' input_blocked: 'Eingabe voruebergehend blockiert (%{ms}ms verbleibend)'
unlock_msg_1: 'Gut gemacht! Baue deine Tippfaehigkeiten weiter aus.' unlock_msg_1: 'Gut gemacht! Baue deine Tippfaehigkeiten weiter aus.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Muskelgedaechtnis verankert!' mastery_msg_3: 'Muskelgedaechtnis verankert!'
mastery_msg_4: 'Eine weitere Taste bezwungen!' 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 explorer
keyboard: keyboard:
title: ' Tastatur ' title: ' Tastatur '
subtitle: 'Druecke eine Taste oder klicke darauf' subtitle: 'Druecke eine Taste oder klicke darauf'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigieren' hint_navigate: 'Navigieren'
hint_back: '[q/ESC] Zurueck' hint_back: 'Zurueck'
key_label: 'Taste: ' key_label: 'Taste: '
finger_label: 'Finger: ' finger_label: 'Finger: '
hand_left: 'Links' hand_left: 'Links'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Textpassagen-Lektion starten' start_passage_drill: 'Textpassagen-Lektion starten'
start_code_drill: 'Code-Lektion starten' start_code_drill: 'Code-Lektion starten'
confirm: 'Bestaetigen' confirm: 'Bestaetigen'
hint_navigate: '[Auf/Ab] Navigieren' hint_navigate: 'Navigieren'
hint_adjust: '[Links/Rechts] Anpassen' hint_adjust: 'Anpassen'
hint_edit: '[Tippen/Backspace] Bearbeiten' hint_edit: 'Bearbeiten'
hint_confirm: '[Enter] Bestaetigen' hint_confirm: 'Bestaetigen'
hint_cancel: '[ESC] Abbrechen' hint_cancel: 'Abbrechen'
preparing_download: 'Download wird vorbereitet...' preparing_download: 'Download wird vorbereitet...'
download_passage_title: ' Textquelle wird heruntergeladen ' download_passage_title: ' Textquelle wird heruntergeladen '
download_code_title: ' Code-Quelle wird heruntergeladen ' download_code_title: ' Code-Quelle wird heruntergeladen '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configure keydr' settings_desc: 'Configure keydr'
day_streak: ' | %{days} day streak' day_streak: ' | %{days} day streak'
key_progress: ' Key Progress %{unlocked}/%{total} (%{mastered} mastered) | Target %{target} WPM%{streak}' key_progress: ' Key Progress %{unlocked}/%{total} (%{mastered} mastered) | Target %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Skill Tree' hint_skill_tree: 'Skill Tree'
hint_keyboard: '[b] Keyboard' hint_keyboard: 'Keyboard'
hint_stats: '[s] Stats' hint_stats: 'Stats'
hint_settings: '[c] Settings' hint_settings: 'Settings'
hint_quit: '[q] Quit' hint_quit: 'Quit'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Passage source ' passage_source: ' Passage source '
footer: '[ESC] End drill [Backspace] Delete' footer: '[ESC] End drill [Backspace] Delete'
keys_reenabled: 'Keys re-enabled in %{ms}ms' keys_reenabled: 'Keys re-enabled in %{ms}ms'
hint_end: '[ESC] End drill' hint_end: 'End drill'
hint_backspace: '[Backspace] Delete' hint_backspace: 'Delete'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} correct)' correct_detail: ' (%{correct}/%{total} correct)'
input_blocked: ' Input temporarily blocked ' input_blocked: ' Input temporarily blocked '
input_blocked_ms: '(%{ms}ms remaining)' input_blocked_ms: '(%{ms}ms remaining)'
hint_continue: '[c/Enter/Space] Continue' hint_continue: 'Continue'
hint_retry: '[r] Retry' hint_retry: 'Retry'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Stats' hint_stats: 'Stats'
hint_delete: '[x] Delete' hint_delete: 'Delete'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Accuracy' tab_accuracy: '[4] Accuracy'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-grams' tab_ngrams: '[6] N-grams'
hint_back: '[ESC] Back' hint_back: 'Back'
hint_next_tab: '[Tab] Next tab' hint_next_tab: 'Next tab'
hint_switch_tab: '[1-6] Switch tab' hint_switch_tab: 'Switch tab'
hint_navigate: '[j/k] Navigate' hint_navigate: 'Navigate'
hint_page: '[PgUp/PgDn] Page' hint_page: 'Page'
hint_delete: '[x] Delete' hint_delete: 'Delete'
summary_title: ' Summary ' summary_title: ' Summary '
drills: ' Drills: ' drills: ' Drills: '
avg_wpm: ' Avg WPM: ' avg_wpm: ' Avg WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Import Path' import_path: 'Import Path'
import_data: 'Import Data' import_data: 'Import Data'
import_now: 'Import now' import_now: 'Import now'
hint_save_back: '[ESC] Save & back' hint_save_back: 'Save & back'
hint_change_value: '[Enter/arrows] Change value' hint_change_value: 'Change value'
hint_edit_path: '[Enter on path] Edit' hint_edit_path: 'Edit'
hint_move: '[←→] Move' hint_move: 'Move'
hint_tab_complete: '[Tab] Complete (at end)' hint_tab_complete: 'Complete (at end)'
hint_confirm: '[Enter] Confirm' hint_confirm: 'Confirm'
hint_cancel: '[Esc] Cancel' hint_cancel: 'Cancel'
success_title: ' Success ' success_title: ' Success '
error_title: ' Error ' error_title: ' Error '
press_any_key: 'Press any key' press_any_key: 'Press any key'
@@ -236,9 +236,9 @@ select:
cached: ' (cached)' cached: ' (cached)'
disabled_download: ' (disabled: download required)' disabled_download: ' (disabled: download required)'
download_required: ' (download required)' download_required: ' (download required)'
hint_navigate: '[Up/Down/PgUp/PgDn] Navigate' hint_navigate: 'Navigate'
hint_confirm: '[Enter] Confirm' hint_confirm: 'Confirm'
hint_back: '[ESC] Back' hint_back: 'Back'
language_resets_layout: 'Selecting a language resets keyboard layout to that language''s default.' 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.' layout_no_language_change: 'Layout changes do not change dictionary language.'
disabled_network_notice: 'Some languages are disabled: enable network downloads in intro/settings.' disabled_network_notice: 'Some languages are disabled: enable network downloads in intro/settings.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Level %{current}/%{total}' level: 'Level %{current}/%{total}'
level_zero: 'Level 0/%{total}' level_zero: 'Level 0/%{total}'
in_focus: ' in focus' in_focus: ' in focus'
hint_navigate: '[↑↓/jk] Navigate' hint_navigate: 'Navigate'
hint_scroll: '[PgUp/PgDn or Ctrl+U/Ctrl+D] Scroll' hint_scroll: 'Scroll'
hint_back: '[q] Back' hint_back: 'Back'
hint_unlock: '[Enter] Unlock' hint_unlock: 'Unlock'
hint_start_drill: '[Enter] Start Drill' 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_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.' 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}?' confirm_unlock: 'Unlock %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Every key on the keyboard is at maximum confidence.' all_mastered_desc: 'Every key on the keyboard is at maximum confidence.'
mastery_takes_practice: 'Mastery is not a destination — it takes ongoing practice.' mastery_takes_practice: 'Mastery is not a destination — it takes ongoing practice.'
keep_drilling: 'Keep drilling to maintain your edge.' 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' hint_any_key: 'Press any key to continue'
input_blocked: 'Input temporarily blocked (%{ms}ms remaining)' input_blocked: 'Input temporarily blocked (%{ms}ms remaining)'
unlock_msg_1: 'Nice work! Keep building your typing skills.' unlock_msg_1: 'Nice work! Keep building your typing skills.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Muscle memory locked in!' mastery_msg_3: 'Muscle memory locked in!'
mastery_msg_4: 'One more key conquered!' 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 explorer
keyboard: keyboard:
title: ' Keyboard ' title: ' Keyboard '
subtitle: 'Press any key or click a key' subtitle: 'Press any key or click a key'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigate' hint_navigate: 'Navigate'
hint_back: '[q/ESC] Back' hint_back: 'Back'
key_label: 'Key: ' key_label: 'Key: '
finger_label: 'Finger: ' finger_label: 'Finger: '
hand_left: 'Left' hand_left: 'Left'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Start passage drill' start_passage_drill: 'Start passage drill'
start_code_drill: 'Start code drill' start_code_drill: 'Start code drill'
confirm: 'Confirm' confirm: 'Confirm'
hint_navigate: '[Up/Down] Navigate' hint_navigate: 'Navigate'
hint_adjust: '[Left/Right] Adjust' hint_adjust: 'Adjust'
hint_edit: '[Type/Backspace] Edit' hint_edit: 'Edit'
hint_confirm: '[Enter] Confirm' hint_confirm: 'Confirm'
hint_cancel: '[ESC] Cancel' hint_cancel: 'Cancel'
preparing_download: 'Preparing download...' preparing_download: 'Preparing download...'
download_passage_title: ' Downloading Passage Source ' download_passage_title: ' Downloading Passage Source '
download_code_title: ' Downloading Code Source ' download_code_title: ' Downloading Code Source '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configurar keydr' settings_desc: 'Configurar keydr'
day_streak: ' | %{days} días seguidos' day_streak: ' | %{days} días seguidos'
key_progress: ' Progreso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Objetivo %{target} WPM%{streak}' key_progress: ' Progreso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Objetivo %{target} WPM%{streak}'
hint_start: '[1-3] Iniciar' hint_start: 'Iniciar'
hint_skill_tree: '[t] Árbol de Habilidades' hint_skill_tree: 'Árbol de Habilidades'
hint_keyboard: '[b] Teclado' hint_keyboard: 'Teclado'
hint_stats: '[s] Estadísticas' hint_stats: 'Estadísticas'
hint_settings: '[c] Configuración' hint_settings: 'Configuración'
hint_quit: '[q] Salir' hint_quit: 'Salir'
# Pantalla de ejercicio # Pantalla de ejercicio
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Fuente del pasaje ' passage_source: ' Fuente del pasaje '
footer: '[ESC] Fin [Backspace] Borrar' footer: '[ESC] Fin [Backspace] Borrar'
keys_reenabled: 'Teclas reactivadas en %{ms}ms' keys_reenabled: 'Teclas reactivadas en %{ms}ms'
hint_end: '[ESC] Fin del ejercicio' hint_end: 'Fin del ejercicio'
hint_backspace: '[Backspace] Borrar' hint_backspace: 'Borrar'
# Panel / resultado del ejercicio # Panel / resultado del ejercicio
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} correctos)' correct_detail: ' (%{correct}/%{total} correctos)'
input_blocked: ' Entrada bloqueada temporalmente ' input_blocked: ' Entrada bloqueada temporalmente '
input_blocked_ms: '(%{ms}ms restantes)' input_blocked_ms: '(%{ms}ms restantes)'
hint_continue: '[c/Enter/Space] Continuar' hint_continue: 'Continuar'
hint_retry: '[r] Reintentar' hint_retry: 'Reintentar'
hint_menu: '[q] Menú' hint_menu: 'Menú'
hint_stats: '[s] Estadísticas' hint_stats: 'Estadísticas'
hint_delete: '[x] Eliminar' hint_delete: 'Eliminar'
# Barra lateral de estadísticas (durante el ejercicio) # Barra lateral de estadísticas (durante el ejercicio)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Precisión' tab_accuracy: '[4] Precisión'
tab_timing: '[5] Tiempos' tab_timing: '[5] Tiempos'
tab_ngrams: '[6] N-gramas' tab_ngrams: '[6] N-gramas'
hint_back: '[ESC] Volver' hint_back: 'Volver'
hint_next_tab: '[Tab] Siguiente pestaña' hint_next_tab: 'Siguiente pestaña'
hint_switch_tab: '[1-6] Cambiar pestaña' hint_switch_tab: 'Cambiar pestaña'
hint_navigate: '[j/k] Navegar' hint_navigate: 'Navegar'
hint_page: '[PgUp/PgDn] Página' hint_page: 'Página'
hint_delete: '[x] Eliminar' hint_delete: 'Eliminar'
summary_title: ' Resumen ' summary_title: ' Resumen '
drills: ' Ejercicios: ' drills: ' Ejercicios: '
avg_wpm: ' WPM Prom: ' avg_wpm: ' WPM Prom: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Ruta de Importación' import_path: 'Ruta de Importación'
import_data: 'Importar Datos' import_data: 'Importar Datos'
import_now: 'Importar ahora' import_now: 'Importar ahora'
hint_save_back: '[ESC] Guardar y volver' hint_save_back: 'Guardar y volver'
hint_change_value: '[Enter/flechas] Cambiar valor' hint_change_value: 'Cambiar valor'
hint_edit_path: '[Enter en ruta] Editar' hint_edit_path: 'Editar'
hint_move: '[←→] Mover' hint_move: 'Mover'
hint_tab_complete: '[Tab] Completar (al final)' hint_tab_complete: 'Completar (al final)'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_cancel: '[Esc] Cancelar' hint_cancel: 'Cancelar'
success_title: ' Éxito ' success_title: ' Éxito '
error_title: ' Fallo ' error_title: ' Fallo '
press_any_key: 'Presiona cualquier tecla' press_any_key: 'Presiona cualquier tecla'
@@ -236,9 +236,9 @@ select:
cached: ' (en caché)' cached: ' (en caché)'
disabled_download: ' (desactivado: requiere descarga)' disabled_download: ' (desactivado: requiere descarga)'
download_required: ' (requiere descarga)' download_required: ' (requiere descarga)'
hint_navigate: '[Up/Down/PgUp/PgDn] Navegar' hint_navigate: 'Navegar'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_back: '[ESC] Volver' hint_back: 'Volver'
language_resets_layout: 'Seleccionar un idioma restablece la distribución a la predeterminada de ese idioma.' 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.' 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.' 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: 'Nivel %{current}/%{total}'
level_zero: 'Nivel 0/%{total}' level_zero: 'Nivel 0/%{total}'
in_focus: ' en foco' in_focus: ' en foco'
hint_navigate: '[↑↓/jk] Navegar' hint_navigate: 'Navegar'
hint_scroll: '[PgUp/PgDn o Ctrl+U/Ctrl+D] Desplazar' hint_scroll: 'Desplazar'
hint_back: '[q] Volver' hint_back: 'Volver'
hint_unlock: '[Enter] Desbloquear' hint_unlock: 'Desbloquear'
hint_start_drill: '[Enter] Iniciar Ejercicio' 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_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.' 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}?' confirm_unlock: '¿Desbloquear %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Cada tecla del teclado está a máxima confianza.' 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.' mastery_takes_practice: 'El dominio no es un destino — requiere práctica continua.'
keep_drilling: 'Sigue practicando para mantener tu nivel.' 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' hint_any_key: 'Presiona cualquier tecla para continuar'
input_blocked: 'Entrada bloqueada temporalmente (%{ms}ms restantes)' input_blocked: 'Entrada bloqueada temporalmente (%{ms}ms restantes)'
unlock_msg_1: '¡Buen trabajo! Sigue mejorando tus habilidades.' unlock_msg_1: '¡Buen trabajo! Sigue mejorando tus habilidades.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: '¡Memoria muscular asegurada!' mastery_msg_3: '¡Memoria muscular asegurada!'
mastery_msg_4: '¡Una tecla más conquistada!' 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 # Explorador de teclado
keyboard: keyboard:
title: ' Teclado ' title: ' Teclado '
subtitle: 'Presiona o haz clic en una tecla' subtitle: 'Presiona o haz clic en una tecla'
hint_navigate: '[←→↑↓/hjkl/Tab] Navegar' hint_navigate: 'Navegar'
hint_back: '[q/ESC] Volver' hint_back: 'Volver'
key_label: 'Tecla: ' key_label: 'Tecla: '
finger_label: 'Dedo: ' finger_label: 'Dedo: '
hand_left: 'Izquierda' hand_left: 'Izquierda'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Iniciar ejercicio de pasaje' start_passage_drill: 'Iniciar ejercicio de pasaje'
start_code_drill: 'Iniciar ejercicio de código' start_code_drill: 'Iniciar ejercicio de código'
confirm: 'Confirmar' confirm: 'Confirmar'
hint_navigate: '[Up/Down] Navegar' hint_navigate: 'Navegar'
hint_adjust: '[Left/Right] Ajustar' hint_adjust: 'Ajustar'
hint_edit: '[Type/Backspace] Editar' hint_edit: 'Editar'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_cancel: '[ESC] Cancelar' hint_cancel: 'Cancelar'
preparing_download: 'Preparando descarga...' preparing_download: 'Preparando descarga...'
download_passage_title: ' Descargando Fuente de Pasaje ' download_passage_title: ' Descargando Fuente de Pasaje '
download_code_title: ' Descargando Fuente de Código ' download_code_title: ' Descargando Fuente de Código '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Seadista keydr' settings_desc: 'Seadista keydr'
day_streak: ' | %{days} päeva järjest' day_streak: ' | %{days} päeva järjest'
key_progress: ' Klahvide edenemine %{unlocked}/%{total} (%{mastered} omandatud) | Siht %{target} WPM%{streak}' key_progress: ' Klahvide edenemine %{unlocked}/%{total} (%{mastered} omandatud) | Siht %{target} WPM%{streak}'
hint_start: '[1-3] Alusta' hint_start: 'Alusta'
hint_skill_tree: '[t] Oskuste puu' hint_skill_tree: 'Oskuste puu'
hint_keyboard: '[b] Klaviatuur' hint_keyboard: 'Klaviatuur'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_settings: '[c] Seaded' hint_settings: 'Seaded'
hint_quit: '[q] Välju' hint_quit: 'Välju'
# Harjutuse kuva # Harjutuse kuva
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Teksti allikas ' passage_source: ' Teksti allikas '
footer: '[ESC] Lõpeta harjutus [Backspace] Kustuta' footer: '[ESC] Lõpeta harjutus [Backspace] Kustuta'
keys_reenabled: 'Klahvid taas lubatud %{ms}ms pärast' keys_reenabled: 'Klahvid taas lubatud %{ms}ms pärast'
hint_end: '[ESC] Lõpeta harjutus' hint_end: 'Lõpeta harjutus'
hint_backspace: '[Backspace] Kustuta' hint_backspace: 'Kustuta'
# Tulemuste paneel / harjutuse tulemus # Tulemuste paneel / harjutuse tulemus
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} õiget)' correct_detail: ' (%{correct}/%{total} õiget)'
input_blocked: ' Sisend ajutiselt blokeeritud ' input_blocked: ' Sisend ajutiselt blokeeritud '
input_blocked_ms: '(%{ms}ms jäänud)' input_blocked_ms: '(%{ms}ms jäänud)'
hint_continue: '[c/Enter/Space] Jätka' hint_continue: 'Jätka'
hint_retry: '[r] Uuesti' hint_retry: 'Uuesti'
hint_menu: '[q] Menüü' hint_menu: 'Menüü'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_delete: '[x] Kustuta' hint_delete: 'Kustuta'
# Statistika külgriba (harjutuse ajal) # Statistika külgriba (harjutuse ajal)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Täpsus' tab_accuracy: '[4] Täpsus'
tab_timing: '[5] Ajastus' tab_timing: '[5] Ajastus'
tab_ngrams: '[6] N-grammid' tab_ngrams: '[6] N-grammid'
hint_back: '[ESC] Tagasi' hint_back: 'Tagasi'
hint_next_tab: '[Tab] Järgmine vahekaart' hint_next_tab: 'Järgmine vahekaart'
hint_switch_tab: '[1-6] Vaheta vahekaart' hint_switch_tab: 'Vaheta vahekaart'
hint_navigate: '[j/k] Navigeeri' hint_navigate: 'Navigeeri'
hint_page: '[PgUp/PgDn] Lehekülg' hint_page: 'Lehekülg'
hint_delete: '[x] Kustuta' hint_delete: 'Kustuta'
summary_title: ' Kokkuvõte ' summary_title: ' Kokkuvõte '
drills: ' Harjutused: ' drills: ' Harjutused: '
avg_wpm: ' Kesk WPM: ' avg_wpm: ' Kesk WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Impordi tee' import_path: 'Impordi tee'
import_data: 'Impordi andmed' import_data: 'Impordi andmed'
import_now: 'Impordi kohe' import_now: 'Impordi kohe'
hint_save_back: '[ESC] Salvesta ja tagasi' hint_save_back: 'Salvesta ja tagasi'
hint_change_value: '[Enter/nooled] Muuda väärtust' hint_change_value: 'Muuda väärtust'
hint_edit_path: '[Enter teel] Muuda' hint_edit_path: 'Muuda'
hint_move: '[←→] Liigu' hint_move: 'Liigu'
hint_tab_complete: '[Tab] Täienda (lõpus)' hint_tab_complete: 'Täienda (lõpus)'
hint_confirm: '[Enter] Kinnita' hint_confirm: 'Kinnita'
hint_cancel: '[Esc] Tühista' hint_cancel: 'Tühista'
success_title: ' Õnnestus ' success_title: ' Õnnestus '
error_title: ' Viga ' error_title: ' Viga '
press_any_key: 'Vajuta suvalist klahvi' press_any_key: 'Vajuta suvalist klahvi'
@@ -236,9 +236,9 @@ select:
cached: ' (puhverdatud)' cached: ' (puhverdatud)'
disabled_download: ' (keelatud: allalaadimine vajalik)' disabled_download: ' (keelatud: allalaadimine vajalik)'
download_required: ' (allalaadimine vajalik)' download_required: ' (allalaadimine vajalik)'
hint_navigate: '[Üles/Alla/PgUp/PgDn] Navigeeri' hint_navigate: 'Navigeeri'
hint_confirm: '[Enter] Kinnita' hint_confirm: 'Kinnita'
hint_back: '[ESC] Tagasi' hint_back: 'Tagasi'
language_resets_layout: 'Keele valimine lähtestab klahvipaigutuse selle keele vaikimisi paigutusele.' language_resets_layout: 'Keele valimine lähtestab klahvipaigutuse selle keele vaikimisi paigutusele.'
layout_no_language_change: 'Paigutuse muutmine ei muuda sõnastiku keelt.' 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.' 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: 'Tase %{current}/%{total}'
level_zero: 'Tase 0/%{total}' level_zero: 'Tase 0/%{total}'
in_focus: ' fookuses' in_focus: ' fookuses'
hint_navigate: '[↑↓/jk] Navigeeri' hint_navigate: 'Navigeeri'
hint_scroll: '[PgUp/PgDn või Ctrl+U/Ctrl+D] Keri' hint_scroll: 'Keri'
hint_back: '[q] Tagasi' hint_back: 'Tagasi'
hint_unlock: '[Enter] Ava' hint_unlock: 'Ava'
hint_start_drill: '[Enter] Alusta harjutust' hint_start_drill: 'Alusta harjutust'
unlock_msg_1: 'Pärast avamist segab vaikimisi kohanduv harjutus selle haru avatud klahve.' 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.' unlock_msg_2: 'Kui soovite keskenduda ainult sellele harule, käivitage harjutus otse oskuste puust.'
confirm_unlock: 'Avada %{branch}?' confirm_unlock: 'Avada %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Iga klahv klaviatuuril on maksimaalsel tasemel.' all_mastered_desc: 'Iga klahv klaviatuuril on maksimaalsel tasemel.'
mastery_takes_practice: 'Valdamine pole sihtkoht — see nõuab pidevat harjutamist.' mastery_takes_practice: 'Valdamine pole sihtkoht — see nõuab pidevat harjutamist.'
keep_drilling: 'Jätkake harjutamist oma taseme hoidmiseks.' 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' hint_any_key: 'Vajuta suvalist klahvi jätkamiseks'
input_blocked: 'Sisend ajutiselt blokeeritud (%{ms}ms jäänud)' input_blocked: 'Sisend ajutiselt blokeeritud (%{ms}ms jäänud)'
unlock_msg_1: 'Tubli! Jätkake oma trükkimisoskuste arendamist.' unlock_msg_1: 'Tubli! Jätkake oma trükkimisoskuste arendamist.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Lihasmälu lukustatud!' mastery_msg_3: 'Lihasmälu lukustatud!'
mastery_msg_4: 'Veel üks klahv vallutatud!' 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 # Klaviatuuri uurija
keyboard: keyboard:
title: ' Klaviatuur ' title: ' Klaviatuur '
subtitle: 'Vajuta suvalist klahvi või klõpsa klahvi' subtitle: 'Vajuta suvalist klahvi või klõpsa klahvi'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigeeri' hint_navigate: 'Navigeeri'
hint_back: '[q/ESC] Tagasi' hint_back: 'Tagasi'
key_label: 'Klahv: ' key_label: 'Klahv: '
finger_label: 'Sõrm: ' finger_label: 'Sõrm: '
hand_left: 'Vasak' hand_left: 'Vasak'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Alusta tekstiharjutust' start_passage_drill: 'Alusta tekstiharjutust'
start_code_drill: 'Alusta koodi harjutust' start_code_drill: 'Alusta koodi harjutust'
confirm: 'Kinnita' confirm: 'Kinnita'
hint_navigate: '[Üles/Alla] Navigeeri' hint_navigate: 'Navigeeri'
hint_adjust: '[Vasakule/Paremale] Kohanda' hint_adjust: 'Kohanda'
hint_edit: '[Trüki/Backspace] Muuda' hint_edit: 'Muuda'
hint_confirm: '[Enter] Kinnita' hint_confirm: 'Kinnita'
hint_cancel: '[ESC] Tühista' hint_cancel: 'Tühista'
preparing_download: 'Valmistan allalaadimist ette...' preparing_download: 'Valmistan allalaadimist ette...'
download_passage_title: ' Teksti allika allalaadimine ' download_passage_title: ' Teksti allika allalaadimine '
download_code_title: ' Koodi allika allalaadimine ' download_code_title: ' Koodi allika allalaadimine '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Määritä keydr-asetukset' settings_desc: 'Määritä keydr-asetukset'
day_streak: ' | %{days} päivän putki' day_streak: ' | %{days} päivän putki'
key_progress: ' Näppäinedistyminen %{unlocked}/%{total} (%{mastered} hallittu) | Tavoite %{target} WPM%{streak}' key_progress: ' Näppäinedistyminen %{unlocked}/%{total} (%{mastered} hallittu) | Tavoite %{target} WPM%{streak}'
hint_start: '[1-3] Aloita' hint_start: 'Aloita'
hint_skill_tree: '[t] Taitopuu' hint_skill_tree: 'Taitopuu'
hint_keyboard: '[b] Näppäimistö' hint_keyboard: 'Näppäimistö'
hint_stats: '[s] Tilastot' hint_stats: 'Tilastot'
hint_settings: '[c] Asetukset' hint_settings: 'Asetukset'
hint_quit: '[q] Lopeta' hint_quit: 'Lopeta'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Tekstilähde ' passage_source: ' Tekstilähde '
footer: '[ESC] Lopeta harjoitus [Backspace] Poista' footer: '[ESC] Lopeta harjoitus [Backspace] Poista'
keys_reenabled: 'Näppäimet palautettu %{ms}ms:ssa' keys_reenabled: 'Näppäimet palautettu %{ms}ms:ssa'
hint_end: '[ESC] Lopeta harjoitus' hint_end: 'Lopeta harjoitus'
hint_backspace: '[Backspace] Poista' hint_backspace: 'Poista'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} oikein)' correct_detail: ' (%{correct}/%{total} oikein)'
input_blocked: ' Syöte estetty väliaikaisesti ' input_blocked: ' Syöte estetty väliaikaisesti '
input_blocked_ms: '(%{ms}ms jäljellä)' input_blocked_ms: '(%{ms}ms jäljellä)'
hint_continue: '[c/Enter/Space] Jatka' hint_continue: 'Jatka'
hint_retry: '[r] Uudelleen' hint_retry: 'Uudelleen'
hint_menu: '[q] Valikko' hint_menu: 'Valikko'
hint_stats: '[s] Tilastot' hint_stats: 'Tilastot'
hint_delete: '[x] Poista' hint_delete: 'Poista'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Tarkkuus' tab_accuracy: '[4] Tarkkuus'
tab_timing: '[5] Ajoitus' tab_timing: '[5] Ajoitus'
tab_ngrams: '[6] N-grammit' tab_ngrams: '[6] N-grammit'
hint_back: '[ESC] Takaisin' hint_back: 'Takaisin'
hint_next_tab: '[Tab] Seuraava välilehti' hint_next_tab: 'Seuraava välilehti'
hint_switch_tab: '[1-6] Vaihda välilehteä' hint_switch_tab: 'Vaihda välilehteä'
hint_navigate: '[j/k] Navigoi' hint_navigate: 'Navigoi'
hint_page: '[PgUp/PgDn] Sivu' hint_page: 'Sivu'
hint_delete: '[x] Poista' hint_delete: 'Poista'
summary_title: ' Yhteenveto ' summary_title: ' Yhteenveto '
drills: ' Harjoitukset: ' drills: ' Harjoitukset: '
avg_wpm: ' Ka WPM: ' avg_wpm: ' Ka WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Tuontipolku' import_path: 'Tuontipolku'
import_data: 'Tuo data' import_data: 'Tuo data'
import_now: 'Tuo nyt' import_now: 'Tuo nyt'
hint_save_back: '[ESC] Tallenna ja takaisin' hint_save_back: 'Tallenna ja takaisin'
hint_change_value: '[Enter/nuolet] Muuta arvoa' hint_change_value: 'Muuta arvoa'
hint_edit_path: '[Enter polulla] Muokkaa' hint_edit_path: 'Muokkaa'
hint_move: '[←→] Siirrä' hint_move: 'Siirrä'
hint_tab_complete: '[Tab] Täydennä (lopussa)' hint_tab_complete: 'Täydennä (lopussa)'
hint_confirm: '[Enter] Vahvista' hint_confirm: 'Vahvista'
hint_cancel: '[Esc] Peruuta' hint_cancel: 'Peruuta'
success_title: ' Onnistui ' success_title: ' Onnistui '
error_title: ' Virhe ' error_title: ' Virhe '
press_any_key: 'Paina mitä tahansa näppäintä' press_any_key: 'Paina mitä tahansa näppäintä'
@@ -236,9 +236,9 @@ select:
cached: ' (välimuistissa)' cached: ' (välimuistissa)'
disabled_download: ' (pois käytöstä: lataus vaaditaan)' disabled_download: ' (pois käytöstä: lataus vaaditaan)'
download_required: ' (lataus vaaditaan)' download_required: ' (lataus vaaditaan)'
hint_navigate: '[Ylös/Alas/PgUp/PgDn] Navigoi' hint_navigate: 'Navigoi'
hint_confirm: '[Enter] Vahvista' hint_confirm: 'Vahvista'
hint_back: '[ESC] Takaisin' hint_back: 'Takaisin'
language_resets_layout: 'Kielen valinta palauttaa näppäinasettelun kielen oletukseen.' language_resets_layout: 'Kielen valinta palauttaa näppäinasettelun kielen oletukseen.'
layout_no_language_change: 'Asettelun muutos ei vaihda sanakirjan kieltä.' 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.' 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: 'Taso %{current}/%{total}'
level_zero: 'Taso 0/%{total}' level_zero: 'Taso 0/%{total}'
in_focus: ' fokuksessa' in_focus: ' fokuksessa'
hint_navigate: '[↑↓/jk] Navigoi' hint_navigate: 'Navigoi'
hint_scroll: '[PgUp/PgDn tai Ctrl+U/Ctrl+D] Vieritä' hint_scroll: 'Vieritä'
hint_back: '[q] Takaisin' hint_back: 'Takaisin'
hint_unlock: '[Enter] Avaa' hint_unlock: 'Avaa'
hint_start_drill: '[Enter] Aloita harjoitus' 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_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.' unlock_msg_2: 'Jos haluat keskittyä vain tähän haaraan, aloita harjoitus suoraan taitopuusta.'
confirm_unlock: 'Avaa %{branch}?' confirm_unlock: 'Avaa %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Jokainen näppäin näppäimistöllä on maksimivarmuudella.' 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.' mastery_takes_practice: 'Hallinta ei ole päämäärä — se vaatii jatkuvaa harjoittelua.'
keep_drilling: 'Jatka harjoittelua säilyttääksesi taitosi.' 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' hint_any_key: 'Paina mitä tahansa näppäintä jatkaaksesi'
input_blocked: 'Syöte estetty väliaikaisesti (%{ms}ms jäljellä)' input_blocked: 'Syöte estetty väliaikaisesti (%{ms}ms jäljellä)'
unlock_msg_1: 'Hienoa! Jatka kirjoitustaitojesi kehittämistä.' unlock_msg_1: 'Hienoa! Jatka kirjoitustaitojesi kehittämistä.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Lihasmuisti lukittuna!' mastery_msg_3: 'Lihasmuisti lukittuna!'
mastery_msg_4: 'Taas yksi näppäin valloitettu!' 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 explorer
keyboard: keyboard:
title: ' Näppäimistö ' title: ' Näppäimistö '
subtitle: 'Paina mitä tahansa näppäintä tai klikkaa näppäintä' subtitle: 'Paina mitä tahansa näppäintä tai klikkaa näppäintä'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigoi' hint_navigate: 'Navigoi'
hint_back: '[q/ESC] Takaisin' hint_back: 'Takaisin'
key_label: 'Näppäin: ' key_label: 'Näppäin: '
finger_label: 'Sormi: ' finger_label: 'Sormi: '
hand_left: 'Vasen' hand_left: 'Vasen'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Aloita tekstiharjoitus' start_passage_drill: 'Aloita tekstiharjoitus'
start_code_drill: 'Aloita koodiharjoitus' start_code_drill: 'Aloita koodiharjoitus'
confirm: 'Vahvista' confirm: 'Vahvista'
hint_navigate: '[Ylös/Alas] Navigoi' hint_navigate: 'Navigoi'
hint_adjust: '[Vasen/Oikea] Säädä' hint_adjust: 'Säädä'
hint_edit: '[Kirjoita/Backspace] Muokkaa' hint_edit: 'Muokkaa'
hint_confirm: '[Enter] Vahvista' hint_confirm: 'Vahvista'
hint_cancel: '[ESC] Peruuta' hint_cancel: 'Peruuta'
preparing_download: 'Valmistellaan latausta...' preparing_download: 'Valmistellaan latausta...'
download_passage_title: ' Ladataan tekstilähdettä ' download_passage_title: ' Ladataan tekstilähdettä '
download_code_title: ' Ladataan koodilähdettä ' download_code_title: ' Ladataan koodilähdettä '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configurer keydr' settings_desc: 'Configurer keydr'
day_streak: ' | %{days} jours consécutifs' day_streak: ' | %{days} jours consécutifs'
key_progress: ' Progression %{unlocked}/%{total} (%{mastered} maîtrisées) | Objectif %{target} WPM%{streak}' key_progress: ' Progression %{unlocked}/%{total} (%{mastered} maîtrisées) | Objectif %{target} WPM%{streak}'
hint_start: '[1-3] Démarrer' hint_start: 'Démarrer'
hint_skill_tree: '[t] Arbre de Compétences' hint_skill_tree: 'Arbre de Compétences'
hint_keyboard: '[b] Clavier' hint_keyboard: 'Clavier'
hint_stats: '[s] Statistiques' hint_stats: 'Statistiques'
hint_settings: '[c] Paramètres' hint_settings: 'Paramètres'
hint_quit: '[q] Quitter' hint_quit: 'Quitter'
# Écran d'exercice # Écran d'exercice
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Source du passage ' passage_source: ' Source du passage '
footer: '[ESC] Fin [Backspace] Effacer' footer: '[ESC] Fin [Backspace] Effacer'
keys_reenabled: 'Touches réactivées en %{ms}ms' keys_reenabled: 'Touches réactivées en %{ms}ms'
hint_end: '[ESC] Fin de l''exercice' hint_end: 'Fin de l''exercice'
hint_backspace: '[Backspace] Effacer' hint_backspace: 'Effacer'
# Tableau de bord / résultat de l'exercice # Tableau de bord / résultat de l'exercice
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} corrects)' correct_detail: ' (%{correct}/%{total} corrects)'
input_blocked: ' Saisie temporairement bloquée ' input_blocked: ' Saisie temporairement bloquée '
input_blocked_ms: '(%{ms}ms restantes)' input_blocked_ms: '(%{ms}ms restantes)'
hint_continue: '[c/Enter/Space] Continuer' hint_continue: 'Continuer'
hint_retry: '[r] Réessayer' hint_retry: 'Réessayer'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statistiques' hint_stats: 'Statistiques'
hint_delete: '[x] Supprimer' hint_delete: 'Supprimer'
# Barre latérale de statistiques (pendant l'exercice) # Barre latérale de statistiques (pendant l'exercice)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Précision' tab_accuracy: '[4] Précision'
tab_timing: '[5] Chronométrage' tab_timing: '[5] Chronométrage'
tab_ngrams: '[6] N-grammes' tab_ngrams: '[6] N-grammes'
hint_back: '[ESC] Retour' hint_back: 'Retour'
hint_next_tab: '[Tab] Onglet suivant' hint_next_tab: 'Onglet suivant'
hint_switch_tab: '[1-6] Changer d''onglet' hint_switch_tab: 'Changer d''onglet'
hint_navigate: '[j/k] Naviguer' hint_navigate: 'Naviguer'
hint_page: '[PgUp/PgDn] Défiler' hint_page: 'Défiler'
hint_delete: '[x] Supprimer' hint_delete: 'Supprimer'
summary_title: ' Résumé ' summary_title: ' Résumé '
drills: ' Exercices : ' drills: ' Exercices : '
avg_wpm: ' WPM Moy : ' avg_wpm: ' WPM Moy : '
@@ -200,13 +200,13 @@ settings:
import_path: 'Chemin d''Import' import_path: 'Chemin d''Import'
import_data: 'Importer les Données' import_data: 'Importer les Données'
import_now: 'Importer maintenant' import_now: 'Importer maintenant'
hint_save_back: '[ESC] Sauvegarder et retour' hint_save_back: 'Sauvegarder et retour'
hint_change_value: '[Enter/flèches] Changer la valeur' hint_change_value: 'Changer la valeur'
hint_edit_path: '[Enter sur chemin] Éditer' hint_edit_path: 'Éditer'
hint_move: '[←→] Déplacer' hint_move: 'Déplacer'
hint_tab_complete: '[Tab] Compléter (à la fin)' hint_tab_complete: 'Compléter (à la fin)'
hint_confirm: '[Enter] Confirmer' hint_confirm: 'Confirmer'
hint_cancel: '[Esc] Annuler' hint_cancel: 'Annuler'
success_title: ' Succès ' success_title: ' Succès '
error_title: ' Erreur ' error_title: ' Erreur '
press_any_key: 'Appuyez sur une touche' press_any_key: 'Appuyez sur une touche'
@@ -236,9 +236,9 @@ select:
cached: ' (en cache)' cached: ' (en cache)'
disabled_download: ' (désactivé : téléchargement requis)' disabled_download: ' (désactivé : téléchargement requis)'
download_required: ' (téléchargement requis)' download_required: ' (téléchargement requis)'
hint_navigate: '[Up/Down/PgUp/PgDn] Naviguer' hint_navigate: 'Naviguer'
hint_confirm: '[Enter] Confirmer' hint_confirm: 'Confirmer'
hint_back: '[ESC] Retour' hint_back: 'Retour'
language_resets_layout: 'Sélectionner une langue réinitialise la disposition à celle par défaut de cette langue.' 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.' 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.' 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: 'Niveau %{current}/%{total}'
level_zero: 'Niveau 0/%{total}' level_zero: 'Niveau 0/%{total}'
in_focus: ' en focus' in_focus: ' en focus'
hint_navigate: '[↑↓/jk] Naviguer' hint_navigate: 'Naviguer'
hint_scroll: '[PgUp/PgDn ou Ctrl+U/Ctrl+D] Défiler' hint_scroll: 'Défiler'
hint_back: '[q] Retour' hint_back: 'Retour'
hint_unlock: '[Enter] Déverrouiller' hint_unlock: 'Déverrouiller'
hint_start_drill: '[Enter] Lancer l''Exercice' 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_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.' 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} ?' confirm_unlock: 'Déverrouiller %{branch} ?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Chaque touche du clavier est à confiance maximale.' 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.' 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.' 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' hint_any_key: 'Appuyez sur une touche pour continuer'
input_blocked: 'Saisie temporairement bloquée (%{ms}ms restantes)' input_blocked: 'Saisie temporairement bloquée (%{ms}ms restantes)'
unlock_msg_1: 'Bon travail ! Continuez à améliorer vos compétences.' 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_3: 'Mémoire musculaire acquise !'
mastery_msg_4: 'Une touche de plus conquise !' 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 # Explorateur de clavier
keyboard: keyboard:
title: ' Clavier ' title: ' Clavier '
subtitle: 'Appuyez ou cliquez sur une touche' subtitle: 'Appuyez ou cliquez sur une touche'
hint_navigate: '[←→↑↓/hjkl/Tab] Naviguer' hint_navigate: 'Naviguer'
hint_back: '[q/ESC] Retour' hint_back: 'Retour'
key_label: 'Touche : ' key_label: 'Touche : '
finger_label: 'Doigt : ' finger_label: 'Doigt : '
hand_left: 'Gauche' hand_left: 'Gauche'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Lancer l''exercice de passage' start_passage_drill: 'Lancer l''exercice de passage'
start_code_drill: 'Lancer l''exercice de code' start_code_drill: 'Lancer l''exercice de code'
confirm: 'Confirmer' confirm: 'Confirmer'
hint_navigate: '[Up/Down] Naviguer' hint_navigate: 'Naviguer'
hint_adjust: '[Left/Right] Ajuster' hint_adjust: 'Ajuster'
hint_edit: '[Type/Backspace] Éditer' hint_edit: 'Éditer'
hint_confirm: '[Enter] Confirmer' hint_confirm: 'Confirmer'
hint_cancel: '[ESC] Annuler' hint_cancel: 'Annuler'
preparing_download: 'Préparation du téléchargement...' preparing_download: 'Préparation du téléchargement...'
download_passage_title: ' Téléchargement de la Source de Passage ' download_passage_title: ' Téléchargement de la Source de Passage '
download_code_title: ' Téléchargement de la Source de Code ' download_code_title: ' Téléchargement de la Source de Code '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigurirajte keydr' settings_desc: 'Konfigurirajte keydr'
day_streak: ' | %{days} dana zaredom' day_streak: ' | %{days} dana zaredom'
key_progress: ' Napredak tipki %{unlocked}/%{total} (%{mastered} savladano) | Cilj %{target} WPM%{streak}' key_progress: ' Napredak tipki %{unlocked}/%{total} (%{mastered} savladano) | Cilj %{target} WPM%{streak}'
hint_start: '[1-3] Pokreni' hint_start: 'Pokreni'
hint_skill_tree: '[t] Stablo vještina' hint_skill_tree: 'Stablo vještina'
hint_keyboard: '[b] Tipkovnica' hint_keyboard: 'Tipkovnica'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_settings: '[c] Postavke' hint_settings: 'Postavke'
hint_quit: '[q] Izlaz' hint_quit: 'Izlaz'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Izvor teksta ' passage_source: ' Izvor teksta '
footer: '[ESC] Završi vježbu [Backspace] Obriši' footer: '[ESC] Završi vježbu [Backspace] Obriši'
keys_reenabled: 'Tipke ponovo aktivne za %{ms}ms' keys_reenabled: 'Tipke ponovo aktivne za %{ms}ms'
hint_end: '[ESC] Završi vježbu' hint_end: 'Završi vježbu'
hint_backspace: '[Backspace] Obriši' hint_backspace: 'Obriši'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} točno)' correct_detail: ' (%{correct}/%{total} točno)'
input_blocked: ' Unos privremeno blokiran ' input_blocked: ' Unos privremeno blokiran '
input_blocked_ms: '(%{ms}ms preostalo)' input_blocked_ms: '(%{ms}ms preostalo)'
hint_continue: '[c/Enter/Space] Nastavi' hint_continue: 'Nastavi'
hint_retry: '[r] Ponovi' hint_retry: 'Ponovi'
hint_menu: '[q] Izbornik' hint_menu: 'Izbornik'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_delete: '[x] Obriši' hint_delete: 'Obriši'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Točnost' tab_accuracy: '[4] Točnost'
tab_timing: '[5] Tajming' tab_timing: '[5] Tajming'
tab_ngrams: '[6] N-grami' tab_ngrams: '[6] N-grami'
hint_back: '[ESC] Natrag' hint_back: 'Natrag'
hint_next_tab: '[Tab] Sljedeća kartica' hint_next_tab: 'Sljedeća kartica'
hint_switch_tab: '[1-6] Kartica' hint_switch_tab: 'Kartica'
hint_navigate: '[j/k] Navigacija' hint_navigate: 'Navigacija'
hint_page: '[PgUp/PgDn] Stranica' hint_page: 'Stranica'
hint_delete: '[x] Obriši' hint_delete: 'Obriši'
summary_title: ' Sažetak ' summary_title: ' Sažetak '
drills: ' Vježbe: ' drills: ' Vježbe: '
avg_wpm: ' Prosj. WPM: ' avg_wpm: ' Prosj. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Putanja uvoza' import_path: 'Putanja uvoza'
import_data: 'Uvezi podatke' import_data: 'Uvezi podatke'
import_now: 'Uvezi sada' import_now: 'Uvezi sada'
hint_save_back: '[ESC] Spremi i natrag' hint_save_back: 'Spremi i natrag'
hint_change_value: '[Enter/strelice] Promijeni' hint_change_value: 'Promijeni'
hint_edit_path: '[Enter na putanju] Uredi' hint_edit_path: 'Uredi'
hint_move: '[←→] Pomakni' hint_move: 'Pomakni'
hint_tab_complete: '[Tab] Dovrši (na kraju)' hint_tab_complete: 'Dovrši (na kraju)'
hint_confirm: '[Enter] Potvrdi' hint_confirm: 'Potvrdi'
hint_cancel: '[Esc] Odustani' hint_cancel: 'Odustani'
success_title: ' Uspjeh ' success_title: ' Uspjeh '
error_title: ' Greška ' error_title: ' Greška '
press_any_key: 'Pritisnite bilo koju tipku' press_any_key: 'Pritisnite bilo koju tipku'
@@ -236,9 +236,9 @@ select:
cached: ' (u predmemoriji)' cached: ' (u predmemoriji)'
disabled_download: ' (onemogućeno: potrebno preuzimanje)' disabled_download: ' (onemogućeno: potrebno preuzimanje)'
download_required: ' (potrebno preuzimanje)' download_required: ' (potrebno preuzimanje)'
hint_navigate: '[Gore/Dolje/PgUp/PgDn] Navigacija' hint_navigate: 'Navigacija'
hint_confirm: '[Enter] Potvrdi' hint_confirm: 'Potvrdi'
hint_back: '[ESC] Natrag' hint_back: 'Natrag'
language_resets_layout: 'Odabir jezika resetira raspored tipkovnice na zadani za taj jezik.' language_resets_layout: 'Odabir jezika resetira raspored tipkovnice na zadani za taj jezik.'
layout_no_language_change: 'Promjena rasporeda ne mijenja jezik rječnika.' 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.' 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: 'Razina %{current}/%{total}'
level_zero: 'Razina 0/%{total}' level_zero: 'Razina 0/%{total}'
in_focus: ' u fokusu' in_focus: ' u fokusu'
hint_navigate: '[↑↓/jk] Navigacija' hint_navigate: 'Navigacija'
hint_scroll: '[PgUp/PgDn ili Ctrl+U/Ctrl+D] Pomicanje' hint_scroll: 'Pomicanje'
hint_back: '[q] Natrag' hint_back: 'Natrag'
hint_unlock: '[Enter] Otključaj' hint_unlock: 'Otključaj'
hint_start_drill: '[Enter] Pokreni vježbu' 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_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.' 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}?' confirm_unlock: 'Otključati %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Svaka tipka na tipkovnici je na maksimalnoj razini pouzdanosti.' all_mastered_desc: 'Svaka tipka na tipkovnici je na maksimalnoj razini pouzdanosti.'
mastery_takes_practice: 'Majstorstvo nije odredište — zahtijeva stalnu vježbu.' mastery_takes_practice: 'Majstorstvo nije odredište — zahtijeva stalnu vježbu.'
keep_drilling: 'Nastavite vježbati kako biste održali formu.' 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' hint_any_key: 'Pritisnite bilo koju tipku za nastavak'
input_blocked: 'Unos privremeno blokiran (%{ms}ms preostalo)' input_blocked: 'Unos privremeno blokiran (%{ms}ms preostalo)'
unlock_msg_1: 'Odličan posao! Nastavite graditi vještine tipkanja.' 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_3: 'Mišićna memorija zaključana!'
mastery_msg_4: 'Još jedna tipka osvojena!' 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 explorer
keyboard: keyboard:
title: ' Tipkovnica ' title: ' Tipkovnica '
subtitle: 'Pritisnite bilo koju tipku ili kliknite tipku' subtitle: 'Pritisnite bilo koju tipku ili kliknite tipku'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' hint_navigate: 'Navigacija'
hint_back: '[q/ESC] Natrag' hint_back: 'Natrag'
key_label: 'Tipka: ' key_label: 'Tipka: '
finger_label: 'Prst: ' finger_label: 'Prst: '
hand_left: 'Lijeva' hand_left: 'Lijeva'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Pokreni vježbu teksta' start_passage_drill: 'Pokreni vježbu teksta'
start_code_drill: 'Pokreni vježbu koda' start_code_drill: 'Pokreni vježbu koda'
confirm: 'Potvrdi' confirm: 'Potvrdi'
hint_navigate: '[Gore/Dolje] Navigacija' hint_navigate: 'Navigacija'
hint_adjust: '[Lijevo/Desno] Prilagodi' hint_adjust: 'Prilagodi'
hint_edit: '[Tipkanje/Backspace] Uredi' hint_edit: 'Uredi'
hint_confirm: '[Enter] Potvrdi' hint_confirm: 'Potvrdi'
hint_cancel: '[ESC] Odustani' hint_cancel: 'Odustani'
preparing_download: 'Priprema preuzimanja...' preparing_download: 'Priprema preuzimanja...'
download_passage_title: ' Preuzimanje izvora teksta ' download_passage_title: ' Preuzimanje izvora teksta '
download_code_title: ' Preuzimanje izvora koda ' download_code_title: ' Preuzimanje izvora koda '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'keydr konfigurálása' settings_desc: 'keydr konfigurálása'
day_streak: ' | %{days} napos sorozat' day_streak: ' | %{days} napos sorozat'
key_progress: ' Billentyűhaladás %{unlocked}/%{total} (%{mastered} elsajátítva) | Cél %{target} WPM%{streak}' key_progress: ' Billentyűhaladás %{unlocked}/%{total} (%{mastered} elsajátítva) | Cél %{target} WPM%{streak}'
hint_start: '[1-3] Indítás' hint_start: 'Indítás'
hint_skill_tree: '[t] Képességfa' hint_skill_tree: 'Képességfa'
hint_keyboard: '[b] Billentyűzet' hint_keyboard: 'Billentyűzet'
hint_stats: '[s] Statisztika' hint_stats: 'Statisztika'
hint_settings: '[c] Beállítások' hint_settings: 'Beállítások'
hint_quit: '[q] Kilépés' hint_quit: 'Kilépés'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Szövegforrás ' passage_source: ' Szövegforrás '
footer: '[ESC] Gyakorlat vége [Backspace] Törlés' footer: '[ESC] Gyakorlat vége [Backspace] Törlés'
keys_reenabled: 'Billentyűk újra aktívak %{ms}ms múlva' keys_reenabled: 'Billentyűk újra aktívak %{ms}ms múlva'
hint_end: '[ESC] Gyakorlat vége' hint_end: 'Gyakorlat vége'
hint_backspace: '[Backspace] Törlés' hint_backspace: 'Törlés'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} helyes)' correct_detail: ' (%{correct}/%{total} helyes)'
input_blocked: ' Bevitel ideiglenesen blokkolva ' input_blocked: ' Bevitel ideiglenesen blokkolva '
input_blocked_ms: '(%{ms}ms hátra)' input_blocked_ms: '(%{ms}ms hátra)'
hint_continue: '[c/Enter/Space] Tovább' hint_continue: 'Tovább'
hint_retry: '[r] Újra' hint_retry: 'Újra'
hint_menu: '[q] Menü' hint_menu: 'Menü'
hint_stats: '[s] Statisztika' hint_stats: 'Statisztika'
hint_delete: '[x] Törlés' hint_delete: 'Törlés'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Pontosság' tab_accuracy: '[4] Pontosság'
tab_timing: '[5] Időzítés' tab_timing: '[5] Időzítés'
tab_ngrams: '[6] N-gramok' tab_ngrams: '[6] N-gramok'
hint_back: '[ESC] Vissza' hint_back: 'Vissza'
hint_next_tab: '[Tab] Következő fül' hint_next_tab: 'Következő fül'
hint_switch_tab: '[1-6] Fül váltás' hint_switch_tab: 'Fül váltás'
hint_navigate: '[j/k] Navigáció' hint_navigate: 'Navigáció'
hint_page: '[PgUp/PgDn] Lap' hint_page: 'Lap'
hint_delete: '[x] Törlés' hint_delete: 'Törlés'
summary_title: ' Összefoglaló ' summary_title: ' Összefoglaló '
drills: ' Gyakorlatok: ' drills: ' Gyakorlatok: '
avg_wpm: ' Átl. WPM: ' avg_wpm: ' Átl. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importálási útvonal' import_path: 'Importálási útvonal'
import_data: 'Adatok importálása' import_data: 'Adatok importálása'
import_now: 'Importálás most' import_now: 'Importálás most'
hint_save_back: '[ESC] Mentés és vissza' hint_save_back: 'Mentés és vissza'
hint_change_value: '[Enter/nyilak] Érték módosítása' hint_change_value: 'Érték módosítása'
hint_edit_path: '[Enter az útvonalon] Szerkesztés' hint_edit_path: 'Szerkesztés'
hint_move: '[←→] Mozgatás' hint_move: 'Mozgatás'
hint_tab_complete: '[Tab] Kiegészítés (végén)' hint_tab_complete: 'Kiegészítés (végén)'
hint_confirm: '[Enter] Megerősítés' hint_confirm: 'Megerősítés'
hint_cancel: '[Esc] Mégse' hint_cancel: 'Mégse'
success_title: ' Sikeres ' success_title: ' Sikeres '
error_title: ' Hiba ' error_title: ' Hiba '
press_any_key: 'Nyomjon egy billentyűt' press_any_key: 'Nyomjon egy billentyűt'
@@ -236,9 +236,9 @@ select:
cached: ' (gyorsítótárazva)' cached: ' (gyorsítótárazva)'
disabled_download: ' (letiltva: letöltés szükséges)' disabled_download: ' (letiltva: letöltés szükséges)'
download_required: ' (letöltés szükséges)' download_required: ' (letöltés szükséges)'
hint_navigate: '[Fel/Le/PgUp/PgDn] Navigáció' hint_navigate: 'Navigáció'
hint_confirm: '[Enter] Megerősítés' hint_confirm: 'Megerősítés'
hint_back: '[ESC] Vissza' 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.' 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.' 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.' 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: 'Szint %{current}/%{total}'
level_zero: 'Szint 0/%{total}' level_zero: 'Szint 0/%{total}'
in_focus: ' fókuszban' in_focus: ' fókuszban'
hint_navigate: '[↑↓/jk] Navigáció' hint_navigate: 'Navigáció'
hint_scroll: '[PgUp/PgDn vagy Ctrl+U/Ctrl+D] Görgetés' hint_scroll: 'Görgetés'
hint_back: '[q] Vissza' hint_back: 'Vissza'
hint_unlock: '[Enter] Feloldás' hint_unlock: 'Feloldás'
hint_start_drill: '[Enter] Gyakorlat indítása' 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_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.' 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?' 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ú.' 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.' 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.' 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' hint_any_key: 'Nyomjon bármely billentyűt a folytatáshoz'
input_blocked: 'Bevitel ideiglenesen blokkolva (%{ms}ms hátra)' input_blocked: 'Bevitel ideiglenesen blokkolva (%{ms}ms hátra)'
unlock_msg_1: 'Szép munka! Fejlessze tovább gépelési készségeit.' 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_3: 'Izommemória rögzítve!'
mastery_msg_4: 'Még egy billentyű meghódítva!' 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 explorer
keyboard: keyboard:
title: ' Billentyűzet ' title: ' Billentyűzet '
subtitle: 'Nyomjon meg bármely billentyűt vagy kattintson' subtitle: 'Nyomjon meg bármely billentyűt vagy kattintson'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigáció' hint_navigate: 'Navigáció'
hint_back: '[q/ESC] Vissza' hint_back: 'Vissza'
key_label: 'Billentyű: ' key_label: 'Billentyű: '
finger_label: 'Ujj: ' finger_label: 'Ujj: '
hand_left: 'Bal' hand_left: 'Bal'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Szöveg gyakorlat indítása' start_passage_drill: 'Szöveg gyakorlat indítása'
start_code_drill: 'Kód gyakorlat indítása' start_code_drill: 'Kód gyakorlat indítása'
confirm: 'Megerősítés' confirm: 'Megerősítés'
hint_navigate: '[Fel/Le] Navigáció' hint_navigate: 'Navigáció'
hint_adjust: '[Bal/Jobb] Állítás' hint_adjust: 'Állítás'
hint_edit: '[Gépelés/Backspace] Szerkesztés' hint_edit: 'Szerkesztés'
hint_confirm: '[Enter] Megerősítés' hint_confirm: 'Megerősítés'
hint_cancel: '[ESC] Mégse' hint_cancel: 'Mégse'
preparing_download: 'Letöltés előkészítése...' preparing_download: 'Letöltés előkészítése...'
download_passage_title: ' Szövegforrás letöltése ' download_passage_title: ' Szövegforrás letöltése '
download_code_title: ' Kódforrás letöltése ' download_code_title: ' Kódforrás letöltése '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configura keydr' settings_desc: 'Configura keydr'
day_streak: ' | %{days} giorni consecutivi' day_streak: ' | %{days} giorni consecutivi'
key_progress: ' Progresso Tasti %{unlocked}/%{total} (%{mastered} padroneggiati) | Obiettivo %{target} WPM%{streak}' key_progress: ' Progresso Tasti %{unlocked}/%{total} (%{mastered} padroneggiati) | Obiettivo %{target} WPM%{streak}'
hint_start: '[1-3] Avvia' hint_start: 'Avvia'
hint_skill_tree: '[t] Albero delle Abilità' hint_skill_tree: 'Albero delle Abilità'
hint_keyboard: '[b] Tastiera' hint_keyboard: 'Tastiera'
hint_stats: '[s] Statistiche' hint_stats: 'Statistiche'
hint_settings: '[c] Impostazioni' hint_settings: 'Impostazioni'
hint_quit: '[q] Esci' hint_quit: 'Esci'
# Schermata esercizio # Schermata esercizio
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Sorgente brano ' passage_source: ' Sorgente brano '
footer: '[ESC] Fine [Backspace] Cancella' footer: '[ESC] Fine [Backspace] Cancella'
keys_reenabled: 'Tasti riattivati in %{ms}ms' keys_reenabled: 'Tasti riattivati in %{ms}ms'
hint_end: '[ESC] Fine esercizio' hint_end: 'Fine esercizio'
hint_backspace: '[Backspace] Cancella' hint_backspace: 'Cancella'
# Pannello / risultato dell'esercizio # Pannello / risultato dell'esercizio
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} corretti)' correct_detail: ' (%{correct}/%{total} corretti)'
input_blocked: ' Input temporaneamente bloccato ' input_blocked: ' Input temporaneamente bloccato '
input_blocked_ms: '(%{ms}ms rimanenti)' input_blocked_ms: '(%{ms}ms rimanenti)'
hint_continue: '[c/Enter/Space] Continua' hint_continue: 'Continua'
hint_retry: '[r] Riprova' hint_retry: 'Riprova'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statistiche' hint_stats: 'Statistiche'
hint_delete: '[x] Elimina' hint_delete: 'Elimina'
# Barra laterale statistiche (durante l'esercizio) # Barra laterale statistiche (durante l'esercizio)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Precisione' tab_accuracy: '[4] Precisione'
tab_timing: '[5] Tempistica' tab_timing: '[5] Tempistica'
tab_ngrams: '[6] N-grammi' tab_ngrams: '[6] N-grammi'
hint_back: '[ESC] Indietro' hint_back: 'Indietro'
hint_next_tab: '[Tab] Scheda successiva' hint_next_tab: 'Scheda successiva'
hint_switch_tab: '[1-6] Cambia scheda' hint_switch_tab: 'Cambia scheda'
hint_navigate: '[j/k] Naviga' hint_navigate: 'Naviga'
hint_page: '[PgUp/PgDn] Pagina' hint_page: 'Pagina'
hint_delete: '[x] Elimina' hint_delete: 'Elimina'
summary_title: ' Riepilogo ' summary_title: ' Riepilogo '
drills: ' Esercizi: ' drills: ' Esercizi: '
avg_wpm: ' WPM Med: ' avg_wpm: ' WPM Med: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Percorso di Importazione' import_path: 'Percorso di Importazione'
import_data: 'Importa Dati' import_data: 'Importa Dati'
import_now: 'Importa ora' import_now: 'Importa ora'
hint_save_back: '[ESC] Salva e indietro' hint_save_back: 'Salva e indietro'
hint_change_value: '[Enter/frecce] Cambia valore' hint_change_value: 'Cambia valore'
hint_edit_path: '[Enter su percorso] Modifica' hint_edit_path: 'Modifica'
hint_move: '[←→] Sposta' hint_move: 'Sposta'
hint_tab_complete: '[Tab] Completa (alla fine)' hint_tab_complete: 'Completa (alla fine)'
hint_confirm: '[Enter] Conferma' hint_confirm: 'Conferma'
hint_cancel: '[Esc] Annulla' hint_cancel: 'Annulla'
success_title: ' Successo ' success_title: ' Successo '
error_title: ' Errore ' error_title: ' Errore '
press_any_key: 'Premi un tasto qualsiasi' press_any_key: 'Premi un tasto qualsiasi'
@@ -236,9 +236,9 @@ select:
cached: ' (in cache)' cached: ' (in cache)'
disabled_download: ' (disattivato: download richiesto)' disabled_download: ' (disattivato: download richiesto)'
download_required: ' (download richiesto)' download_required: ' (download richiesto)'
hint_navigate: '[Up/Down/PgUp/PgDn] Naviga' hint_navigate: 'Naviga'
hint_confirm: '[Enter] Conferma' hint_confirm: 'Conferma'
hint_back: '[ESC] Indietro' hint_back: 'Indietro'
language_resets_layout: 'Selezionare una lingua reimposta il layout a quello predefinito di quella lingua.' 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.' 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.' disabled_network_notice: 'Alcune lingue sono disattivate: attiva i download in intro/impostazioni.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Livello %{current}/%{total}' level: 'Livello %{current}/%{total}'
level_zero: 'Livello 0/%{total}' level_zero: 'Livello 0/%{total}'
in_focus: ' in focus' in_focus: ' in focus'
hint_navigate: '[↑↓/jk] Naviga' hint_navigate: 'Naviga'
hint_scroll: '[PgUp/PgDn o Ctrl+U/Ctrl+D] Scorri' hint_scroll: 'Scorri'
hint_back: '[q] Indietro' hint_back: 'Indietro'
hint_unlock: '[Enter] Sblocca' hint_unlock: 'Sblocca'
hint_start_drill: '[Enter] Avvia Esercizio' 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_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à.' 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}?' confirm_unlock: 'Sbloccare %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Ogni tasto della tastiera è a confidenza massima.' all_mastered_desc: 'Ogni tasto della tastiera è a confidenza massima.'
mastery_takes_practice: 'La padronanza non è una destinazione — richiede pratica continua.' mastery_takes_practice: 'La padronanza non è una destinazione — richiede pratica continua.'
keep_drilling: 'Continua ad esercitarti per mantenere il tuo livello.' 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' hint_any_key: 'Premi un tasto qualsiasi per continuare'
input_blocked: 'Input temporaneamente bloccato (%{ms}ms rimanenti)' input_blocked: 'Input temporaneamente bloccato (%{ms}ms rimanenti)'
unlock_msg_1: 'Ottimo lavoro! Continua a migliorare le tue abilità.' unlock_msg_1: 'Ottimo lavoro! Continua a migliorare le tue abilità.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Memoria muscolare acquisita!' mastery_msg_3: 'Memoria muscolare acquisita!'
mastery_msg_4: 'Un altro tasto conquistato!' 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 # Esploratore tastiera
keyboard: keyboard:
title: ' Tastiera ' title: ' Tastiera '
subtitle: 'Premi o clicca su un tasto' subtitle: 'Premi o clicca su un tasto'
hint_navigate: '[←→↑↓/hjkl/Tab] Naviga' hint_navigate: 'Naviga'
hint_back: '[q/ESC] Indietro' hint_back: 'Indietro'
key_label: 'Tasto: ' key_label: 'Tasto: '
finger_label: 'Dito: ' finger_label: 'Dito: '
hand_left: 'Sinistra' hand_left: 'Sinistra'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Avvia esercizio di brano' start_passage_drill: 'Avvia esercizio di brano'
start_code_drill: 'Avvia esercizio di codice' start_code_drill: 'Avvia esercizio di codice'
confirm: 'Conferma' confirm: 'Conferma'
hint_navigate: '[Up/Down] Naviga' hint_navigate: 'Naviga'
hint_adjust: '[Left/Right] Regola' hint_adjust: 'Regola'
hint_edit: '[Type/Backspace] Modifica' hint_edit: 'Modifica'
hint_confirm: '[Enter] Conferma' hint_confirm: 'Conferma'
hint_cancel: '[ESC] Annulla' hint_cancel: 'Annulla'
preparing_download: 'Preparazione download...' preparing_download: 'Preparazione download...'
download_passage_title: ' Download Sorgente Brano ' download_passage_title: ' Download Sorgente Brano '
download_code_title: ' Download Sorgente Codice ' download_code_title: ' Download Sorgente Codice '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigūruokite keydr' settings_desc: 'Konfigūruokite keydr'
day_streak: ' | %{days} d. serija' day_streak: ' | %{days} d. serija'
key_progress: ' Klavišų pažanga %{unlocked}/%{total} (%{mastered} įvaldyta) | Tikslas %{target} WPM%{streak}' key_progress: ' Klavišų pažanga %{unlocked}/%{total} (%{mastered} įvaldyta) | Tikslas %{target} WPM%{streak}'
hint_start: '[1-3] Pradėti' hint_start: 'Pradėti'
hint_skill_tree: '[t] Įgūdžių medis' hint_skill_tree: 'Įgūdžių medis'
hint_keyboard: '[b] Klaviatūra' hint_keyboard: 'Klaviatūra'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_settings: '[c] Nustatymai' hint_settings: 'Nustatymai'
hint_quit: '[q] Išeiti' hint_quit: 'Išeiti'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Teksto šaltinis ' passage_source: ' Teksto šaltinis '
footer: '[ESC] Baigti pratybas [Backspace] Trinti' footer: '[ESC] Baigti pratybas [Backspace] Trinti'
keys_reenabled: 'Klavišai vėl aktyvūs po %{ms}ms' keys_reenabled: 'Klavišai vėl aktyvūs po %{ms}ms'
hint_end: '[ESC] Baigti pratybas' hint_end: 'Baigti pratybas'
hint_backspace: '[Backspace] Trinti' hint_backspace: 'Trinti'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} teisingai)' correct_detail: ' (%{correct}/%{total} teisingai)'
input_blocked: ' Įvestis laikinai blokuota ' input_blocked: ' Įvestis laikinai blokuota '
input_blocked_ms: '(%{ms}ms liko)' input_blocked_ms: '(%{ms}ms liko)'
hint_continue: '[c/Enter/Space] Tęsti' hint_continue: 'Tęsti'
hint_retry: '[r] Iš naujo' hint_retry: 'Iš naujo'
hint_menu: '[q] Meniu' hint_menu: 'Meniu'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_delete: '[x] Trinti' hint_delete: 'Trinti'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Tikslumas' tab_accuracy: '[4] Tikslumas'
tab_timing: '[5] Laikas' tab_timing: '[5] Laikas'
tab_ngrams: '[6] N-gramos' tab_ngrams: '[6] N-gramos'
hint_back: '[ESC] Atgal' hint_back: 'Atgal'
hint_next_tab: '[Tab] Kita kortelė' hint_next_tab: 'Kita kortelė'
hint_switch_tab: '[1-6] Kortelė' hint_switch_tab: 'Kortelė'
hint_navigate: '[j/k] Navigacija' hint_navigate: 'Navigacija'
hint_page: '[PgUp/PgDn] Puslapis' hint_page: 'Puslapis'
hint_delete: '[x] Trinti' hint_delete: 'Trinti'
summary_title: ' Santrauka ' summary_title: ' Santrauka '
drills: ' Pratybos: ' drills: ' Pratybos: '
avg_wpm: ' Vid. WPM: ' avg_wpm: ' Vid. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importo kelias' import_path: 'Importo kelias'
import_data: 'Importuoti duomenis' import_data: 'Importuoti duomenis'
import_now: 'Importuoti dabar' import_now: 'Importuoti dabar'
hint_save_back: '[ESC] Išsaugoti ir atgal' hint_save_back: 'Išsaugoti ir atgal'
hint_change_value: '[Enter/rodyklės] Keisti reikšmę' hint_change_value: 'Keisti reikšmę'
hint_edit_path: '[Enter ant kelio] Redaguoti' hint_edit_path: 'Redaguoti'
hint_move: '[←→] Judėti' hint_move: 'Judėti'
hint_tab_complete: '[Tab] Užbaigti (gale)' hint_tab_complete: 'Užbaigti (gale)'
hint_confirm: '[Enter] Patvirtinti' hint_confirm: 'Patvirtinti'
hint_cancel: '[Esc] Atšaukti' hint_cancel: 'Atšaukti'
success_title: ' Sėkmė ' success_title: ' Sėkmė '
error_title: ' Klaida ' error_title: ' Klaida '
press_any_key: 'Paspauskite bet kurį klavišą' press_any_key: 'Paspauskite bet kurį klavišą'
@@ -236,9 +236,9 @@ select:
cached: ' (podėlyje)' cached: ' (podėlyje)'
disabled_download: ' (išjungta: reikia atsisiųsti)' disabled_download: ' (išjungta: reikia atsisiųsti)'
download_required: ' (reikia atsisiųsti)' download_required: ' (reikia atsisiųsti)'
hint_navigate: '[Aukštyn/Žemyn/PgUp/PgDn] Navigacija' hint_navigate: 'Navigacija'
hint_confirm: '[Enter] Patvirtinti' hint_confirm: 'Patvirtinti'
hint_back: '[ESC] Atgal' hint_back: 'Atgal'
language_resets_layout: 'Kalbos pasirinkimas atstato klaviatūros išdėstymą į tos kalbos numatytąjį.' 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.' 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.' disabled_network_notice: 'Kai kurios kalbos išjungtos: įjunkite tinklo atsisiuntimus įvade/nustatymuose.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Lygis %{current}/%{total}' level: 'Lygis %{current}/%{total}'
level_zero: 'Lygis 0/%{total}' level_zero: 'Lygis 0/%{total}'
in_focus: ' fokuse' in_focus: ' fokuse'
hint_navigate: '[↑↓/jk] Navigacija' hint_navigate: 'Navigacija'
hint_scroll: '[PgUp/PgDn arba Ctrl+U/Ctrl+D] Slinkti' hint_scroll: 'Slinkti'
hint_back: '[q] Atgal' hint_back: 'Atgal'
hint_unlock: '[Enter] Atrakinti' hint_unlock: 'Atrakinti'
hint_start_drill: '[Enter] Pradėti pratybas' hint_start_drill: 'Pradėti pratybas'
unlock_msg_1: 'Atrakinus, numatytosios adaptyvios pratybos įtrauks šios šakos atrakintus klavišus.' 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.' 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}?' confirm_unlock: 'Atrakinti %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Kiekvienas klaviatūros klavišas yra maksimalaus patikimumo.' all_mastered_desc: 'Kiekvienas klaviatūros klavišas yra maksimalaus patikimumo.'
mastery_takes_practice: 'Meistriškumas nėra tikslas — jis reikalauja nuolatinės praktikos.' mastery_takes_practice: 'Meistriškumas nėra tikslas — jis reikalauja nuolatinės praktikos.'
keep_drilling: 'Tęskite pratybas, kad išlaikytumėte formą.' 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' hint_any_key: 'Paspauskite bet kurį klavišą tęsti'
input_blocked: 'Įvestis laikinai blokuota (%{ms}ms liko)' input_blocked: 'Įvestis laikinai blokuota (%{ms}ms liko)'
unlock_msg_1: 'Puiku! Toliau tobulinkite spausdinimo įgūdžius.' unlock_msg_1: 'Puiku! Toliau tobulinkite spausdinimo įgūdžius.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Raumenų atmintis užfiksuota!' mastery_msg_3: 'Raumenų atmintis užfiksuota!'
mastery_msg_4: 'Dar vienas klavišas užkariauta!' 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 explorer
keyboard: keyboard:
title: ' Klaviatūra ' title: ' Klaviatūra '
subtitle: 'Paspauskite bet kurį klavišą arba spustelėkite' subtitle: 'Paspauskite bet kurį klavišą arba spustelėkite'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' hint_navigate: 'Navigacija'
hint_back: '[q/ESC] Atgal' hint_back: 'Atgal'
key_label: 'Klavišas: ' key_label: 'Klavišas: '
finger_label: 'Pirštas: ' finger_label: 'Pirštas: '
hand_left: 'Kairė' hand_left: 'Kairė'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Pradėti teksto pratybas' start_passage_drill: 'Pradėti teksto pratybas'
start_code_drill: 'Pradėti kodo pratybas' start_code_drill: 'Pradėti kodo pratybas'
confirm: 'Patvirtinti' confirm: 'Patvirtinti'
hint_navigate: '[Aukštyn/Žemyn] Navigacija' hint_navigate: 'Navigacija'
hint_adjust: '[Kairėn/Dešinėn] Reguliuoti' hint_adjust: 'Reguliuoti'
hint_edit: '[Rašymas/Backspace] Redaguoti' hint_edit: 'Redaguoti'
hint_confirm: '[Enter] Patvirtinti' hint_confirm: 'Patvirtinti'
hint_cancel: '[ESC] Atšaukti' hint_cancel: 'Atšaukti'
preparing_download: 'Ruošiamas atsisiuntimas...' preparing_download: 'Ruošiamas atsisiuntimas...'
download_passage_title: ' Atsisiunčiamas teksto šaltinis ' download_passage_title: ' Atsisiunčiamas teksto šaltinis '
download_code_title: ' Atsisiunčiamas kodo šaltinis ' download_code_title: ' Atsisiunčiamas kodo šaltinis '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigurēt keydr' settings_desc: 'Konfigurēt keydr'
day_streak: ' | %{days} dienu sērija' day_streak: ' | %{days} dienu sērija'
key_progress: ' Taustiņu progress %{unlocked}/%{total} (%{mastered} apgūti) | Mērķis %{target} WPM%{streak}' key_progress: ' Taustiņu progress %{unlocked}/%{total} (%{mastered} apgūti) | Mērķis %{target} WPM%{streak}'
hint_start: '[1-3] Sākt' hint_start: 'Sākt'
hint_skill_tree: '[t] Prasmju koks' hint_skill_tree: 'Prasmju koks'
hint_keyboard: '[b] Tastatūra' hint_keyboard: 'Tastatūra'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_settings: '[c] Iestatījumi' hint_settings: 'Iestatījumi'
hint_quit: '[q] Iziet' hint_quit: 'Iziet'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Teksta avots ' passage_source: ' Teksta avots '
footer: '[ESC] Beigt vingrinājumu [Backspace] Dzēst' footer: '[ESC] Beigt vingrinājumu [Backspace] Dzēst'
keys_reenabled: 'Taustiņi atkal aktīvi pēc %{ms}ms' keys_reenabled: 'Taustiņi atkal aktīvi pēc %{ms}ms'
hint_end: '[ESC] Beigt vingrinājumu' hint_end: 'Beigt vingrinājumu'
hint_backspace: '[Backspace] Dzēst' hint_backspace: 'Dzēst'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} pareizi)' correct_detail: ' (%{correct}/%{total} pareizi)'
input_blocked: ' Ievade īslaicīgi bloķēta ' input_blocked: ' Ievade īslaicīgi bloķēta '
input_blocked_ms: '(%{ms}ms atlicis)' input_blocked_ms: '(%{ms}ms atlicis)'
hint_continue: '[c/Enter/Space] Turpināt' hint_continue: 'Turpināt'
hint_retry: '[r] Atkārtot' hint_retry: 'Atkārtot'
hint_menu: '[q] Izvēlne' hint_menu: 'Izvēlne'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_delete: '[x] Dzēst' hint_delete: 'Dzēst'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Precizitāte' tab_accuracy: '[4] Precizitāte'
tab_timing: '[5] Laiki' tab_timing: '[5] Laiki'
tab_ngrams: '[6] N-gramas' tab_ngrams: '[6] N-gramas'
hint_back: '[ESC] Atpakaļ' hint_back: 'Atpakaļ'
hint_next_tab: '[Tab] Nākamā cilne' hint_next_tab: 'Nākamā cilne'
hint_switch_tab: '[1-6] Cilne' hint_switch_tab: 'Cilne'
hint_navigate: '[j/k] Navigācija' hint_navigate: 'Navigācija'
hint_page: '[PgUp/PgDn] Lapa' hint_page: 'Lapa'
hint_delete: '[x] Dzēst' hint_delete: 'Dzēst'
summary_title: ' Kopsavilkums ' summary_title: ' Kopsavilkums '
drills: ' Vingrinājumi: ' drills: ' Vingrinājumi: '
avg_wpm: ' Vid. WPM: ' avg_wpm: ' Vid. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importa ceļš' import_path: 'Importa ceļš'
import_data: 'Importēt datus' import_data: 'Importēt datus'
import_now: 'Importēt tagad' import_now: 'Importēt tagad'
hint_save_back: '[ESC] Saglabāt un atpakaļ' hint_save_back: 'Saglabāt un atpakaļ'
hint_change_value: '[Enter/bultiņas] Mainīt vērtību' hint_change_value: 'Mainīt vērtību'
hint_edit_path: '[Enter uz ceļa] Rediģēt' hint_edit_path: 'Rediģēt'
hint_move: '[←→] Pārvietot' hint_move: 'Pārvietot'
hint_tab_complete: '[Tab] Pabeigt (beigās)' hint_tab_complete: 'Pabeigt (beigās)'
hint_confirm: '[Enter] Apstiprināt' hint_confirm: 'Apstiprināt'
hint_cancel: '[Esc] Atcelt' hint_cancel: 'Atcelt'
success_title: ' Veiksmīgi ' success_title: ' Veiksmīgi '
error_title: ' Kļūda ' error_title: ' Kļūda '
press_any_key: 'Nospiediet jebkuru taustiņu' press_any_key: 'Nospiediet jebkuru taustiņu'
@@ -236,9 +236,9 @@ select:
cached: ' (kešots)' cached: ' (kešots)'
disabled_download: ' (atspējots: nepieciešama lejupielāde)' disabled_download: ' (atspējots: nepieciešama lejupielāde)'
download_required: ' (nepieciešama lejupielāde)' download_required: ' (nepieciešama lejupielāde)'
hint_navigate: '[Augšup/Lejup/PgUp/PgDn] Navigācija' hint_navigate: 'Navigācija'
hint_confirm: '[Enter] Apstiprināt' hint_confirm: 'Apstiprināt'
hint_back: '[ESC] Atpakaļ' hint_back: 'Atpakaļ'
language_resets_layout: 'Valodas izvēle atjauno tastatūras izkārtojumu uz šīs valodas noklusējumu.' 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.' 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.' 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: 'Līmenis %{current}/%{total}'
level_zero: 'Līmenis 0/%{total}' level_zero: 'Līmenis 0/%{total}'
in_focus: ' fokusā' in_focus: ' fokusā'
hint_navigate: '[↑↓/jk] Navigācija' hint_navigate: 'Navigācija'
hint_scroll: '[PgUp/PgDn vai Ctrl+U/Ctrl+D] Ritināt' hint_scroll: 'Ritināt'
hint_back: '[q] Atpakaļ' hint_back: 'Atpakaļ'
hint_unlock: '[Enter] Atbloķēt' hint_unlock: 'Atbloķēt'
hint_start_drill: '[Enter] Sākt vingrinājumu' 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_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.' 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}?' confirm_unlock: 'Atbloķēt %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Katrs tastatūras taustiņš ir maksimālā uzticamībā.' 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.' mastery_takes_practice: 'Meistarība nav galamērķis — tā prasa pastāvīgu praksi.'
keep_drilling: 'Turpiniet vingrinājumus, lai uzturētu formu.' 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' hint_any_key: 'Nospiediet jebkuru taustiņu lai turpinātu'
input_blocked: 'Ievade īslaicīgi bloķēta (%{ms}ms atlicis)' input_blocked: 'Ievade īslaicīgi bloķēta (%{ms}ms atlicis)'
unlock_msg_1: 'Lielisks darbs! Turpiniet veidot rakstīšanas prasmes.' 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_3: 'Muskuļu atmiņa nostiprināta!'
mastery_msg_4: 'Vēl viens taustiņš iekarots!' 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 explorer
keyboard: keyboard:
title: ' Tastatūra ' title: ' Tastatūra '
subtitle: 'Nospiediet jebkuru taustiņu vai noklikšķiniet' subtitle: 'Nospiediet jebkuru taustiņu vai noklikšķiniet'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigācija' hint_navigate: 'Navigācija'
hint_back: '[q/ESC] Atpakaļ' hint_back: 'Atpakaļ'
key_label: 'Taustiņš: ' key_label: 'Taustiņš: '
finger_label: 'Pirksts: ' finger_label: 'Pirksts: '
hand_left: 'Kreisā' hand_left: 'Kreisā'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Sākt teksta vingrinājumu' start_passage_drill: 'Sākt teksta vingrinājumu'
start_code_drill: 'Sākt koda vingrinājumu' start_code_drill: 'Sākt koda vingrinājumu'
confirm: 'Apstiprināt' confirm: 'Apstiprināt'
hint_navigate: '[Augšup/Lejup] Navigācija' hint_navigate: 'Navigācija'
hint_adjust: '[Pa kreisi/Pa labi] Pielāgot' hint_adjust: 'Pielāgot'
hint_edit: '[Rakstīšana/Backspace] Rediģēt' hint_edit: 'Rediģēt'
hint_confirm: '[Enter] Apstiprināt' hint_confirm: 'Apstiprināt'
hint_cancel: '[ESC] Atcelt' hint_cancel: 'Atcelt'
preparing_download: 'Gatavo lejupielādi...' preparing_download: 'Gatavo lejupielādi...'
download_passage_title: ' Lejupielādē teksta avotu ' download_passage_title: ' Lejupielādē teksta avotu '
download_code_title: ' Lejupielādē koda avotu ' download_code_title: ' Lejupielādē koda avotu '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigurer keydr' settings_desc: 'Konfigurer keydr'
day_streak: ' | %{days} dagers rekke' day_streak: ' | %{days} dagers rekke'
key_progress: ' Tastefremgang %{unlocked}/%{total} (%{mastered} mestret) | Maal %{target} WPM%{streak}' key_progress: ' Tastefremgang %{unlocked}/%{total} (%{mastered} mestret) | Maal %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Ferdighetstre' hint_skill_tree: 'Ferdighetstre'
hint_keyboard: '[b] Tastatur' hint_keyboard: 'Tastatur'
hint_stats: '[s] Statistikk' hint_stats: 'Statistikk'
hint_settings: '[c] Innstillinger' hint_settings: 'Innstillinger'
hint_quit: '[q] Avslutt' hint_quit: 'Avslutt'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Tekstkilde ' passage_source: ' Tekstkilde '
footer: '[ESC] Avslutt oevelse [Backspace] Slett' footer: '[ESC] Avslutt oevelse [Backspace] Slett'
keys_reenabled: 'Taster reaktivert etter %{ms}ms' keys_reenabled: 'Taster reaktivert etter %{ms}ms'
hint_end: '[ESC] Avslutt oevelse' hint_end: 'Avslutt oevelse'
hint_backspace: '[Backspace] Slett' hint_backspace: 'Slett'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} korrekte)' correct_detail: ' (%{correct}/%{total} korrekte)'
input_blocked: ' Inndata midlertidig blokkert ' input_blocked: ' Inndata midlertidig blokkert '
input_blocked_ms: '(%{ms}ms gjenstaar)' input_blocked_ms: '(%{ms}ms gjenstaar)'
hint_continue: '[c/Enter/Space] Fortsett' hint_continue: 'Fortsett'
hint_retry: '[r] Proev igjen' hint_retry: 'Proev igjen'
hint_menu: '[q] Meny' hint_menu: 'Meny'
hint_stats: '[s] Statistikk' hint_stats: 'Statistikk'
hint_delete: '[x] Slett' hint_delete: 'Slett'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Noeyaktighet' tab_accuracy: '[4] Noeyaktighet'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-grammer' tab_ngrams: '[6] N-grammer'
hint_back: '[ESC] Tilbake' hint_back: 'Tilbake'
hint_next_tab: '[Tab] Neste fane' hint_next_tab: 'Neste fane'
hint_switch_tab: '[1-6] Bytt fane' hint_switch_tab: 'Bytt fane'
hint_navigate: '[j/k] Naviger' hint_navigate: 'Naviger'
hint_page: '[PgUp/PgDn] Side' hint_page: 'Side'
hint_delete: '[x] Slett' hint_delete: 'Slett'
summary_title: ' Sammendrag ' summary_title: ' Sammendrag '
drills: ' Oevelser: ' drills: ' Oevelser: '
avg_wpm: ' Snitt WPM: ' avg_wpm: ' Snitt WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importsti' import_path: 'Importsti'
import_data: 'Importer data' import_data: 'Importer data'
import_now: 'Importer naa' import_now: 'Importer naa'
hint_save_back: '[ESC] Lagre & tilbake' hint_save_back: 'Lagre & tilbake'
hint_change_value: '[Enter/piler] Endre verdi' hint_change_value: 'Endre verdi'
hint_edit_path: '[Enter paa sti] Rediger' hint_edit_path: 'Rediger'
hint_move: '[←→] Flytt' hint_move: 'Flytt'
hint_tab_complete: '[Tab] Fullfaor (paa slutten)' hint_tab_complete: 'Fullfaor (paa slutten)'
hint_confirm: '[Enter] Bekreft' hint_confirm: 'Bekreft'
hint_cancel: '[Esc] Avbryt' hint_cancel: 'Avbryt'
success_title: ' Suksess ' success_title: ' Suksess '
error_title: ' Feil ' error_title: ' Feil '
press_any_key: 'Trykk paa en tast' press_any_key: 'Trykk paa en tast'
@@ -236,9 +236,9 @@ select:
cached: ' (lagret)' cached: ' (lagret)'
disabled_download: ' (deaktivert: nedlasting kraeves)' disabled_download: ' (deaktivert: nedlasting kraeves)'
download_required: ' (nedlasting kraeves)' download_required: ' (nedlasting kraeves)'
hint_navigate: '[Opp/Ned/PgUp/PgDn] Naviger' hint_navigate: 'Naviger'
hint_confirm: '[Enter] Bekreft' hint_confirm: 'Bekreft'
hint_back: '[ESC] Tilbake' hint_back: 'Tilbake'
language_resets_layout: 'Spraakvalg tilbakestiller tastaturoppsett til spraakets standard.' language_resets_layout: 'Spraakvalg tilbakestiller tastaturoppsett til spraakets standard.'
layout_no_language_change: 'Oppsettendringer endrer ikke ordlistespraaket.' layout_no_language_change: 'Oppsettendringer endrer ikke ordlistespraaket.'
disabled_network_notice: 'Noen spraak er deaktivert: aktiver nettverksnedlastinger i intro/innstillinger.' disabled_network_notice: 'Noen spraak er deaktivert: aktiver nettverksnedlastinger i intro/innstillinger.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Nivaa %{current}/%{total}' level: 'Nivaa %{current}/%{total}'
level_zero: 'Nivaa 0/%{total}' level_zero: 'Nivaa 0/%{total}'
in_focus: ' i fokus' in_focus: ' i fokus'
hint_navigate: '[↑↓/jk] Naviger' hint_navigate: 'Naviger'
hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Rull' hint_scroll: 'Rull'
hint_back: '[q] Tilbake' hint_back: 'Tilbake'
hint_unlock: '[Enter] Laas opp' hint_unlock: 'Laas opp'
hint_start_drill: '[Enter] Start oevelse' hint_start_drill: 'Start oevelse'
unlock_msg_1: 'Etter opplaasing blandes oplaaste taster fra denne grenen inn i den adaptive oevelsen.' 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.' unlock_msg_2: 'Vil du kun oeve denne grenen, start en oevelse direkte fra denne grenen i Ferdighetstreet.'
confirm_unlock: 'Laas opp %{branch}?' confirm_unlock: 'Laas opp %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillit.' all_mastered_desc: 'Hver tast paa tastaturet har maksimal tillit.'
mastery_takes_practice: 'Mestring er ikke et maal — det krever vedvarende oeving.' mastery_takes_practice: 'Mestring er ikke et maal — det krever vedvarende oeving.'
keep_drilling: 'Fortsett aa oeve for aa holde deg skarp.' 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' hint_any_key: 'Trykk paa en tast for aa fortsette'
input_blocked: 'Inndata midlertidig blokkert (%{ms}ms gjenstaar)' input_blocked: 'Inndata midlertidig blokkert (%{ms}ms gjenstaar)'
unlock_msg_1: 'Bra jobbet! Fortsett aa bygge skriveferdighetene dine.' unlock_msg_1: 'Bra jobbet! Fortsett aa bygge skriveferdighetene dine.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Muskelminne forankret!' mastery_msg_3: 'Muskelminne forankret!'
mastery_msg_4: 'Enda en tast erobret!' 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 explorer
keyboard: keyboard:
title: ' Tastatur ' title: ' Tastatur '
subtitle: 'Trykk paa en tast eller klikk paa en tast' subtitle: 'Trykk paa en tast eller klikk paa en tast'
hint_navigate: '[←→↑↓/hjkl/Tab] Naviger' hint_navigate: 'Naviger'
hint_back: '[q/ESC] Tilbake' hint_back: 'Tilbake'
key_label: 'Tast: ' key_label: 'Tast: '
finger_label: 'Finger: ' finger_label: 'Finger: '
hand_left: 'Venstre' hand_left: 'Venstre'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Start tekstoevelse' start_passage_drill: 'Start tekstoevelse'
start_code_drill: 'Start kodeoevelse' start_code_drill: 'Start kodeoevelse'
confirm: 'Bekreft' confirm: 'Bekreft'
hint_navigate: '[Opp/Ned] Naviger' hint_navigate: 'Naviger'
hint_adjust: '[Venstre/Hoeyre] Juster' hint_adjust: 'Juster'
hint_edit: '[Skriv/Backspace] Rediger' hint_edit: 'Rediger'
hint_confirm: '[Enter] Bekreft' hint_confirm: 'Bekreft'
hint_cancel: '[ESC] Avbryt' hint_cancel: 'Avbryt'
preparing_download: 'Forbereder nedlasting...' preparing_download: 'Forbereder nedlasting...'
download_passage_title: ' Laster ned tekstkilde ' download_passage_title: ' Laster ned tekstkilde '
download_code_title: ' Laster ned kodekilde ' download_code_title: ' Laster ned kodekilde '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configureer keydr' settings_desc: 'Configureer keydr'
day_streak: ' | %{days} dagen reeks' day_streak: ' | %{days} dagen reeks'
key_progress: ' Toetsvoortgang %{unlocked}/%{total} (%{mastered} beheerst) | Doel %{target} WPM%{streak}' key_progress: ' Toetsvoortgang %{unlocked}/%{total} (%{mastered} beheerst) | Doel %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Vaardigheidsboom' hint_skill_tree: 'Vaardigheidsboom'
hint_keyboard: '[b] Toetsenbord' hint_keyboard: 'Toetsenbord'
hint_stats: '[s] Statistieken' hint_stats: 'Statistieken'
hint_settings: '[c] Instellingen' hint_settings: 'Instellingen'
hint_quit: '[q] Stoppen' hint_quit: 'Stoppen'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Tekstbron ' passage_source: ' Tekstbron '
footer: '[ESC] Oefening stoppen [Backspace] Wissen' footer: '[ESC] Oefening stoppen [Backspace] Wissen'
keys_reenabled: 'Toetsen weer actief na %{ms}ms' keys_reenabled: 'Toetsen weer actief na %{ms}ms'
hint_end: '[ESC] Oefening stoppen' hint_end: 'Oefening stoppen'
hint_backspace: '[Backspace] Wissen' hint_backspace: 'Wissen'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} juist)' correct_detail: ' (%{correct}/%{total} juist)'
input_blocked: ' Invoer tijdelijk geblokkeerd ' input_blocked: ' Invoer tijdelijk geblokkeerd '
input_blocked_ms: '(%{ms}ms resterend)' input_blocked_ms: '(%{ms}ms resterend)'
hint_continue: '[c/Enter/Space] Doorgaan' hint_continue: 'Doorgaan'
hint_retry: '[r] Opnieuw' hint_retry: 'Opnieuw'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statistieken' hint_stats: 'Statistieken'
hint_delete: '[x] Verwijderen' hint_delete: 'Verwijderen'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Nauwkeurigheid' tab_accuracy: '[4] Nauwkeurigheid'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-grammen' tab_ngrams: '[6] N-grammen'
hint_back: '[ESC] Terug' hint_back: 'Terug'
hint_next_tab: '[Tab] Volgend tabblad' hint_next_tab: 'Volgend tabblad'
hint_switch_tab: '[1-6] Tabblad wisselen' hint_switch_tab: 'Tabblad wisselen'
hint_navigate: '[j/k] Navigeren' hint_navigate: 'Navigeren'
hint_page: '[PgUp/PgDn] Pagina' hint_page: 'Pagina'
hint_delete: '[x] Verwijderen' hint_delete: 'Verwijderen'
summary_title: ' Samenvatting ' summary_title: ' Samenvatting '
drills: ' Oefeningen: ' drills: ' Oefeningen: '
avg_wpm: ' Gem. WPM: ' avg_wpm: ' Gem. WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importpad' import_path: 'Importpad'
import_data: 'Gegevens importeren' import_data: 'Gegevens importeren'
import_now: 'Nu importeren' import_now: 'Nu importeren'
hint_save_back: '[ESC] Opslaan & terug' hint_save_back: 'Opslaan & terug'
hint_change_value: '[Enter/pijltjes] Waarde wijzigen' hint_change_value: 'Waarde wijzigen'
hint_edit_path: '[Enter op pad] Bewerken' hint_edit_path: 'Bewerken'
hint_move: '[←→] Verplaatsen' hint_move: 'Verplaatsen'
hint_tab_complete: '[Tab] Aanvullen (aan einde)' hint_tab_complete: 'Aanvullen (aan einde)'
hint_confirm: '[Enter] Bevestigen' hint_confirm: 'Bevestigen'
hint_cancel: '[Esc] Annuleren' hint_cancel: 'Annuleren'
success_title: ' Geslaagd ' success_title: ' Geslaagd '
error_title: ' Fout ' error_title: ' Fout '
press_any_key: 'Druk op een toets' press_any_key: 'Druk op een toets'
@@ -236,9 +236,9 @@ select:
cached: ' (opgeslagen)' cached: ' (opgeslagen)'
disabled_download: ' (uitgeschakeld: download vereist)' disabled_download: ' (uitgeschakeld: download vereist)'
download_required: ' (download vereist)' download_required: ' (download vereist)'
hint_navigate: '[Omhoog/Omlaag/PgUp/PgDn] Navigeren' hint_navigate: 'Navigeren'
hint_confirm: '[Enter] Bevestigen' hint_confirm: 'Bevestigen'
hint_back: '[ESC] Terug' hint_back: 'Terug'
language_resets_layout: 'Taalselectie herstelt de toetsenbordindeling naar de standaard van die taal.' language_resets_layout: 'Taalselectie herstelt de toetsenbordindeling naar de standaard van die taal.'
layout_no_language_change: 'Indelingswijzigingen veranderen de woordenboektaal niet.' layout_no_language_change: 'Indelingswijzigingen veranderen de woordenboektaal niet.'
disabled_network_notice: 'Sommige talen zijn uitgeschakeld: schakel netwerkdownloads in via intro/instellingen.' disabled_network_notice: 'Sommige talen zijn uitgeschakeld: schakel netwerkdownloads in via intro/instellingen.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Niveau %{current}/%{total}' level: 'Niveau %{current}/%{total}'
level_zero: 'Niveau 0/%{total}' level_zero: 'Niveau 0/%{total}'
in_focus: ' in aandacht' in_focus: ' in aandacht'
hint_navigate: '[↑↓/jk] Navigeren' hint_navigate: 'Navigeren'
hint_scroll: '[PgUp/PgDn of Ctrl+U/Ctrl+D] Scrollen' hint_scroll: 'Scrollen'
hint_back: '[q] Terug' hint_back: 'Terug'
hint_unlock: '[Enter] Ontgrendelen' hint_unlock: 'Ontgrendelen'
hint_start_drill: '[Enter] Oefening starten' hint_start_drill: 'Oefening starten'
unlock_msg_1: 'Na ontgrendeling worden ontgrendelde toetsen van deze tak gemengd in de adaptieve oefening.' 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.' unlock_msg_2: 'Wil je alleen deze tak oefenen, start dan een oefening direct vanuit deze tak in de Vaardigheidsboom.'
confirm_unlock: '%{branch} ontgrendelen?' confirm_unlock: '%{branch} ontgrendelen?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Elke toets op het toetsenbord heeft maximaal vertrouwen.' all_mastered_desc: 'Elke toets op het toetsenbord heeft maximaal vertrouwen.'
mastery_takes_practice: 'Meesterschap is geen bestemming — het vereist voortdurend oefenen.' mastery_takes_practice: 'Meesterschap is geen bestemming — het vereist voortdurend oefenen.'
keep_drilling: 'Blijf oefenen om je niveau te behouden.' 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' hint_any_key: 'Druk op een toets om door te gaan'
input_blocked: 'Invoer tijdelijk geblokkeerd (%{ms}ms resterend)' input_blocked: 'Invoer tijdelijk geblokkeerd (%{ms}ms resterend)'
unlock_msg_1: 'Goed gedaan! Blijf je typvaardigheden opbouwen.' unlock_msg_1: 'Goed gedaan! Blijf je typvaardigheden opbouwen.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Spiergeheugen verankerd!' mastery_msg_3: 'Spiergeheugen verankerd!'
mastery_msg_4: 'Weer een toets veroverd!' 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 explorer
keyboard: keyboard:
title: ' Toetsenbord ' title: ' Toetsenbord '
subtitle: 'Druk op een toets of klik op een toets' subtitle: 'Druk op een toets of klik op een toets'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigeren' hint_navigate: 'Navigeren'
hint_back: '[q/ESC] Terug' hint_back: 'Terug'
key_label: 'Toets: ' key_label: 'Toets: '
finger_label: 'Vinger: ' finger_label: 'Vinger: '
hand_left: 'Links' hand_left: 'Links'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Tekstoefening starten' start_passage_drill: 'Tekstoefening starten'
start_code_drill: 'Code-oefening starten' start_code_drill: 'Code-oefening starten'
confirm: 'Bevestigen' confirm: 'Bevestigen'
hint_navigate: '[Omhoog/Omlaag] Navigeren' hint_navigate: 'Navigeren'
hint_adjust: '[Links/Rechts] Aanpassen' hint_adjust: 'Aanpassen'
hint_edit: '[Typen/Backspace] Bewerken' hint_edit: 'Bewerken'
hint_confirm: '[Enter] Bevestigen' hint_confirm: 'Bevestigen'
hint_cancel: '[ESC] Annuleren' hint_cancel: 'Annuleren'
preparing_download: 'Download wordt voorbereid...' preparing_download: 'Download wordt voorbereid...'
download_passage_title: ' Tekstbron downloaden ' download_passage_title: ' Tekstbron downloaden '
download_code_title: ' Codebron downloaden ' download_code_title: ' Codebron downloaden '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfiguruj keydr' settings_desc: 'Konfiguruj keydr'
day_streak: ' | %{days} dni z rzedu' day_streak: ' | %{days} dni z rzedu'
key_progress: ' Postep klawiszy %{unlocked}/%{total} (%{mastered} opanowanych) | Cel %{target} WPM%{streak}' key_progress: ' Postep klawiszy %{unlocked}/%{total} (%{mastered} opanowanych) | Cel %{target} WPM%{streak}'
hint_start: '[1-3] Rozpocznij' hint_start: 'Rozpocznij'
hint_skill_tree: '[t] Drzewo' hint_skill_tree: 'Drzewo'
hint_keyboard: '[b] Klawiatura' hint_keyboard: 'Klawiatura'
hint_stats: '[s] Statystyki' hint_stats: 'Statystyki'
hint_settings: '[c] Ustawienia' hint_settings: 'Ustawienia'
hint_quit: '[q] Wyjdz' hint_quit: 'Wyjdz'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Zrodlo tekstu ' passage_source: ' Zrodlo tekstu '
footer: '[ESC] Zakoncz trening [Backspace] Usun' footer: '[ESC] Zakoncz trening [Backspace] Usun'
keys_reenabled: 'Klawisze przywrocone w %{ms}ms' keys_reenabled: 'Klawisze przywrocone w %{ms}ms'
hint_end: '[ESC] Zakoncz trening' hint_end: 'Zakoncz trening'
hint_backspace: '[Backspace] Usun' hint_backspace: 'Usun'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} poprawnych)' correct_detail: ' (%{correct}/%{total} poprawnych)'
input_blocked: ' Wejscie tymczasowo zablokowane ' input_blocked: ' Wejscie tymczasowo zablokowane '
input_blocked_ms: '(%{ms}ms pozostalo)' input_blocked_ms: '(%{ms}ms pozostalo)'
hint_continue: '[c/Enter/Space] Kontynuuj' hint_continue: 'Kontynuuj'
hint_retry: '[r] Powtorz' hint_retry: 'Powtorz'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Statystyki' hint_stats: 'Statystyki'
hint_delete: '[x] Usun' hint_delete: 'Usun'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Dokladnosc' tab_accuracy: '[4] Dokladnosc'
tab_timing: '[5] Czas reakcji' tab_timing: '[5] Czas reakcji'
tab_ngrams: '[6] N-gramy' tab_ngrams: '[6] N-gramy'
hint_back: '[ESC] Wstecz' hint_back: 'Wstecz'
hint_next_tab: '[Tab] Nastepna karta' hint_next_tab: 'Nastepna karta'
hint_switch_tab: '[1-6] Zmien karte' hint_switch_tab: 'Zmien karte'
hint_navigate: '[j/k] Nawiguj' hint_navigate: 'Nawiguj'
hint_page: '[PgUp/PgDn] Strona' hint_page: 'Strona'
hint_delete: '[x] Usun' hint_delete: 'Usun'
summary_title: ' Podsumowanie ' summary_title: ' Podsumowanie '
drills: ' Treningi: ' drills: ' Treningi: '
avg_wpm: ' Sr WPM: ' avg_wpm: ' Sr WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Sciezka importu' import_path: 'Sciezka importu'
import_data: 'Importuj dane' import_data: 'Importuj dane'
import_now: 'Importuj teraz' import_now: 'Importuj teraz'
hint_save_back: '[ESC] Zapisz i wstecz' hint_save_back: 'Zapisz i wstecz'
hint_change_value: '[Enter/strzalki] Zmien wartosc' hint_change_value: 'Zmien wartosc'
hint_edit_path: '[Enter na sciezce] Edytuj' hint_edit_path: 'Edytuj'
hint_move: '[←→] Przesun' hint_move: 'Przesun'
hint_tab_complete: '[Tab] Uzupelnij (na koncu)' hint_tab_complete: 'Uzupelnij (na koncu)'
hint_confirm: '[Enter] Potwierdz' hint_confirm: 'Potwierdz'
hint_cancel: '[Esc] Anuluj' hint_cancel: 'Anuluj'
success_title: ' Sukces ' success_title: ' Sukces '
error_title: ' Blad ' error_title: ' Blad '
press_any_key: 'Nacisnij dowolny klawisz' press_any_key: 'Nacisnij dowolny klawisz'
@@ -236,9 +236,9 @@ select:
cached: ' (w pamieci podrecznej)' cached: ' (w pamieci podrecznej)'
disabled_download: ' (wylaczony: wymagane pobranie)' disabled_download: ' (wylaczony: wymagane pobranie)'
download_required: ' (wymagane pobranie)' download_required: ' (wymagane pobranie)'
hint_navigate: '[Gora/Dol/PgUp/PgDn] Nawiguj' hint_navigate: 'Nawiguj'
hint_confirm: '[Enter] Potwierdz' hint_confirm: 'Potwierdz'
hint_back: '[ESC] Wstecz' hint_back: 'Wstecz'
language_resets_layout: 'Wybor jezyka resetuje uklad klawiatury do domyslnego dla tego jezyka.' language_resets_layout: 'Wybor jezyka resetuje uklad klawiatury do domyslnego dla tego jezyka.'
layout_no_language_change: 'Zmiana ukladu nie zmienia jezyka slownika.' layout_no_language_change: 'Zmiana ukladu nie zmienia jezyka slownika.'
disabled_network_notice: 'Niektorej jezyki sa wylaczone: wlacz pobieranie sieciowe w ustawieniach.' disabled_network_notice: 'Niektorej jezyki sa wylaczone: wlacz pobieranie sieciowe w ustawieniach.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Poziom %{current}/%{total}' level: 'Poziom %{current}/%{total}'
level_zero: 'Poziom 0/%{total}' level_zero: 'Poziom 0/%{total}'
in_focus: ' w fokusie' in_focus: ' w fokusie'
hint_navigate: '[↑↓/jk] Nawiguj' hint_navigate: 'Nawiguj'
hint_scroll: '[PgUp/PgDn lub Ctrl+U/Ctrl+D] Przewin' hint_scroll: 'Przewin'
hint_back: '[q] Wstecz' hint_back: 'Wstecz'
hint_unlock: '[Enter] Odblokuj' hint_unlock: 'Odblokuj'
hint_start_drill: '[Enter] Rozpocznij trening' hint_start_drill: 'Rozpocznij trening'
unlock_msg_1: 'Po odblokowaniu domyslny trening adaptacyjny bedzie wlaczal klawisze z tej galezi.' 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.' unlock_msg_2: 'Jesli chcesz skupic sie tylko na tej galezi, uruchom trening bezposrednio z drzewa.'
confirm_unlock: 'Odblokowac %{branch}?' confirm_unlock: 'Odblokowac %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Kazdy klawisz na klawiaturze jest na maksymalnej pewnosci.' all_mastered_desc: 'Kazdy klawisz na klawiaturze jest na maksymalnej pewnosci.'
mastery_takes_practice: 'Bieglosc to nie cel — wymaga ciaglej praktyki.' mastery_takes_practice: 'Bieglosc to nie cel — wymaga ciaglej praktyki.'
keep_drilling: 'Kontynuuj treningi, aby utrzymac swoj poziom.' 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' hint_any_key: 'Nacisnij dowolny klawisz, aby kontynuowac'
input_blocked: 'Wejscie tymczasowo zablokowane (%{ms}ms pozostalo)' input_blocked: 'Wejscie tymczasowo zablokowane (%{ms}ms pozostalo)'
unlock_msg_1: 'Swietna robota! Rozwijaj swoje umiejetnosci pisania.' unlock_msg_1: 'Swietna robota! Rozwijaj swoje umiejetnosci pisania.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Pamiec miesniowa zablokowana!' mastery_msg_3: 'Pamiec miesniowa zablokowana!'
mastery_msg_4: 'Kolejny klawisz podbity!' 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 explorer
keyboard: keyboard:
title: ' Klawiatura ' title: ' Klawiatura '
subtitle: 'Nacisnij dowolny klawisz lub kliknij klawisz' subtitle: 'Nacisnij dowolny klawisz lub kliknij klawisz'
hint_navigate: '[←→↑↓/hjkl/Tab] Nawiguj' hint_navigate: 'Nawiguj'
hint_back: '[q/ESC] Wstecz' hint_back: 'Wstecz'
key_label: 'Klawisz: ' key_label: 'Klawisz: '
finger_label: 'Palec: ' finger_label: 'Palec: '
hand_left: 'Lewy' hand_left: 'Lewy'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Rozpocznij trening tekstu' start_passage_drill: 'Rozpocznij trening tekstu'
start_code_drill: 'Rozpocznij trening kodu' start_code_drill: 'Rozpocznij trening kodu'
confirm: 'Potwierdz' confirm: 'Potwierdz'
hint_navigate: '[Gora/Dol] Nawiguj' hint_navigate: 'Nawiguj'
hint_adjust: '[Lewo/Prawo] Dostosuj' hint_adjust: 'Dostosuj'
hint_edit: '[Pisz/Backspace] Edytuj' hint_edit: 'Edytuj'
hint_confirm: '[Enter] Potwierdz' hint_confirm: 'Potwierdz'
hint_cancel: '[ESC] Anuluj' hint_cancel: 'Anuluj'
preparing_download: 'Przygotowywanie pobierania...' preparing_download: 'Przygotowywanie pobierania...'
download_passage_title: ' Pobieranie zrodla tekstu ' download_passage_title: ' Pobieranie zrodla tekstu '
download_code_title: ' Pobieranie zrodla kodu ' download_code_title: ' Pobieranie zrodla kodu '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configurar keydr' settings_desc: 'Configurar keydr'
day_streak: ' | %{days} dias seguidos' day_streak: ' | %{days} dias seguidos'
key_progress: ' Progresso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Meta %{target} WPM%{streak}' key_progress: ' Progresso de Teclas %{unlocked}/%{total} (%{mastered} dominadas) | Meta %{target} WPM%{streak}'
hint_start: '[1-3] Iniciar' hint_start: 'Iniciar'
hint_skill_tree: '[t] Árvore de Habilidades' hint_skill_tree: 'Árvore de Habilidades'
hint_keyboard: '[b] Teclado' hint_keyboard: 'Teclado'
hint_stats: '[s] Estatísticas' hint_stats: 'Estatísticas'
hint_settings: '[c] Configurações' hint_settings: 'Configurações'
hint_quit: '[q] Sair' hint_quit: 'Sair'
# Tela de exercício # Tela de exercício
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Fonte da passagem ' passage_source: ' Fonte da passagem '
footer: '[ESC] Fim [Backspace] Apagar' footer: '[ESC] Fim [Backspace] Apagar'
keys_reenabled: 'Teclas reativadas em %{ms}ms' keys_reenabled: 'Teclas reativadas em %{ms}ms'
hint_end: '[ESC] Fim do exercício' hint_end: 'Fim do exercício'
hint_backspace: '[Backspace] Apagar' hint_backspace: 'Apagar'
# Painel / resultado do exercício # Painel / resultado do exercício
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} corretos)' correct_detail: ' (%{correct}/%{total} corretos)'
input_blocked: ' Entrada temporariamente bloqueada ' input_blocked: ' Entrada temporariamente bloqueada '
input_blocked_ms: '(%{ms}ms restantes)' input_blocked_ms: '(%{ms}ms restantes)'
hint_continue: '[c/Enter/Space] Continuar' hint_continue: 'Continuar'
hint_retry: '[r] Tentar novamente' hint_retry: 'Tentar novamente'
hint_menu: '[q] Menu' hint_menu: 'Menu'
hint_stats: '[s] Estatísticas' hint_stats: 'Estatísticas'
hint_delete: '[x] Excluir' hint_delete: 'Excluir'
# Barra lateral de estatísticas (durante o exercício) # Barra lateral de estatísticas (durante o exercício)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Precisão' tab_accuracy: '[4] Precisão'
tab_timing: '[5] Cronometragem' tab_timing: '[5] Cronometragem'
tab_ngrams: '[6] N-gramas' tab_ngrams: '[6] N-gramas'
hint_back: '[ESC] Voltar' hint_back: 'Voltar'
hint_next_tab: '[Tab] Próxima aba' hint_next_tab: 'Próxima aba'
hint_switch_tab: '[1-6] Trocar aba' hint_switch_tab: 'Trocar aba'
hint_navigate: '[j/k] Navegar' hint_navigate: 'Navegar'
hint_page: '[PgUp/PgDn] Página' hint_page: 'Página'
hint_delete: '[x] Excluir' hint_delete: 'Excluir'
summary_title: ' Resumo ' summary_title: ' Resumo '
drills: ' Exercícios: ' drills: ' Exercícios: '
avg_wpm: ' WPM Méd: ' avg_wpm: ' WPM Méd: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Caminho de Importação' import_path: 'Caminho de Importação'
import_data: 'Importar Dados' import_data: 'Importar Dados'
import_now: 'Importar agora' import_now: 'Importar agora'
hint_save_back: '[ESC] Salvar e voltar' hint_save_back: 'Salvar e voltar'
hint_change_value: '[Enter/setas] Alterar valor' hint_change_value: 'Alterar valor'
hint_edit_path: '[Enter no caminho] Editar' hint_edit_path: 'Editar'
hint_move: '[←→] Mover' hint_move: 'Mover'
hint_tab_complete: '[Tab] Completar (no final)' hint_tab_complete: 'Completar (no final)'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_cancel: '[Esc] Cancelar' hint_cancel: 'Cancelar'
success_title: ' Sucesso ' success_title: ' Sucesso '
error_title: ' Erro ' error_title: ' Erro '
press_any_key: 'Pressione qualquer tecla' press_any_key: 'Pressione qualquer tecla'
@@ -236,9 +236,9 @@ select:
cached: ' (em cache)' cached: ' (em cache)'
disabled_download: ' (desativado: download necessário)' disabled_download: ' (desativado: download necessário)'
download_required: ' (download necessário)' download_required: ' (download necessário)'
hint_navigate: '[Up/Down/PgUp/PgDn] Navegar' hint_navigate: 'Navegar'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_back: '[ESC] Voltar' hint_back: 'Voltar'
language_resets_layout: 'Selecionar um idioma redefine o layout para o padrão desse idioma.' 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.' 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.' 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: 'Nível %{current}/%{total}'
level_zero: 'Nível 0/%{total}' level_zero: 'Nível 0/%{total}'
in_focus: ' em foco' in_focus: ' em foco'
hint_navigate: '[↑↓/jk] Navegar' hint_navigate: 'Navegar'
hint_scroll: '[PgUp/PgDn ou Ctrl+U/Ctrl+D] Rolar' hint_scroll: 'Rolar'
hint_back: '[q] Voltar' hint_back: 'Voltar'
hint_unlock: '[Enter] Desbloquear' hint_unlock: 'Desbloquear'
hint_start_drill: '[Enter] Iniciar Exercício' 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_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.' unlock_msg_2: 'Se quiser focar apenas neste ramo, inicie um exercício diretamente deste ramo na Árvore de Habilidades.'
confirm_unlock: 'Desbloquear %{branch}?' confirm_unlock: 'Desbloquear %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Cada tecla do teclado está em confiança máxima.' 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.' mastery_takes_practice: 'O domínio não é um destino — requer prática contínua.'
keep_drilling: 'Continue praticando para manter seu nível.' 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' hint_any_key: 'Pressione qualquer tecla para continuar'
input_blocked: 'Entrada temporariamente bloqueada (%{ms}ms restantes)' input_blocked: 'Entrada temporariamente bloqueada (%{ms}ms restantes)'
unlock_msg_1: 'Bom trabalho! Continue melhorando suas habilidades.' unlock_msg_1: 'Bom trabalho! Continue melhorando suas habilidades.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Memória muscular adquirida!' mastery_msg_3: 'Memória muscular adquirida!'
mastery_msg_4: 'Mais uma tecla conquistada!' 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 # Explorador de teclado
keyboard: keyboard:
title: ' Teclado ' title: ' Teclado '
subtitle: 'Pressione ou clique em uma tecla' subtitle: 'Pressione ou clique em uma tecla'
hint_navigate: '[←→↑↓/hjkl/Tab] Navegar' hint_navigate: 'Navegar'
hint_back: '[q/ESC] Voltar' hint_back: 'Voltar'
key_label: 'Tecla: ' key_label: 'Tecla: '
finger_label: 'Dedo: ' finger_label: 'Dedo: '
hand_left: 'Esquerda' hand_left: 'Esquerda'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Iniciar exercício de passagem' start_passage_drill: 'Iniciar exercício de passagem'
start_code_drill: 'Iniciar exercício de código' start_code_drill: 'Iniciar exercício de código'
confirm: 'Confirmar' confirm: 'Confirmar'
hint_navigate: '[Up/Down] Navegar' hint_navigate: 'Navegar'
hint_adjust: '[Left/Right] Ajustar' hint_adjust: 'Ajustar'
hint_edit: '[Type/Backspace] Editar' hint_edit: 'Editar'
hint_confirm: '[Enter] Confirmar' hint_confirm: 'Confirmar'
hint_cancel: '[ESC] Cancelar' hint_cancel: 'Cancelar'
preparing_download: 'Preparando download...' preparing_download: 'Preparando download...'
download_passage_title: ' Baixando Fonte de Passagem ' download_passage_title: ' Baixando Fonte de Passagem '
download_code_title: ' Baixando Fonte de Código ' download_code_title: ' Baixando Fonte de Código '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Configureaza keydr' settings_desc: 'Configureaza keydr'
day_streak: ' | %{days} zile consecutive' day_streak: ' | %{days} zile consecutive'
key_progress: ' Progres taste %{unlocked}/%{total} (%{mastered} stapanite) | Tinta %{target} WPM%{streak}' key_progress: ' Progres taste %{unlocked}/%{total} (%{mastered} stapanite) | Tinta %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Arbore' hint_skill_tree: 'Arbore'
hint_keyboard: '[b] Tastatura' hint_keyboard: 'Tastatura'
hint_stats: '[s] Statistici' hint_stats: 'Statistici'
hint_settings: '[c] Setari' hint_settings: 'Setari'
hint_quit: '[q] Iesire' hint_quit: 'Iesire'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Sursa text ' passage_source: ' Sursa text '
footer: '[ESC] Termina exercitiu [Backspace] Sterge' footer: '[ESC] Termina exercitiu [Backspace] Sterge'
keys_reenabled: 'Taste reactivate in %{ms}ms' keys_reenabled: 'Taste reactivate in %{ms}ms'
hint_end: '[ESC] Termina exercitiu' hint_end: 'Termina exercitiu'
hint_backspace: '[Backspace] Sterge' hint_backspace: 'Sterge'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} corecte)' correct_detail: ' (%{correct}/%{total} corecte)'
input_blocked: ' Intrare blocata temporar ' input_blocked: ' Intrare blocata temporar '
input_blocked_ms: '(%{ms}ms ramas)' input_blocked_ms: '(%{ms}ms ramas)'
hint_continue: '[c/Enter/Space] Continua' hint_continue: 'Continua'
hint_retry: '[r] Reia' hint_retry: 'Reia'
hint_menu: '[q] Meniu' hint_menu: 'Meniu'
hint_stats: '[s] Statistici' hint_stats: 'Statistici'
hint_delete: '[x] Sterge' hint_delete: 'Sterge'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Precizie' tab_accuracy: '[4] Precizie'
tab_timing: '[5] Cronometraj' tab_timing: '[5] Cronometraj'
tab_ngrams: '[6] N-grame' tab_ngrams: '[6] N-grame'
hint_back: '[ESC] Inapoi' hint_back: 'Inapoi'
hint_next_tab: '[Tab] Tab urmator' hint_next_tab: 'Tab urmator'
hint_switch_tab: '[1-6] Schimba tab' hint_switch_tab: 'Schimba tab'
hint_navigate: '[j/k] Navigheaza' hint_navigate: 'Navigheaza'
hint_page: '[PgUp/PgDn] Pagina' hint_page: 'Pagina'
hint_delete: '[x] Sterge' hint_delete: 'Sterge'
summary_title: ' Sumar ' summary_title: ' Sumar '
drills: ' Exercitii: ' drills: ' Exercitii: '
avg_wpm: ' Med WPM: ' avg_wpm: ' Med WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Cale import' import_path: 'Cale import'
import_data: 'Importa date' import_data: 'Importa date'
import_now: 'Importa acum' import_now: 'Importa acum'
hint_save_back: '[ESC] Salveaza si inapoi' hint_save_back: 'Salveaza si inapoi'
hint_change_value: '[Enter/sageti] Schimba valoarea' hint_change_value: 'Schimba valoarea'
hint_edit_path: '[Enter pe cale] Editeaza' hint_edit_path: 'Editeaza'
hint_move: '[←→] Muta' hint_move: 'Muta'
hint_tab_complete: '[Tab] Completeaza (la sfarsit)' hint_tab_complete: 'Completeaza (la sfarsit)'
hint_confirm: '[Enter] Confirma' hint_confirm: 'Confirma'
hint_cancel: '[Esc] Anuleaza' hint_cancel: 'Anuleaza'
success_title: ' Succes ' success_title: ' Succes '
error_title: ' Eroare ' error_title: ' Eroare '
press_any_key: 'Apasa orice tasta' press_any_key: 'Apasa orice tasta'
@@ -236,9 +236,9 @@ select:
cached: ' (in cache)' cached: ' (in cache)'
disabled_download: ' (dezactivat: descarcare necesara)' disabled_download: ' (dezactivat: descarcare necesara)'
download_required: ' (descarcare necesara)' download_required: ' (descarcare necesara)'
hint_navigate: '[Sus/Jos/PgUp/PgDn] Navigheaza' hint_navigate: 'Navigheaza'
hint_confirm: '[Enter] Confirma' hint_confirm: 'Confirma'
hint_back: '[ESC] Inapoi' hint_back: 'Inapoi'
language_resets_layout: 'Selectarea unei limbi reseteaza aranjamentul la implicit pentru acea limba.' language_resets_layout: 'Selectarea unei limbi reseteaza aranjamentul la implicit pentru acea limba.'
layout_no_language_change: 'Schimbarea aranjamentului nu schimba limba dictionarului.' layout_no_language_change: 'Schimbarea aranjamentului nu schimba limba dictionarului.'
disabled_network_notice: 'Unele limbi sunt dezactivate: activeaza descarcarile de retea in setari.' disabled_network_notice: 'Unele limbi sunt dezactivate: activeaza descarcarile de retea in setari.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Nivel %{current}/%{total}' level: 'Nivel %{current}/%{total}'
level_zero: 'Nivel 0/%{total}' level_zero: 'Nivel 0/%{total}'
in_focus: ' in focus' in_focus: ' in focus'
hint_navigate: '[↑↓/jk] Navigheaza' hint_navigate: 'Navigheaza'
hint_scroll: '[PgUp/PgDn sau Ctrl+U/Ctrl+D] Deruleaza' hint_scroll: 'Deruleaza'
hint_back: '[q] Inapoi' hint_back: 'Inapoi'
hint_unlock: '[Enter] Deblocheaza' hint_unlock: 'Deblocheaza'
hint_start_drill: '[Enter] Incepe exercitiu' hint_start_drill: 'Incepe exercitiu'
unlock_msg_1: 'Dupa deblocare, exercitiul adaptiv implicit va include taste din aceasta ramura.' 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.' unlock_msg_2: 'Daca vrei sa te concentrezi doar pe aceasta ramura, lanseaza un exercitiu direct din arbore.'
confirm_unlock: 'Deblocheaza %{branch}?' confirm_unlock: 'Deblocheaza %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Fiecare tasta de pe tastatura este la incredere maxima.' all_mastered_desc: 'Fiecare tasta de pe tastatura este la incredere maxima.'
mastery_takes_practice: 'Stapanirea nu este o destinatie — necesita practica continua.' mastery_takes_practice: 'Stapanirea nu este o destinatie — necesita practica continua.'
keep_drilling: 'Continua sa exersezi pentru a-ti mentine nivelul.' 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' hint_any_key: 'Apasa orice tasta pentru a continua'
input_blocked: 'Intrare blocata temporar (%{ms}ms ramas)' input_blocked: 'Intrare blocata temporar (%{ms}ms ramas)'
unlock_msg_1: 'Bine lucrat! Continua sa-ti dezvolti abilitatile.' unlock_msg_1: 'Bine lucrat! Continua sa-ti dezvolti abilitatile.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Memorie musculara fixata!' mastery_msg_3: 'Memorie musculara fixata!'
mastery_msg_4: 'Inca o tasta cucerita!' 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 explorer
keyboard: keyboard:
title: ' Tastatura ' title: ' Tastatura '
subtitle: 'Apasa orice tasta sau click pe o tasta' subtitle: 'Apasa orice tasta sau click pe o tasta'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigheaza' hint_navigate: 'Navigheaza'
hint_back: '[q/ESC] Inapoi' hint_back: 'Inapoi'
key_label: 'Tasta: ' key_label: 'Tasta: '
finger_label: 'Deget: ' finger_label: 'Deget: '
hand_left: 'Stang' hand_left: 'Stang'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Incepe exercitiu de text' start_passage_drill: 'Incepe exercitiu de text'
start_code_drill: 'Incepe exercitiu de cod' start_code_drill: 'Incepe exercitiu de cod'
confirm: 'Confirma' confirm: 'Confirma'
hint_navigate: '[Sus/Jos] Navigheaza' hint_navigate: 'Navigheaza'
hint_adjust: '[Stanga/Dreapta] Ajusteaza' hint_adjust: 'Ajusteaza'
hint_edit: '[Tasteaza/Backspace] Editeaza' hint_edit: 'Editeaza'
hint_confirm: '[Enter] Confirma' hint_confirm: 'Confirma'
hint_cancel: '[ESC] Anuleaza' hint_cancel: 'Anuleaza'
preparing_download: 'Se pregateste descarcarea...' preparing_download: 'Se pregateste descarcarea...'
download_passage_title: ' Se descarca sursa textului ' download_passage_title: ' Se descarca sursa textului '
download_code_title: ' Se descarca sursa codului ' download_code_title: ' Se descarca sursa codului '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Nastavite keydr' settings_desc: 'Nastavite keydr'
day_streak: ' | %{days} dni zapored' day_streak: ' | %{days} dni zapored'
key_progress: ' Napredek tipk %{unlocked}/%{total} (%{mastered} osvojenih) | Cilj %{target} WPM%{streak}' key_progress: ' Napredek tipk %{unlocked}/%{total} (%{mastered} osvojenih) | Cilj %{target} WPM%{streak}'
hint_start: '[1-3] Začni' hint_start: 'Začni'
hint_skill_tree: '[t] Drevo veščin' hint_skill_tree: 'Drevo veščin'
hint_keyboard: '[b] Tipkovnica' hint_keyboard: 'Tipkovnica'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_settings: '[c] Nastavitve' hint_settings: 'Nastavitve'
hint_quit: '[q] Izhod' hint_quit: 'Izhod'
# Zaslon vaje # Zaslon vaje
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Vir odlomka ' passage_source: ' Vir odlomka '
footer: '[ESC] Končaj vajo [Backspace] Izbriši' footer: '[ESC] Končaj vajo [Backspace] Izbriši'
keys_reenabled: 'Tipke ponovno omogočene čez %{ms}ms' keys_reenabled: 'Tipke ponovno omogočene čez %{ms}ms'
hint_end: '[ESC] Končaj vajo' hint_end: 'Končaj vajo'
hint_backspace: '[Backspace] Izbriši' hint_backspace: 'Izbriši'
# Nadzorna plošča / rezultat vaje # Nadzorna plošča / rezultat vaje
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} pravilnih)' correct_detail: ' (%{correct}/%{total} pravilnih)'
input_blocked: ' Vnos začasno blokiran ' input_blocked: ' Vnos začasno blokiran '
input_blocked_ms: '(še %{ms}ms)' input_blocked_ms: '(še %{ms}ms)'
hint_continue: '[c/Enter/Space] Nadaljuj' hint_continue: 'Nadaljuj'
hint_retry: '[r] Ponovi' hint_retry: 'Ponovi'
hint_menu: '[q] Meni' hint_menu: 'Meni'
hint_stats: '[s] Statistika' hint_stats: 'Statistika'
hint_delete: '[x] Izbriši' hint_delete: 'Izbriši'
# Stranska vrstica statistike (med vajo) # Stranska vrstica statistike (med vajo)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Točnost' tab_accuracy: '[4] Točnost'
tab_timing: '[5] Časi' tab_timing: '[5] Časi'
tab_ngrams: '[6] N-grami' tab_ngrams: '[6] N-grami'
hint_back: '[ESC] Nazaj' hint_back: 'Nazaj'
hint_next_tab: '[Tab] Naslednji zavihek' hint_next_tab: 'Naslednji zavihek'
hint_switch_tab: '[1-6] Preklopi zavihek' hint_switch_tab: 'Preklopi zavihek'
hint_navigate: '[j/k] Navigacija' hint_navigate: 'Navigacija'
hint_page: '[PgUp/PgDn] Stran' hint_page: 'Stran'
hint_delete: '[x] Izbriši' hint_delete: 'Izbriši'
summary_title: ' Povzetek ' summary_title: ' Povzetek '
drills: ' Vaje: ' drills: ' Vaje: '
avg_wpm: ' Povpr WPM: ' avg_wpm: ' Povpr WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Pot uvoza' import_path: 'Pot uvoza'
import_data: 'Uvozi podatke' import_data: 'Uvozi podatke'
import_now: 'Uvozi zdaj' import_now: 'Uvozi zdaj'
hint_save_back: '[ESC] Shrani in nazaj' hint_save_back: 'Shrani in nazaj'
hint_change_value: '[Enter/puščice] Spremeni vrednost' hint_change_value: 'Spremeni vrednost'
hint_edit_path: '[Enter na poti] Uredi' hint_edit_path: 'Uredi'
hint_move: '[←→] Premik' hint_move: 'Premik'
hint_tab_complete: '[Tab] Dopolni (na koncu)' hint_tab_complete: 'Dopolni (na koncu)'
hint_confirm: '[Enter] Potrdi' hint_confirm: 'Potrdi'
hint_cancel: '[Esc] Prekliči' hint_cancel: 'Prekliči'
success_title: ' Uspeh ' success_title: ' Uspeh '
error_title: ' Napaka ' error_title: ' Napaka '
press_any_key: 'Pritisnite katerokoli tipko' press_any_key: 'Pritisnite katerokoli tipko'
@@ -236,9 +236,9 @@ select:
cached: ' (predpomnjeno)' cached: ' (predpomnjeno)'
disabled_download: ' (onemogočeno: potreben prenos)' disabled_download: ' (onemogočeno: potreben prenos)'
download_required: ' (potreben prenos)' download_required: ' (potreben prenos)'
hint_navigate: '[Gor/Dol/PgUp/PgDn] Navigacija' hint_navigate: 'Navigacija'
hint_confirm: '[Enter] Potrdi' hint_confirm: 'Potrdi'
hint_back: '[ESC] Nazaj' hint_back: 'Nazaj'
language_resets_layout: 'Izbira jezika ponastavi razporeditev tipkovnice na privzeto za ta jezik.' language_resets_layout: 'Izbira jezika ponastavi razporeditev tipkovnice na privzeto za ta jezik.'
layout_no_language_change: 'Sprememba razporeditve ne spremeni jezika slovarja.' 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.' 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: 'Raven %{current}/%{total}'
level_zero: 'Raven 0/%{total}' level_zero: 'Raven 0/%{total}'
in_focus: ' v fokusu' in_focus: ' v fokusu'
hint_navigate: '[↑↓/jk] Navigacija' hint_navigate: 'Navigacija'
hint_scroll: '[PgUp/PgDn ali Ctrl+U/Ctrl+D] Pomik' hint_scroll: 'Pomik'
hint_back: '[q] Nazaj' hint_back: 'Nazaj'
hint_unlock: '[Enter] Odkleni' hint_unlock: 'Odkleni'
hint_start_drill: '[Enter] Začni vajo' hint_start_drill: 'Začni vajo'
unlock_msg_1: 'Ko je odklenjena, bo privzeta prilagodljiva vaja vključevala tipke iz te veje.' 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.' unlock_msg_2: 'Če se želite osredotočiti le na to vejo, zaženite vajo neposredno iz drevesa veščin.'
confirm_unlock: 'Odkleniti %{branch}?' confirm_unlock: 'Odkleniti %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Vsaka tipka na tipkovnici je na maksimalnem zaupanju.' all_mastered_desc: 'Vsaka tipka na tipkovnici je na maksimalnem zaupanju.'
mastery_takes_practice: 'Osvojitev ni cilj — zahteva stalno vadbo.' mastery_takes_practice: 'Osvojitev ni cilj — zahteva stalno vadbo.'
keep_drilling: 'Nadaljujte z vajami, da ohranite prednost.' 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' hint_any_key: 'Pritisnite katerokoli tipko za nadaljevanje'
input_blocked: 'Vnos začasno blokiran (še %{ms}ms)' input_blocked: 'Vnos začasno blokiran (še %{ms}ms)'
unlock_msg_1: 'Odlično! Nadaljujte z gradenjem veščin tipkanja.' 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_3: 'Mišični spomin zaklenjen!'
mastery_msg_4: 'Še ena tipka osvojena!' 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 # Raziskovalec tipkovnice
keyboard: keyboard:
title: ' Tipkovnica ' title: ' Tipkovnica '
subtitle: 'Pritisnite ali kliknite tipko' subtitle: 'Pritisnite ali kliknite tipko'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigacija' hint_navigate: 'Navigacija'
hint_back: '[q/ESC] Nazaj' hint_back: 'Nazaj'
key_label: 'Tipka: ' key_label: 'Tipka: '
finger_label: 'Prst: ' finger_label: 'Prst: '
hand_left: 'Leva' hand_left: 'Leva'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Začni vajo odlomkov' start_passage_drill: 'Začni vajo odlomkov'
start_code_drill: 'Začni vajo kode' start_code_drill: 'Začni vajo kode'
confirm: 'Potrdi' confirm: 'Potrdi'
hint_navigate: '[Gor/Dol] Navigacija' hint_navigate: 'Navigacija'
hint_adjust: '[Levo/Desno] Prilagodi' hint_adjust: 'Prilagodi'
hint_edit: '[Tipkanje/Backspace] Uredi' hint_edit: 'Uredi'
hint_confirm: '[Enter] Potrdi' hint_confirm: 'Potrdi'
hint_cancel: '[ESC] Prekliči' hint_cancel: 'Prekliči'
preparing_download: 'Pripravljam prenos...' preparing_download: 'Pripravljam prenos...'
download_passage_title: ' Prenašanje vira odlomkov ' download_passage_title: ' Prenašanje vira odlomkov '
download_code_title: ' Prenašanje vira kode ' download_code_title: ' Prenašanje vira kode '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'Konfigurera keydr' settings_desc: 'Konfigurera keydr'
day_streak: ' | %{days} dagars svit' day_streak: ' | %{days} dagars svit'
key_progress: ' Tangentframsteg %{unlocked}/%{total} (%{mastered} behaerskade) | Maal %{target} WPM%{streak}' key_progress: ' Tangentframsteg %{unlocked}/%{total} (%{mastered} behaerskade) | Maal %{target} WPM%{streak}'
hint_start: '[1-3] Start' hint_start: 'Start'
hint_skill_tree: '[t] Faerdighetstraed' hint_skill_tree: 'Faerdighetstraed'
hint_keyboard: '[b] Tangentbord' hint_keyboard: 'Tangentbord'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_settings: '[c] Installningar' hint_settings: 'Installningar'
hint_quit: '[q] Avsluta' hint_quit: 'Avsluta'
# Drill screen # Drill screen
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Textkaella ' passage_source: ' Textkaella '
footer: '[ESC] Avsluta oevning [Backspace] Radera' footer: '[ESC] Avsluta oevning [Backspace] Radera'
keys_reenabled: 'Tangenter aateraktiverade efter %{ms}ms' keys_reenabled: 'Tangenter aateraktiverade efter %{ms}ms'
hint_end: '[ESC] Avsluta oevning' hint_end: 'Avsluta oevning'
hint_backspace: '[Backspace] Radera' hint_backspace: 'Radera'
# Dashboard / drill result # Dashboard / drill result
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} korrekta)' correct_detail: ' (%{correct}/%{total} korrekta)'
input_blocked: ' Inmatning tillfalligt blockerad ' input_blocked: ' Inmatning tillfalligt blockerad '
input_blocked_ms: '(%{ms}ms aaterstar)' input_blocked_ms: '(%{ms}ms aaterstar)'
hint_continue: '[c/Enter/Space] Fortsaett' hint_continue: 'Fortsaett'
hint_retry: '[r] Foersoek igen' hint_retry: 'Foersoek igen'
hint_menu: '[q] Meny' hint_menu: 'Meny'
hint_stats: '[s] Statistik' hint_stats: 'Statistik'
hint_delete: '[x] Radera' hint_delete: 'Radera'
# Stats sidebar (during drill) # Stats sidebar (during drill)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Noggrannhet' tab_accuracy: '[4] Noggrannhet'
tab_timing: '[5] Timing' tab_timing: '[5] Timing'
tab_ngrams: '[6] N-gram' tab_ngrams: '[6] N-gram'
hint_back: '[ESC] Tillbaka' hint_back: 'Tillbaka'
hint_next_tab: '[Tab] Naesta flik' hint_next_tab: 'Naesta flik'
hint_switch_tab: '[1-6] Byt flik' hint_switch_tab: 'Byt flik'
hint_navigate: '[j/k] Navigera' hint_navigate: 'Navigera'
hint_page: '[PgUp/PgDn] Sida' hint_page: 'Sida'
hint_delete: '[x] Radera' hint_delete: 'Radera'
summary_title: ' Sammanfattning ' summary_title: ' Sammanfattning '
drills: ' Oevningar: ' drills: ' Oevningar: '
avg_wpm: ' Snitt WPM: ' avg_wpm: ' Snitt WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'Importsoekvaeg' import_path: 'Importsoekvaeg'
import_data: 'Importera data' import_data: 'Importera data'
import_now: 'Importera nu' import_now: 'Importera nu'
hint_save_back: '[ESC] Spara & tillbaka' hint_save_back: 'Spara & tillbaka'
hint_change_value: '[Enter/pilar] AEndra vaerde' hint_change_value: 'AEndra vaerde'
hint_edit_path: '[Enter paa soekvaeg] Redigera' hint_edit_path: 'Redigera'
hint_move: '[←→] Flytta' hint_move: 'Flytta'
hint_tab_complete: '[Tab] Komplettera (i slutet)' hint_tab_complete: 'Komplettera (i slutet)'
hint_confirm: '[Enter] Bekraefta' hint_confirm: 'Bekraefta'
hint_cancel: '[Esc] Avbryt' hint_cancel: 'Avbryt'
success_title: ' Lyckades ' success_title: ' Lyckades '
error_title: ' Fel ' error_title: ' Fel '
press_any_key: 'Tryck paa valfri tangent' press_any_key: 'Tryck paa valfri tangent'
@@ -236,9 +236,9 @@ select:
cached: ' (sparad)' cached: ' (sparad)'
disabled_download: ' (inaktiverad: nedladdning kraevs)' disabled_download: ' (inaktiverad: nedladdning kraevs)'
download_required: ' (nedladdning kraevs)' download_required: ' (nedladdning kraevs)'
hint_navigate: '[Upp/Ner/PgUp/PgDn] Navigera' hint_navigate: 'Navigera'
hint_confirm: '[Enter] Bekraefta' hint_confirm: 'Bekraefta'
hint_back: '[ESC] Tillbaka' hint_back: 'Tillbaka'
language_resets_layout: 'Spraakval aaterstaeller tangentbordslayouten till spraakens standard.' language_resets_layout: 'Spraakval aaterstaeller tangentbordslayouten till spraakens standard.'
layout_no_language_change: 'Layoutaendringar aendrar inte ordlistespraaket.' layout_no_language_change: 'Layoutaendringar aendrar inte ordlistespraaket.'
disabled_network_notice: 'Vissa spraak aer inaktiverade: aktivera naetverksnedladdningar i intro/installningar.' disabled_network_notice: 'Vissa spraak aer inaktiverade: aktivera naetverksnedladdningar i intro/installningar.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Nivaa %{current}/%{total}' level: 'Nivaa %{current}/%{total}'
level_zero: 'Nivaa 0/%{total}' level_zero: 'Nivaa 0/%{total}'
in_focus: ' i fokus' in_focus: ' i fokus'
hint_navigate: '[↑↓/jk] Navigera' hint_navigate: 'Navigera'
hint_scroll: '[PgUp/PgDn eller Ctrl+U/Ctrl+D] Scrolla' hint_scroll: 'Scrolla'
hint_back: '[q] Tillbaka' hint_back: 'Tillbaka'
hint_unlock: '[Enter] Laas upp' hint_unlock: 'Laas upp'
hint_start_drill: '[Enter] Starta oevning' hint_start_drill: 'Starta oevning'
unlock_msg_1: 'Efter upplaasning blandas uplaasta tangenter fraan denna gren in i den adaptiva oevningen.' 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.' unlock_msg_2: 'Vill du bara oeva denna gren, starta en oevning direkt fraan denna gren i Faerdighetsgrenen.'
confirm_unlock: 'Laas upp %{branch}?' confirm_unlock: 'Laas upp %{branch}?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Varje tangent paa tangentbordet har maximalt foertroende.' all_mastered_desc: 'Varje tangent paa tangentbordet har maximalt foertroende.'
mastery_takes_practice: 'Behaerskning aer inte en destination — det kraever staendig oevning.' mastery_takes_practice: 'Behaerskning aer inte en destination — det kraever staendig oevning.'
keep_drilling: 'Fortsaett oeva foer att behalla din skaerpa.' 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' hint_any_key: 'Tryck paa valfri tangent foer att fortsaetta'
input_blocked: 'Inmatning tillfalligt blockerad (%{ms}ms aaterstar)' input_blocked: 'Inmatning tillfalligt blockerad (%{ms}ms aaterstar)'
unlock_msg_1: 'Bra jobbat! Fortsaett bygga dina skrivfaerdigheter.' unlock_msg_1: 'Bra jobbat! Fortsaett bygga dina skrivfaerdigheter.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Muskelminne foerankrat!' mastery_msg_3: 'Muskelminne foerankrat!'
mastery_msg_4: 'Annu en tangent eroevrrad!' 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 explorer
keyboard: keyboard:
title: ' Tangentbord ' title: ' Tangentbord '
subtitle: 'Tryck paa en tangent eller klicka paa en tangent' subtitle: 'Tryck paa en tangent eller klicka paa en tangent'
hint_navigate: '[←→↑↓/hjkl/Tab] Navigera' hint_navigate: 'Navigera'
hint_back: '[q/ESC] Tillbaka' hint_back: 'Tillbaka'
key_label: 'Tangent: ' key_label: 'Tangent: '
finger_label: 'Finger: ' finger_label: 'Finger: '
hand_left: 'Vaenster' hand_left: 'Vaenster'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Starta textoevning' start_passage_drill: 'Starta textoevning'
start_code_drill: 'Starta kodoevning' start_code_drill: 'Starta kodoevning'
confirm: 'Bekraefta' confirm: 'Bekraefta'
hint_navigate: '[Upp/Ner] Navigera' hint_navigate: 'Navigera'
hint_adjust: '[Vaenster/Hoeger] Justera' hint_adjust: 'Justera'
hint_edit: '[Skriv/Backspace] Redigera' hint_edit: 'Redigera'
hint_confirm: '[Enter] Bekraefta' hint_confirm: 'Bekraefta'
hint_cancel: '[ESC] Avbryt' hint_cancel: 'Avbryt'
preparing_download: 'Forbereder nedladdning...' preparing_download: 'Forbereder nedladdning...'
download_passage_title: ' Laddar ner textkaella ' download_passage_title: ' Laddar ner textkaella '
download_code_title: ' Laddar ner kodkaella ' download_code_title: ' Laddar ner kodkaella '

View File

@@ -17,12 +17,12 @@ menu:
settings_desc: 'keydr yapılandır' settings_desc: 'keydr yapılandır'
day_streak: ' | %{days} gün seri' day_streak: ' | %{days} gün seri'
key_progress: ' Tuş İlerlemesi %{unlocked}/%{total} (%{mastered} ustalaşmış) | Hedef %{target} WPM%{streak}' key_progress: ' Tuş İlerlemesi %{unlocked}/%{total} (%{mastered} ustalaşmış) | Hedef %{target} WPM%{streak}'
hint_start: '[1-3] Başla' hint_start: 'Başla'
hint_skill_tree: '[t] Yetenek Ağacı' hint_skill_tree: 'Yetenek Ağacı'
hint_keyboard: '[b] Klavye' hint_keyboard: 'Klavye'
hint_stats: '[s] İstatistikler' hint_stats: 'İstatistikler'
hint_settings: '[c] Ayarlar' hint_settings: 'Ayarlar'
hint_quit: '[q] Çıkış' hint_quit: ıkış'
# Alıştırma ekranı # Alıştırma ekranı
drill: drill:
@@ -40,8 +40,8 @@ drill:
passage_source: ' Metin kaynağı ' passage_source: ' Metin kaynağı '
footer: '[ESC] Alıştırmayı bitir [Backspace] Sil' footer: '[ESC] Alıştırmayı bitir [Backspace] Sil'
keys_reenabled: 'Tuşlar %{ms}ms sonra yeniden etkin' keys_reenabled: 'Tuşlar %{ms}ms sonra yeniden etkin'
hint_end: '[ESC] Alıştırmayı bitir' hint_end: 'Alıştırmayı bitir'
hint_backspace: '[Backspace] Sil' hint_backspace: 'Sil'
# Pano / alıştırma sonucu # Pano / alıştırma sonucu
dashboard: dashboard:
@@ -56,11 +56,11 @@ dashboard:
correct_detail: ' (%{correct}/%{total} doğru)' correct_detail: ' (%{correct}/%{total} doğru)'
input_blocked: ' Giriş geçici olarak engellendi ' input_blocked: ' Giriş geçici olarak engellendi '
input_blocked_ms: '(%{ms}ms kaldı)' input_blocked_ms: '(%{ms}ms kaldı)'
hint_continue: '[c/Enter/Space] Devam' hint_continue: 'Devam'
hint_retry: '[r] Tekrar' hint_retry: 'Tekrar'
hint_menu: '[q] Menü' hint_menu: 'Menü'
hint_stats: '[s] İstatistikler' hint_stats: 'İstatistikler'
hint_delete: '[x] Sil' hint_delete: 'Sil'
# İstatistik kenar çubuğu (alıştırma sırasında) # İstatistik kenar çubuğu (alıştırma sırasında)
sidebar: sidebar:
@@ -86,12 +86,12 @@ stats:
tab_accuracy: '[4] Doğruluk' tab_accuracy: '[4] Doğruluk'
tab_timing: '[5] Zamanlama' tab_timing: '[5] Zamanlama'
tab_ngrams: '[6] N-gramlar' tab_ngrams: '[6] N-gramlar'
hint_back: '[ESC] Geri' hint_back: 'Geri'
hint_next_tab: '[Tab] Sonraki sekme' hint_next_tab: 'Sonraki sekme'
hint_switch_tab: '[1-6] Sekme değiştir' hint_switch_tab: 'Sekme değiştir'
hint_navigate: '[j/k] Gezin' hint_navigate: 'Gezin'
hint_page: '[PgUp/PgDn] Sayfa' hint_page: 'Sayfa'
hint_delete: '[x] Sil' hint_delete: 'Sil'
summary_title: ' Özet ' summary_title: ' Özet '
drills: ' Alıştırmalar: ' drills: ' Alıştırmalar: '
avg_wpm: ' Ort WPM: ' avg_wpm: ' Ort WPM: '
@@ -200,13 +200,13 @@ settings:
import_path: 'İçe Aktarma Yolu' import_path: 'İçe Aktarma Yolu'
import_data: 'Veriyi İçe Aktar' import_data: 'Veriyi İçe Aktar'
import_now: 'Şimdi içe aktar' import_now: 'Şimdi içe aktar'
hint_save_back: '[ESC] Kaydet ve geri' hint_save_back: 'Kaydet ve geri'
hint_change_value: '[Enter/oklar] Değer değiştir' hint_change_value: 'Değer değiştir'
hint_edit_path: '[Enter yolda] Düzenle' hint_edit_path: 'Düzenle'
hint_move: '[←→] Taşı' hint_move: 'Taşı'
hint_tab_complete: '[Tab] Tamamla (sonda)' hint_tab_complete: 'Tamamla (sonda)'
hint_confirm: '[Enter] Onayla' hint_confirm: 'Onayla'
hint_cancel: '[Esc] İptal' hint_cancel: 'İptal'
success_title: ' Başarılı ' success_title: ' Başarılı '
error_title: ' Hata ' error_title: ' Hata '
press_any_key: 'Herhangi bir tuşa basın' press_any_key: 'Herhangi bir tuşa basın'
@@ -236,9 +236,9 @@ select:
cached: ' (önbelleğe alınmış)' cached: ' (önbelleğe alınmış)'
disabled_download: ' (devre dışı: indirme gerekli)' disabled_download: ' (devre dışı: indirme gerekli)'
download_required: ' (indirme gerekli)' download_required: ' (indirme gerekli)'
hint_navigate: '[Yukarı/Aşağı/PgUp/PgDn] Gezin' hint_navigate: 'Gezin'
hint_confirm: '[Enter] Onayla' hint_confirm: 'Onayla'
hint_back: '[ESC] Geri' hint_back: 'Geri'
language_resets_layout: 'Dil seçimi, klavye düzenini o dilin varsayılanına sıfırlar.' 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.' 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.' disabled_network_notice: 'Bazı diller devre dışı: giriş/ayarlarda ağ indirmelerini etkinleştirin.'
@@ -267,11 +267,11 @@ skill_tree:
level: 'Seviye %{current}/%{total}' level: 'Seviye %{current}/%{total}'
level_zero: 'Seviye 0/%{total}' level_zero: 'Seviye 0/%{total}'
in_focus: ' odakta' in_focus: ' odakta'
hint_navigate: '[↑↓/jk] Gezin' hint_navigate: 'Gezin'
hint_scroll: '[PgUp/PgDn veya Ctrl+U/Ctrl+D] Kaydır' hint_scroll: 'Kaydır'
hint_back: '[q] Geri' hint_back: 'Geri'
hint_unlock: '[Enter] Aç' hint_unlock: 'Aç'
hint_start_drill: '[Enter] Alıştırma Başlat' 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_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.' 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ı?' confirm_unlock: '%{branch} açılsın mı?'
@@ -328,7 +328,7 @@ milestones:
all_mastered_desc: 'Klavyedeki her tuş maksimum güven seviyesinde.' 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.' 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.' 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' hint_any_key: 'Devam etmek için herhangi bir tuşa basın'
input_blocked: 'Giriş geçici olarak engellendi (%{ms}ms kaldı)' input_blocked: 'Giriş geçici olarak engellendi (%{ms}ms kaldı)'
unlock_msg_1: 'Harika! Yazma becerilerinizi geliştirmeye devam edin.' unlock_msg_1: 'Harika! Yazma becerilerinizi geliştirmeye devam edin.'
@@ -340,12 +340,24 @@ milestones:
mastery_msg_3: 'Kas hafızası kilitlendi!' mastery_msg_3: 'Kas hafızası kilitlendi!'
mastery_msg_4: 'Bir tuş daha fethedildi!' 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 # Klavye gezgini
keyboard: keyboard:
title: ' Klavye ' title: ' Klavye '
subtitle: 'Bir tuşa basın veya tıklayın' subtitle: 'Bir tuşa basın veya tıklayın'
hint_navigate: '[←→↑↓/hjkl/Tab] Gezin' hint_navigate: 'Gezin'
hint_back: '[q/ESC] Geri' hint_back: 'Geri'
key_label: 'Tuş: ' key_label: 'Tuş: '
finger_label: 'Parmak: ' finger_label: 'Parmak: '
hand_left: 'Sol' hand_left: 'Sol'
@@ -397,11 +409,11 @@ intro:
start_passage_drill: 'Metin alıştırmasını başlat' start_passage_drill: 'Metin alıştırmasını başlat'
start_code_drill: 'Kod alıştırmasını başlat' start_code_drill: 'Kod alıştırmasını başlat'
confirm: 'Onayla' confirm: 'Onayla'
hint_navigate: '[Yukarı/Aşağı] Gezin' hint_navigate: 'Gezin'
hint_adjust: '[Sol/Sağ] Ayarla' hint_adjust: 'Ayarla'
hint_edit: '[Yazma/Backspace] Düzenle' hint_edit: 'Düzenle'
hint_confirm: '[Enter] Onayla' hint_confirm: 'Onayla'
hint_cancel: '[ESC] İptal' hint_cancel: 'İptal'
preparing_download: 'İndirme hazırlanıyor...' preparing_download: 'İndirme hazırlanıyor...'
download_passage_title: ' Metin Kaynağı İndiriliyor ' download_passage_title: ' Metin Kaynağı İndiriliyor '
download_code_title: ' Kod Kaynağı İndiriliyor ' download_code_title: ' Kod Kaynağı İndiriliyor '

View File

@@ -372,6 +372,7 @@ pub struct App {
pub caps_lock: bool, pub caps_lock: bool,
pub keyboard_model: KeyboardModel, pub keyboard_model: KeyboardModel,
pub milestone_queue: VecDeque<KeyMilestonePopup>, pub milestone_queue: VecDeque<KeyMilestonePopup>,
pub show_adaptive_intro: bool,
pub settings_confirm_import: bool, pub settings_confirm_import: bool,
pub settings_export_conflict: bool, pub settings_export_conflict: bool,
pub settings_status_message: Option<StatusMessage>, pub settings_status_message: Option<StatusMessage>,
@@ -577,6 +578,7 @@ impl App {
caps_lock: false, caps_lock: false,
keyboard_model, keyboard_model,
milestone_queue: VecDeque::new(), milestone_queue: VecDeque::new(),
show_adaptive_intro: false,
settings_confirm_import: false, settings_confirm_import: false,
settings_export_conflict: false, settings_export_conflict: false,
settings_status_message: None, settings_status_message: None,
@@ -3036,6 +3038,7 @@ impl App {
caps_lock: false, caps_lock: false,
keyboard_model, keyboard_model,
milestone_queue: VecDeque::new(), milestone_queue: VecDeque::new(),
show_adaptive_intro: false,
settings_confirm_import: false, settings_confirm_import: false,
settings_export_conflict: false, settings_export_conflict: false,
settings_status_message: None, settings_status_message: None,

View File

@@ -44,11 +44,16 @@ pub struct Config {
pub code_onboarding_done: bool, pub code_onboarding_done: bool,
#[serde(default = "default_ui_language")] #[serde(default = "default_ui_language")]
pub ui_language: String, pub ui_language: String,
#[serde(default = "default_adaptive_intro_done")]
pub adaptive_intro_done: bool,
} }
fn default_target_wpm() -> u32 { fn default_target_wpm() -> u32 {
35 35
} }
fn default_adaptive_intro_done() -> bool {
false
}
fn default_theme() -> String { fn default_theme() -> String {
"terminal-default".to_string() "terminal-default".to_string()
} }
@@ -124,6 +129,7 @@ impl Default for Config {
code_snippets_per_repo: default_code_snippets_per_repo(), code_snippets_per_repo: default_code_snippets_per_repo(),
code_onboarding_done: default_code_onboarding_done(), code_onboarding_done: default_code_onboarding_done(),
ui_language: default_ui_language(), 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; 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. // Milestone overlays are modal: one key action applies and is consumed.
if let Some(milestone) = app.milestone_queue.front() { if let Some(milestone) = app.milestone_queue.front() {
let open_skill_tree = milestone_supports_skill_tree_shortcut(milestone) 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 inner = Block::bordered().inner(overlay_area);
let footer_y = inner.y + inner.height.saturating_sub(1); let footer_y = inner.y + inner.height.saturating_sub(1);
let footer_area = Rect::new(inner.x, footer_y, inner.width, 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 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( hint_token_at(
footer_area, footer_area,
&hints, &hints,
@@ -556,8 +579,12 @@ fn handle_mouse(app: &mut App, mouse: MouseEvent) {
fn activate_menu_selected(app: &mut App) { fn activate_menu_selected(app: &mut App) {
match app.menu.selected { match app.menu.selected {
0 => { 0 => {
if !app.config.adaptive_intro_done {
app.show_adaptive_intro = true;
} else {
app.start_global_adaptive_drill(); app.start_global_adaptive_drill();
} }
}
1 => { 1 => {
if app.config.code_onboarding_done { if app.config.code_onboarding_done {
app.go_to_code_language_select(); app.go_to_code_language_select();
@@ -587,19 +614,19 @@ fn handle_menu_mouse(app: &mut App, mouse: MouseEvent) {
MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => {
let is_secondary = matches!(mouse.kind, MouseEventKind::Down(MouseButton::Right)); let is_secondary = matches!(mouse.kind, MouseEventKind::Down(MouseButton::Right));
let area = terminal_area(); let area = terminal_area();
let mh_start = t!("menu.hint_start"); let mh_start = ui::hint::hint(ui::hint::K_1_3, t!("menu.hint_start").as_ref());
let mh_tree = t!("menu.hint_skill_tree"); let mh_tree = ui::hint::hint(ui::hint::K_T, t!("menu.hint_skill_tree").as_ref());
let mh_kbd = t!("menu.hint_keyboard"); let mh_kbd = ui::hint::hint(ui::hint::K_B, t!("menu.hint_keyboard").as_ref());
let mh_stats = t!("menu.hint_stats"); let mh_stats = ui::hint::hint(ui::hint::K_S, t!("menu.hint_stats").as_ref());
let mh_settings = t!("menu.hint_settings"); let mh_settings = ui::hint::hint(ui::hint::K_C, t!("menu.hint_settings").as_ref());
let mh_quit = t!("menu.hint_quit"); let mh_quit = ui::hint::hint(ui::hint::K_Q, t!("menu.hint_quit").as_ref());
let menu_hints: Vec<&str> = vec![ let menu_hints: Vec<&str> = vec![
mh_start.as_ref(), mh_start.as_str(),
mh_tree.as_ref(), mh_tree.as_str(),
mh_kbd.as_ref(), mh_kbd.as_str(),
mh_stats.as_ref(), mh_stats.as_str(),
mh_settings.as_ref(), mh_settings.as_str(),
mh_quit.as_ref(), mh_quit.as_str(),
]; ];
let footer_line_count = pack_hint_lines(&menu_hints, area.width as usize) let footer_line_count = pack_hint_lines(&menu_hints, area.width as usize)
.len() .len()
@@ -677,9 +704,9 @@ fn handle_drill_mouse(app: &mut App, mouse: MouseEvent) {
} }
let layout = AppLayout::new(terminal_area()); let layout = AppLayout::new(terminal_area());
if point_in_rect(mouse.column, mouse.row, layout.footer) { if point_in_rect(mouse.column, mouse.row, layout.footer) {
let hint_end = t!("drill.hint_end"); let hint_end = ui::hint::hint(ui::hint::K_ESC, t!("drill.hint_end").as_ref());
let hint_bs = t!("drill.hint_backspace"); let hint_bs = ui::hint::hint(ui::hint::K_BACKSPACE, t!("drill.hint_backspace").as_ref());
let hints: Vec<&str> = vec![hint_end.as_ref(), hint_bs.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) { if let Some(token) = hint_token_at(layout.footer, &hints, mouse.column, mouse.row) {
match token.as_str() { match token.as_str() {
"ESC" => { "ESC" => {
@@ -739,17 +766,17 @@ fn handle_result_mouse(app: &mut App, mouse: MouseEvent) {
let area = terminal_area(); let area = terminal_area();
let centered = ui::layout::centered_rect(60, 70, area); let centered = ui::layout::centered_rect(60, 70, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_cont = t!("dashboard.hint_continue"); let h_cont = ui::hint::hint(ui::hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref());
let h_retry = t!("dashboard.hint_retry"); let h_retry = ui::hint::hint(ui::hint::K_R, t!("dashboard.hint_retry").as_ref());
let h_menu = t!("dashboard.hint_menu"); let h_menu = ui::hint::hint(ui::hint::K_Q, t!("dashboard.hint_menu").as_ref());
let h_stats = t!("dashboard.hint_stats"); let h_stats = ui::hint::hint(ui::hint::K_S, t!("dashboard.hint_stats").as_ref());
let h_del = t!("dashboard.hint_delete"); let h_del = ui::hint::hint(ui::hint::K_X, t!("dashboard.hint_delete").as_ref());
let hints: Vec<&str> = vec![ let hints: Vec<&str> = vec![
h_cont.as_ref(), h_cont.as_str(),
h_retry.as_ref(), h_retry.as_str(),
h_menu.as_ref(), h_menu.as_str(),
h_stats.as_ref(), h_stats.as_str(),
h_del.as_ref(), h_del.as_str(),
]; ];
let footer_line_count = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16; let footer_line_count = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16;
let footer_y = inner let footer_y = inner
@@ -852,23 +879,23 @@ fn handle_stats_mouse(app: &mut App, mouse: MouseEvent) {
let inner = Block::bordered().inner(area); let inner = Block::bordered().inner(area);
let width = inner.width as usize; let width = inner.width as usize;
let tab_line_count = wrapped_stats_tab_line_count(width) as u16; let tab_line_count = wrapped_stats_tab_line_count(width) as u16;
let sh_back = t!("stats.hint_back"); let sh_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("stats.hint_back").as_ref());
let sh_next = t!("stats.hint_next_tab"); let sh_next = ui::hint::hint(ui::hint::K_TAB, t!("stats.hint_next_tab").as_ref());
let sh_switch = t!("stats.hint_switch_tab"); let sh_switch = ui::hint::hint(ui::hint::K_1_6, t!("stats.hint_switch_tab").as_ref());
let sh_nav = t!("stats.hint_navigate"); let sh_nav = ui::hint::hint(ui::hint::K_J_K, t!("stats.hint_navigate").as_ref());
let sh_page = t!("stats.hint_page"); let sh_page = ui::hint::hint(ui::hint::K_PGUP_PGDN, t!("stats.hint_page").as_ref());
let sh_del = t!("stats.hint_delete"); 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 { let footer_hints: Vec<&str> = if app.stats_tab == 1 {
vec![ vec![
sh_back.as_ref(), sh_back.as_str(),
sh_next.as_ref(), sh_next.as_str(),
sh_switch.as_ref(), sh_switch.as_str(),
sh_nav.as_ref(), sh_nav.as_str(),
sh_page.as_ref(), sh_page.as_str(),
sh_del.as_ref(), sh_del.as_str(),
] ]
} else { } 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 footer_line_count = pack_hint_lines(&footer_hints, width).len().max(1) as u16;
let layout = Layout::default() 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)); 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) { if let Some(token) = hint_token_at(layout[2], &footer_hints, mouse.column, mouse.row) {
match token.as_str() { match token.as_str() {
"ESC" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
"Tab" => { "Tab" => {
app.stats_tab = if is_secondary { app.stats_tab = if is_secondary {
if app.stats_tab == 0 { 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 inner = Block::bordered().inner(centered);
let fields = settings_fields(app); let fields = settings_fields(app);
let header_height = if inner.height > 0 { 1 } else { 0 }; let header_height = if inner.height > 0 { 1 } else { 0 };
let sfh_save = t!("settings.hint_save_back"); let sfh_save = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_save_back").as_ref());
let sfh_change = t!("settings.hint_change_value"); let sfh_change = ui::hint::hint(ui::hint::K_ENTER_ARROWS, t!("settings.hint_change_value").as_ref());
let sfh_edit = t!("settings.hint_edit_path"); 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![ let footer_hints: Vec<&str> = vec![
sfh_save.as_ref(), sfh_save.as_str(),
sfh_change.as_ref(), sfh_change.as_str(),
sfh_edit.as_ref(), sfh_edit.as_str(),
]; ];
let footer_height = if inner.height > header_height { let footer_height = if inner.height > header_height {
pack_hint_lines(&footer_hints, inner.width as usize) pack_hint_lines(&footer_hints, inner.width as usize)
@@ -1207,22 +1234,22 @@ fn handle_settings_mouse(app: &mut App, mouse: MouseEvent) {
.split(inner); .split(inner);
if is_click && layout[2].height > 0 { if is_click && layout[2].height > 0 {
let efh_move = t!("settings.hint_move"); let efh_move = ui::hint::hint(ui::hint::K_ARROW_LR, t!("settings.hint_move").as_ref());
let efh_tab = t!("settings.hint_tab_complete"); let efh_tab = ui::hint::hint(ui::hint::K_TAB, t!("settings.hint_tab_complete").as_ref());
let efh_confirm = t!("settings.hint_confirm"); let efh_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("settings.hint_confirm").as_ref());
let efh_cancel = t!("settings.hint_cancel"); 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() { let footer_hints: Vec<&str> = if app.settings_editing_path.is_some() {
vec![ vec![
efh_move.as_ref(), efh_move.as_str(),
efh_tab.as_ref(), efh_tab.as_str(),
efh_confirm.as_ref(), efh_confirm.as_str(),
efh_cancel.as_ref(), efh_cancel.as_str(),
] ]
} else { } else {
vec![ vec![
sfh_save.as_ref(), sfh_save.as_str(),
sfh_change.as_ref(), sfh_change.as_str(),
sfh_edit.as_ref(), sfh_edit.as_str(),
] ]
}; };
if let Some(token) = hint_token_at(layout[2], &footer_hints, mouse.column, mouse.row) { 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" => { "Enter" => {
handle_settings_key(app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE)) handle_settings_key(app, KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE))
} }
"Esc" => { "ESC" => {
handle_settings_key(app, KeyEvent::new(KeyCode::Esc, KeyModifiers::NONE)) 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 { fn dictionary_language_list_area(area: Rect) -> Rect {
let centered = ui::layout::centered_rect(60, 70, area); let centered = ui::layout::centered_rect(60, 70, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref());
let hint_lines = pack_hint_lines( 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, inner.width as usize,
); );
let footer_height = (hint_lines.len() as u16).max(1); 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 area = terminal_area();
let centered = ui::layout::centered_rect(60, 70, area); let centered = ui::layout::centered_rect(60, 70, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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 footer_h = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16;
let chunks = if inner.height > footer_h { let chunks = if inner.height > footer_h {
Some( Some(
@@ -1794,7 +1821,7 @@ fn handle_dictionary_language_mouse(app: &mut App, mouse: MouseEvent) {
{ {
match token.as_str() { match token.as_str() {
"Enter" => confirm_dictionary_language_selection(app), "Enter" => confirm_dictionary_language_selection(app),
"ESC" => { "q/ESC" => {
app.go_to_settings(); app.go_to_settings();
app.settings_selected = SettingItem::DictionaryLanguage.index(); 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 { fn keyboard_layout_list_area(area: Rect) -> Rect {
let centered = ui::layout::centered_rect(60, 70, area); let centered = ui::layout::centered_rect(60, 70, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref());
let hint_lines = pack_hint_lines( 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, inner.width as usize,
); );
let footer_height = (hint_lines.len() as u16).max(1); 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 area = terminal_area();
let centered = ui::layout::centered_rect(60, 70, area); let centered = ui::layout::centered_rect(60, 70, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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 footer_h = pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16;
let chunks = if inner.height > footer_h { let chunks = if inner.height > footer_h {
Some( Some(
@@ -2023,7 +2050,7 @@ fn handle_keyboard_layout_mouse(app: &mut App, mouse: MouseEvent) {
{ {
match token.as_str() { match token.as_str() {
"Enter" => confirm_keyboard_layout_selection(app), "Enter" => confirm_keyboard_layout_selection(app),
"ESC" => { "q/ESC" => {
app.go_to_settings(); app.go_to_settings();
app.settings_selected = SettingItem::KeyboardLayout.index(); 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 inner = Block::bordered().inner(centered);
let options = code_language_options(); let options = code_language_options();
let width = inner.width as usize; let width = inner.width as usize;
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); let h_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref());
let hint_lines = pack_hint_lines( 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, width,
); );
let disabled_notice_t = t!("select.disabled_network_notice"); 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) => { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => {
let centered = ui::layout::centered_rect(50, 70, terminal_area()); let centered = ui::layout::centered_rect(50, 70, terminal_area());
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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 hint_lines = pack_hint_lines(&hints, inner.width as usize);
let disabled_notice_t = t!("select.disabled_network_notice"); let disabled_notice_t = t!("select.disabled_network_notice");
let disabled_notice = disabled_notice_t.as_ref(); 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), KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE),
); );
} }
"ESC" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
_ => {} _ => {}
} }
return; return;
@@ -2310,11 +2337,11 @@ fn passage_book_list_area(app: &App, area: Rect) -> Rect {
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let options = passage_options(); let options = passage_options();
let width = inner.width as usize; let width = inner.width as usize;
let h_nav_t = t!("select.hint_navigate"); let h_nav_t = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref());
let h_confirm_t = t!("select.hint_confirm"); let h_confirm_t = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back_t = t!("select.hint_back"); let h_back_t = ui::hint::hint(ui::hint::K_Q_ESC, t!("select.hint_back").as_ref());
let hint_lines = pack_hint_lines( 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, width,
); );
let disabled_notice_t = t!("select.disabled_sources_notice"); 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) => { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => {
let centered = ui::layout::centered_rect(60, 70, terminal_area()); let centered = ui::layout::centered_rect(60, 70, terminal_area());
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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 hint_lines = pack_hint_lines(&hints, inner.width as usize);
let disabled_notice_t = t!("select.disabled_sources_notice"); let disabled_notice_t = t!("select.disabled_sources_notice");
let disabled_notice = disabled_notice_t.as_ref(); let disabled_notice = disabled_notice_t.as_ref();
@@ -2394,7 +2421,7 @@ fn handle_passage_book_mouse(app: &mut App, mouse: MouseEvent) {
app, app,
KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE),
), ),
"ESC" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
_ => {} _ => {}
} }
return; 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 { fn passage_intro_content_area(area: Rect) -> Rect {
let centered = ui::layout::centered_rect(75, 80, area); let centered = ui::layout::centered_rect(75, 80, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref());
let hint_lines = pack_hint_lines( 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, inner.width as usize,
); );
let footer_height = (hint_lines.len() + 1) as u16; 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) => { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => {
let centered = ui::layout::centered_rect(75, 80, terminal_area()); let centered = ui::layout::centered_rect(75, 80, terminal_area());
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); 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_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_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 hint_lines = pack_hint_lines(&hints, inner.width as usize);
let footer_height = (hint_lines.len() + 1) as u16; let footer_height = (hint_lines.len() + 1) as u16;
if footer_height > 0 && footer_height < inner.height { if footer_height > 0 && footer_height < inner.height {
@@ -2629,7 +2656,7 @@ fn handle_passage_intro_mouse(app: &mut App, mouse: MouseEvent) {
app, app,
KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE),
), ),
"ESC" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
_ => {} _ => {}
} }
return; return;
@@ -2758,13 +2785,13 @@ fn handle_code_intro_key(app: &mut App, key: KeyEvent) {
fn code_intro_content_area(area: Rect) -> Rect { fn code_intro_content_area(area: Rect) -> Rect {
let centered = ui::layout::centered_rect(75, 80, area); let centered = ui::layout::centered_rect(75, 80, area);
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); let ih_cancel = ui::hint::hint(ui::hint::K_Q_ESC, t!("intro.hint_cancel").as_ref());
let hint_lines = pack_hint_lines( 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, inner.width as usize,
); );
let footer_height = (hint_lines.len() + 1) as u16; 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) => { MouseEventKind::Down(MouseButton::Left) | MouseEventKind::Down(MouseButton::Right) => {
let centered = ui::layout::centered_rect(75, 80, terminal_area()); let centered = ui::layout::centered_rect(75, 80, terminal_area());
let inner = Block::bordered().inner(centered); let inner = Block::bordered().inner(centered);
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); 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_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_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 hint_lines = pack_hint_lines(&hints, inner.width as usize);
let footer_height = (hint_lines.len() + 1) as u16; let footer_height = (hint_lines.len() + 1) as u16;
if footer_height > 0 && footer_height < inner.height { if footer_height > 0 && footer_height < inner.height {
@@ -2842,7 +2869,7 @@ fn handle_code_intro_mouse(app: &mut App, mouse: MouseEvent) {
app, app,
KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE), KeyEvent::new(KeyCode::Enter, KeyModifiers::NONE),
), ),
"ESC" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
_ => {} _ => {}
} }
return; return;
@@ -2978,44 +3005,44 @@ fn skill_tree_interactive_areas(app: &App, area: Rect) -> SkillTreeMouseLayout {
let bp = branches let bp = branches
.get(selected) .get(selected)
.map(|id| app.skill_tree.branch_progress(*id)); .map(|id| app.skill_tree.branch_progress(*id));
let st_nav = t!("skill_tree.hint_navigate"); let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref());
let st_scroll = t!("skill_tree.hint_scroll"); let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref());
let st_back = t!("skill_tree.hint_back"); let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref());
let st_unlock = t!("skill_tree.hint_unlock"); let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref());
let st_drill = t!("skill_tree.hint_start_drill"); 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>) = let (footer_hints, footer_notice): (Vec<&str>, Option<String>) =
match bp.map(|b| b.status.clone()) { match bp.map(|b| b.status.clone()) {
Some(BranchStatus::Locked) => ( Some(BranchStatus::Locked) => (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
Some(locked_branch_notice(app)), Some(locked_branch_notice(app)),
), ),
Some(BranchStatus::Available) => ( Some(BranchStatus::Available) => (
vec![ vec![
st_unlock.as_ref(), st_unlock.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
), ),
Some(BranchStatus::InProgress) => ( Some(BranchStatus::InProgress) => (
vec![ vec![
st_drill.as_ref(), st_drill.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
), ),
_ => ( _ => (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
), ),
@@ -3169,49 +3196,49 @@ fn handle_skill_tree_mouse(app: &mut App, mouse: MouseEvent) {
.skill_tree_selected .skill_tree_selected
.min(branches.len().saturating_sub(1)); .min(branches.len().saturating_sub(1));
let bp = app.skill_tree.branch_progress(branches[selected]); let bp = app.skill_tree.branch_progress(branches[selected]);
let st_nav = t!("skill_tree.hint_navigate"); let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref());
let st_scroll = t!("skill_tree.hint_scroll"); let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref());
let st_back = t!("skill_tree.hint_back"); let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref());
let st_unlock = t!("skill_tree.hint_unlock"); let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref());
let st_drill = t!("skill_tree.hint_start_drill"); 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>) = let (footer_hints, footer_notice): (Vec<&str>, Option<String>) =
if *app.skill_tree.branch_status(branches[selected]) if *app.skill_tree.branch_status(branches[selected])
== engine::skill_tree::BranchStatus::Locked == engine::skill_tree::BranchStatus::Locked
{ {
( (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
Some(locked_branch_notice(app)), Some(locked_branch_notice(app)),
) )
} else if bp.status == engine::skill_tree::BranchStatus::Available { } else if bp.status == engine::skill_tree::BranchStatus::Available {
( (
vec![ vec![
st_unlock.as_ref(), st_unlock.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
} else if bp.status == engine::skill_tree::BranchStatus::InProgress { } else if bp.status == engine::skill_tree::BranchStatus::InProgress {
( (
vec![ vec![
st_drill.as_ref(), st_drill.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
} else { } else {
( (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
@@ -3233,17 +3260,9 @@ fn handle_skill_tree_mouse(app: &mut App, mouse: MouseEvent) {
inner.width, inner.width,
footer_height, footer_height,
); );
if let Some(token) = hint_token_at( if let Some(token) = hint_token_at(footer_area, &footer_hints, mouse.column, mouse.row) {
footer_area,
&footer_hints
.iter()
.map(|s| s.as_ref())
.collect::<Vec<&str>>(),
mouse.column,
mouse.row,
) {
match token.as_str() { match token.as_str() {
"q" => app.go_to_menu(), "q/ESC" => app.go_to_menu(),
"Enter" => { "Enter" => {
let branch_id = branches[selected]; let branch_id = branches[selected];
let status = app.skill_tree.branch_status(branch_id).clone(); 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 .skill_tree_selected
.min(branches.len().saturating_sub(1)); .min(branches.len().saturating_sub(1));
let bp = app.skill_tree.branch_progress(branches[selected]); let bp = app.skill_tree.branch_progress(branches[selected]);
let st_nav = t!("skill_tree.hint_navigate"); let st_nav = ui::hint::hint(ui::hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref());
let st_scroll = t!("skill_tree.hint_scroll"); let st_scroll = ui::hint::hint(ui::hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref());
let st_back = t!("skill_tree.hint_back"); let st_back = ui::hint::hint(ui::hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref());
let st_unlock = t!("skill_tree.hint_unlock"); let st_unlock = ui::hint::hint(ui::hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref());
let st_drill = t!("skill_tree.hint_start_drill"); 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>) = let (footer_hints, footer_notice): (Vec<&str>, Option<String>) =
if *app.skill_tree.branch_status(branches[selected]) if *app.skill_tree.branch_status(branches[selected])
== engine::skill_tree::BranchStatus::Locked == engine::skill_tree::BranchStatus::Locked
{ {
( (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
Some(locked_branch_notice(app)), Some(locked_branch_notice(app)),
) )
} else if bp.status == engine::skill_tree::BranchStatus::Available { } else if bp.status == engine::skill_tree::BranchStatus::Available {
( (
vec![ vec![
st_unlock.as_ref(), st_unlock.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
} else if bp.status == engine::skill_tree::BranchStatus::InProgress { } else if bp.status == engine::skill_tree::BranchStatus::InProgress {
( (
vec![ vec![
st_drill.as_ref(), st_drill.as_str(),
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
} else { } else {
( (
vec![ vec![
st_nav.as_ref(), st_nav.as_str(),
st_scroll.as_ref(), st_scroll.as_str(),
st_back.as_ref(), st_back.as_str(),
], ],
None, None,
) )
@@ -3433,6 +3452,12 @@ fn render(frame: &mut ratatui::Frame, app: &App) {
let bg = Block::default().style(Style::default().bg(colors.bg())); let bg = Block::default().style(Style::default().bg(colors.bg()));
frame.render_widget(bg, area); 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. // Milestone overlays are modal and shown before the underlying screen.
if let Some(milestone) = app.milestone_queue.front() { if let Some(milestone) = app.milestone_queue.front() {
render_milestone_overlay(frame, app, milestone); render_milestone_overlay(frame, app, milestone);
@@ -3463,19 +3488,19 @@ fn render_menu(frame: &mut ratatui::Frame, app: &App) {
let area = frame.area(); let area = frame.area();
let colors = &app.theme.colors; let colors = &app.theme.colors;
let mh_start = t!("menu.hint_start"); let mh_start = ui::hint::hint(ui::hint::K_1_3, t!("menu.hint_start").as_ref());
let mh_tree = t!("menu.hint_skill_tree"); let mh_tree = ui::hint::hint(ui::hint::K_T, t!("menu.hint_skill_tree").as_ref());
let mh_kbd = t!("menu.hint_keyboard"); let mh_kbd = ui::hint::hint(ui::hint::K_B, t!("menu.hint_keyboard").as_ref());
let mh_stats = t!("menu.hint_stats"); let mh_stats = ui::hint::hint(ui::hint::K_S, t!("menu.hint_stats").as_ref());
let mh_settings = t!("menu.hint_settings"); let mh_settings = ui::hint::hint(ui::hint::K_C, t!("menu.hint_settings").as_ref());
let mh_quit = t!("menu.hint_quit"); let mh_quit = ui::hint::hint(ui::hint::K_Q, t!("menu.hint_quit").as_ref());
let menu_hints: Vec<&str> = vec![ let menu_hints: Vec<&str> = vec![
mh_start.as_ref(), mh_start.as_str(),
mh_tree.as_ref(), mh_tree.as_str(),
mh_kbd.as_ref(), mh_kbd.as_str(),
mh_stats.as_ref(), mh_stats.as_str(),
mh_settings.as_ref(), mh_settings.as_str(),
mh_quit.as_ref(), mh_quit.as_str(),
]; ];
let footer_lines_vec = pack_hint_lines(&menu_hints, area.width as usize); 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; 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( fn render_milestone_overlay(
frame: &mut ratatui::Frame, frame: &mut ratatui::Frame,
app: &App, app: &App,
@@ -4095,7 +4202,7 @@ fn render_milestone_overlay(
let footer_text = if let Some(ms) = app.post_drill_input_lock_remaining_ms() { let footer_text = if let Some(ms) = app.post_drill_input_lock_remaining_ms() {
format!(" {}", t!("milestones.input_blocked", ms = ms)) format!(" {}", t!("milestones.input_blocked", ms = ms))
} else if milestone_supports_skill_tree_shortcut(milestone) { } 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 { } else {
format!(" {}", t!("milestones.hint_any_key")) format!(" {}", t!("milestones.hint_any_key"))
}; };
@@ -5140,7 +5247,7 @@ mod review_tests {
// After editing: shows editing hints // After editing: shows editing hints
let output_during = render_settings_to_string(&app); let output_during = render_settings_to_string(&app);
assert!(output_during.contains("[Enter] Confirm")); assert!(output_during.contains("[Enter] Confirm"));
assert!(output_during.contains("[Esc] Cancel")); assert!(output_during.contains("[ESC] Cancel"));
assert!(output_during.contains("[Tab] Complete")); assert!(output_during.contains("[Tab] Complete"));
} }
@@ -5637,19 +5744,19 @@ fn render_settings(frame: &mut ratatui::Frame, app: &App) {
.as_ref() .as_ref()
.map(|(_, input)| input.completion_error) .map(|(_, input)| input.completion_error)
.unwrap_or(false); .unwrap_or(false);
let fh_move = t!("settings.hint_move"); let fh_move = ui::hint::hint(ui::hint::K_ARROW_LR, t!("settings.hint_move").as_ref());
let fh_tab = t!("settings.hint_tab_complete"); let fh_tab = ui::hint::hint(ui::hint::K_TAB, t!("settings.hint_tab_complete").as_ref());
let fh_confirm = t!("settings.hint_confirm"); let fh_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("settings.hint_confirm").as_ref());
let fh_cancel = t!("settings.hint_cancel"); let fh_cancel = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_cancel").as_ref());
let fh_save = t!("settings.hint_save_back"); let fh_save = ui::hint::hint(ui::hint::K_ESC, t!("settings.hint_save_back").as_ref());
let fh_change = t!("settings.hint_change_value"); let fh_change = ui::hint::hint(ui::hint::K_ENTER_ARROWS, t!("settings.hint_change_value").as_ref());
let fh_edit = t!("settings.hint_edit_path"); 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 footer_hints: Vec<&str> = if app.is_editing_path() {
let mut hints = vec![ let mut hints = vec![
fh_move.as_ref(), fh_move.as_str(),
fh_tab.as_ref(), fh_tab.as_str(),
fh_confirm.as_ref(), fh_confirm.as_str(),
fh_cancel.as_ref(), fh_cancel.as_str(),
]; ];
if completion_error { if completion_error {
hints.push("(cannot read directory)"); hints.push("(cannot read directory)");
@@ -5657,9 +5764,9 @@ fn render_settings(frame: &mut ratatui::Frame, app: &App) {
hints hints
} else { } else {
vec![ vec![
fh_save.as_ref(), fh_save.as_str(),
fh_change.as_ref(), fh_change.as_str(),
fh_edit.as_ref(), fh_edit.as_str(),
] ]
}; };
let footer_packed = pack_hint_lines(&footer_hints, inner.width as usize); 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()); block.render(centered, frame.buffer_mut());
let options = language_packs(); let options = language_packs();
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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_t = t!("select.language_resets_layout");
let support_notice = support_notice_t.as_ref(); let support_notice = support_notice_t.as_ref();
let width = inner.width as usize; 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()); block.render(centered, frame.buffer_mut());
let options = keyboard::model::KeyboardModel::supported_layout_keys(); let options = keyboard::model::KeyboardModel::supported_layout_keys();
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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_t = t!("select.layout_no_language_change");
let support_notice = support_notice_t.as_ref(); let support_notice = support_notice_t.as_ref();
let width = inner.width as usize; 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 options = code_language_options();
let cache_dir = &app.config.code_download_dir; let cache_dir = &app.config.code_download_dir;
let h_nav = t!("select.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN_PGUP_PGDN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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_t = t!("select.disabled_sources_notice");
let disabled_notice = disabled_notice_t.as_ref(); let disabled_notice = disabled_notice_t.as_ref();
let has_disabled = !app.config.code_downloads_enabled 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()); block.render(centered, frame.buffer_mut());
let options = passage_options(); let options = passage_options();
let h_nav = t!("intro.hint_navigate"); let h_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("select.hint_navigate").as_ref());
let h_confirm = t!("select.hint_confirm"); let h_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("select.hint_confirm").as_ref());
let h_back = t!("select.hint_back"); 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_ref(), h_confirm.as_ref(), h_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_t = t!("select.disabled_sources_notice");
let disabled_notice = disabled_notice_t.as_ref(); let disabled_notice = disabled_notice_t.as_ref();
let has_disabled = !app.config.passage_downloads_enabled 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 { let hint_lines = if app.passage_intro_downloading {
Vec::new() Vec::new()
} else { } else {
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); 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_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_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( pack_hint_lines(
&hints, &hints,
inner.width as usize, 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 { let hint_lines = if app.code_intro_downloading {
Vec::new() Vec::new()
} else { } else {
let ih_nav = t!("intro.hint_navigate"); let ih_nav = ui::hint::hint(ui::hint::K_UP_DOWN, t!("intro.hint_navigate").as_ref());
let ih_adj = t!("intro.hint_adjust"); let ih_adj = ui::hint::hint(ui::hint::K_LEFT_RIGHT, t!("intro.hint_adjust").as_ref());
let ih_edit = t!("intro.hint_edit"); let ih_edit = ui::hint::hint(ui::hint::K_TYPE_BACKSPACE, t!("intro.hint_edit").as_ref());
let ih_confirm = t!("intro.hint_confirm"); let ih_confirm = ui::hint::hint(ui::hint::K_ENTER, t!("intro.hint_confirm").as_ref());
let ih_cancel = t!("intro.hint_cancel"); 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_ref(), ih_adj.as_ref(), ih_edit.as_ref(), ih_confirm.as_ref(), ih_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( pack_hint_lines(
&hints, &hints,
inner.width as usize, inner.width as usize,
@@ -7099,8 +7206,8 @@ fn handle_keyboard_explorer_mouse(app: &mut App, mouse: MouseEvent) {
Constraint::Length(1), Constraint::Length(1),
]) ])
.split(area); .split(area);
let h_back = t!("keyboard.hint_back"); 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_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() if hint_token_at(layout[3], &footer_hints, mouse.column, mouse.row).is_some()
|| point_in_rect(mouse.column, mouse.row, layout[3]) || 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]); render_keyboard_detail_panel(frame, app, layout[2]);
// Footer // 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( 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()), Style::default().fg(colors.text_pending()),
)])); )]));
frame.render_widget(footer, layout[3]); frame.render_widget(footer, layout[3]);

View File

@@ -6,6 +6,7 @@ use ratatui::widgets::{Block, Paragraph, Widget};
use crate::i18n::t; use crate::i18n::t;
use crate::session::result::DrillResult; use crate::session::result::DrillResult;
use crate::ui::hint;
use crate::ui::layout::pack_hint_lines; use crate::ui::layout::pack_hint_lines;
use crate::ui::theme::Theme; 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() { let footer_line_count = if self.input_lock_remaining_ms.is_some() {
1u16 1u16
} else { } else {
let hint_continue = t!("dashboard.hint_continue"); let hint_continue = hint::hint(hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref());
let hint_retry = t!("dashboard.hint_retry"); let hint_retry = hint::hint(hint::K_R, t!("dashboard.hint_retry").as_ref());
let hint_menu = t!("dashboard.hint_menu"); let hint_menu = hint::hint(hint::K_Q, t!("dashboard.hint_menu").as_ref());
let hint_stats = t!("dashboard.hint_stats"); let hint_stats = hint::hint(hint::K_S, t!("dashboard.hint_stats").as_ref());
let hint_delete = t!("dashboard.hint_delete"); let hint_delete = hint::hint(hint::K_X, t!("dashboard.hint_delete").as_ref());
let hints = [ let hints = [
hint_continue.as_ref(), hint_continue.as_str(),
hint_retry.as_ref(), hint_retry.as_str(),
hint_menu.as_ref(), hint_menu.as_str(),
hint_stats.as_ref(), hint_stats.as_str(),
hint_delete.as_ref(), hint_delete.as_str(),
]; ];
pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16 pack_hint_lines(&hints, inner.width as usize).len().max(1) as u16
}; };
@@ -167,17 +168,17 @@ impl Widget for Dashboard<'_> {
), ),
])) ]))
} else { } else {
let hint_continue = t!("dashboard.hint_continue"); let hint_continue = hint::hint(hint::K_C_ENTER_SPACE, t!("dashboard.hint_continue").as_ref());
let hint_retry = t!("dashboard.hint_retry"); let hint_retry = hint::hint(hint::K_R, t!("dashboard.hint_retry").as_ref());
let hint_menu = t!("dashboard.hint_menu"); let hint_menu = hint::hint(hint::K_Q, t!("dashboard.hint_menu").as_ref());
let hint_stats = t!("dashboard.hint_stats"); let hint_stats = hint::hint(hint::K_S, t!("dashboard.hint_stats").as_ref());
let hint_delete = t!("dashboard.hint_delete"); let hint_delete = hint::hint(hint::K_X, t!("dashboard.hint_delete").as_ref());
let hints = [ let hints = [
hint_continue.as_ref(), hint_continue.as_str(),
hint_retry.as_ref(), hint_retry.as_str(),
hint_menu.as_ref(), hint_menu.as_str(),
hint_stats.as_ref(), hint_stats.as_str(),
hint_delete.as_ref(), hint_delete.as_str(),
]; ];
let lines: Vec<Line> = pack_hint_lines(&hints, inner.width as usize) let lines: Vec<Line> = pack_hint_lines(&hints, inner.width as usize)
.into_iter() .into_iter()

View File

@@ -9,6 +9,7 @@ use crate::engine::key_stats::KeyStatsStore;
use crate::engine::skill_tree::{ use crate::engine::skill_tree::{
BranchId, BranchStatus, DrillScope, SkillTree as SkillTreeEngine, get_branch_definition, 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::layout::{pack_hint_lines, wrapped_line_count};
use crate::ui::theme::Theme; use crate::ui::theme::Theme;
@@ -137,11 +138,11 @@ impl Widget for SkillTreeWidget<'_> {
// Layout: main split (branch list + detail) and footer (adaptive height) // Layout: main split (branch list + detail) and footer (adaptive height)
let branches = selectable_branches(); let branches = selectable_branches();
let h_navigate = t!("skill_tree.hint_navigate").to_string(); let h_navigate = hint::hint(hint::K_UD_JK, t!("skill_tree.hint_navigate").as_ref());
let h_scroll = t!("skill_tree.hint_scroll").to_string(); let h_scroll = hint::hint(hint::K_SCROLL_KEYS, t!("skill_tree.hint_scroll").as_ref());
let h_back = t!("skill_tree.hint_back").to_string(); let h_back = hint::hint(hint::K_Q_ESC, t!("skill_tree.hint_back").as_ref());
let h_unlock = t!("skill_tree.hint_unlock").to_string(); let h_unlock = hint::hint(hint::K_ENTER, t!("skill_tree.hint_unlock").as_ref());
let h_start_drill = t!("skill_tree.hint_start_drill").to_string(); 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>) = let (footer_hints, footer_notice): (Vec<&str>, Option<String>) =
if self.selected < branches.len() { if self.selected < branches.len() {
let bp = self.skill_tree.branch_progress(branches[self.selected]); 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::session::result::DrillResult;
use crate::ui::components::activity_heatmap::ActivityHeatmap; use crate::ui::components::activity_heatmap::ActivityHeatmap;
use crate::i18n::t; use crate::i18n::t;
use crate::ui::hint;
use crate::ui::layout::pack_hint_lines; use crate::ui::layout::pack_hint_lines;
use crate::ui::theme::Theme; use crate::ui::theme::Theme;
@@ -1673,20 +1674,20 @@ const TAB_SEPARATOR: &str = " ";
fn footer_hints_default() -> Vec<String> { fn footer_hints_default() -> Vec<String> {
vec![ vec![
t!("stats.hint_back").to_string(), hint::hint(hint::K_Q_ESC, t!("stats.hint_back").as_ref()),
t!("stats.hint_next_tab").to_string(), hint::hint(hint::K_TAB, t!("stats.hint_next_tab").as_ref()),
t!("stats.hint_switch_tab").to_string(), hint::hint(hint::K_1_6, t!("stats.hint_switch_tab").as_ref()),
] ]
} }
fn footer_hints_history() -> Vec<String> { fn footer_hints_history() -> Vec<String> {
vec![ vec![
t!("stats.hint_back").to_string(), hint::hint(hint::K_Q_ESC, t!("stats.hint_back").as_ref()),
t!("stats.hint_next_tab").to_string(), hint::hint(hint::K_TAB, t!("stats.hint_next_tab").as_ref()),
t!("stats.hint_switch_tab").to_string(), hint::hint(hint::K_1_6, t!("stats.hint_switch_tab").as_ref()),
t!("stats.hint_navigate").to_string(), hint::hint(hint::K_J_K, t!("stats.hint_navigate").as_ref()),
t!("stats.hint_page").to_string(), hint::hint(hint::K_PGUP_PGDN, t!("stats.hint_page").as_ref()),
t!("stats.hint_delete").to_string(), 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 components;
pub mod hint;
pub mod layout; pub mod layout;
pub mod line_input; pub mod line_input;
pub mod theme; pub mod theme;