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