{
  "about.contact_title": "Suggestions or found a bug?",
  "about.contact_body": "Write to",
  "about.contact_email_label": "feedback@midipiano.app",
  "about.feature_adaptive_body": "Adjust speed, difficulty, and A-B loop range so you can repeat only what you need until it feels solid.",
  "about.feature_adaptive_title": "Practice your way",
  "about.feature_connect_body": "Works with most modern digital pianos. Connect by USB or Bluetooth and the app listens to every note you play.",
  "about.feature_connect_title": "Connect your digital keyboard",
  "about.feature_feedback_body": "Get immediate note, sync, and timing feedback so each repetition becomes more precise.",
  "about.feature_feedback_title": "Learn from mistakes instantly",
  "about.feature_scores_body": "Import MusicXML, MXL, XML or MEI scores and practice measure by measure with a clean, professional view.",
  "about.feature_scores_title": "Play the music you love",
  "about.hero_cta_midi": "Connect keyboard",
  "about.hero_cta_practice": "Start practicing",
  "about.lead": "Load your favorite scores, connect your digital piano, and get real-time guidance while you play. No pressure, fully at your own pace.",
  "about.partners_copied": "Copied!",
  "about.partners_discount": "5% off with code",
  "about.partners_sponsored": "Sponsored",
  "about.partners_title": "Compatible light-up pianos",
  "about.title": "Learn piano at your own pace.",
  "action.close": "Close",
  "app.name": "midipiano.app",
  "app.tagline": "Connect your MIDI keyboard, import MusicXML or MEI scores, and get instant feedback on note accuracy, mistakes, and timing directly in your browser.",
  "app.top_title.about": "About midipiano.app",
  "app.top_title.challenge": "Daily challenge",
  "app.top_title.load": "Import Score",
  "app.top_title.midi": "MIDI Devices",
  "app.top_title.practice": "Practice",
  "aria.main_nav": "Main navigation",
  "cookies.accept_all": "Accept cookies",
  "cookies.banner_text": "By using midipiano.app, you agree to our Terms and Conditions. We use the cookies and browser storage needed to run the app. You can accept or reject optional cookies.",
  "cookies.manage_button": "Cookie notice ({mode})",
  "cookies.manage_button_short": "Legal and cookie notice",
  "cookies.mode_all": "essential storage and optional cookies",
  "cookies.mode_essential": "essential only",
  "cookies.policy_link": "Cookie policy",
  "cookies.privacy_link": "Privacy policy",
  "cookies.reject_optional": "Reject optional",
  "legal.terms_link": "Terms and Conditions",
  "legal.third_party_link": "Licenses",
  "feedback.mail_fallback_copied": "Could not open the mail app automatically. Email copied: {email}",
  "feedback.mail_fallback_manual": "Could not open the mail app automatically. Please write to: {email}",
  "feedback.summary_show_details": "Show feedback",
  "feedback.summary_hide_details": "Hide feedback",
  "feedback.summary_score_label": "Practice score",
  "feedback.summary_score_aria": "Practice score {score} out of 100",
  "feedback.summary_star_aria": "{rating} of 5 stars",
  "feedback.summary_review_measures": "Review {measures}",
  "feedback.summary_title": "Practice summary",
  "feedback.summary_accuracy": "Accuracy",
  "feedback.summary_timing_not_measured": "Timing not measured",
  "feedback.summary_timing_avg_value": "Timing avg {ms} ms",
  "feedback.summary_weak_measures": "{count} weak measures",
  "feedback.summary_errors": "Errors",
  "feedback.summary_missed": "Missed",
  "feedback.summary_early_late": "Early / late",
  "feedback.summary_sync": "Sync issues",
  "feedback.summary_speed": "Speed",
  "feedback.summary_balanced": "Balanced session",
  "feedback.summary_no_hand_data": "No hand data yet.",
  "feedback.summary_no_weak_measures": "No weak measures",
  "feedback.summary_no_notes_played": "No notes played yet",
  "feedback.summary_no_notes_played_detail": "Play a few notes first, then midipiano.app can point you to specific measures.",
  "feedback.summary_by_hand": "By hand",
  "feedback.summary_measures_to_review": "Measures to review",
  "feedback.summary_hand_values": "{accuracy}% · missed {missed} · avg {timing}",
  "feedback.summary_missed_count": "{count} missed",
  "feedback.summary_wrong_count": "{count} wrong",
  "feedback.summary_offtime_count": "{count} off-time",
  "feedback.summary_sync_count": "{count} sync",
  "feedback.summary_measure_label": "m.{measure}",
  "feedback.summary_left_hand": "Left hand",
  "feedback.summary_right_hand": "Right hand",
  "feedback.summary_both_hands": "Both hands",
  "feedback.summary_mostly_early": "Mostly early",
  "feedback.summary_mostly_late": "Mostly late",
  "feedback.summary_left_more_missed": "Left hand missed more notes",
  "feedback.summary_right_more_missed": "Right hand missed more notes",
  "feedback.summary_hands_out_of_sync": "Hands out of sync",
  "feedback.summary_partial": "Partial session",
  "feedback.summary_wait_assisted": "Wait Mode assisted",
  "feedback.summary_loop": "Loop practice",
  "focus.button.aria_enter": "Focus Mode",
  "focus.button.aria_exit": "Exit Focus Mode",
  "focus.button.bottom": "Mode",
  "focus.button.exit_bottom": "Focus Mode",
  "focus.button.exit_top": "Exit",
  "focus.button.top": "Focus",
  "focus.fab_label": "Focus mode",
  "focus.hand_short_both": "Both",
  "focus.hand_short_left": "Left",
  "focus.hand_short_right": "Right",
  "focus.loop_disabled_title": "Loop A-B disabled",
  "focus.loop_enabled_title": "Loop A-B enabled",
  "focus.loop_toggle_aria": "Toggle loop A-B",
  "focus.no_exercise": "No exercise",
  "import.error_file_too_large": "File too large ({current}). Max: {max}.",
  "import.error_mxl_entry_count": "MXL has too many entries ({count}). Max: {max}.",
  "import.error_mxl_entry_too_large": "MXL entry too large ({entry}: {current}). Max: {max}.",
  "import.error_mxl_uncompressed_too_large": "MXL uncompressed content is too large ({current}). Max: {max}.",
  "import.status_processing_fun": "Processing the score...",
  "import.status_error": "Import error: {error}",
  "import.recaptcha_generic_error": "We couldn't verify this import. Please wait a few seconds and try again.",
  "import.file_too_large": "That file is too large to import. Try a smaller score.",
  "import.file_unavailable": "We couldn't read that file. Pick it again. Cloud files (iCloud, Dropbox) may still be downloading.",
  "import.status_file_too_large": "File too large ({current}). Max: {max}.",
  "import.status_format_not_allowed": "Format not allowed. Use only: {formats}",
  "import.status_imported_success": "Imported successfully: {file}",
  "import.status_select_valid": "Select a valid file ({formats}).",
  "language.selector_aria": "Language",
  "language.short_label": "Lang",
  "midi.enable": "Enable MIDI",
  "midi.enable_enabled": "MIDI enabled",
  "midi.error_api_unavailable": "No MIDI API available.",
  "midi.generic_label": "MIDI",
  "midi.indicator_connected": "MIDI connected: {input}",
  "midi.indicator_disconnected": "MIDI not connected",
  "midi.input_generic": "input",
  "midi.inputs_aria": "MIDI inputs",
  "midi.insecure_hint": " | possible cause: insecure HTTP, try HTTPS",
  "midi.no_inputs": "No MIDI inputs",
  "midi.refresh_devices": "Rescan devices",
  "midi.reconnect_prompt_title": "Keyboard disconnected",
  "midi.reconnect_prompt_body": "Your MIDI keyboard may have lost its connection while the screen was off. Reactivate it to keep playing.",
  "midi.reconnect_prompt_action": "Reactivate",
  "midi.experimental_tag": "Beta",
  "midi.output_lights_subsection": "Lighted keys (optional)",
  "midi.output_lights_enabled": "Lights",
  "midi.output_lights_enabled_aria": "Enable keyboard lights",
  "midi.output_lights_profile": "Manufacturer/model",
  "midi.output_lights_profile_aria": "Lighted keyboard manufacturer or model",
  "midi.output_lights_profile_generic": "Generic (auto detect)",
  "midi.output_lights_profile_mustar_meks": "Mustar / MEKS",
  "midi.output_lights_profile_casio_navigate": "Casio (MIDI In Navigate)",
  "midi.output_lights_profile_partykeys": "PopuMusic · PartyKeys",
  "midi.output_lights_profile_popupiano": "PopuMusic · PopuPiano",
  "midi.output_lights_profile_hint_generic": "Generic mode sends standard Note On/Off MIDI. If your keyboard does not react, run auto scan to detect the channel.",
  "midi.output_lights_profile_hint_mustar_meks": "Mustar / MEKS mode sends standard Note On/Off plus Mustar key-light messages. If lights do not react, run auto scan to lock the channel.",
  "midi.output_lights_profile_hint_casio": "Casio (LK-S): enable MIDI In Navigate on the keyboard first, then use auto scan to lock the channel that lights keys.",
  "midi.output_channel": "Output channel",
  "midi.output_channel_aria": "MIDI output channel",
  "midi.select_output_placeholder": "Select receiver...",
  "midi.output_option_web_audio": "Browser audio (Web Audio)",
  "midi.output_channel_scan_help_aria": "Auto channel setup help",
  "midi.output_channel_scan_committed": "Channel set to {channel}.",
  "midi.output_channel_scan_finished": "Scan 1-16 finished. If the key lights responded, run it again and press \"Use channel\".",
  "midi.output_channel_scan_running": "Scanning channel {current}/{total}... Press \"Use channel\" if it responds.",
  "midi.output_channel_scan_start": "Auto scan 1-16",
  "midi.output_channel_scan_use_current": "Use channel {channel}",
  "midi.output_channel_scan_modal_title": "Auto channel setup",
  "midi.output_channel_scan_modal_body": "This feature tests channels 1-16 automatically and sends one probe note on each channel.",
  "midi.output_channel_scan_modal_body_mustar_meks": "For Mustar / MEKS keyboards, this scan tests channels 1-16 with standard Note On/Off and then applies Mustar key-light messages on the selected channel.",
  "midi.output_channel_scan_modal_body_casio": "For Casio key-light models, this scan sends standard MIDI notes (Note On/Off).",
  "midi.output_channel_scan_modal_steps": "When your keyboard reacts, press auto scan again to lock the detected channel.",
  "midi.output_channel_scan_modal_steps_mustar_meks": "Start auto scan and watch the key lights. When your keyboard reacts, press it again to lock the channel.",
  "midi.output_channel_scan_modal_steps_casio": "On the keyboard, enable MIDI In Navigate first. Then run auto scan and press it again when keys react.",
  "midi.output_channel_scan_modal_experimental_note": "Behavior may vary depending on keyboard model and firmware version.",
  "midi.output_channel_scan_modal_experimental_note_mustar_meks": "Some Mustar / MEKS firmware versions only react on specific MIDI output ports.",
  "midi.output_channel_scan_modal_experimental_note_casio": "MIDI In Navigate is a keyboard-side setting and cannot be toggled remotely by the app.",
  "midi.output_volume": "Output volume",
  "midi.outputs_aria": "Output receiver",
  "midi.reco_ios_link_label": "Discover MIDIWeb Browser (midiweb.cc)",
  "midi.reco_ios_appstore_label": "Download on the App Store",
  "midi.reco_ios_body": "Browsers on iPhone and iPad (Safari, Chrome, Edge...) cannot connect to MIDI keyboards. Our recommendation: MIDIWeb Browser, a free browser with MIDI support. Open it and go to https://midipiano.app.",
  "midi.reco_mac_body": "Safari on the Mac cannot connect to MIDI keyboards. Use a browser with MIDI support such as Chrome, Edge or Firefox, or our recommended alternative: MIDIWeb Browser, also available for macOS.",
  "midi.reco_firefox_desktop_body": "Firefox will ask you to install a small Mozilla permission add-on the first time you enable MIDI with a keyboard connected. It is normal, safe, and only happens once. If no MIDI device is plugged in, Firefox skips that prompt and only the virtual keyboard is enabled. Chrome and Edge work without extra steps.",
  "midi.reco_firefox_android_body": "MIDI is not available in Firefox on Android. Please use Chrome or another compatible browser to connect your keyboard.",
  "midi.status_activate_first": "Enable MIDI first.",
  "midi.status_api_missing": "This browser does not expose WebMIDI API for this page. Try MIDIWeb Browser over HTTPS.",
  "midi.status_enable_error": "Could not enable MIDI ({name}: {message}) [context {secure}, {protocol}//{host}]{insecureHint}",
  "midi.status_input_connected": "Input connected: {input}{outputInfo}",
  "midi.status_input_label": "Input",
  "midi.status_invalid_input": "Invalid MIDI input.",
  "midi.status_invalid_output": "Invalid MIDI output.",
  "midi.status_web_audio_output_connected": "Receiver enabled: browser audio.",
  "midi.status_native_activated": "MIDI enabled successfully. Select input and output.",
  "midi.status_native_error": "{action} ({errorName}: {errorMessage}).",
  "midi.status_output_connected": "Output connected: {output} (vol {volume}){inputInfo}",
  "midi.status_output_selector_missing": "MIDI output selector unavailable.",
  "midi.status_read_ports_error": "MIDI enabled ({mode}), but failed to read MIDI ports ({errorName}: {errorMessage}).",
  "midi.status_state_change_error": "MIDI enabled ({mode}), but failed to register state changes ({error}).",
  "midi.status_virtual_output": "Virtual output",
  "virtual_keyboard.output_modal_title": "Configure sound input/output",
  "virtual_keyboard.output_modal_body": "Practice needs an active input. Enable MIDI, choose Web browser to use the virtual keyboard or a physical MIDI input, then choose Browser audio or a MIDI output for sound.",
  "virtual_keyboard.output_modal_configure": "Configure MIDI",
  "virtual_keyboard.output_modal_continue": "Not now",
  "midi.step_enable": "Step 1: System permissions",
  "midi.step_select_input": "Step 2: sound input",
  "midi.step_select_output": "Step 3: Sound output",
  "nav.home": "Home",
  "nav.settings": "Settings",
  "option.exercise_fallback": "Exercise",
  "option.exercise_prefix": "Exercise: {name}",
  "option.score_prefix": "Score: {name}",
  "option.temp_prefix": "Temporary: {name}",
  "panel.load.compat_line_1": "• Supported score formats: MusicXML (.musicxml, .xml, .mxl) and MEI (.mei). MusicXML/MXL usually preserves the visual score layout as authored.",
  "panel.load.compat_line_2": "• Unsupported directly: .mid, .midi, .pdf, .mscz, .sib, .gp/.gp3/.gp4/.gp5. Export or convert to MusicXML, MXL or MEI first, then import again.",
  "panel.load.compat_line_3": "• You can export to MusicXML/MXL from apps such as musescore.org, Finale or Sibelius.",
  "panel.load.compat_title": "Which formats are accepted?",
  "panel.load.dropzone_subtitle": "You can also drag and drop the file",
  "panel.load.dropzone_title": "Click here to choose a score file",
  "panel.load.file_aria": "Score file",
  "panel.load.formats_allowed": "Allowed formats: .mxl, .musicxml, .xml, .mei",
  "panel.load.go_imported": "Go to imported exercise",
  "panel.load.hint": "Import a score from your device.",
  "panel.load.local_source": "Import new score",
  "panel.load.processing_detail": "Preparing the MusicXML render.",
  "panel.load.processing_file": "Rendering",
  "panel.load.processing_title": "Processing score...",
  "panel.load.ready": "Score loaded. Opening practice view.",
  "panel.load.select_valid_file": "Select a valid file.",
  "panel.load.title": "Import Score",
  "panel.midi.hint": "To practice, enable MIDI, choose an input, and choose a sound output. Use Web browser as the input for the virtual keyboard.",
  "panel.midi.title": "Connect your digital instrument",
  "playback.completed": "Playback completed.",
  "playback.modal_need_output_body": "To use playback, first configure the MIDI connection and connect an output device.",
  "playback.modal_need_output_title": "Configure MIDI output",
  "playback.modal_open_midi_tab": "Open MIDI connection",
  "playback.need_output": "Connect a MIDI output to play back.",
  "playback.no_active_exercise": "No active exercise.",
  "playback.no_notes_for_hand": "No notes for the selected hand mode.",
  "playback.output_error": "MIDI output error: {error}",
  "playback.playing": "Playing: {name}",
  "playback.preparing": "Preparing playback...",
  "playback.stopped": "Playback stopped.",
  "playback.stopped_output_disconnected": "Playback stopped: MIDI output disconnected.",
  "playback.stopped_output_missing": "Playback stopped: MIDI output unavailable.",
  "practice.auto_restart_count_in": "Auto restart with count-in",
  "practice.auto_restart_on_end": "Auto restart at end",
  "practice.completed_press_start": "Range completed. Press Practice to begin again.",
  "practice.count_in_active": "Count-in",
  "practice.count_in_wait": "Count-in active: wait {beats} beat(s)",
  "practice.diagnosis_both": "Tempo and force both unstable. Practice slower (tempo 50%).",
  "practice.diagnosis_timing_only": "Pure timing offset. Move both hands as one block.",
  "practice.diagnosis_velocity_only": "Timing ok, but force control is uneven between fingers.",
  "practice.difficulty_aria": "Difficulty",
  "practice.difficulty_beginner": "Beginner (150 ms)",
  "practice.difficulty_custom": "Custom",
  "practice.difficulty_master": "Master (40 ms)",
  "practice.difficulty_normal": "Normal (80 ms)",
  "practice.dynamics_fair": "Dynamics uneven (dV {dv})",
  "practice.dynamics_good": "Dynamics acceptable (dV {dv})",
  "practice.dynamics_perfect": "Dynamics balanced (dV {dv})",
  "practice.dynamics_voicing": "Voicing detected +{boost}% (dV {dv})",
  "practice.dynamics_weak": "Dynamics unbalanced (dV {dv})",
  "practice.dynamics_weak_feedback": "Correct notes, but force is unbalanced (dV {dv})",
  "practice.exercise_aria": "Exercises",
  "practice.exercise_catalog_label": "Exercises",
  "practice.exercise_catalog_loading": "Loading exercises...",
  "practice.exercise_not_found": "Exercise not found",
  "practice.geometry_not_ready": "The score is not ready for practice yet. Try again.",
  "practice.exercise_topbar_label": "Exercise",
  "practice.extra_note": "Extra note",
  "practice.hand_mode_aria": "Hand mode",
  "practice.hand_mode_both": "Both hands",
  "practice.hand_mode_left": "Left hand only",
  "practice.hand_mode_right": "Right hand only",
  "practice.hands_delta": "Hands delta: {ms} ms",
  "practice.hands_out_of_sync": "Hands out of sync ({ms} ms)",
  "practice.incorrect": "Incorrect",
  "practice.loop_ab": "Loop A-B",
  "practice.loop_enable": "Repeat measures (A-B)",
  "practice.full_score": "View context",
  "practice.full_score_aria": "View full loop score",
  "practice.stopped_ready": "Take stopped. You can repeat or clear.",
  "practice.no_active_exercise": "No active exercise",
  "practice.no_exercises_loaded": "No exercises loaded",
  "practice.no_notes_for_hand": "No notes for the selected hand",
  "practice.pedagogy.button": "Guide",
  "practice.pedagogy.button_aria": "Open exercise guide",
  "practice.pedagogy.empty": "This exercise does not include additional practice guidance.",
  "practice.pedagogy.focus_label": "Focus:",
  "practice.pedagogy.goal_label": "Goal:",
  "practice.pedagogy.level.advanced": "Advanced",
  "practice.pedagogy.level.beginner": "Beginner",
  "practice.pedagogy.level.generic": "Level",
  "practice.pedagogy.level.intermediate": "Intermediate",
  "practice.pedagogy.level_with_stage": "{level} · Stage {stage}",
  "practice.pedagogy.tips_title": "Tips",
  "practice.pedagogy.title": "Exercise guide",
  "practice.pedagogy.unavailable": "Guide unavailable",
  "practice.note_correct": "Correct note ({source})",
  "practice.note_correct_off_timing": "Correct note out of timing ({source})",
  "practice.note_missed": "Missed note",
  "practice.need_midi_access": "Enable MIDI before starting practice.",
  "practice.need_web_audio_output": "Select Browser audio as the sound output before starting practice.",
  "practice.play": "🔊 Listen",
  "practice.precision_compact": "🎯 Precision: {precision}% (Hits: {success} | Errors: {errors})",
  "practice.press_start_count_in": "Press Practice to begin.",
  "practice.preparing": "Preparing...",
  "practice.progress": "Progress: {progress}",
  "practice.range_aria": "Practice range by measure",
  "practice.range_end_aria": "Range end",
  "practice.range_start_aria": "Range start",
  "practice.speed_aria": "Speed",
  "practice.tempo_advanced_aria": "Tempo details",
  "practice.tempo_bpm_input": "Target BPM",
  "practice.tempo_changes_label": "Tempo changes in score",
  "practice.tempo_default": "Default",
  "practice.tempo_now": "Now",
  "practice.tempo_playing_now": "Playing now",
  "practice.tempo_reset_100": "Reset 100%",
  "practice.tempo_score": "Score tempo",
  "practice.tempo_variable": "Variable tempo",
  "practice.stop": "■ Stop",
  "practice.timing_compact": "Timing {onTime}/{count} · ±{avg} ms · early {early} · late {late}",
  "practice.timing_guide_count_in": "Timing guide: count-in {current}/{total}",
  "practice.timing_guide_focus_count_in": "Count-in {current}/{total}",
  "practice.timing_guide_focus_idle": "Pulse guide",
  "practice.timing_guide_focus_ignored": "Timing ignored",
  "practice.timing_guide_focus_running": "{delta} · beat {beat}/{beatsPerMeasure}",
  "practice.timing_guide_focus_waiting": "Waiting first note",
  "practice.timing_guide_idle": "Timing guide: start an exercise.",
  "practice.timing_guide_ignored": "Timing guide disabled (timing ignored).",
  "practice.timing_guide_running_musical": "Timing guide: {delta} · beat {beat}/{beatsPerMeasure} · note {current}/{total}",
  "practice.timing_guide_waiting": "Timing guide: waiting for first correct note.",
  "practice.timing_ignored_compact": "Timing ignored",
  "practice.transport_play": "▶ Practice",
  "practice.transport_pause": "Pause",
  "practice.transport_paused": "Paused",
  "practice.status_ready": "Ready",
  "practice.status_practicing": "Practicing...",
  "practice.status_listening": "Listening...",
  "practice.transport_resume": "Resume",
  "practice.transport_stop": "⏹ Stop",
  "practice.waiting_start_count_in": "Waiting for Practice",
  "score_surface.processing": "Processing...",
  "score_surface.resizing": "Resizing score...",
  "seo.feature_1": "Real-time MIDI feedback",
  "seo.feature_2": "Hand separation training",
  "seo.feature_3": "Multi-language support",
  "seo.feature_4": "MusicXML and MEI score import",
  "seo.jsonld_description": "Practice piano online in your browser. Connect your MIDI keyboard, import MusicXML or MEI scores, and train each hand with real-time feedback.",
  "seo.meta_description": "Practice piano online in your browser. Connect your MIDI keyboard, import MusicXML or MEI scores, and train each hand with real-time feedback.",
  "seo.title": "midipiano.app - Online Piano Practice with MIDI",
  "seo.h1": "Practice piano online with your MIDI keyboard",
  "seo.faq_title": "Frequently asked questions",
  "seo.faq_q1": "Can I practice piano online with a MIDI keyboard?",
  "seo.faq_a1": "Yes. midipiano.app runs in your web browser: connect a MIDI keyboard over USB or Bluetooth and play interactive scores with real-time feedback for each hand.",
  "seo.faq_q2": "Which MIDI keyboards are supported?",
  "seo.faq_a2": "Any MIDI-compatible keyboard or digital piano works. Use a browser with Web MIDI support such as Chrome or Edge; on iPhone and iPad you can play through the MIDIWeb Browser app. The daily challenge stays within A2 to G5, so any keyboard reaching down to C2 covers it.",
  "seo.faq_q3": "Do I need to install anything or create an account?",
  "seo.faq_a3": "No. midipiano.app works entirely in the browser, with nothing to install and no account needed.",
  "seo.faq_q4": "Can I import my own sheet music?",
  "seo.faq_a4": "Yes. Import MusicXML, MXL or MEI files and they render as interactive scores you can practice hand by hand, in loops and at your own tempo.",
  "seo.faq_q5": "How does the practice feedback work?",
  "seo.faq_a5": "The app listens to your MIDI keyboard as you play and scores every note in real time, per hand and per loop, with built-in exercises from beginner to advanced.",
  "seo.faq_q6": "What is the daily challenge?",
  "seo.faq_a6": "A new short piece every day, the same for everyone, in three difficulty tiers. You get three attempts per tier: sight-read it, get a star score for the day and share your result.",
  "seo.challenge_title": "Daily piano challenge - sight-read a new piece every day - midipiano.app",
  "seo.challenge_meta_description": "A new short piece every day, the same for everyone, in three difficulty tiers. Connect your MIDI keyboard, sight-read it and share your star score.",
  "seo.challenge_h1": "The daily piano challenge",
  "seo.challenge_how_title": "How it works",
  "seo.challenge_how_body": "Every day at midnight UTC a new piece appears, generated for that date and identical for every player. Pick your tier, listen to it if you want, then play it at sight on your MIDI keyboard while the app scores every note.",
  "seo.challenge_need_title": "What you need",
  "seo.challenge_need_body": "A MIDI keyboard connected over USB or Bluetooth and a browser with Web MIDI, such as Chrome or Edge. Nothing to install and no account. You get three attempts per tier and your best one counts.",
  "settings.aria_button": "Settings",
  "settings.aria_panel": "Settings",
  "settings.ble_timing_smoothing": "Smooth BLE MIDI timing (experimental)",
  "settings.ignore_timing": "Ignore timing (notes only)",
  "settings.keep_awake": "Keep screen awake",
  "settings.recommended_short": "Rec.",
  "settings.section_about": "About midipiano.app",
  "settings.contact_button": "Contact",
  "settings.error_reporting": "Share optional diagnostics",
  "settings.section_engine": "Evaluation engine",
  "settings.section_visualization": "Visualization",
  "settings.show_feedback": "Show feedback",
  "settings.show_keyboard": "Show virtual keyboard",
  "settings.keep_screen_awake": "Keep the screen awake",
  "settings.keep_screen_awake_unsupported": "Not available in this browser.",
  "settings.staff_zoom": "Score zoom",
  "settings.sync_tolerance": "Sync tolerance (ms)",
  "settings.sync_tolerance_recommended": "Recommended: {value} ms (click to apply)",
  "settings.title": "Settings",
  "settings.two_hand_sync": "Validate two-hand sync",
  "settings.vexflow_unavailable": "VexFlow is not available in this browser.",
  "settings.virtual_metronome": "Virtual metronome",
  "settings.virtual_metronome_volume": "Metronome volume",
  "settings.zoom_in_aria": "Zoom in",
  "settings.zoom_out_aria": "Zoom out",
  "summary.completed": "completed",
  "summary.interrupted": "interrupted",
  "summary.last_result": "Last: {exerciseName} ({handMode}), {completion}. {successCount}/{totalExpectedNotes} hits, {errorCount} errors, timing {timingOnTime}/{timingCount} on time (avg ±{timingAvgAbsMs} ms). [{when}]",
  "summary.last_result_timing_ignored": "Last: {exerciseName} ({handMode}), {completion}. {successCount}/{totalExpectedNotes} hits, {errorCount} errors, timing ignored. [{when}]",
  "tabs.about": "About",
  "tabs.load": "Load score",
  "tabs.midi": "Connect instrument",
  "tabs.nav_about": "Home",
  "tabs.nav_load": "Import",
  "tabs.nav_midi": "MIDI",
  "tabs.nav_practice": "Practice",
  "tabs.practice": "Practice",
  "ui.placeholder_pending": "Pending in midipiano.app",
  "ui.previous_render_preserved": "Previous render is still visible.",
  "ui.settings_hint": "Core settings are being migrated to midipiano.app.",
  "timing.feel_early": "Early ({pct}% beat)",
  "timing.feel_late": "Late ({pct}% beat)",
  "timing.feel_on_time": "On beat",
  "timing.status_early": "Early",
  "timing.status_late": "Late",
  "timing.status_on_time": "On beat",
  "settings.wait_mode": "Wait mode (pause until correct note)",
  "practice.note_near_time": "Correct note, slightly off ({source})",
  "feedback.sheet.show": "Show feedback",
  "feedback.sheet.hide": "Hide feedback",
  "settings.diagnostics_help_aria": "About optional diagnostics",
  "settings.diagnostics_modal_title": "Optional diagnostics",
  "settings.diagnostics_modal_body": "When enabled, midipiano.app sends temporary anonymous technical diagnostic data that helps us improve reliability, performance, and device compatibility, and shows us in aggregate which app settings (such as the interface theme) are actually used.",
  "settings.diagnostics_modal_close": "Got it",
  "settings.diagnostics_modal_choice": "You can change this choice at any time in Settings.",
  "settings.diagnostics_modal_more": "More information in our",
  "midi.input_option_web_browser": "Web browser (virtual keyboard)",
  "import.part_selection_title": "Choose piano part",
  "import.part_selection_body": "This score has more than one real piano part.",
  "import.part_selection_status": "Choose which piano part to import.",
  "import.render_timeout": "The score took too long or the connection dropped. Please try again.",
  "import.part_selection_both": "Both",
  "import.part_selection_parts_count": "({count} parts)",
  "feedback.summary_duration": "Duration",
  "feedback.summary_release": "Release",
  "feedback.summary_pedal": "Pedal",
  "feedback.summary_chord_clarity": "Chord clarity",
  "feedback.summary_release_early": "Keys released too early",
  "feedback.summary_release_late": "Keys released too late",
  "feedback.summary_pedal_check": "Check pedal changes",
  "feedback.summary_pedal_not_measured": "Pedal not measured",
  "feedback.summary_chords_uneven": "Chords are uneven",
  "feedback.summary_repeat_weak_measures": "Repeat weak measures",
  "feedback.summary_try_speed": "Try {speed}%",
  "feedback.summary_next_objective": "Next objective: {objective}",
  "feedback.summary_next_objective_no_input": "Next objective: Play the first notes",
  "feedback.summary_objective_measure": "in m.{measure}",
  "feedback.summary_objective_accuracy": "Accuracy",
  "feedback.summary_objective_timing": "Timing",
  "feedback.summary_objective_left_hand": "Left hand",
  "feedback.summary_objective_right_hand": "Right hand",
  "feedback.summary_objective_sync": "Hand sync",
  "feedback.summary_objective_release": "Releases",
  "feedback.summary_objective_pedal": "Pedal",
  "feedback.summary_objective_chord_clarity": "Chord clarity",
  "feedback.summary_objective_balanced": "Balanced session",
  "feedback.reward_headline_first_result": "First attempt saved",
  "feedback.reward_headline_new_best": "New personal best",
  "feedback.reward_headline_improved": "You improved",
  "feedback.reward_headline_solid_pass": "Solid pass",
  "feedback.reward_headline_next_rep": "Next rep is ready",
  "feedback.reward_chip_baseline": "First attempt",
  "feedback.reward_chip_new_best": "New best",
  "feedback.reward_chip_improved": "+{points} vs last",
  "feedback.reward_chip_near_star": "{points} from next star",
  "feedback.reward_chip_no_misses": "No misses",
  "feedback.reward_chip_timing_improved": "Timing improved",
  "feedback.reward_chip_clean_left": "Clean left hand",
  "feedback.reward_chip_clean_right": "Clean right hand",
  "feedback.reward_chip_clean_pass": "Clean pass",
  "feedback.reward_history_first": "First attempt in this setup",
  "feedback.reward_history_previous": "Previous {score}",
  "feedback.reward_history_best": "Best {score}",
  "feedback.reward_heatmap_aria": "Measure map",
  "feedback.reward_heatmap_measure_label": "m.{measure}: {status}",
  "feedback.reward_heatmap_clean": "clean",
  "feedback.reward_heatmap_ok": "ok",
  "feedback.reward_heatmap_weak": "weak",
  "feedback.reward_heatmap_not_attempted": "not attempted",
  "feedback.analysis_global_title": "Global analysis",
  "feedback.analysis_global_hint": "Overall metrics for the selected scope.",
  "feedback.analysis_measure_title": "Measure {measure}",
  "feedback.analysis_measure_hint": "Metrics for the selected measure.",
  "feedback.map_title": "Practice map",
  "feedback.map_hint": "Click a measure to inspect it.",
  "feedback.map_all_measures": "All measures",
  "feedback.map_selected_measure": "Measure {measure} selected",
  "feedback.score_help_aria": "How practice score is calculated",
  "feedback.score_help_text": "Score = note accuracy + timing.\nBoth hands: hand sync counts 10%.\nFine technique can subtract up to 5 pts.\nStars: 5★ 90+ · 4★ 75+ · 3★ 60+ · 2★ 40+.",
  "feedback.scope_label": "View",
  "feedback.scope_full": "Full exercise",
  "feedback.scope_loop": "Loop {number}",
  "feedback.map_previous_range": "Previous measures",
  "feedback.map_next_range": "Next measures",
  "feedback.map_range_label": "Measure range",
  "feedback.map_range_option": "Measures {start}-{end}",
  "feedback.summary_timing": "Timing",
  "feedback.summary_clean": "Clean",
  "settings.feedback_sounds": "Feedback sounds",
  "practice.catalog_filters_aria": "Exercise filters",
  "practice.catalog_filter_level": "Level",
  "practice.catalog_filter_family": "Family",
  "practice.catalog_filter_hand": "Hand focus",
  "practice.catalog_filter_duration": "Duration",
  "practice.catalog_empty": "No exercises available.",
  "practice.catalog_no_matches": "No exercises match these filters.",
  "practice.catalog_count": "{visible} of {total} exercises",
  "practice.catalog_level_count": "{count} exercises",
  "practice.catalog_level_count_one": "1 exercise",
  "practice.catalog_expand_level": "View",
  "practice.catalog_collapse_level": "Hide",
  "practice.catalog_filter_all_levels": "All levels",
  "practice.catalog_filter_all_families": "All families",
  "practice.catalog_filter_all_hands": "Any hand focus",
  "practice.catalog_filter_any_duration": "Any duration",
  "practice.catalog_filter_duration_3": "Up to 3 min",
  "practice.catalog_filter_duration_5": "Up to 5 min",
  "practice.catalog_filter_duration_7": "Up to 7 min",
  "practice.catalog_minutes": "{minutes} min",
  "practice.catalog_family_scales": "Scales",
  "practice.catalog_family_arpeggios": "Arpeggios",
  "practice.catalog_family_chords": "Chords",
  "practice.catalog_family_independence": "Independence",
  "practice.catalog_family_leaps": "Leaps",
  "practice.catalog_family_rhythm": "Rhythm",
  "practice.catalog_family_polyrhythm": "Polyrhythm",
  "practice.catalog_family_reading": "Reading",
  "practice.catalog_family_voice-control": "Voice control",
  "practice.catalog_family_other": "Other",
  "practice.catalog_hand_both": "Both hands",
  "practice.catalog_hand_left": "Left hand",
  "practice.catalog_hand_right": "Right hand",
  "practice.catalog_hand_alternating": "Alternating hands",
  "tabs.nav_exercises": "Exercises",
  "app.top_title.exercises": "Exercise catalog",
  "exercises.title": "Exercise catalog",
  "exercises.search": "Search",
  "exercises.search_placeholder": "Title, goal, tag...",
  "exercises.catalog_col_exercise": "Exercise",
  "exercises.catalog_col_goal": "Goal",
  "practice.catalog_filter_tags": "Tags",
  "practice.catalog_filter_all_tags": "All tags",
  "exercises.catalog_col_time": "Practice recommendations",
  "exercises.curriculum_level_1": "Level 1 · Basic beginner",
  "exercises.curriculum_level_2": "Level 2 · Beginner, two hands",
  "exercises.curriculum_level_3": "Level 3 · Elementary",
  "exercises.curriculum_level_4": "Level 4 · Upper elementary",
  "exercises.curriculum_level_5": "Level 5 · Intermediate",
  "exercises.curriculum_level_6": "Level 6 · Upper intermediate / early advanced",
  "settings.theme": "Theme",
  "settings.theme_midnight": "Midnight Concert",
  "settings.theme_ivory": "Ivory Studio",
  "settings.theme_ocean": "Ocean Practice",
  "settings.theme_forest": "Forest Focus",
  "settings.theme_aubergine": "Aubergine Stage",
  "exercises.catalog_variant": "Variant",
  "feedback.summary_not_applicable": "n/a",
  "feedback.summary_not_measured_short": "Not measured",
  "feedback.summary_release_early_count": "{count} early releases",
  "feedback.summary_release_late_count": "{count} late releases",
  "cookies.consent_aria": "Cookie consent",
  "feedback.summary_hand_sync_score": "Hand sync",
  "feedback.summary_fine_technique": "Fine technique",
  "feedback.metric_accuracy_help": "Share of expected notes played correctly. Missed notes, wrong notes and notes outside the timing window lower this. It is the largest part of the practice score: 65%.",
  "feedback.metric_timing_help": "Average distance from the expected beat for notes that were played. Smaller milliseconds are better. It contributes 25% of the practice score.",
  "feedback.metric_sync_help": "How often left and right hand notes that should land together are played together. If the passage uses only one hand, this metric is not scored and its weight moves to accuracy and timing.",
  "feedback.metric_fine_help": "Small diagnostic adjustment for releases, note duration, pedal, articulation and chord clarity when those can be measured. It can subtract at most 5 points from the global score.",
  "feedback.summary_no_penalty": "No penalty",
  "feedback.summary_fine_penalty": "-{points} pt",
  "keyboard.aria_label": "Virtual piano keyboard",
  "service.unavailable_title": "We'll be right back",
  "service.unavailable_body": "The service is taking a short break. Please check again in a little while.",
  "service.offline_load": "You're offline. Connect to the internet to load this score.",
  "service.unavailable_short": "Temporarily unavailable",
  "feedback.stat_missed": "Missed",
  "feedback.stat_wrong": "Wrong",
  "feedback.stat_offtime": "Off-time",
  "feedback.stat_sync": "Sync",
  "feedback.stat_releases": "On release",
  "feedback.summary_hands_title": "Per-hand stats",
  "feedback.summary_tends_early": "tends early",
  "feedback.summary_tends_late": "tends late",
  "feedback.summary_dragging": "dragging",
  "feedback.summary_rushing": "rushing",
  "feedback.summary_touch_evenness": "touch {percent}%",
  "feedback.summary_dir_early": "early ◀",
  "feedback.summary_dir_late": "late ▶",
  "feedback.summary_extra_notes": "Extra notes added",
  "feedback.map_minimap_aria": "Whole-piece overview",
  "exercises.curriculum_level_0": "Level 0 · First steps",
  "exercises.curriculum_level_7": "Level 7 · Advanced",
  "exercises.unit_min": "min",
  "exercises.unit_min_per_chord": "min per chord",
  "exercises.unit_min_per_arpeggio": "min per arpeggio",
  "exercises.unit_reps": "reps",
  "exercises.unit_per_scale": "per scale",
  "exercises.unit_per_key": "per key",
  "exercises.unit_measure_fragments": "measure fragments",
  "exercises.unit_free_loop": "free loop",
  "exercises.challenge_reco_body": "At this level you're ready for the {tier} challenge: a short new piece every day, at first sight. Up for it?",
  "exercises.challenge_reco_cta": "Go to challenges",
  "feedback.reward_chip_hands_synced": "Hands in sync",
  "midi.output_channel_scan_modal_feedback": "Something not working? Tell us at feedback@midipiano.app",
  "midi.enable_activating": "Enabling…",
  "midi.refresh_searching": "Searching…",
  "tabs.nav_challenge": "Challenges",
  "challenge.title": "Daily challenge",
  "challenge.intro": "A new piece every day, the same for everyone: connect your keyboard, listen to it if you like, then press Start and sight-read it. Will you nail it?",
  "challenge.unavailable": "Today's challenge isn't available right now. Please check back soon.",
  "challenge.needs_midi": "You need a connected MIDI keyboard to play the challenge.",
  "challenge.needs_midi_cta": "Connect keyboard",
  "challenge.tier_starter": "Starter",
  "challenge.tier_intermediate": "Intermediate",
  "challenge.tier_advanced": "Advanced",
  "challenge.tier_starter_hint": "The melody in its simplest form, at a calm tempo.",
  "challenge.tier_intermediate_hint": "Livelier tempo, with passing notes filling out the melody.",
  "challenge.tier_advanced_hint": "Fast tempo, figures down to sixteenths, octaves and seventh chords.",
  "challenge.attempts_intro": "Best of {count} attempts.",
  "challenge.lives_left": "Attempts left: {count}",
  "challenge.lives_aria": "Attempts left: {remaining} of {total}",
  "challenge.retry": "Try again",
  "challenge.leave": "Finish challenge",
  "challenge.exit": "Exit",
  "challenge.continue_later": "Continue later",
  "challenge.practice": "Practice this piece",
  "challenge.practice_score_name": "Challenge {tier} · {label}",
  "challenge.practice_locked": "Play at least one attempt of the challenge to unlock practice.",
  "challenge.best_so_far": "Best so far",
  "challenge.no_score": "No score this time.",
  "challenge.no_score_yet": "No score yet.",
  "challenge.autoscroll_on": "Autoscroll: on",
  "challenge.autoscroll_off": "Autoscroll: off",
  "challenge.play": "Play this challenge",
  "challenge.status_done": "Played",
  "challenge.share": "Share result",
  "challenge.cancel_start": "Cancel",
  "challenge.start": "Start the challenge",
  "challenge.get_ready": "Get ready!",
  "challenge.get_ready_hint": "Hands on the keys. The count-in starts in a moment.",
  "challenge.score_name": "Daily challenge",
  "challenge.preparing": "Preparing the challenge…",
  "challenge.result_title": "Challenge complete!",
  "challenge.result_title_attempt": "Attempt done",
  "challenge.next_in": "New challenge in {time}",
  "challenge.time_hm": "{hours} h {minutes} min",
  "challenge.time_m": "{minutes} min",
  "challenge.share_text": "Daily challenge {label} · {tier} level",
  "challenge.share_on": "Share on {network}",
  "challenge.share_other": "More sharing options",
  "challenge.share_cta": "Share my result",
  "challenge.view_score": "View the score",
  "challenge.show_result": "Show result",
  "midi.firefox_denied_hint": "Firefox denied MIDI access without asking. It does this when it can't see any MIDI device. Make sure the keyboard is connected with a data USB cable and powered on, then reload this page and enable MIDI again.",
  "challenge.copy": "Copy to clipboard",
  "challenge.best_score": "Your best score: {score}%",
  "challenge.finish_confirm": "You still have {count} attempts to beat your score. Are you sure you want to finish today's challenge?",
  "challenge.finish_confirm_last": "You still have one attempt to beat your score. Are you sure you want to finish today's challenge?",
  "challenge.finish_confirm_action": "Finish anyway"
}
