/* App & login */
"app.name" = "WatchFlash Tools";
"login.tagline" = "Sign in to use restore and firmware features.";
"login.username" = "Username";
"login.username.placeholder" = "Enter username";
"login.password" = "Password";
"login.password.placeholder" = "Enter password";
"login.remember" = "Remember username and password";
"login.logging_in" = "Signing in…";
"login.button" = "Sign In";
"login.username_required" = "Please enter a username.";

/* Register */
"register.tagline" = "Create an account to use restore and firmware features.";
"register.username" = "Username";
"register.username.placeholder" = "Enter username";
"register.username.hint" = "Use a phone number or email to register";
"register.password" = "Password";
"register.password.placeholder" = "Enter password";
"register.verification_code" = "Verification code";
"register.verification_code.placeholder" = "Enter 6-digit code";
"register.send_code" = "Send code";
"register.send_code.cooldown_format" = "%ds";
"register.entry" = "Register";
"register.button" = "Sign Up";
"register.submitting" = "Signing up…";
"register.username_required" = "Please enter a phone number or email.";
"register.username_invalid_format" = "Invalid account format. Use a phone number or email.";
"register.password_required" = "Please enter a password (at least 6 characters).";
"register.code_required" = "Please enter the verification code (6 digits).";
"auth.back_to_login" = "Back to Sign In";

/* Reset password */
"reset_password.entry" = "Forgot Password";
"reset_password.tagline" = "Reset your password with a verification code.";
"reset_password.username" = "Account";
"reset_password.username.placeholder" = "Enter phone number or email";
"reset_password.new_password" = "New password";
"reset_password.new_password.placeholder" = "Enter new password";
"reset_password.verification_code" = "Verification code";
"reset_password.verification_code.placeholder" = "Enter 6-digit code";
"reset_password.send_code" = "Send code";
"reset_password.button" = "Reset Password";
"reset_password.submitting" = "Submitting…";
"reset_password.username_required" = "Please enter a phone number or email.";
"reset_password.username_invalid_format" = "Invalid account format. Use a phone number or email.";
"reset_password.new_password_required" = "Please enter a new password (at least 6 characters).";
"reset_password.code_required" = "Please enter the verification code (6 digits).";
"reset_password.success_hint" = "Password reset successfully. Please sign in with the new password.";

/* Language picker */
"language.picker.label" = "Language";
"language.name.en" = "English";
"language.name.zh_hans" = "简体中文";

/* Auth errors */
"auth.error.invalid_url" = "Invalid server address.";
"auth.error.invalid_response" = "Invalid server response.";
"auth.error.decoding_failed" = "Could not parse server response.";
"auth.error.http_status" = "Sign in failed (HTTP %d).";
"auth.error.client_version_mismatch" = "This app version does not match the server requirement. Please download the latest build.";
"auth.version_mismatch.download_label" = "Latest download URL";
"auth.version_mismatch.copy_link" = "Copy link";
"auth.version_mismatch.copied" = "Copied";
"auth.session_expired" = "Your session expired. Please sign in again.";

/* Device state */
"device.state.disconnected" = "Disconnected";
"device.state.connecting" = "Connecting";
"device.state.connected" = "Connected";
"device.state.recovery" = "Recovery Mode";
"device.state.dfu" = "DFU Mode";

/* Common */
"common.unknown" = "Unknown";
"common.not_available" = "N/A";
"common.placeholder_dash" = "—";

/* Sidebar */
"sidebar.section.device" = "Device";
"sidebar.account.username_unknown" = "Unknown user";
"sidebar.balance.points_format" = "Balance points: %d";
"sidebar.button.recharge" = "Recharge points";
"sidebar.button.ledger" = "View ledger";
"sidebar.placeholder.not_implemented_title" = "Not implemented yet";
"sidebar.placeholder.not_implemented_message" = "This feature will be added later.";

/* Point card redeem */
"pointcard.title" = "Recharge points";
"pointcard.back" = "Back";
"pointcard.hint" = "Enter the 18-character card number (letters and digits) and the 8-digit password (digits 1–9 only, no 0). Your balance updates immediately after a successful redeem.";
"pointcard.refund_notice" = "Successful recharges are non-refundable. Please recharge according to your actual usage.";
"pointcard.field.card_no" = "Card number";
"pointcard.field.card_no.placeholder" = "18-character code";
"pointcard.field.password" = "Password";
"pointcard.field.password.placeholder" = "8 digits (1–9)";
"pointcard.submit" = "Redeem";
"pointcard.submitting" = "Redeeming…";
"pointcard.success.credited_format" = "Credited %1$d points; balance is now %2$d.";
"pointcard.success.already_redeemed" = "This card was already redeemed; no additional credit. Balance refreshed.";
"pointcard.error.expired" = "This point card has expired and cannot be redeemed.";
"sidebar.refresh_catalog" = "Refresh Models & Firmware";
"sidebar.loading" = "Loading…";
"sidebar.section.models" = "Models";
"sidebar.no_models" = "No models";
"sidebar.firmware_section_format" = "Firmware (%@)";
"sidebar.no_firmware" = "No firmware for this model";

/* Firmware row */
"firmware.status.imported" = "Imported";
"firmware.status.not_imported" = "Not imported";
"firmware.action.select" = "Select";
"firmware.action.remove" = "Remove";
"firmware.action.import" = "Import…";
"firmware.action.download" = "Download";

/* CDN firmware download */
"firmware.download.help" = "Download this firmware from the configured CDN link, then import it automatically.";
"firmware.download.busy" = "Another firmware download is already in progress.";
"firmware.download.no_url" = "No CDN download URL is configured for this firmware.";
"firmware.download.started_format" = "CDN download started: %@";
"firmware.download.dir_failed_format" = "Could not prepare download folder: %@";
"firmware.download.failed_format" = "CDN download failed: %@";
"firmware.download.cancelled" = "CDN download cancelled.";
"firmware.download.cancel" = "Cancel";
"firmware.download.speed_unknown" = "—";
"firmware.download.rate_per_second_format" = "%@/s";
"firmware.download.status_known_total_format" = "%1$@ / %2$@ · %3$@";
"firmware.download.status_unknown_total_format" = "%1$@ · %2$@";

/* Import panel */
"panel.import_firmware.title" = "Import Firmware";
"panel.import_firmware.message" = "Display name: %1$@. Choose a file named “%2$@” (must match the last segment of encrypted_file_path).";

/* Detail cards */
"detail.connection_status" = "Connection";
"detail.current_firmware_format" = "Current firmware: %@";
"detail.status.disconnected_label" = "No device";
"detail.status.operable" = "Ready";
"detail.status.inoperable" = "Unavailable";
"detail.basic_info" = "Details";
"detail.log" = "Log";
"detail.flashing" = "Flashing in progress";
"detail.verbose_flash_log" = "Verbose restore log";
"detail.verbose_flash_log.help" = "Include Info and Verbose messages from the restore engine in the log panel.";
"detail.field.model" = "Model";
"detail.field.ios" = "iOS version";
"detail.field.ecid" = "ECID";
"detail.field.udid" = "UDID";
"detail.field.serial" = "Serial";
"detail.value.em_dash" = "—";

/* Toolbar */
"toolbar.redetect" = "Detect Again";
"toolbar.refresh_info" = "Refresh Info";
"toolbar.exit_recovery" = "Exit Recovery";
"toolbar.enter_recovery" = "Enter Recovery";
"toolbar.start_flash" = "Start Restore";
"toolbar.logout" = "Sign Out";
"toolbar.clear_log" = "Clear Log";
"toolbar.reboot" = "Reboot Device";

/* Activity logs */
"log.welcome.line1" = "Welcome to WatchFlash Tools.";
"log.welcome.line2" = "Devices are detected automatically; import and select firmware in the sidebar to start restoring.";
"log.firmware_selected_format" = "Selected firmware for restore: %@";
"log.connected_device_format" = "Connected device: %1$@ %2$@";
"log.recovery_mode_suffix" = "(Recovery mode)";
"log.device_disconnected" = "Device disconnected.";
"log.refreshing_device" = "Refreshing device info…";
"log.device_disconnected_reconnect" = "Device disconnected. Please reconnect.";
"log.refresh_done" = "Refresh complete.";
"log.entering_recovery" = "Entering recovery mode…";
"log.enter_recovery_failed_format" = "Failed to enter recovery: %@";
"log.device_entered_recovery" = "Device entered recovery mode; it will be detected again automatically.";
"log.exiting_recovery" = "Exiting recovery mode…";
"log.exit_recovery_failed_format" = "Failed to exit recovery: %@";
"log.reboot_sent" = "Reboot command sent; device will be detected again automatically.";
"log.rebooting" = "Rebooting device…";
"log.reboot_failed_format" = "Reboot failed: %@";
"log.device_rebooted" = "Device rebooted.";
"log.no_ipsw" = "No IPSW selected. Cannot start restore.";
"log.no_device" = "No device detected. Cannot start restore.";
"log.flash_started" = "Starting restore…";
"log.normal_then_recovery" = "Device is in normal mode; entering recovery mode…";
"log.enter_recovery_failed_retry" = "Failed to enter recovery. Please try again.";
"log.waiting_recovery_after_reboot" = "Device rebooting; waiting for recovery mode…";
"log.recovery_device_fallback_name" = "Recovery mode device";
"log.recovery_identified" = "Recovery mode device detected; starting restore.";
"log.recovery_wait_timeout" = "Recovery mode not detected in time. Check the cable and try again.";
"log.flash_missing_firmware_id" = "Cannot restore: firmware ID missing. Select the firmware again in the sidebar.";
"log.flash_missing_device_model_id" = "Cannot restore: device model ID missing. Select the firmware again in the sidebar.";
"log.flash_missing_ecid" = "Cannot restore: no ECID for this device (use Recovery/DFU and detect again).";
"log.flash_fatal_format" = "Restore stopped: %@";
"log.flash_not_logged_in" = "Cannot restore: not signed in or session expired. Please sign in.";
"log.session_expired_relogin" = "Session expired. Please sign in again.";
"log.fetch_payload_failed_format" = "Failed to fetch excluded-file payload: %@";
"log.flash_complete" = "Restore finished.";
"log.flash_failed_format" = "Restore failed: %@";
"log.flash_watchdog_usb_missing" = "No USB device has been enumerated for an extended period during restore; treating this as an abnormal disconnect.";
"log.flash_watchdog_stall" = "No native restore progress updates for an extended period; treating this as an abnormal interruption.";
"log.unknown_error" = "Unknown error";
"log.import_removed_format" = "Removed import entry: %@";
"log.import_failed_format" = "Import failed: %@";
"log.import_ok_format" = "Firmware imported: %@";
"log.log_cleared" = "Log cleared.";

/* Firmware catalog */
"catalog.error.not_logged_in" = "Not signed in; cannot load models.";
"catalog.error.invalid_url" = "Invalid server address.";
"catalog.error.session_expired" = "Session expired. Please sign in again.";
"catalog.error.load_failed_format" = "Load failed (HTTP %d)%@";
"catalog.import.filename_mismatch_format" = "File name must match encrypted_file_path (expected “%@”).";
"catalog.import.file_missing" = "The selected file does not exist.";

/* Flash billing & credentials */
"flash.charge.confirm_title" = "Confirm charge";
"flash.charge.confirm_detail" = "No valid restore credential. This restore will charge %d points. Continue?";
"flash.charge.confirm_detail_with_balance" = "No valid restore credential. This restore will charge %1$d points (balance %2$@ points). Continue?";
"flash.charge.confirm_extra_notice" = "For this device, the first five failed restore attempts are fully refunded. From the sixth failure onward, up to 20 points may be retained as a fee. Do not disconnect the device during flashing, or failure reporting and refunds may be affected.";
"flash.charge.button_confirm" = "Charge & continue";
"flash.charge.button_cancel" = "Cancel";
"flash.charge.user_cancelled" = "Charge cancelled; restore not started.";
"flash.charge.submitting" = "Confirming charge with server…";
"flash.charge.success_format" = "Charged %1$d points; balance is now %2$d points.";
"flash.credential.error.zero_price" = "This model’s restore price is zero or unset. Charging is not allowed. Contact an administrator.";
"flash.credential.missing_after_check" = "No valid credential after charge. Retry later or contact support.";
"flash.credential.ready" = "Valid restore credential present;";
"flash.credential.error.generic_format" = "Credential API error: %@";
"flash.alert.title" = "Cannot start restore";
"flash.alert.flow_stopped_title" = "Restore stopped";
"flash.alert.ok" = "OK";
"flash.error.firmware_model_mismatch" = "The selected firmware does not match the charged device model. Choose firmware for the same model you were charged for.";
"flash.failure.reported" = "Reported restore failure to the server (refund rules apply).";
"flash.failure.report_failed_format" = "Failed to report restore failure: %@";
"flash.failure.disconnect_alert.title" = "Restore failed";
"flash.failure.disconnect_alert.message" = "Restore failed and the device disconnected. Please place the device again. If it remains disconnected for a long time, try reconnecting the cable or restarting your computer.";
"flash.credential.error.invalid_url" = "Invalid server address.";
"flash.credential.error.unauthenticated" = "Not signed in.";
"flash.credential.error.decode" = "Could not parse server response.";
"flash.credential.error.conflict_still_no_credential" = "Server returned a conflict, but recheck found no valid credential.";

/* Ledger */
"ledger.title" = "Balance Ledger";
"ledger.back" = "Back";
"ledger.close" = "Close";
"ledger.loading" = "Loading…";
"ledger.load_more" = "Load more";
"ledger.none" = "No ledger records.";
"ledger.unauthenticated" = "Session expired. Please sign in again.";

/* Excluded payload errors */
"payload.error.invalid_url" = "Invalid server address.";
"payload.error.bad_http_format" = "Request failed (HTTP %d).";
"payload.error.bad_json" = "Could not parse server response.";
"payload.error.missing_field_format" = "Missing field: %@.";
"payload.error.bad_jwt" = "Session token is invalid.";
"payload.error.crypto_failed_format" = "Decryption failed: %@";

/* RSA bind errors */
"rsa.bind.error.key_create_failed_format" = "Failed to create RSA private key: %@";
"rsa.bind.error.key_read_failed" = "Failed to read local RSA private key.";
"rsa.bind.error.key_export_failed" = "Failed to export local RSA public key.";
"rsa.bind.error.sign_failed" = "Failed to sign challenge.";
"rsa.bind.error.probe_decrypt_failed" = "This client certificate does not match the server-bound certificate. The account may have been used on another client.";
"rsa.bind.error.certificate_mismatch" = "This client certificate does not match the server-bound certificate. The account may have been used on another client.";
"rsa.bind.error.server_protocol" = "Invalid server response format.";
"rsa.bind.error.unauthenticated" = "Authentication state is invalid. Please sign in again.";
"rsa.bind.error.http_status_format" = "Request failed (HTTP %d).";

/* Network proxy (SOCKS5) */
"proxy.picker.label" = "Connection route";
"proxy.option.none" = "No proxy (direct)";
"proxy.option.china" = "Mainland China";
"proxy.option.hong_kong" = "Hong Kong";
"proxy.option.usa" = "United States";
"proxy.option.iran" = "Iran";
"proxy.option.egypt" = "Egypt";
