"app.subtitle" = "Secure mobile connection";
"handoff.protected" = "Protected handoff";
"action.return_to_portal" = "Open HT Portal";
"action.sign_in_select_device" = "Sign in and select a device";
"action.disconnect" = "Disconnect";
"action.retry_disconnect" = "Retry disconnection";
"action.continue_vpn" = "Continue and authorize VPN";
"action.cancel" = "Cancel";
"action.done" = "Done";
"app.version" = "Version %@ (build %@) · n3n 3.4.6";
"license.title" = "Open-source licenses";
"license.open_source" = "Open-source licenses";
"license.n3n_summary" = "The HT Portal packet-tunnel extension contains n3n 3.4.6 and the Hive Technology packet bridge. This separate executable is distributed under GNU GPL version 3 only.";
"license.no_warranty" = "This software is provided without warranty. You may redistribute and modify the GPL-covered packet-tunnel components under the GNU GPL version 3.";
"license.source" = "Download corresponding source";
"license.gpl" = "GNU GPL version 3";
"license.lgpl" = "GNU LGPL version 2.1";
"license.project" = "n3n project";

"state.idle.title" = "Open a VPN from HT Portal";
"state.idle.detail" = "Choose VPN on a device in the portal, then continue in this app.";
"state.invalid_link" = "The VPN link is invalid or incomplete.";
"state.active_conflict" = "Disconnect the active VPN before opening another one.";
"state.cancelled.title" = "VPN not started";
"state.cancelled.detail" = "No VPN session data was sent by this app. You can return to HT Portal.";
"state.redeeming.title" = "Verifying request";
"state.redeeming.detail" = "Secure connection to HT Portal";
"state.stopping.title" = "Disconnecting";
"state.stopping.detail" = "Stopping the VPN and updating the portal.";
"state.stopping.short_detail" = "Stopping VPN";
"state.stopped.title" = "VPN disconnected";
"state.stopped.detail" = "You can start a new VPN from the portal.";
"state.stopped.portal_detail" = "The session has also been closed in the portal.";
"state.connected.title" = "VPN connected";
"state.connected.detail" = "Traffic to remote networks is routed through the secure tunnel.";
"state.checking.title" = "Checking connection";
"state.checking.detail" = "The tunnel is active; waiting for the runtime to respond.";
"state.connecting.title" = "Connecting to device";
"state.connecting.detail" = "Preparing the secure tunnel";
"state.failed.title" = "VPN connection failed";
"state.failed.detail" = "Check the details below, then try again from the portal.";
"state.failed.message_detail" = "Check the message below, then try again from the portal.";
"state.recovering.detail" = "Retrieving the reason for the interruption";
"state.runtime_stopped" = "The runtime ended the VPN session.";
"state.ios_stopped" = "iOS stopped the tunnel without returning further details.";
"state.stop_failed.title" = "Disconnection not confirmed";
"state.stop_failed.detail" = "The local VPN was stopped, but the portal did not confirm the closure. Try again.";
"state.permission.title" = "Authorize VPN";
"state.permission.detail" = "iOS will show the system consent before connecting the device.";
"generic.device" = "Device";
"preview.device" = "Packaging Line 04";

"privacy.title" = "Before you connect";
"privacy.summary" = "Review how HT Portal VPN handles data for the requested connection.";
"privacy.data_title" = "VPN data and privacy";
"privacy.traffic.title" = "VPN traffic";
"privacy.traffic.detail" = "Only HT Portal remote networks are routed. Traffic contents, browsing history and DNS queries are not inspected, logged or stored.";
"privacy.operational.title" = "Operational data";
"privacy.operational.detail" = "HT Portal processes the account and target-device association, a random installation ID, app version, session status, transport, quality, latency and errors. Security audit records also include the source IP and action.";
"privacy.use.title" = "Purpose and sharing";
"privacy.use.detail" = "This data is used only to establish, secure and troubleshoot the requested connection. It is not sold or shared with third parties and is not used for advertising, analytics or tracking.";
"privacy.retention.title" = "Retention";
"privacy.retention.detail" = "Session diagnostics are retained for up to 30 days after disconnection. Security audit events are retained for up to 180 days.";
"privacy.consent" = "By continuing, you authorize the processing described above, which is necessary to provide the requested VPN session.";
"privacy.policy" = "Read the privacy policy";

"diagnostics.title" = "VPN details";
"diagnostics.address" = "VPN address";
"diagnostics.runtime" = "Runtime";
"diagnostics.transport" = "Transport";
"diagnostics.phase" = "Phase";
"diagnostics.routes" = "Routes";
"diagnostics.skipped_routes" = "Excluded routes";
"diagnostics.packets" = "Packet diagnostics";
"diagnostics.phase.idle" = "Idle";
"diagnostics.phase.starting" = "Starting";
"diagnostics.phase.waiting-runtime" = "Waiting for runtime";
"diagnostics.phase.connecting-n3n" = "Connecting n3n";
"diagnostics.phase.checking-runtime" = "Checking runtime";
"diagnostics.phase.connected" = "Connected";
"diagnostics.phase.reconnecting" = "Reconnecting";
"diagnostics.phase.failed" = "Failed";
"diagnostics.transport.unknown" = "Unknown";
"diagnostics.transport.udp-adaptive" = "Automatic UDP";
"diagnostics.transport.udp-p2p" = "UDP peer-to-peer";
"diagnostics.transport.udp-relay" = "UDP relay";
"diagnostics.transport.tcp-relay" = "TCP relay";
"diagnostics.transport_format" = "Transport: %@";
"diagnostics.transport.udp-relay_warning" = "Peer-to-peer is unavailable. Traffic is relayed and may be slower. Allow bidirectional UDP to the configured HT Portal VPN servers; symmetric NAT or carrier-grade NAT may require a network or ISP change.";
"diagnostics.transport.tcp-relay_warning" = "The UDP path is unavailable. Traffic uses a TCP relay and may be slower. Check outbound UDP access to the configured HT Portal VPN servers.";
"state.switching_transport" = "Switching VPN transport to %@";
"error.p2p_unavailable" = "The peer-to-peer VPN path could not be confirmed";

"error.vpn_internal" = "Internal VPN tunnel error";
"error.overlay_conflict_detail" = "VPN network %@/%d is already used by local network %@/%d on %@";
"error.control_socket_detail" = "The VPN control channel cannot be reached: %@";
"error.session_expired" = "The VPN session has expired";
"error.session_closed_portal" = "The VPN session was closed by the portal";
"error.ios_version" = "The VPN connection requires iOS 18 or later";
"error.runtime_diagnostics" = "The runtime is not responding through the VPN: %@. n3n diagnostics: %@";
"error.missing_session" = "VPN session unavailable";
"error.invalid_session_options" = "The credentials received at startup are invalid";
"error.runtime_timeout" = "The runtime did not prepare the VPN in time";
"error.invalid_configuration" = "Invalid VPN configuration";
"error.overlay_conflict" = "The VPN network is already used by the local network";
"error.supernode_resolution" = "The VPN supernode cannot be resolved";
"error.control_socket" = "The VPN control channel cannot be reached";
"error.runtime_socket" = "The runtime is not responding through the VPN";
"error.remote_stopped" = "The session was closed by the portal";
"error.supernode_runtime_unreachable" = "The VPN supernode is responding, but the runtime cannot be reached on the n3n network";
"error.supernode_unreachable" = "No VPN supernode can be reached";

"error.keychain_unknown" = "unknown error";
"error.keychain" = "Could not access VPN credentials: %@ (%d)";
"error.invalid_saved_credentials" = "The saved VPN credentials are invalid";
"error.websocket_closed" = "WebSocket channel closed";
"error.websocket_closed_detail" = "WebSocket closed by the runtime (%d): %@";
"error.websocket_closed_code" = "WebSocket closed by the runtime (%d)";
"error.runtime_timeout_seconds" = "The runtime did not respond within %d seconds";
"error.runtime_missing_certificate" = "The runtime did not provide a TLS certificate";
"error.runtime_certificate_mismatch" = "The runtime TLS certificate does not match the session";
"error.runtime_untrusted_certificate" = "The runtime TLS certificate is not trusted";
"error.missing_tunnel_interface" = "VPN virtual interface unavailable";
"error.invalid_runtime_address" = "Invalid runtime address";
"error.websocket_initialization" = "Could not initialize the WebSocket channel";
"error.runtime_timeout_diagnostics" = "The runtime did not respond within %d seconds (%@)";
"error.runtime_connection_diagnostics" = "Could not connect to the runtime: %@ (%@)";
"error.runtime_rejected_websocket" = "The runtime rejected the WebSocket channel: %@";
"error.runtime_invalid_frame" = "The runtime sent an invalid WebSocket frame: %@";
"error.runtime_channel_closed" = "Runtime channel closed";
"error.runtime_closed_code" = "The runtime closed the VPN channel (%d)";
"error.runtime_closed" = "The runtime closed the VPN channel";

"network.path_unavailable" = "unavailable";
"network.phase" = "network phase: %@, path: %@, TLS: %@";
"network.setup" = "setup";
"network.starting" = "starting";
"network.preparing" = "preparing TCP/TLS";
"network.websocket_upgrade" = "TCP/TLS ready, WebSocket upgrade";
"network.error" = "error: %@";
"network.waiting" = "waiting: %@";
"network.unknown" = "unknown network state";
"network.websocket_ready" = "WebSocket ready";
"network.http_too_large" = "HTTP response too large";
"network.http_invalid" = "invalid HTTP response";
"network.http_empty" = "empty HTTP response";
"network.websocket_upgrade_invalid" = "invalid WebSocket upgrade";
"network.fragmented_control_frame" = "fragmented control frame";
"network.frame_too_large" = "frame too large";
"network.invalid_frame_size" = "invalid frame size";
"network.unsupported_opcode" = "unsupported opcode %d";
"tls.system_trust" = "system trust validation";
"tls.invalid_fingerprint" = "invalid received fingerprint";
"tls.missing_certificate" = "TLS certificate not provided";
"tls.fingerprint_verified" = "fingerprint verified";
"tls.fingerprint_mismatch" = "fingerprint mismatch";
"tls.invalid_ca" = "configured CA is invalid";
"tls.ca_verified" = "CA verified";
"tls.ca_untrusted" = "CA not trusted";
"tls.not_run" = "not run yet";
"tls.not_applicable" = "not applicable";
