diff --git a/.env b/.env index f69e5bcc..95505467 100644 --- a/.env +++ b/.env @@ -1,7 +1,6 @@ NODE_PATH=src PUBLIC_SITE_NAME=OpenShock -PUBLIC_SITE_DESCRIPTION=a free and open-source ecosystem to control various shock collars over the internet. PUBLIC_GITHUB_PROJECT_URL=https://github.com/OpenShock PUBLIC_DISCORD_INVITE_URL=https://discord.gg/OpenShock diff --git a/.gitignore b/.gitignore index aebe8d14..4e72d95f 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,6 @@ yarn.lock .claude .playwright-mcp + +# Paraglide (src/lib/paraglide ignores itself) +project.inlang/cache diff --git a/.husky/pre-commit b/.husky/pre-commit index f743e08d..b0940458 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,4 +1,5 @@ pnpm exec svelte-kit sync +pnpm exec paraglide-js compile --silent pnpm exec svelte-check --tsconfig ./tsconfig.json & pid1=$! diff --git a/.prettierignore b/.prettierignore index 83f5d41c..5c7f0e4d 100644 --- a/.prettierignore +++ b/.prettierignore @@ -22,3 +22,6 @@ src/worker-configuration.d.ts # Cloudflare headers file — no prettier parser _headers + +# Generated by Paraglide +src/lib/paraglide diff --git a/docker-compose.yml b/docker-compose.yml index 4e803dff..49d4970c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,7 +11,6 @@ services: - PUBLIC_BACKEND_API_URL=https://test - PUBLIC_GATEWAY_CSP_WILDCARD=http://*.localhost:3000 - PUBLIC_SITE_NAME=OpenShock - - PUBLIC_SITE_DESCRIPTION=a free and open-source ecosystem to control various shock collars over the internet. - PUBLIC_GITHUB_PROJECT_URL=https://github.com/OpenShock - PUBLIC_DISCORD_INVITE_URL=https://discord.gg/OpenShock - PUBLIC_TURNSTILE_DEV_BYPASS_VALUE=dev-bypass diff --git a/eslint.config.js b/eslint.config.js index 85bda1a8..46791481 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -64,6 +64,7 @@ export default defineConfig( 'yarn.lock', 'src/lib/api/internal', 'src/lib/components/ui', + 'src/lib/paraglide', // Workspace packages (e.g. svelte-core submodule) own their own linting 'packages/**', ], diff --git a/messages/de.json b/messages/de.json new file mode 100644 index 00000000..a1f82b70 --- /dev/null +++ b/messages/de.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Die Plattform für sicheres, zuverlässiges und wirklich latenzarmes Fernsteuern von Shockern.", + "landing_section_label": "Startseite", + "landing_hubs_online": "Hubs jetzt online: ", + "landing_learn_more": "Mehr erfahren", + "landing_wiki": "Wiki", + "landing_meta_description": "Willkommen bei OpenShock, einem freien Open-Source-Ökosystem, um verschiedene Shocker über das Internet zu steuern.", + "instance_meta_description": "Willkommen bei {siteName}, einer unabhängigen Instanz von OpenShock, einem freien Open-Source-Ökosystem, um verschiedene Shocker über das Internet zu steuern.", + "header_sidebar_toggle": "Seitenleiste umschalten", + "header_avatar_alt": "Avatar von {name}", + "header_menu_profile": "Profil", + "header_menu_settings": "Einstellungen", + "header_menu_logout": "Abmelden", + "header_login": "Anmelden", + "header_signup": "Registrieren", + "header_github_title": "OpenShock auf GitHub", + "header_discord_title": "Community-Discord", + + "footer_made_with": "Mit {#heart/} gemacht vom {#team}OpenShock-Team{/team}", + "footer_connection_status_label": "Verbindungsstatus zum Server", + "footer_signalr_state": "SignalR-Status", + "footer_frontend_version": "Frontend-Version", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backend-Version", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Sprache", + + "sidebar_home_link_label": "OpenShock-Startseite", + "sidebar_group_general": "Allgemein", + "sidebar_home": "Startseite", + "sidebar_shockers": "Shocker", + "sidebar_shared_shockers": "Geteilte Shocker", + "sidebar_hubs": "Hubs", + "sidebar_user_shares": "Benutzerfreigaben", + "sidebar_public_shares": "Öffentliche Freigaben", + "sidebar_serial_terminal": "Serielles Terminal", + "sidebar_group_admin": "Admin", + "sidebar_admin_monitoring": "Überwachung", + "sidebar_admin_online_hubs": "Verfügbare Hubs", + "sidebar_admin_online_gateways": "Verfügbare Gateways", + "sidebar_admin_management": "Verwaltung", + "sidebar_admin_users": "Benutzer", + "sidebar_admin_blacklists": "Blocklisten", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "E-Mail", + "sidebar_admin_automation_tokens": "Automatisierungstokens", + "sidebar_admin_configuration": "Konfiguration", + "sidebar_group_settings": "Einstellungen", + "sidebar_settings_api_tokens": "API-Tokens", + "sidebar_settings_sessions": "Sitzungen", + "sidebar_settings_audit_log": "Aktivitätsprotokoll", + "sidebar_settings_connections": "Verbindungen", + "sidebar_settings_account": "Kontoeinstellungen", + + "error_meta_title": "Dienst nicht verfügbar", + "error_meta_description": "OpenShock ist derzeit nicht verfügbar", + "error_meta_logo_alt": "OpenShock-Logo", + "error_fallback_message": "Etwas ist schiefgelaufen.", + "error_not_found_message": "Seite nicht gefunden", + "error_not_found_description": "Die gesuchte Seite existiert nicht.", + "error_unexpected_description": "Ein unerwarteter Fehler ist aufgetreten.", + "error_go_back": "Zurück", + + "auth_layout_logo_alt": "OpenShock-Logo", + "auth_layout_invalid_redirect_removed": "Eine ungültige Weiterleitungs-URL wurde zu deiner Sicherheit entfernt.", + + "auth_activate_breadcrumb": "Konto aktivieren", + "auth_activate_title": "Konto aktivieren", + "auth_activate_activating": "Dein Konto wird aktiviert...", + "auth_activate_success": "Dein Konto wurde aktiviert", + "auth_activate_failed": "Dieser Aktivierungslink ist ungültig oder abgelaufen", + "auth_activate_missing_token": "Aktivierungstoken fehlt", + "auth_activate_continue": "Weiter zur Anmeldung", + "auth_activate_toast_success": "Konto aktiviert", + + "auth_forgot_breadcrumb": "Passwort vergessen", + "auth_forgot_title": "Passwort vergessen", + "auth_forgot_description": "Gib deine E-Mail-Adresse ein, um dein Passwort zurückzusetzen", + "auth_forgot_email_label": "E-Mail", + "auth_forgot_email_placeholder": "E-Mail", + "auth_forgot_submit": "Passwort zurücksetzen", + "auth_forgot_signin_prompt": "Passwort wieder eingefallen? {#signin}Anmelden{/signin}", + "auth_forgot_mail_disabled": "Auf dieser Instanz ist das Zurücksetzen von Passwörtern nicht möglich, da kein E-Mail-Anbieter eingerichtet ist. Wende dich an deine Administration, um wieder Zugriff auf dein Konto zu erhalten.", + "auth_forgot_toast_sent": "Die Anfrage zum Zurücksetzen des Passworts wurde an die angegebene E-Mail-Adresse gesendet", + + "auth_login_breadcrumb": "Anmelden", + "auth_login_title": "Willkommen zurück", + "auth_login_loading_methods": "Verfügbare Anmeldemethoden werden geladen", + "auth_login_choose_method": "Melde dich mit einer dieser Methoden an", + "auth_login_with_account": "Melde dich mit deinem OpenShock-Konto an", + "auth_login_activation_after_signup": "Dein Konto wurde erstellt. Wir haben dir einen Aktivierungslink per E-Mail geschickt. Sieh in deinem Posteingang und im Spam-Ordner nach.", + "auth_login_activation_pending": "Dein Konto ist noch nicht aktiviert. Wir haben dir einen Aktivierungslink per E-Mail geschickt. Sieh in deinem Posteingang und im Spam-Ordner nach. Falls nichts ankommt, melde dich später erneut an, um einen neuen Link zu erhalten.", + "auth_login_oauth_only": "Dieses Konto hat kein Passwort. Melde dich über den Anbieter an, mit dem du dich registriert hast.", + "auth_login_oauth_only_with_buttons": "Dieses Konto hat kein Passwort. Melde dich über die Schaltflächen oben mit dem Anbieter an, mit dem du dich registriert hast.", + "auth_login_or_continue_with": "Oder weiter mit", + "auth_login_username_label": "Benutzername oder E-Mail", + "auth_login_password_label": "Passwort", + "auth_login_submit": "Anmelden", + "auth_login_signup_prompt": "Noch kein Konto? {#signup}Registrieren{/signup}", + "auth_login_legal": "Mit einem Klick auf „Anmelden“ stimmst du unseren {#tos}Nutzungsbedingungen{/tos} und unserer {#privacy}Datenschutzerklärung{/privacy} zu.", + + "auth_oauth_create_breadcrumb": "Mit {provider} registrieren", + "auth_oauth_create_title": "Mit {#provider}{provider}{/provider} registrieren", + "auth_oauth_create_description": "Vervollständige deine Kontodaten", + "auth_oauth_create_username_label": "Benutzername", + "auth_oauth_create_username_placeholder": "Benutzername", + "auth_oauth_create_email_label": "E-Mail", + "auth_oauth_create_email_placeholder": "E-Mail", + "auth_oauth_create_submit": "Registrieren", + "auth_oauth_create_legal": "Mit einem Klick auf „Registrieren“ stimmst du unseren {#tos}Nutzungsbedingungen{/tos} und unserer {#privacy}Datenschutzerklärung{/privacy} zu.", + + "auth_oauth_error_breadcrumb": "Authentifizierungsfehler", + "auth_oauth_error_title": "Authentifizierungsfehler", + "auth_oauth_error_back": "Zurück zur Anmeldung", + + "auth_reset_breadcrumb": "Passwort zurücksetzen", + "auth_reset_title": "Passwort zurücksetzen", + "auth_reset_checking": "Link zum Zurücksetzen wird geprüft...", + "auth_reset_choose_password": "Wähle ein neues Passwort für dein Konto", + "auth_reset_invalid": "Dieser Link zum Zurücksetzen ist ungültig oder abgelaufen", + "auth_reset_password_label": "Neues Passwort", + "auth_reset_password_placeholder": "Neues Passwort", + "auth_reset_confirm_label": "Neues Passwort bestätigen", + "auth_reset_confirm_placeholder": "Neues Passwort bestätigen", + "auth_reset_submit": "Passwort zurücksetzen", + "auth_reset_request_new": "Neuen Link anfordern", + "auth_reset_toast_success": "Passwort wurde zurückgesetzt", + + "auth_signup_breadcrumb": "Registrieren", + "auth_signup_toast_created_mail": "Konto erfolgreich erstellt. Bitte sieh in deinen E-Mails nach, um dein Konto zu bestätigen.", + "auth_signup_toast_created_no_mail": "Konto erfolgreich erstellt. Du kannst dich jetzt anmelden.", + "auth_signup_dialog_title": "Willkommen! Danke für deine Registrierung! ❤️", + "auth_signup_dialog_created_mail": "Dein Konto wurde erstellt. 🎉 Bitte sieh in deinen E-Mails nach, um dein Konto zu bestätigen.", + "auth_signup_dialog_verify_then_login": "Nachdem du deine E-Mail-Adresse bestätigt hast, kannst du dich anmelden.", + "auth_signup_dialog_created_no_mail": "Dein Konto wurde erstellt und ist einsatzbereit. 🎉", + "auth_signup_dialog_login_now": "Du kannst dich jetzt anmelden.", + "auth_signup_title": "Konto erstellen", + "auth_signup_loading_methods": "Verfügbare Registrierungsmethoden werden geladen", + "auth_signup_using_email": "Registrierung per E-Mail", + "auth_signup_choose_method": "Wähle deine bevorzugte Registrierungsmethode", + "auth_signup_back": "Zurück", + "auth_signup_username_label": "Benutzername", + "auth_signup_username_placeholder": "Max OpenShock", + "auth_signup_email_label": "E-Mail", + "auth_signup_email_placeholder": "max@example.com", + "auth_signup_password_label": "Passwort", + "auth_signup_password_placeholder": "Passwort", + "auth_signup_confirm_label": "Passwort bestätigen", + "auth_signup_confirm_placeholder": "Passwort bestätigen", + "auth_signup_submit": "Konto erstellen", + "auth_signup_signin_prompt": "Du hast schon ein Konto? {#signin}Anmelden{/signin}", + "auth_signup_or": "Oder", + "auth_signup_with_email": "Mit E-Mail registrieren", + "auth_signup_legal": "Mit einem Klick auf „Konto erstellen“ stimmst du unseren {#tos}Nutzungsbedingungen{/tos} und unserer {#privacy}Datenschutzerklärung{/privacy} zu.", + + "auth_verify_breadcrumb": "E-Mail bestätigen", + "auth_verify_title": "E-Mail bestätigen", + "auth_verify_verifying": "Deine E-Mail-Adresse wird bestätigt...", + "auth_verify_success": "Deine E-Mail-Adresse wurde bestätigt", + "auth_verify_failed": "Dieser Bestätigungslink ist ungültig oder abgelaufen", + "auth_verify_missing_token": "Bestätigungstoken fehlt", + "auth_verify_continue": "Weiter zur Anmeldung", + "auth_verify_toast_success": "E-Mail-Adresse bestätigt", + + "common_cancel": "Abbrechen", + "common_delete": "Löschen", + "common_edit": "Bearbeiten", + "common_share": "Teilen", + "common_copy_id": "ID kopieren", + "common_id_copied": "ID in die Zwischenablage kopiert", + "common_open_menu": "Menü öffnen", + "common_refresh": "Aktualisieren", + "common_settings": "Einstellungen", + "common_clear": "Zurücksetzen", + "common_online": "Online", + "common_offline": "Offline", + "common_paused": "Pausiert", + "common_resume": "Fortsetzen", + "common_resuming": "Wird fortgesetzt...", + "common_coming_soon": "(Demnächst)", + "common_save_changes": "Änderungen speichern", + "common_danger_zone": "Gefahrenbereich", + "common_name": "Name", + "control_intensity": "Intensität", + "control_duration": "Dauer", + "control_max_intensity": "Max. Intensität", + "control_max_duration": "Max. Dauer", + "control_vibration": "Vibration", + "control_value": "Wert", + "control_live_intensity": "Live-Intensität", + "control_type_stop": "Stopp", + "control_type_shock": "Schock", + "control_type_vibrate": "Vibrieren", + "control_type_sound": "Ton", + "live_tooltip_active": "Live über {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Verbinde...", + "live_tooltip_connect": "Mit Live-Steuerung verbinden", + "live_tooltip_hub_start": "Strg+Klick startet den ganzen Hub", + "live_tooltip_hub_stop": "Strg+Klick stoppt den ganzen Hub", + "pause_resume_shocker": "Shocker fortsetzen", + "pause_pause_shocker": "Shocker pausieren", + "pause_resume_all": "Alle Shocker fortsetzen", + "pause_pause_all": "Alle Shocker pausieren", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Hub auswählen", + "shocker_rf_id": "RF-ID", + "shocker_rf_id_invalid": "Die RF-ID muss eine ganze Zahl zwischen {min} und {max} sein.", + "shocker_model": "Modell", + "shocker_select_model": "Modell auswählen", + "shocker_name_placeholder": "Shocker-Name", + "shocker_menu_view_logs": "Protokolle anzeigen", + "shocker_delete_title": "Shocker löschen", + "shocker_delete_desc": "Möchtest du „{name}“ wirklich löschen? Dies kann nicht rückgängig gemacht werden.", + "shocker_toast_deleted": "Shocker „{name}“ gelöscht", + "shocker_toast_paused": "Shocker pausiert", + "shocker_toast_resumed": "Shocker fortgesetzt", + "shocker_add_desc": "Registriere einen neuen Shocker an einem deiner Hubs.", + "shocker_add_name_placeholder": "Mein Shocker", + "shockers_title": "Shocker", + "shockers_subtitle": "Alle Shocker, die mit deinen Hubs gekoppelt sind.", + "shockers_loading": "Shocker werden geladen...", + "shockers_toast_refreshed": "Shocker aktualisiert", + "shockers_toast_need_hub": "Du musst einen Hub erstellen, bevor du Shocker hinzufügen kannst.", + "shockers_toast_added": "Shocker hinzugefügt", + "shockers_unknown_module": "Unbekannter Modultyp", + "shockers_add": "Shocker hinzufügen", + "shockers_view_mode": "Ansicht", + "shockers_mode_classic": "Klassisch", + "shockers_mode_rich": "Erweitert", + "shockers_mode_simple": "Einfach", + "shockers_mode_map": "Karte", + "shockers_group_by_hub": "Nach Hub gruppieren", + "shockers_global_limits": "Globale Limits", + "shockers_logs_label": "Protokolle", + "shockers_empty_title": "Noch keine Shocker", + "shockers_empty_no_hubs": "Erstelle zuerst einen Hub und füge dann Shocker hinzu.", + "shockers_empty_has_hubs": "Füge einem deiner Hubs einen Shocker hinzu, um loszulegen.", + "shockers_create_hub": "Hub erstellen", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} Shocker", "countPlural=other": "{count} Shocker" } + } + ], + "shared_shockers_title": "Geteilte Shocker", + "shared_shockers_subtitle": "Shocker, die andere Nutzer mit dir geteilt haben.", + "shared_shockers_empty_title": "Bisher wurden keine Shocker mit dir geteilt.", + "shared_shockers_empty_desc": "Sobald jemand Shocker mit dir teilt, erscheinen sie hier.", + "shocker_logs_title": "Shocker-Protokolle", + "shocker_logs_subtitle": "Alle Steuerbefehle, die an deine Shocker gesendet wurden.", + "shocker_logs_live_title": "Neue Einträge erscheinen in Echtzeit", + "shocker_logs_paused_title": "Live-Updates pausieren beim Sortieren oder auf anderen Seiten als der ersten", + "shocker_logs_live": "Live", + "shocker_logs_col_time": "Zeit", + "shocker_logs_col_type": "Typ", + "shocker_logs_col_by": "Von", + "shocker_logs_filter_label": "Nach Shocker filtern", + "shocker_logs_filter_placeholder": "Shocker suchen...", + "shocker_logs_filter_all": "Alle Shocker", + "shocker_logs_filter_none": "Keine passenden Shocker", + "shocker_edit_title": "Shocker bearbeiten", + "shocker_edit_subtitle": "Ändere die Details dieses Shockers oder entferne ihn.", + "shocker_edit_back": "Zurück zu den Shockern", + "shocker_edit_load_failed": "Shocker konnte nicht geladen werden.", + "shocker_edit_loading": "Shocker wird geladen...", + "shocker_edit_details_title": "Shocker-Details", + "shocker_edit_details_desc": "Aktualisiere Name, RF-ID und Modell dieses Shockers.", + "shocker_edit_pause_state": "Pausenstatus", + "shocker_edit_is_paused": "Shocker ist pausiert", + "shocker_edit_is_active": "Shocker ist aktiv", + "shocker_edit_toast_updated": "Shocker aktualisiert", + "shocker_edit_delete_desc": "Lösche diesen Shocker dauerhaft. Dies kann nicht rückgängig gemacht werden.", + + "common_close": "Schließen", + "common_continue": "Weiter", + "common_loading": "Wird geladen...", + "common_previous": "Zurück", + "common_next": "Weiter", + "common_steps": "Schritte", + "common_step_label": "Schritt {number}: {title}", + "common_copy": "Kopieren", + "common_copied": "Kopiert", + "common_never": "Nie", + "common_error": "Fehler: {message}", + "terminal_title": "Serielles Terminal", + "terminal_connecting": "Verbinde...", + "terminal_help_button": "Probleme? Hilfe", + "terminal_back_to_modes": "Zurück zur Modusauswahl", + "terminal_mode_configure": "Gerät konfigurieren", + "terminal_mode_configure_desc": "WLAN, Authentifizierung und mehr konfigurieren. Mit interaktiver serieller Konsole.", + "terminal_mode_flash": "Firmware flashen", + "terminal_mode_flash_desc": "Firmware auf einem verbundenen Gerät installieren oder aktualisieren.", + "terminal_mode_raw": "Serieller Monitor", + "terminal_mode_raw_desc": "Nur die Konsole. Geräteprotokolle lesen und Befehle senden.", + "terminal_step_channel": "Kanal auswählen", + "terminal_step_board": "Board auswählen", + "terminal_go_to_step": "Zu Schritt {number}: {title}", + "terminal_erase": "Vor dem Flashen löschen", + "terminal_erase_desc": "Löscht alle Daten auf dem Gerät, einschließlich vorhandener Konfigurationen", + "terminal_unsupported": "Dein Browser unterstützt diese Funktion nicht.", + "terminal_update_browser": "Bitte aktualisiere deinen Browser auf die neueste Version.", + "terminal_use_browsers": "Bitte verwende einen der folgenden Browser:", + "terminal_connect_failed_bootloader": "Bootloader-Modus konnte nicht gestartet werden", + "terminal_connect_failed": "Verbindung zum Gerät fehlgeschlagen", + "terminal_connect_failed_desc": "Es konnte keine serielle Verbindung zum Gerät hergestellt werden.", + "terminal_quick_tries": "Das kannst du schnell ausprobieren:", + "terminal_try_replug": "Trenne das Gerät und schließe es erneut an.", + "terminal_try_cable": "Probiere ein anderes USB-Kabel oder einen anderen Anschluss.", + "terminal_try_driver": "Stelle sicher, dass der serielle Treiber installiert ist.", + "terminal_open_troubleshooter": "Fehlerbehebung öffnen", + "terminal_log_reset_no_device": "Hostseitiger Fehler beim Zurücksetzen: kein Gerät!", + "terminal_log_reset_error": "Hostseitiger Fehler beim Zurücksetzen: {error}", + "terminal_log_send_no_device": "Senden fehlgeschlagen: kein Gerät!", + "terminal_log_send_error": "Senden fehlgeschlagen: {error}", + "terminal_log_firmware_disconnected": "Firmware getrennt: {error}", + "terminal_log_erase_failed": "Flash konnte nicht gelöscht werden: {error}", + "terminal_log_hard_reset_failed": "Hard-Reset fehlgeschlagen: {error}", + "terminal_log_flash_complete": "Flashen abgeschlossen", + "terminal_log_flash_failed": "Flashen fehlgeschlagen: {error}", + "terminal_log_command_failed": "Befehl konnte nicht gesendet werden: {error}", + "terminal_help_title": "Fehlerbehebung", + "terminal_help_desc": "Gehe diese Schritte der Reihe nach durch. Jeder schließt eine häufige Ursache aus.", + "terminal_help_step_cable": "USB-Kabel", + "terminal_help_step_port": "USB-Anschluss", + "terminal_help_step_driver": "Treiber installieren", + "terminal_help_step_manual": "Treiber manuell aktualisieren", + "terminal_help_step_discord": "Auf Discord fragen", + "terminal_help_cable_body": "Viele USB-C- und Micro-USB-Kabel können nur laden und übertragen keine Daten. Verwende ein Datenkabel, das sicher funktioniert (eines, mit dem du schon Dateien übertragen oder andere Geräte verbunden hast), und schließe den Hub erneut an.", + "terminal_help_port_body": "Schließe das Gerät direkt an einen USB-Anschluss deines Computers an. Vermeide nach Möglichkeit USB-Hubs, Dockingstationen und Anschlüsse an der Gehäusefront; sie sind häufige Ursachen für Strom- und Signalprobleme. Bei einem Desktop-PC probiere einen Anschluss auf der Rückseite.", + "terminal_help_driver_download": "Lade den CP210x-Treiber herunter:", + "terminal_help_driver_extract": "Entpacke die ZIP-Datei in einen Ordner auf deinem Computer.", + "terminal_help_driver_run": "Öffne den Ordner und starte {#code}{installer}{/code}. Folge den Anweisungen zur Installation.", + "terminal_help_driver_reconnect": "Schließe das Gerät erneut an.", + "terminal_help_manual_intro": "Wenn der Treiber installiert wurde, das Gerät aber immer noch nicht erscheint:", + "terminal_help_manual_open": "Öffne den Geräte-Manager (drücke {#key}Win{/key} + {#key}X{/key} und wähle {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Suche unter {#code}Ports (COM & LPT){/code} nach einem Eintrag wie:", + "terminal_help_manual_missing": "Fehlt er, erkennt Windows das Gerät überhaupt nicht; geh noch einmal die Schritte zu Kabel und Anschluss durch.", + "terminal_help_manual_update": "Klicke mit der rechten Maustaste auf das Gerät und wähle {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Wähle {#code}Browse my computer for drivers{/code} und dann den Ordner, in den du die Treiber-ZIP entpackt hast. Achte darauf, dass {#code}Include subfolders{/code} aktiviert ist.", + "terminal_help_manual_success": "Bei Erfolg sollte der Eintrag nun {#code}{deviceName}{/code} lauten.", + "terminal_help_discord_intro": "Kommst du trotzdem nicht weiter? Komm auf unseren Discord-Server und frag im Kanal {#code}{channel}{/code}. Gib bitte Folgendes an:", + "terminal_help_discord_os": "dein Betriebssystem und deinen Browser", + "terminal_help_discord_device": "das verwendete Gerät (Board-Modell, woher du es hast)", + "terminal_help_discord_tried": "was du von den vorherigen Schritten schon probiert hast", + "terminal_help_discord_errors": "Fehlermeldungen oder relevante Terminalausgaben", + "terminal_help_discord_join": "Unserem Discord-Server beitreten", + "terminal_risk_title": "⚠️ INSTABILE FIRMWARE", + "terminal_risk_intro": "Du bist dabei, {#strong}experimentelle Firmware{/strong} zu flashen, die {#strong}bekanntermaßen instabil{/strong} ist.", + "terminal_risk_brick": "Dies kann dein Gerät dauerhaft unbrauchbar machen oder eine manuelle Wiederherstellung erfordern.", + "terminal_risk_no_support": "Für Probleme, die durch diese Firmware entstehen, leisten wir KEINEN Support.", + "terminal_risk_acknowledge": "Mir ist bewusst, dass ich die volle Verantwortung trage", + "terminal_risk_abort": "Abbrechen", + "terminal_risk_accept": "ICH ÜBERNEHME DIE VOLLE VERANTWORTUNG", + "firmware_channel_recommended": "Dies ist der empfohlene Kanal.", + "firmware_channel_danger": "NUR VERWENDEN, WENN DU GENAU WEISST, WAS DU TUST", + "firmware_channel_stable": "Stabil", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Entwicklung", + "terminal_board_select": "Board auswählen...", + "terminal_board_search": "Boards suchen...", + "terminal_board_none": "Kein Board gefunden.", + "terminal_flash_button": "Flashen", + "terminal_flash_progress": "Fortschritt: {status}", + "terminal_flash_idle": "Bereit", + "terminal_flash_no_device": "Kein Gerät ausgewählt.", + "terminal_flash_resetting": "Wird zurückgesetzt...", + "terminal_flash_downloading": "Firmware wird heruntergeladen...", + "terminal_flash_download_failed": "Firmware konnte nicht heruntergeladen werden.", + "terminal_flash_flashing": "Firmware wird geflasht...", + "terminal_flash_rebooting": "Gerät wird neu gestartet... (Bei Problemen Stromversorgung manuell trennen und wieder anschließen)", + "terminal_flash_done": "Gerät neu gestartet! Flashen abgeschlossen.", + "terminal_port_select": "Gerät auswählen", + "terminal_port_disconnect": "Gerät trennen", + "terminal_port_connected": "Gerät verbunden: {#strong}{id}{/strong}", + "terminal_console": "Konsole", + "terminal_connected_device": "Verbundenes Gerät", + "terminal_resize": "Terminalbereich anpassen", + "terminal_reboot": "Neustart", + "terminal_disconnect": "Trennen", + "terminal_fullscreen_exit_esc": "Vollbild beenden (Esc)", + "terminal_fullscreen_exit": "Vollbild beenden", + "terminal_fullscreen_fill": "Fenster ausfüllen", + "terminal_command_label": "Serieller Befehl", + "terminal_command_placeholder": "Befehl eingeben...", + "terminal_command_send": "Befehl senden", + "terminal_colors": "Farben", + "terminal_colors_menu": "Farben...", + "terminal_colors_label": "Konsolenfarben", + "terminal_colors_close": "Farben schließen", + "terminal_color_input": "Farbe für {name}", + "terminal_colors_reset": "Auf Standard zurücksetzen", + "terminal_color_bg": "Hintergrund", + "terminal_color_fg": "Text", + "terminal_color_ts": "Zeitstempel", + "terminal_color_error": "Fehler", + "terminal_color_warning": "Warnung", + "terminal_color_info": "Info", + "terminal_color_debug": "Debug", + "terminal_color_verbose": "Ausführlich", + "terminal_options": "Optionen", + "terminal_options_label": "Konsolenoptionen", + "terminal_hide_system": "Systemmeldungen ausblenden", + "terminal_stick_bottom": "Unten bleiben", + "terminal_raw_output": "Rohausgabe", + "terminal_timestamps": "Zeitstempel", + "terminal_timestamp_uptime": "Laufzeit", + "terminal_timestamp_local": "Lokal", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Aus", + "terminal_copy_settings": "Einstellungen kopieren", + "terminal_import_settings": "Einstellungen importieren", + "terminal_copy_selection": "Auswahl kopieren", + "terminal_copy_all": "Gesamte Ausgabe kopieren", + "terminal_toast_selection_copied": "Auswahl kopiert", + "terminal_toast_output_copied": "Konsolenausgabe kopiert", + "terminal_toast_settings_copied": "Konsoleneinstellungen kopiert", + "terminal_toast_clipboard_unreadable": "Zwischenablage konnte nicht gelesen werden", + "terminal_toast_settings_imported": "Konsoleneinstellungen importiert", + "terminal_toast_settings_invalid": "Die Zwischenablage enthält keine Konsoleneinstellungen", + + "common_try_again": "Erneut versuchen", + "terminal_cfg_intro": "Werte werden per UART an das Gerät gesendet. Die Antwort des Geräts siehst du in der Konsole unten. Befehle ohne Argument lesen den Wert aus; nutze die {#eye/}-Schaltfläche neben jedem Feld, um den aktuellen Wert zu lesen.", + "terminal_cfg_rf_title": "RF-Sender", + "terminal_cfg_rf_desc": "Steuert die RF-Ausgabe an die Shocker.", + "terminal_cfg_tx_pin": "TX-GPIO-Pin", + "terminal_cfg_example": "z. B. {value}", + "terminal_cfg_read_value": "Aktuellen Wert lesen", + "terminal_cfg_set": "Setzen", + "terminal_cfg_read": "Lesen", + "terminal_cfg_reading": "Wird gelesen…", + "terminal_cfg_apply": "Anwenden", + "terminal_cfg_keepalive": "Keepalive aktiviert", + "terminal_cfg_keepalive_desc": "Pingt gekoppelte Shocker regelmäßig an, damit sie wach bleiben.", + "terminal_cfg_estop_title": "Not-Aus", + "terminal_cfg_estop_desc": "Hardware-Taste, die jede Ausgabe stoppt.", + "terminal_cfg_estop_enabled": "Not-Aus aktiviert", + "terminal_cfg_estop_pin": "Not-Aus-GPIO-Pin", + "terminal_cfg_estop_note": "Hinweis: Für {#code}{latching}{/code} und {#code}{active}{/code} gibt es keine eigenen Befehle; setze sie über die JSON-Konfiguration unten.", + "terminal_cfg_wifi_title": "WLAN", + "terminal_cfg_wifi_desc": "Zugangsdaten für Netzwerke und Hostname des Geräts.", + "terminal_cfg_hostname": "Hostname", + "terminal_cfg_networks": "Netzwerke (JSON-Array)", + "terminal_cfg_invalid_json_array": "Muss ein gültiges JSON-Array sein", + "terminal_cfg_ap_note": "Für AP-Einstellungen ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) gibt es keine eigenen Befehle; nutze die JSON-Konfiguration.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "OpenShock-Server und Authentifizierung.", + "terminal_cfg_domain": "Domain", + "terminal_cfg_domain_restart": "Das Setzen der Domain startet das Gerät neu.", + "terminal_cfg_auth_token": "Auth-Token", + "terminal_cfg_auth_token_placeholder": "Geräte-Token einfügen", + "terminal_cfg_hide": "Ausblenden", + "terminal_cfg_show": "Anzeigen", + "terminal_cfg_serial_title": "Serielle Eingabe", + "terminal_cfg_echo": "Echo aktiviert", + "terminal_cfg_echo_desc": "Eingegebene Zeichen in der Konsole wiedergeben.", + "terminal_cfg_advanced_title": "Erweitert: gesamte Konfiguration", + "terminal_cfg_advanced_desc": "Für Felder ohne eigene Befehle (Captive Portal, OTA, LAN usw.) ersetzt du die gesamte Konfiguration.", + "terminal_cfg_json_config": "JSON-Konfiguration", + "terminal_cfg_invalid_json": "Muss gültiges JSON sein", + "terminal_cfg_read_json": "Aktuelle Konfiguration als JSON lesen", + "terminal_cfg_json_restart": "Das Anwenden einer JSON-Konfiguration startet das Gerät neu.", + "terminal_cfg_raw_config": "Rohe FlatBuffer-Konfiguration (Base64)", + "terminal_cfg_invalid_base64": "Muss ein gültiger Base64-String sein", + "terminal_cfg_read_raw": "Aktuelle Konfiguration als Base64 lesen", + "terminal_cfg_factory_reset": "Werkseinstellungen", + "terminal_cfg_factory_reset_desc": "Löscht die gesamte Gerätekonfiguration.", + "terminal_cfg_factory_reset_title": "Gerät auf Werkseinstellungen zurücksetzen?", + "terminal_cfg_factory_reset_action": "Konfiguration löschen", + "terminal_cfg_factory_reset_confirm": "Dadurch wird die gesamte Konfiguration auf dem Gerät gelöscht: WLAN-Netzwerke, Backend-Zugangsdaten, Pins und alle anderen Einstellungen. Das Gerät wird auf die Standardwerte zurückgesetzt.", + "terminal_cfg_read_failed_json_title": "JSON-Konfiguration konnte nicht gelesen werden", + "terminal_cfg_read_failed_raw_title": "Rohkonfiguration konnte nicht gelesen werden", + "terminal_cfg_read_failed_desc": "Das Gerät hat nach {attempts} Versuchen nicht geantwortet.", + "terminal_cfg_common_causes": "Häufige Ursachen:", + "terminal_cfg_cause_busy": "Das Gerät verarbeitet gerade einen anderen Befehl.", + "terminal_cfg_cause_disconnected": "Das Gerät wurde getrennt oder neu gestartet.", + "terminal_cfg_cause_unsupported": "Die Firmware-Version unterstützt diesen Befehl nicht.", + + "common_status": "Status", + "common_version": "Version", + "common_created": "Erstellt", + "common_create": "Erstellen", + "common_done": "Fertig", + "common_enable": "Aktivieren", + "common_disable": "Deaktivieren", + "common_are_you_sure": "Bist du sicher?", + "common_generating": "Wird erstellt...", + "hubs_title": "Hubs", + "hubs_subtitle": "Alle Hubs, die in deinem Konto registriert sind.", + "hubs_add": "Hub hinzufügen", + "hubs_load_failed": "Hubs konnten nicht geladen werden.", + "hubs_empty_title": "Noch keine Hubs", + "hubs_empty_desc": "Ein Hub ist das Gerät, das Befehle an deine Shocker weiterleitet. Füge einen hinzu, um loszulegen.", + "hubs_create_title": "Hub erstellen", + "hubs_name_label": "Hub-Name", + "hubs_name_placeholder": "Mein Hub", + "hub_toast_not_connected": "Nicht mit dem Server verbunden", + "hub_toast_try_later": "Versuche es gleich noch einmal.", + "hub_reboot_title": "{name} neu starten?", + "hub_reboot_desc": "Der Hub trennt die Verbindung und startet neu. Gekoppelte Shocker reagieren erst wieder, wenn er online ist.", + "hub_reboot": "Neu starten", + "hub_hotspot_enable_title": "WLAN-Hotspot auf {name} aktivieren?", + "hub_hotspot_disable_title": "WLAN-Hotspot auf {name} deaktivieren?", + "hub_hotspot_enable_desc": "Der Hub sendet ein eigenes Einrichtungsnetzwerk. Er bleibt über dein WLAN erreichbar, aber der Hotspot ist für alle in Reichweite offen, bis du ihn ausschaltest.", + "hub_hotspot_disable_desc": "Der Einrichtungs-Hotspot wird abgeschaltet. Ist der Hub noch nicht in deinem WLAN, brauchst du physischen Zugriff, um ihn erneut einzurichten.", + "hub_delete_desc": "Du bist dabei, den Hub {#strong}{name}{/strong} zu löschen.", + "hub_delete_shockers": "Dadurch werden auch die folgenden Shocker gelöscht:", + "hub_edit_title": "Hub bearbeiten", + "hub_edit_apply": "Anwenden", + "hub_pair_title_generate": "Kopplungscode erstellen?", + "hub_pair_title_generated": "Kopplungscode erstellt", + "hub_pair_title_paired": "Hub gekoppelt", + "hub_pair_consumed": "{#strong}{name}{/strong} hat diesen Kopplungscode verwendet und ist jetzt gekoppelt.", + "hub_pair_used": "Der Code wurde verwendet und ist nicht mehr gültig.", + "hub_pair_generated_for": "Kopplungscode für {#strong}{name}{/strong} erstellt.", + "hub_copy_now": "Der Code unten ist später nicht mehr abrufbar. Kopiere ihn jetzt und trage ihn in deinen Clients ein.", + "hub_pair_generate_for": "Du bist dabei, einen Kopplungscode für {#strong}{name}{/strong} zu erstellen.", + "hub_pair_valid_for": "Er ist nach der Erstellung 15 Minuten lang gültig.", + "hub_pair_one_active": "Pro Hub gibt es nur einen aktiven Kopplungscode; ein neuer Code ersetzt den älteren.", + "hub_pair_complete": "Kopplung abgeschlossen", + "hub_pair_code_label": "Kopplungscode:", + "hub_pair_copied_close": "Code kopiert, schließen", + "hub_pair_get": "Kopplungscode abrufen", + "hub_token_generated": "Token erstellt", + "hub_token_generated_for": "Neues Token für {#strong}{name}{/strong} erstellt.", + "hub_token_regenerate_for": "Du bist dabei, das Token für {#strong}{name}{/strong} neu zu erstellen.", + "hub_token_invalidate": "Dadurch wird das aktuelle Token ungültig und Clients, die es verwenden, werden getrennt.", + "hub_token_confirm": "Möchtest du das wirklich tun?", + "hub_token_label": "Neues Token:", + "hub_token_copied_close": "Token kopiert, schließen", + "hub_token_regenerate": "Token neu erstellen", + "hub_menu_update": "Aktualisieren", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "WLAN-Hotspot aktivieren", + "hub_menu_hotspot_disable": "WLAN-Hotspot deaktivieren", + "hub_menu_pair": "Koppeln", + "hub_menu_estop": "Not-Aus", + "hub_update_breadcrumb": "Aktualisieren", + "hub_update_unknown_hub": "Unbekannter Hub", + "hub_update_unknown_task": "Unbekannte Aufgabe", + "hub_update_task_metadata": "Metadaten werden abgerufen", + "hub_update_task_preparing": "Update wird vorbereitet", + "hub_update_task_flash_fs": "Dateisystem wird geflasht", + "hub_update_task_verify_fs": "Dateisystem wird überprüft", + "hub_update_task_flash_app": "Anwendung wird geflasht", + "hub_update_task_bootable": "Anwendung wird als startfähig markiert", + "hub_update_task_rebooting": "Neustart", + "hub_update_status_started": "Gestartet", + "hub_update_status_running": "Läuft", + "hub_update_status_finished": "Abgeschlossen", + "hub_update_status_error": "Fehler", + "hub_update_status_timeout": "Zeitüberschreitung", + "hub_update_confirm_title": "Firmware-Update bestätigen", + "hub_update_confirm_desc": "{#strong}{name}{/strong} auf Version {#strong}{version}{/strong} aktualisieren?", + "hub_update_unstable_warning": "Diese Version stammt möglicherweise nicht aus dem stabilen Kanal und kann Fehler enthalten.", + "hub_update_title": "{name} aktualisieren", + "hub_update_subtitle": "Firmware-Updates für diesen Hub verwalten.", + "hub_update_status_title": "Hub-Status", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Aktualisieren", + "hub_update_success": "Update erfolgreich abgeschlossen", + "hub_update_rolled_back": "Gerät wurde auf die vorherige Version zurückgesetzt", + "hub_update_back": "Zurück zu den Hubs", + "hub_update_flash_again": "Erneut flashen", + "hub_update_card_title": "Firmware-Update", + "hub_update_card_desc": "Wähle einen Firmware-Kanal und eine Version zur Installation.", + "hub_update_to": "Auf {version} aktualisieren", + "hub_update_must_be_online": "Der Hub muss online sein, um ein Update zu starten.", + "hub_update_updating_to": "Aktualisierung auf {version}...", + "hub_update_total": "Gesamt", + "hub_update_task": "Aufgabe", + "hub_update_history": "Update-Verlauf", + "hub_update_no_history": "Für diesen Hub wurde kein Update-Verlauf gefunden.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Gestartet", + "hub_update_col_message": "Nachricht", + "hub_update_loading": "Hub-Informationen werden geladen...", + "hub_update_not_found": "Hub nicht gefunden.", + "home_breadcrumb": "Startseite", + "home_welcome": "Willkommen zurück", + "home_welcome_name": "Willkommen zurück, {name}", + "home_subtitle": "Hier ist ein Überblick über dein OpenShock-Setup.", + "home_hubs_online": "{count} online", + "home_hub_status": "Hub-Status", + "home_no_hubs": "Keine Hubs", + "home_all_online": "Alle online", + "home_all_offline": "Alle offline", + "home_some_online": "{online}/{total} online", + "home_quick_links": "Schnellzugriff", + "home_my_shockers": "Meine Shocker", + "home_my_shockers_desc": "Steuere deine Shocker", + "home_hubs_desc": "Verwalte deine Hubs", + "home_shared_desc": "Mit dir geteilte Shocker", + "home_public_desc": "Freigabelinks verwalten", + "home_get_started": "Los geht's", + "home_get_started_desc": "Du hast noch keine Hubs. Erstelle einen Hub, um dein erstes Gerät zu verbinden, und füge dann Shocker hinzu.", + "home_set_up_hub": "Hub einrichten", + "home_first_shocker": "Füge deinen ersten Shocker hinzu", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Du hast {count} Hub eingerichtet. Füge einen Shocker hinzu, um ihn zu steuern.", + "countPlural=other": "Du hast {count} Hubs eingerichtet. Füge einen Shocker hinzu, um ihn zu steuern." + } + } + ], + "home_go_to_shockers": "Zu den Shockern", + "profile_title": "Profil", + "profile_coming_soon": "Das Profil kommt bald", + "profile_coming_soon_desc": "Dein öffentliches Profil ist noch nicht verfügbar. Kontodetails findest du in den Einstellungen.", + + "common_retry": "Erneut versuchen", + "common_never_used": "Nie verwendet", + "common_expires": "Läuft {time} ab", + "common_search_placeholder": "Suchen...", + "common_unknown": "Unbekannt", + "settings_breadcrumb_account": "Konto", + "account_subtitle": "Deine Anmeldedaten und Kontoaktionen.", + "account_change_username": "Benutzernamen ändern", + "account_change_email": "E-Mail ändern", + "account_change_password": "Passwort ändern", + "account_username_label": "Benutzername", + "account_email_label": "E-Mail", + "account_password_label": "Passwort", + "account_new_password_label": "Neues Passwort", + "account_confirm_password_label": "Neues Passwort bestätigen", + "account_oauth_only": "Für reine OAuth-Konten nicht verfügbar", + "account_oauth_no_password": "Dieses Konto meldet sich über OAuth an und hat kein Passwort.", + "account_diagnostics": "Diagnose", + "account_diagnostics_desc": "Hilf uns, Abstürze und langsame API-Aufrufe zu beheben. Berichte enthalten die Fehlermeldung, den Stacktrace und deine IP. Standardmäßig aus.", + "account_diagnostics_level": "Diagnosestufe", + "account_telemetry_off": "Aus", + "account_telemetry_off_desc": "Nichts senden.", + "account_telemetry_errors": "Fehler", + "account_telemetry_errors_desc": "Nur Fehlerberichte des Browsers senden.", + "account_telemetry_full": "Voll", + "account_telemetry_full_desc": "Fehlerberichte plus Traces von API-Aufrufen (keine Seitenaufrufe).", + "account_toast_deactivated": "Konto erfolgreich deaktiviert", + "account_deactivate_title": "Konto deaktivieren", + "account_deactivate_desc": "Möchtest du dein Konto wirklich deaktivieren?", + "account_deactivate": "Konto deaktivieren", + "account_email_title": "E-Mail ändern", + "account_email_desc": "Gib deine neue E-Mail-Adresse ein und bestätige mit deinem aktuellen Passwort.", + "account_email_toast_sent": "Bestätigungs-E-Mail an {email} gesendet. Klicke auf den Link in der E-Mail, um die Änderung zu übernehmen.", + "account_new_email": "Neue E-Mail", + "account_current_password": "Aktuelles Passwort", + "account_password_title": "Passwort ändern", + "account_password_desc": "Gib dein aktuelles Passwort ein und wähle ein neues.", + "account_password_toast": "Passwort wurde geändert", + "account_username_title": "Benutzernamen ändern", + "account_username_desc": "Gib einen neuen Benutzernamen ein.", + "account_new_username": "Neuer Benutzername", + "account_username_toast": "Benutzername erfolgreich geändert", + "tokens_subtitle": "API-Token dienen zur Authentifizierung bei der OpenShock-API.", + "tokens_generate": "Token erstellen", + "tokens_toast_refreshed": "Token aktualisiert", + "tokens_empty_title": "Keine API-Token", + "tokens_empty_desc": "Erstelle ein Token, um dich bei der OpenShock-API zu authentifizieren.", + "tokens_created_on": "Erstellt am {date}", + "tokens_last_used": "Zuletzt verwendet {time}", + "tokens_never_expires": "Läuft nie ab", + "tokens_load_failed": "API-Token konnten nicht geladen werden.", + "token_toast_edited": "Token erfolgreich bearbeitet", + "token_name_required": "Name ist erforderlich", + "token_name_too_long": "Name ist zu lang", + "token_edit_title": "API-Token bearbeiten", + "token_name_label": "Token-Name", + "token_name_placeholder": "Token-Name...", + "token_permissions": "Berechtigungen", + "token_perm_category_shockers": "Shocker", + "token_perm_category_devices": "Hubs", + "token_perm_category_usershares": "Benutzerfreigaben", + "token_perm_category_publicshares": "Öffentliche Freigaben", + "token_perm_use": "Verwenden", + "token_perm_edit": "Bearbeiten", + "token_perm_pause": "Pausieren", + "token_perm_auth": "Authentifizieren", + "token_shocker_control": "Shocker-Steuerung", + "token_toast_paused": "Token pausiert", + "token_toast_resumed": "Token fortgesetzt", + "token_delete_title": "API-Token löschen", + "token_delete_desc": "Möchtest du {#strong}{name}{/strong} wirklich löschen?", + "token_delete_permanent": "Dies kann nicht rückgängig gemacht werden. Das Token wird dauerhaft gelöscht.", + "token_toast_deleted": "Token erfolgreich gelöscht", + "token_resume": "Token fortsetzen", + "token_pause": "Token pausieren", + "token_mode_clamp_desc": "Clamp: Anfragen außerhalb des erlaubten Bereichs werden auf die nächste Grenze (Minimum oder Maximum) begrenzt.", + "token_mode_lerp_desc": "Lerp: Der gesamte Eingabebereich wird linear auf deinen erlaubten Bereich von Minimum bis Maximum skaliert.", + "token_paused_desc": "Ein pausiertes Token darf keine Shocker-Steuerbefehle senden.", + "token_intensity_range": "Intensitätsbereich", + "token_duration_range": "Dauerbereich", + "token_new_breadcrumb": "Neu", + "token_redirect_not_allowed": "Die angegebene redirect_uri ist nicht erlaubt. Nur Loopback-Adressen oder eigene Anwendungsschemata sind zulässig.", + "token_params_missing": "Erforderliche GET-Parameter fehlen. Stelle sicher, dass name, redirect_uri und permissions angegeben sind.", + "token_invalid_permissions": "Ungültige Berechtigungen angegeben: {list}", + "token_toast_created": "Token erfolgreich erstellt", + "token_request_title": "API-Token-Anfrage", + "token_access_granted": "Zugriff gewährt", + "token_shared_redirecting": "Das Token wurde erstellt und an die Anwendung übergeben. Du wirst zurückgeleitet zu {#b}{uri}{/b}.", + "token_not_redirected": "Wenn du nicht automatisch weitergeleitet wirst, nutze die Schaltfläche unten.", + "token_finish": "Fertig", + "token_generated_title": "API-Token erstellt", + "token_copy_now": "Kopiere dein API-Token jetzt, du kannst es später nicht mehr ansehen!", + "token_new_title": "Neues API-Token", + "token_external_desc": "Eine externe Anwendung möchte auf dein Konto zugreifen. Prüfe und passe die Berechtigungen unten an, bevor du den Zugriff erlaubst.", + "token_new_desc": "Konfiguriere und erstelle ein neues API-Token für dein Konto.", + "token_external_requesting": "{#b}{name}{/b} fordert ein API-Token an. Dein Token wird an die Anwendung unter {#b}{uri}{/b} übergeben.", + "token_allow": "Erlauben", + "token_generate": "Erstellen", + "token_deny": "Ablehnen", + "sessions_subtitle": "Alle aktiven Sitzungen deines Kontos. Widerrufe alle, die du nicht kennst.", + "sessions_unknown_device": "Unbekanntes Gerät", + "sessions_toast_refreshed": "Sitzungen aktualisiert", + "sessions_load_failed": "Sitzungen konnten nicht geladen werden.", + "sessions_empty_title": "Keine aktiven Sitzungen", + "sessions_empty_desc": "Sitzungen erscheinen hier, sobald du dich in einem Browser oder einer App anmeldest.", + "sessions_last_seen": "Zuletzt gesehen {time}", + "sessions_signed_in": "Angemeldet {time}", + "session_toast_revoked": "Sitzung erfolgreich widerrufen", + "session_revoke_title": "Sitzung widerrufen", + "session_revoke": "Widerrufen", + "session_revoke_desc": "Möchtest du diese Sitzung wirklich widerrufen?", + "session_revoke_from": "Sitzung angemeldet von {#strong}{ip}{/strong} mit {#strong}{agent}{/strong}", + "connections_title": "OAuth-Verbindungen", + "connections_subtitle": "Verknüpfe Konten von Drittanbietern oder trenne sie, um dich schneller anzumelden und dein Profil synchron zu halten.", + "connections_toast_linked": "Konto verknüpft.", + "connections_toast_cancelled": "Verknüpfung abgebrochen.", + "connections_toast_failed": "Verknüpfung fehlgeschlagen.", + "connections_toast_removed": "Verbindung entfernt", + "connections_refreshing": "Wird aktualisiert…", + "connections_link_new": "Neuen Anbieter verknüpfen", + "connections_empty_title": "Noch keine Verbindungen", + "connections_empty_desc": "Wähle oben „Neuen Anbieter verknüpfen“, um verfügbare Anbieter zu verbinden.", + "connections_unlink": "Trennen", + "connections_load_failed": "OAuth-Verbindungen konnten nicht geladen werden.", + "connections_unlink_title": "{name} trennen?", + "connections_unlink_title_generic": "Dieses Konto trennen?", + "connections_unlink_desc": "Du kannst dich dann nicht mehr mit diesem Anbieter anmelden, bis du ihn erneut verknüpfst.", + "provider_starting": "{name} wird gestartet...", + "provider_link": "{name} verknüpfen", + "audit_subtitle": "Sicherheitsrelevante Aktivitäten in deinem Konto. Prüfe alles, was du nicht kennst.", + "audit_col_time": "Zeit", + "audit_col_action": "Aktion", + "audit_col_details": "Details", + "audit_col_reason": "Grund", + "audit_col_ip": "IP-Adresse", + "audit_col_device": "Gerät", + "audit_action_login": "Angemeldet", + "audit_action_logout": "Abgemeldet", + "audit_action_password_changed": "Passwort geändert", + "audit_action_email_change_requested": "E-Mail-Änderung angefordert", + "audit_action_email_changed": "E-Mail geändert", + "audit_action_username_changed": "Benutzername geändert", + "audit_action_api_token_created": "API-Token erstellt", + "audit_action_api_token_deleted": "API-Token gelöscht", + "audit_action_oauth_connected": "Verbindung hinzugefügt", + "audit_action_oauth_disconnected": "Verbindung entfernt", + "audit_action_account_deactivated": "Konto deaktiviert", + "audit_action_account_reactivated": "Konto reaktiviert", + "audit_action_account_deleted": "Konto gelöscht", + "audit_action_automation_token_created": "Automatisierungstoken erstellt", + "audit_action_automation_token_updated": "Automatisierungstoken aktualisiert", + "audit_action_automation_token_rotated": "Automatisierungstoken rotiert", + "audit_action_automation_token_deleted": "Automatisierungstoken gelöscht", + "audit_action_automation_token_used": "Automatisierungstoken verwendet", + "audit_meta_session": "Sitzung {id}", + "audit_meta_changed": "{old} zu {new}", + "audit_meta_email_requested": "Änderung zu {email} angefordert", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} Konto entfernt)", + "countPlural=other": "{name} ({count} Konten entfernt)" + } + } + ], + "audit_meta_scheduled_deletion": "Zur Löschung vorgemerkt", + "audit_meta_kept": "Für Reaktivierung aufbewahrt", + + "common_view": "Ansehen", + "common_save": "Speichern", + "common_saving": "Wird gespeichert...", + "common_back": "Zurück", + "common_shared_by": "Geteilt von", + "common_user_avatar": "Profilbild", + "common_toast_saved": "Änderungen gespeichert", + "pause_reason_shocker": "Auf Shocker-Ebene pausiert", + "pause_reason_shocker_user_share": "Auf Shocker- und Benutzerfreigabe-Ebene pausiert", + "pause_reason_shocker_public_share": "Auf Shocker- und öffentlicher Freigabe-Ebene pausiert", + "pause_reason_user_share": "Auf Benutzerfreigabe-Ebene pausiert", + "pause_reason_public_share": "Auf Ebene der öffentlichen Freigabe pausiert", + "public_shares_subtitle": "Ein Link, den jeder nutzen kann, ganz ohne Konto.", + "public_shares_new": "Neue Freigabe", + "public_share_never_expires": "Läuft nie ab", + "public_shares_empty_title": "Noch keine öffentlichen Freigaben", + "public_shares_empty_desc": "Erstelle einen Link, mit dem jeder deine Shocker steuern kann.", + "public_share_expired": "Abgelaufen", + "public_share_no_expiry": "Kein Ablauf", + "public_share_label": "Öffentliche Freigabe", + "public_share_toast_created": "Neue öffentliche Freigabe erstellt", + "public_share_create_title": "Öffentliche Freigabe erstellen", + "public_share_toast_deleted": "Öffentliche Freigabe gelöscht", + "public_share_delete_title": "Öffentliche Freigabe löschen", + "public_share_delete_desc": "Möchtest du die öffentliche Freigabe {#strong}{name}{/strong} wirklich löschen?", + "public_share_edit_title": "Öffentliche Freigabe: {name}", + "public_share_edit_subtitle": "Bearbeitung: Änderungen gelten erst nach dem Speichern.", + "public_share_add_shocker": "Shocker hinzufügen", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} Shocker zur Freigabe hinzugefügt", + "countPlural=other": "{count} Shocker zur Freigabe hinzugefügt" + } + } + ], + "public_share_empty_shockers_title": "Keine Shocker in dieser Freigabe", + "public_share_empty_shockers_desc": "Füge einen Shocker hinzu, dann kann ihn jeder mit dem Link steuern.", + "public_share_load_failed": "Fehler beim Laden der Freigabedetails", + "public_share_paused_here": "Für diese Freigabe pausiert", + "public_share_resume_shocker": "Shocker fortsetzen", + "public_share_pause_shocker": "Shocker pausieren", + "public_share_remove": "Aus Freigabe entfernen", + "public_share_toast_removed": "Shocker aus der Freigabe entfernt", + "public_share_add_title": "Shocker hinzufügen", + "public_share_add_desc": "Füge dieser öffentlichen Freigabe Shocker hinzu. Ihre Grenzen kannst du danach festlegen.", + "public_share_add_placeholder": "Shocker zum Teilen auswählen...", + "public_share_add_no_match": "Keine passenden Shocker", + "public_share_add_submit": "Shocker hinzufügen", + "public_share_view_loading": "Freigabedetails werden geladen...", + "public_share_view_title": "Öffentlicher Freigabelink", + "public_share_view_desc": "Tritt als Gast ein oder melde dich mit deinem OpenShock-Konto an", + "public_share_view_guest_name": "Gastname", + "public_share_view_enter": "Eintreten", + "public_share_view_enter_guest": "Als Gast eintreten", + "public_share_login": "Anmelden", + "perm_shock_on": "Schock aktiviert", + "perm_shock_off": "Schock deaktiviert", + "perm_vibrate_on": "Vibration aktiviert", + "perm_vibrate_off": "Vibration deaktiviert", + "perm_sound_on": "Ton aktiviert", + "perm_sound_off": "Ton deaktiviert", + "perm_live_on": "Live aktiviert", + "perm_live_off": "Live deaktiviert", + "perm_live_control": "Live-Steuerung", + "user_selector_avatar_of": "Profilbild von {name}", + "user_selector_placeholder": "Benutzernamen eingeben", + "user_selector_aria": "Zu suchender Benutzername", + "user_selector_search": "Benutzer suchen", + "user_selector_found": "Benutzer gefunden", + + "common_remove": "Entfernen", + "user_shares_subtitle": "Direkte, dauerhafte Freigaben mit anderen Benutzern.", + "user_shares_toast_invited": "Shocker-Einladung an {name} gesendet", + "user_shares_redeem": "Code einlösen", + "user_shares_new": "Neue Freigabe", + "user_shares_tab_shares": "Freigaben", + "user_shares_tab_incoming": "Mit mir geteilt", + "user_shares_tab_invites": "Einladungen", + "share_code_create_title": "Neuer Freigabecode", + "share_code_create_desc": "Erstelle einen Freigabecode oder eine Einladung", + "share_code_shocker_placeholder": "Shocker zum Teilen auswählen...", + "share_code_no_match": "Keine passenden Shocker", + "share_code_send_invite": "Einladung senden", + "share_code_create": "Freigabecode erstellen", + "share_code_created_title": "Freigabecode erstellt", + "share_code_created_desc": "Kopiere den Freigabecode oder den Link!", + "share_code_redeem_title": "Freigabecode einlösen", + "share_code_redeem_desc": "Gib den Freigabecode zum Einlösen ein", + "share_code_redeem_placeholder": "Freigabecode eingeben", + "share_code_redeemed": "Erfolgreich eingelöst!", + "share_code_shared_shockers": "Geteilte Shocker", + "share_code_redeeming": "Wird eingelöst...", + "share_code_redeem": "Einlösen", + "incoming_shares_empty_title": "Nichts mit dir geteilt", + "incoming_shares_empty_desc": "Bisher hat niemand einen Shocker mit dir geteilt.", + "incoming_share_toast_removed": "Freigabe von {name} entfernt", + "incoming_share_remove_title": "Freigabe entfernen", + "incoming_share_remove_desc": "Möchtest du die Freigabe von {#strong}{name}{/strong} wirklich entfernen?", + "incoming_share_toast_removed_shocker": "{shocker} von {name} entfernt", + "incoming_share_remove_shocker_title": "Diesen geteilten Shocker entfernen?", + "incoming_share_remove_shocker_desc": "Möchtest du den geteilten Shocker {#strong}{shocker}{/strong} von {#strong}{name}{/strong} wirklich entfernen?", + "incoming_share_manage_from": "Freigaben verwalten von", + "share_remove": "Freigabe entfernen", + "invites_empty_title": "Noch keine Einladungen", + "invites_empty_desc": "Du hast keine eingehenden oder ausgehenden Einladungen.", + "invites_outgoing": "Ausgehend", + "invites_outgoing_empty_title": "Keine ausgehenden Einladungen", + "invites_outgoing_empty_desc": "Du hast keine ausgehenden Einladungen.", + "invites_incoming": "Eingehend", + "invites_incoming_empty_title": "Keine eingehenden Einladungen", + "invites_incoming_empty_desc": "Du hast keine eingehenden Einladungen.", + "invite_toast_accepted": "Einladung von {name} angenommen", + "invite_toast_declined": "Einladung von {name} abgelehnt", + "invite_deny_title": "Einladung ablehnen", + "invite_deny_label": "Einladung ablehnen", + "invite_deny": "Ablehnen", + "invite_deny_desc": "Möchtest du die Einladung von {#strong}{name}{/strong} wirklich ablehnen?", + "invite_accept": "Einladung annehmen", + "invite_toast_cancelled_for": "Einladung für {name} zurückgezogen ({id})", + "invite_toast_cancelled": "Einladung {id} zurückgezogen", + "invite_cancel_title": "Einladung zurückziehen", + "invite_cancel": "Zurückziehen", + "invite_cancel_for_desc": "Möchtest du die Einladung für {#strong}{name}{/strong} wirklich zurückziehen?", + "invite_cancel_code_desc": "Möchtest du die Einladung mit dem Code {#strong}{code}{/strong} wirklich zurückziehen?", + "invite_cancel_outstanding": "Offene Einladung zurückziehen", + "outgoing_shares_empty_title": "Keine geteilten Shocker", + "outgoing_shares_empty_desc": "Du hast noch keine Shocker mit anderen Benutzern geteilt.", + "outgoing_share_toast_removed": "Geteilten Shocker {name} entfernt", + "outgoing_share_remove_title": "Diesen Shocker nicht mehr teilen?", + "outgoing_share_editing_for": "Freigaben bearbeiten für", + "outgoing_share_limits": "Grenzen & Berechtigungen", + "outgoing_share_same": "Gleiche Einschränkungen für alle Shocker", + "outgoing_share_per_desc": "Einschränkungen je Shocker anpassen", + "outgoing_share_all": "Alle", + "outgoing_share_per": "Je Shocker", + + "outgoing_share_remove_desc": "Möchtest du {#strong}{shocker}{/strong} wirklich nicht mehr mit {#strong}{name}{/strong} teilen?", + + "report_breadcrumb": "API-Token melden", + "report_toast_clipboard_failed": "Zwischenablage konnte nicht gelesen werden: {error}", + "report_title": "Geleakte API-Token melden", + "report_paste": "Aus Zwischenablage einfügen", + "report_warning": "Dieses Formular dient nur zum Melden versehentlich geleakter API-Token.", + "report_abuse_warning": "Absichtlicher Missbrauch führt zu Sperren oder starken Einschränkungen.", + "report_detected": "Erkannte Token", + "report_invalid": "Ein oder mehrere Token scheinen ungültig zu sein. Prüfe die Formatierung.", + "report_acknowledge": "Ich bestätige, dass ich verstehe, wofür diese Funktion gedacht ist, und übernehme die Verantwortung.", + "report_submit": "Meldung senden", + "turnstile_disabled": "Turnstile deaktiviert", + "common_internal_error": "Interner Fehler", + "resend_toast_sent": "Aktivierungs-E-Mail gesendet. Sieh in deinem Posteingang und Spam-Ordner nach.", + "resend_toast_throttled": "Es wurden zu viele Aktivierungs-E-Mails angefordert. Versuche es später erneut.", + "resend_toast_unavailable": "Aus diesem Browser kann keine Aktivierungs-E-Mail erneut gesendet werden. Ist dein Konto noch nicht aktiviert, sendet eine Anmeldung einen neuen Link.", + "resend_button": "Keine E-Mail erhalten? Erneut senden", + "expiration_label": "Ablauf", + "expiration_never": "Nie", + "expiration_custom": "Benutzerdefiniert", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} Tag", "countPlural=other": "{count} Tage" } + } + ], + "expiration_required": "Ablaufdatum ist erforderlich", + "expiration_never_desc": "Läuft nie ab", + "expiration_expires_at": "Läuft {time} ab ({date})", + "date_picker_placeholder": "Datum wählen", + "telemetry_toast_title": "OpenShock verbessern helfen?", + "telemetry_toast_desc": "Sende Diagnosedaten, damit wir Abstürze und langsame API-Aufrufe beheben können. Berichte enthalten die Fehlermeldung, den Stacktrace und deine IP. Du kannst das jederzeit in den Kontoeinstellungen ändern.", + "telemetry_toast_no": "Nein danke", + "telemetry_toast_errors": "Nur Fehler", + "telemetry_toast_full": "Voll", + "table_show_details": "Details anzeigen", + "table_hide_details": "Details ausblenden", + "table_no_results": "Keine Ergebnisse.", + "table_sort_asc": "Nach {name} sortieren, aufsteigend", + "table_sort_desc": "Nach {name} sortieren, absteigend", + "table_sort_none": "Nach {name} sortieren, unsortiert", + "cell_na": "k. A.", + "cell_not_applicable": "Nicht anwendbar", + "cell_invalid": "Ungültig", + "cell_unavailable": "Nicht verfügbar", + "cell_none": "Keine", + "oauth_login_with": "Mit {provider} anmelden", + "oauth_signup_with": "Mit {provider} registrieren", + "signalr_connect_failed": "Verbindung zum Server fehlgeschlagen!", + "signalr_disconnect_failed": "Fehler beim Trennen vom Server!", + "signalr_invalid_update": "Ungültiges Update vom Server erhalten!", + "signalr_invalid_log": "Ungültige Protokolldaten vom Server erhalten!", + "signalr_invalid_ota": "Ungültige Firmware-Update-Daten vom Server erhalten!", + "ota_toast_failed": "Firmware-Update des Hubs fehlgeschlagen: {message}", + "ota_toast_succeeded": "Firmware-Update des Hubs erfolgreich abgeschlossen!", + "ota_toast_rolled_back": "Hub-Firmware auf die vorherige Version zurückgesetzt", + "lcg_connect_failed": "Verbindung zum Live-Control-Gateway fehlgeschlagen", + "terminal_toast_bootloader_failed": "Bootloader konnte nicht gestartet werden: {error}", + "terminal_toast_app_mode_failed": "Anwendungsmodus konnte nicht gestartet werden: {error}", + + "problem_account_account_not_activated_title": "Konto nicht aktiviert", + "problem_account_account_not_activated_desc": "Sieh in deinem Posteingang nach der Aktivierungs-E-Mail.", + "problem_account_activation_not_found_title": "Der Aktivierungslink ist ungültig", + "problem_account_activation_not_found_desc": "Der Link ist möglicherweise abgelaufen oder wurde bereits verwendet.", + "problem_account_activation_resend_too_many_title": "Zu viele Aktivierungs-E-Mails angefordert", + "problem_account_activation_resend_too_many_desc": "Warte eine Weile, bevor du es erneut versuchst.", + "problem_account_activation_resend_unavailable_title": "Aktivierungs-E-Mail kann nicht erneut gesendet werden", + "problem_account_activation_resend_unavailable_desc": "Melde dich erneut an, um einen neuen Aktivierungslink anzufordern.", + "problem_account_deactivate_already_deactivated_title": "Das Konto ist bereits deaktiviert", + "problem_account_deactivate_denied_privileged_title": "Privilegierte Konten können nicht deaktiviert werden", + "problem_account_deactivate_unauthorized_title": "Das darfst du nicht", + "problem_account_deactivated_title": "Dieses Konto wurde deaktiviert", + "problem_account_email_already_in_use_title": "Diese E-Mail-Adresse wird bereits verwendet", + "problem_account_email_invalid_title": "Diese E-Mail-Adresse ist ungültig", + "problem_account_email_taken_title": "Diese E-Mail-Adresse wird bereits verwendet", + "problem_account_email_too_many_requests_title": "Zu viele Anfragen zur E-Mail-Änderung", + "problem_account_email_too_many_requests_desc": "Warte eine Weile, bevor du es erneut versuchst.", + "problem_account_email_unchanged_title": "Das ist bereits deine E-Mail-Adresse", + "problem_account_email_verify_not_found_title": "Der Bestätigungslink ist ungültig", + "problem_account_email_verify_not_found_desc": "Der Link ist möglicherweise abgelaufen oder wurde bereits verwendet.", + "problem_account_o_auth_only_title": "Dieses Konto hat kein Passwort", + "problem_account_o_auth_only_desc": "Melde dich mit dem Anbieter an, mit dem du dich registriert hast.", + "problem_account_password_not_set_title": "Kein Passwort festgelegt", + "problem_account_password_not_set_desc": "Dieses Konto meldet sich über einen externen Anbieter an.", + "problem_account_password_old_password_invalid_title": "Das aktuelle Passwort ist falsch", + "problem_account_username_invalid_title": "Dieser Benutzername ist nicht erlaubt", + "problem_account_username_recently_changed_title": "Benutzername wurde vor Kurzem geändert", + "problem_account_username_recently_changed_desc": "Du kannst deinen Benutzernamen einmal alle 7 Tage ändern.", + "problem_account_username_taken_title": "Dieser Benutzername ist bereits vergeben", + "problem_admin_user_deactivated_title": "Dieser Benutzer ist deaktiviert", + "problem_admin_user_not_activated_title": "Dieser Benutzer wurde noch nicht aktiviert", + "problem_api_token_can_only_delete_self_title": "Ein API-Token kann nur sich selbst löschen", + "problem_api_token_not_found_title": "API-Token nicht gefunden", + "problem_api_token_paused_title": "Dieses API-Token ist pausiert", + "problem_assign_lcg_bad_schema_version_title": "Nicht unterstützte Hub-Protokollversion", + "problem_assign_lcg_bad_schema_version_desc": "Aktualisiere die Hub-Firmware, um dich zu verbinden.", + "problem_assign_lcg_no_lcg_available_title": "Kein Gateway verfügbar", + "problem_assign_lcg_no_lcg_available_desc": "Derzeit ist kein Live-Control-Gateway verfügbar. Bitte versuche es später erneut.", + "problem_authentication_account_deactivated_title": "Dieses Konto wurde deaktiviert", + "problem_authentication_account_not_activated_title": "Dieses Konto wurde nicht aktiviert", + "problem_authentication_cookie_missing_or_invalid_title": "Du bist nicht angemeldet", + "problem_authentication_cookie_missing_or_invalid_desc": "Deine Sitzung ist möglicherweise abgelaufen. Bitte melde dich erneut an.", + "problem_authentication_header_missing_or_invalid_title": "Ungültiges API-Token", + "problem_authentication_session_invalid_title": "Sitzung abgelaufen", + "problem_authentication_session_invalid_desc": "Bitte melde dich erneut an.", + "problem_authentication_token_invalid_title": "Ungültiges API-Token", + "problem_authentication_unknown_error_title": "Authentifizierung fehlgeschlagen", + "problem_authorization_policy_not_met_title": "Dazu hast du keine Berechtigung", + "problem_authorization_token_only_title": "Diese Aktion erfordert ein API-Token", + "problem_authorization_token_permission_missing_title": "Diesem API-Token fehlt eine erforderliche Berechtigung", + "problem_authorization_unknown_error_title": "Autorisierung fehlgeschlagen", + "problem_authorization_user_session_only_title": "Diese Aktion erfordert eine angemeldete Sitzung", + "problem_automation_token_not_allowed_for_account_title": "Automatisierungstoken können nicht mit privilegierten Konten verwendet werden", + "problem_configuration_already_exists_title": "Ein Konfigurationseintrag mit diesem Namen existiert bereits", + "problem_configuration_invalid_name_format_title": "Ungültiger Konfigurationsname", + "problem_configuration_invalid_name_format_desc": "Nur A bis Z und Unterstriche sind erlaubt.", + "problem_configuration_invalid_value_format_title": "Der Wert passt nicht zum Konfigurationstyp", + "problem_configuration_not_found_title": "Konfigurationseintrag nicht gefunden", + "problem_control_stats_invalid_range_title": "Das Startdatum darf nicht nach dem Enddatum liegen", + "problem_control_stats_invalid_time_zone_title": "Unbekannte Zeitzone", + "problem_control_stats_missing_capability_title": "Steuerungsstatistiken sind auf diesem Server nicht verfügbar", + "problem_device_not_found_title": "Hub nicht gefunden", + "problem_device_not_online_title": "Der Hub ist offline", + "problem_device_too_many_hubs_title": "Du hast die maximale Anzahl an Hubs erreicht", + "problem_device_too_many_shockers_title": "Dieser Hub hat die maximale Anzahl an Shockern erreicht", + "problem_endpoint_retired_title": "Diese Funktion ist nicht mehr verfügbar", + "problem_expression_error_title": "Ungültiger Filterausdruck", + "problem_internal_server_error_title": "Bei uns ist etwas schiefgelaufen", + "problem_login_invalid_credentials_title": "Ungültiger Benutzername oder ungültiges Passwort", + "problem_login_invalid_domain_title": "Die Anmeldung von dieser Adresse ist nicht erlaubt", + "problem_o_auth_connection_already_exists_title": "Dein Konto ist bereits mit diesem Anbieter verbunden", + "problem_o_auth_connection_already_linked_title": "Dieses externe Konto ist bereits mit einem anderen Benutzer verknüpft", + "problem_o_auth_flow_anonymous_only_title": "Du bist bereits angemeldet", + "problem_o_auth_flow_mismatch_title": "Der Anmeldeversuch stimmt nicht überein", + "problem_o_auth_flow_mismatch_desc": "Bitte beginne von vorn.", + "problem_o_auth_flow_missing_data_title": "Der Anbieter hat deine Kontodaten nicht übermittelt", + "problem_o_auth_flow_missing_data_desc": "Bitte versuche es erneut.", + "problem_o_auth_flow_not_found_title": "Der Anmeldeversuch ist abgelaufen", + "problem_o_auth_flow_not_found_desc": "Bitte beginne von vorn.", + "problem_o_auth_flow_unsupported_title": "Nicht unterstützter Anmeldeablauf", + "problem_o_auth_internal_error_title": "Bei der Anmeldung ist etwas schiefgelaufen", + "problem_o_auth_internal_error_desc": "Versuche es gleich noch einmal.", + "problem_o_auth_link_authenticated_user_only_title": "Du musst angemeldet sein, um ein externes Konto zu verknüpfen", + "problem_o_auth_provider_mismatch_title": "Der Anmeldeversuch passt nicht zum Anbieter", + "problem_o_auth_provider_mismatch_desc": "Bitte beginne von vorn.", + "problem_o_auth_provider_unsupported_title": "Dieser Anmeldeanbieter wird nicht unterstützt", + "problem_pair_code_not_found_title": "Kopplungscode nicht gefunden", + "problem_password_reset_not_found_title": "Der Link zum Zurücksetzen des Passworts ist ungültig", + "problem_password_reset_not_found_desc": "Der Link ist möglicherweise abgelaufen oder wurde bereits verwendet.", + "problem_session_not_found_title": "Sitzung nicht gefunden", + "problem_share_get_no_shares_title": "Du hast keine Freigaben mit diesem Benutzer", + "problem_share_request_create_cannot_share_with_self_title": "Du kannst nicht mit dir selbst teilen", + "problem_share_request_create_shocker_not_found_title": "Ein oder mehrere Shocker wurden nicht gefunden", + "problem_share_request_create_shocker_not_found_desc": "Sie wurden möglicherweise entfernt oder gehören dir nicht.", + "problem_share_request_not_found_title": "Einladung nicht gefunden", + "problem_share_user_not_found_title": "Freigabe nicht gefunden", + "problem_share_code_already_linked_title": "Der Shocker ist bereits mit deinem Konto verknüpft", + "problem_share_code_cant_link_own_share_code_title": "Du kannst deinen eigenen Freigabecode nicht einlösen", + "problem_share_code_not_found_title": "Freigabecode nicht gefunden", + "problem_share_link_expiry_date_in_past_title": "Das Ablaufdatum darf nicht in der Vergangenheit liegen", + "problem_share_link_not_found_title": "Öffentliche Freigabe nicht gefunden", + "problem_share_link_shocker_already_in_share_link_title": "Der Shocker ist bereits in dieser öffentlichen Freigabe", + "problem_share_link_shocker_not_in_share_link_title": "Der Shocker ist nicht in dieser öffentlichen Freigabe", + "problem_shocker_control_no_permission_title": "Du darfst diesen Shocker nicht steuern", + "problem_shocker_control_not_found_title": "Shocker nicht gefunden", + "problem_shocker_control_paused_title": "Der Shocker ist pausiert", + "problem_shocker_not_found_title": "Shocker nicht gefunden", + "problem_signup_registration_disabled_title": "Die Registrierung ist derzeit deaktiviert", + "problem_signup_username_or_email_exists_title": "Dieser Benutzername oder diese E-Mail wird bereits verwendet", + "problem_turnstile_invalid_title": "Überprüfung fehlgeschlagen", + "problem_turnstile_invalid_desc": "Löse die Prüfung erneut und versuche es noch einmal.", + "problem_user_not_found_title": "Benutzer nicht gefunden", + "problem_user_privileged_delete_denied_title": "Privilegierte Benutzer können nicht gelöscht werden", + "problem_validation_error_title": "Einige Felder sind ungültig", + "problem_webhook_not_found_title": "Webhook nicht gefunden", + "problem_webhook_unsupported_title": "Nur Discord-Webhooks werden unterstützt", + "problem_webhook_unsupported_desc": "Verwende eine discord.com-URL, nicht canary oder ptb.", + + "error_too_many_requests": "Zu viele Anfragen", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Versuche es in {seconds} Sekunde erneut.", + "secondsPlural=other": "Versuche es in {seconds} Sekunden erneut." + } + } + ], + "error_unexpected_response": "Unerwartete Serverantwort", + "error_internal": "Ein interner Fehler ist aufgetreten", + "error_network": "Ein Netzwerkfehler ist aufgetreten", + + "dev_banner": "Dies ist die {#b}ENTWICKLUNGS{/b}-Umgebung von OpenShock. {#u}Es werden keine Daten gespeichert{/u}, und sie wird regelmäßig mit Produktionsdaten überschrieben.", + "firmware_channel_bugs_warning": "Dieser Kanal kann Fehler enthalten." +} diff --git a/messages/en.json b/messages/en.json new file mode 100644 index 00000000..5a04930d --- /dev/null +++ b/messages/en.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "The go-to platform for safe, reliable, real low-latency remote shocking.", + "landing_section_label": "Home", + "landing_hubs_online": "Hubs online right now: ", + "landing_learn_more": "Learn More", + "landing_wiki": "Wiki", + "landing_meta_description": "Welcome to OpenShock, a free and open-source ecosystem to control various shock collars over the internet.", + "instance_meta_description": "Welcome to {siteName}, an independent instance of OpenShock, a free and open-source ecosystem to control various shock collars over the internet.", + "header_sidebar_toggle": "Toggle Sidebar", + "header_avatar_alt": "{name}'s avatar", + "header_menu_profile": "Profile", + "header_menu_settings": "Settings", + "header_menu_logout": "Logout", + "header_login": "Login", + "header_signup": "Sign Up", + "header_github_title": "OpenShock on GitHub", + "header_discord_title": "Community Discord", + + "footer_made_with": "Made with {#heart/} by the {#team}OpenShock Team{/team}", + "footer_connection_status_label": "Server connection status", + "footer_signalr_state": "SignalR State", + "footer_frontend_version": "Frontend Version", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backend Version", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Language", + + "sidebar_home_link_label": "OpenShock home", + "sidebar_group_general": "General", + "sidebar_home": "Home", + "sidebar_shockers": "Shockers", + "sidebar_shared_shockers": "Shared Shockers", + "sidebar_hubs": "Hubs", + "sidebar_user_shares": "User Shares", + "sidebar_public_shares": "Public Shares", + "sidebar_serial_terminal": "Serial Terminal", + "sidebar_group_admin": "Admin", + "sidebar_admin_monitoring": "Monitoring", + "sidebar_admin_online_hubs": "Online Hubs", + "sidebar_admin_online_gateways": "Online Gateways", + "sidebar_admin_management": "Management", + "sidebar_admin_users": "Users", + "sidebar_admin_blacklists": "Blacklists", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "Mail", + "sidebar_admin_automation_tokens": "Automation Tokens", + "sidebar_admin_configuration": "Configuration", + "sidebar_group_settings": "Settings", + "sidebar_settings_api_tokens": "API Tokens", + "sidebar_settings_sessions": "Sessions", + "sidebar_settings_audit_log": "Audit Log", + "sidebar_settings_connections": "Connections", + "sidebar_settings_account": "Account Settings", + + "error_meta_title": "Service Unavailable", + "error_meta_description": "OpenShock is currently unavailable", + "error_meta_logo_alt": "OpenShock Logo", + "error_fallback_message": "Something went wrong.", + "error_not_found_message": "Page not found", + "error_not_found_description": "The page you're looking for doesn't exist.", + "error_unexpected_description": "An unexpected error occurred.", + "error_go_back": "Go back", + + "auth_layout_logo_alt": "OpenShock Logo", + "auth_layout_invalid_redirect_removed": "An invalid redirect URL was removed for your safety.", + + "auth_activate_breadcrumb": "Activate Account", + "auth_activate_title": "Activate Account", + "auth_activate_activating": "Activating your account...", + "auth_activate_success": "Your account has been activated", + "auth_activate_failed": "This activation link is invalid or has expired", + "auth_activate_missing_token": "Missing activation token", + "auth_activate_continue": "Continue to login", + "auth_activate_toast_success": "Account activated", + + "auth_forgot_breadcrumb": "Forgot Password", + "auth_forgot_title": "Forgot Password", + "auth_forgot_description": "Enter your email to reset your password", + "auth_forgot_email_label": "Email", + "auth_forgot_email_placeholder": "Email", + "auth_forgot_submit": "Reset Password", + "auth_forgot_signin_prompt": "Remember your password? {#signin}Sign in{/signin}", + "auth_forgot_mail_disabled": "Password resets are unavailable on this instance because it has no mail provider configured. Please contact your administrator for help recovering your account.", + "auth_forgot_toast_sent": "Reset password request has been sent to the given email", + + "auth_login_breadcrumb": "Login", + "auth_login_title": "Welcome back", + "auth_login_loading_methods": "Loading available login methods", + "auth_login_choose_method": "Login with one of these methods", + "auth_login_with_account": "Login with your OpenShock Account", + "auth_login_activation_after_signup": "Your account has been created. We've sent an activation link to your email address. Check your inbox and spam folder.", + "auth_login_activation_pending": "Your account isn't activated yet. We've sent an activation link to your email address. Check your inbox and spam folder. If nothing arrives, try logging in again later to get a new link.", + "auth_login_oauth_only": "This account has no password. Sign in with the provider you signed up with.", + "auth_login_oauth_only_with_buttons": "This account has no password. Sign in with the provider you signed up with using the buttons above.", + "auth_login_or_continue_with": "Or continue with", + "auth_login_username_label": "Username or Email", + "auth_login_password_label": "Password", + "auth_login_submit": "Login", + "auth_login_signup_prompt": "Don't have an account? {#signup}Sign up{/signup}", + "auth_login_legal": "By clicking Login, you agree to our {#tos}Terms of Service{/tos} and {#privacy}Privacy Policy{/privacy}.", + + "auth_oauth_create_breadcrumb": "Sign Up With {provider}", + "auth_oauth_create_title": "Sign Up With {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Complete your account details", + "auth_oauth_create_username_label": "Username", + "auth_oauth_create_username_placeholder": "Username", + "auth_oauth_create_email_label": "Email", + "auth_oauth_create_email_placeholder": "Email", + "auth_oauth_create_submit": "Sign Up", + "auth_oauth_create_legal": "By clicking Sign Up, you agree to our {#tos}Terms of Service{/tos} and {#privacy}Privacy Policy{/privacy}.", + + "auth_oauth_error_breadcrumb": "Authentication Error", + "auth_oauth_error_title": "Authentication Error", + "auth_oauth_error_back": "Back to login", + + "auth_reset_breadcrumb": "Reset Password", + "auth_reset_title": "Reset Password", + "auth_reset_checking": "Verifying reset link...", + "auth_reset_choose_password": "Choose a new password for your account", + "auth_reset_invalid": "This reset link is invalid or has expired", + "auth_reset_password_label": "New Password", + "auth_reset_password_placeholder": "New Password", + "auth_reset_confirm_label": "Confirm New Password", + "auth_reset_confirm_placeholder": "Confirm New Password", + "auth_reset_submit": "Reset Password", + "auth_reset_request_new": "Request a new reset link", + "auth_reset_toast_success": "Password has been reset", + + "auth_signup_breadcrumb": "Sign Up", + "auth_signup_toast_created_mail": "Account created successfully. Please check your email to verify your account.", + "auth_signup_toast_created_no_mail": "Account created successfully. You can log in now.", + "auth_signup_dialog_title": "Welcome! Thank you for signing up! ❤️", + "auth_signup_dialog_created_mail": "Your account has been created. 🎉 Please check your email to verify your account.", + "auth_signup_dialog_verify_then_login": "After verifying your email, you can log in to your account.", + "auth_signup_dialog_created_no_mail": "Your account has been created and is ready to use. 🎉", + "auth_signup_dialog_login_now": "You can log in to your account now.", + "auth_signup_title": "Create your account", + "auth_signup_loading_methods": "Loading available sign-up methods", + "auth_signup_using_email": "Signing up using email", + "auth_signup_choose_method": "Choose your preferred sign-up method", + "auth_signup_back": "Back", + "auth_signup_username_label": "Username", + "auth_signup_username_placeholder": "John OpenShock", + "auth_signup_email_label": "Email", + "auth_signup_email_placeholder": "john@example.com", + "auth_signup_password_label": "Password", + "auth_signup_password_placeholder": "Password", + "auth_signup_confirm_label": "Confirm Password", + "auth_signup_confirm_placeholder": "Confirm Password", + "auth_signup_submit": "Create Account", + "auth_signup_signin_prompt": "Already have an account? {#signin}Sign in{/signin}", + "auth_signup_or": "Or", + "auth_signup_with_email": "Signup with Email", + "auth_signup_legal": "By clicking Create Account, you agree to our {#tos}Terms of Service{/tos} and {#privacy}Privacy Policy{/privacy}.", + + "auth_verify_breadcrumb": "Verify Email", + "auth_verify_title": "Verify Email", + "auth_verify_verifying": "Verifying your email address...", + "auth_verify_success": "Your email has been verified", + "auth_verify_failed": "This verification link is invalid or has expired", + "auth_verify_missing_token": "Missing verification token", + "auth_verify_continue": "Continue to login", + "auth_verify_toast_success": "Email verified", + + "common_cancel": "Cancel", + "common_delete": "Delete", + "common_edit": "Edit", + "common_share": "Share", + "common_copy_id": "Copy ID", + "common_id_copied": "ID copied to clipboard", + "common_open_menu": "Open menu", + "common_refresh": "Refresh", + "common_settings": "Settings", + "common_clear": "Clear", + "common_online": "Online", + "common_offline": "Offline", + "common_paused": "Paused", + "common_resume": "Resume", + "common_resuming": "Resuming...", + "common_coming_soon": "(Coming soon)", + "common_save_changes": "Save Changes", + "common_danger_zone": "Danger Zone", + "common_name": "Name", + "control_intensity": "Intensity", + "control_duration": "Duration", + "control_max_intensity": "Max Intensity", + "control_max_duration": "Max Duration", + "control_vibration": "Vibration", + "control_value": "Value", + "control_live_intensity": "Live intensity", + "control_type_stop": "Stop", + "control_type_shock": "Shock", + "control_type_vibrate": "Vibrate", + "control_type_sound": "Sound", + "live_tooltip_active": "Live via {gateway} ({country}), {latency}ms", + "live_tooltip_connecting": "Connecting...", + "live_tooltip_connect": "Connect to Live Control", + "live_tooltip_hub_start": "Ctrl+click to start the whole hub", + "live_tooltip_hub_stop": "Ctrl+click to stop the whole hub", + "pause_resume_shocker": "Resume shocker", + "pause_pause_shocker": "Pause shocker", + "pause_resume_all": "Resume all shockers", + "pause_pause_all": "Pause all shockers", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Select hub", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID must be a whole number between {min} and {max}.", + "shocker_model": "Model", + "shocker_select_model": "Select model", + "shocker_name_placeholder": "Shocker name", + "shocker_menu_view_logs": "View Logs", + "shocker_delete_title": "Delete Shocker", + "shocker_delete_desc": "Are you sure you want to delete \"{name}\"? This action cannot be undone.", + "shocker_toast_deleted": "Shocker \"{name}\" deleted", + "shocker_toast_paused": "Shocker paused", + "shocker_toast_resumed": "Shocker resumed", + "shocker_add_desc": "Register a new shocker to one of your hubs.", + "shocker_add_name_placeholder": "My Shocker", + "shockers_title": "Shockers", + "shockers_subtitle": "Every shocker paired to your hubs.", + "shockers_loading": "Loading shockers...", + "shockers_toast_refreshed": "Shockers refreshed", + "shockers_toast_need_hub": "You need to create a hub before adding shockers.", + "shockers_toast_added": "Shocker added", + "shockers_unknown_module": "Unknown module type", + "shockers_add": "Add Shocker", + "shockers_view_mode": "View mode", + "shockers_mode_classic": "Classic", + "shockers_mode_rich": "Rich", + "shockers_mode_simple": "Simple", + "shockers_mode_map": "Map", + "shockers_group_by_hub": "Group by Hub", + "shockers_global_limits": "Global Limits", + "shockers_logs_label": "Logs", + "shockers_empty_title": "No shockers yet", + "shockers_empty_no_hubs": "Create a hub first, then add shockers to it.", + "shockers_empty_has_hubs": "Add a shocker to one of your hubs to get started.", + "shockers_create_hub": "Create a Hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockers" } + } + ], + "shared_shockers_title": "Shared Shockers", + "shared_shockers_subtitle": "Shockers other users have shared with you.", + "shared_shockers_empty_title": "No shockers have been shared with you yet.", + "shared_shockers_empty_desc": "When someone shares their shockers with you, they'll appear here.", + "shocker_logs_title": "Shocker Logs", + "shocker_logs_subtitle": "Every control command sent to your shockers.", + "shocker_logs_live_title": "New logs appear in real time", + "shocker_logs_paused_title": "Live updates pause when sorting or viewing a page other than the first", + "shocker_logs_live": "Live", + "shocker_logs_col_time": "Time", + "shocker_logs_col_type": "Type", + "shocker_logs_col_by": "By", + "shocker_logs_filter_label": "Filter by shocker", + "shocker_logs_filter_placeholder": "Search shockers...", + "shocker_logs_filter_all": "All shockers", + "shocker_logs_filter_none": "No matching shockers", + "shocker_edit_title": "Edit Shocker", + "shocker_edit_subtitle": "Change this shocker's details or remove it.", + "shocker_edit_back": "Back to Shockers", + "shocker_edit_load_failed": "Failed to load shocker.", + "shocker_edit_loading": "Loading shocker...", + "shocker_edit_details_title": "Shocker Details", + "shocker_edit_details_desc": "Update the name, RF ID, and model for this shocker.", + "shocker_edit_pause_state": "Pause State", + "shocker_edit_is_paused": "Shocker is paused", + "shocker_edit_is_active": "Shocker is active", + "shocker_edit_toast_updated": "Shocker updated", + "shocker_edit_delete_desc": "Permanently delete this shocker. This action cannot be undone.", + + "common_close": "Close", + "common_continue": "Continue", + "common_loading": "Loading...", + "common_previous": "Previous", + "common_next": "Next", + "common_steps": "Steps", + "common_step_label": "Step {number}: {title}", + "common_copy": "Copy", + "common_copied": "Copied", + "common_never": "Never", + "common_error": "Error: {message}", + "terminal_title": "Serial Terminal", + "terminal_connecting": "Connecting...", + "terminal_help_button": "I'm having trouble, help?", + "terminal_back_to_modes": "Back to mode picker", + "terminal_mode_configure": "Configure Device", + "terminal_mode_configure_desc": "Configure WiFi, authentication, and more. Includes an interactive serial console.", + "terminal_mode_flash": "Flash Firmware", + "terminal_mode_flash_desc": "Install or update firmware on a connected device.", + "terminal_mode_raw": "Serial Monitor", + "terminal_mode_raw_desc": "Just the console. Read device logs and send commands.", + "terminal_step_channel": "Select Channel", + "terminal_step_board": "Select Board", + "terminal_go_to_step": "Go to step {number}: {title}", + "terminal_erase": "Erase before flashing", + "terminal_erase_desc": "Clears all data on the device including existing configs", + "terminal_unsupported": "Your browser does not support this feature.", + "terminal_update_browser": "Please update your browser to the latest version.", + "terminal_use_browsers": "Please use one of the following browsers:", + "terminal_connect_failed_bootloader": "Could not enter bootloader mode", + "terminal_connect_failed": "Device connection failed", + "terminal_connect_failed_desc": "We couldn't establish a serial connection with the device.", + "terminal_quick_tries": "Quick things to try:", + "terminal_try_replug": "Unplug and replug the device.", + "terminal_try_cable": "Try a different USB cable or port.", + "terminal_try_driver": "Make sure the serial driver is installed.", + "terminal_open_troubleshooter": "Open troubleshooter", + "terminal_log_reset_no_device": "Host-side error during reset: no device!", + "terminal_log_reset_error": "Host-side error during reset: {error}", + "terminal_log_send_no_device": "Couldn't send: no device!", + "terminal_log_send_error": "Couldn't send: {error}", + "terminal_log_firmware_disconnected": "Firmware disconnected: {error}", + "terminal_log_erase_failed": "Failed to erase flash: {error}", + "terminal_log_hard_reset_failed": "Failed to hard reset: {error}", + "terminal_log_flash_complete": "Flash complete", + "terminal_log_flash_failed": "Failed to flash: {error}", + "terminal_log_command_failed": "Failed to write application command: {error}", + "terminal_help_title": "Troubleshooter", + "terminal_help_desc": "Work through these steps in order. Each one rules out a common cause.", + "terminal_help_step_cable": "USB cable", + "terminal_help_step_port": "USB port", + "terminal_help_step_driver": "Install driver", + "terminal_help_step_manual": "Manual driver update", + "terminal_help_step_discord": "Ask on Discord", + "terminal_help_cable_body": "Many USB-C and micro-USB cables are charge-only and don't carry data. Swap to a known-good data cable (one you've used to transfer files or connect other devices) and reconnect the hub.", + "terminal_help_port_body": "Plug the device directly into a USB port on your computer. Avoid USB hubs, docking stations, and front-panel ports if possible; these are common sources of power and signal issues. If you're on a desktop, try a port on the back of the machine.", + "terminal_help_driver_download": "Download the CP210x driver:", + "terminal_help_driver_extract": "Extract the contents of the zip file to a folder on your computer.", + "terminal_help_driver_run": "Open the folder and run {#code}{installer}{/code}. Follow the prompts to install.", + "terminal_help_driver_reconnect": "Reconnect the device.", + "terminal_help_manual_intro": "If the driver installer ran but the device still doesn't show up:", + "terminal_help_manual_open": "Open Device Manager (press {#key}Win{/key} + {#key}X{/key} and select {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Under {#code}Ports (COM & LPT){/code}, look for an entry like:", + "terminal_help_manual_missing": "If it's missing, the device isn't being detected by Windows at all; revisit the cable and port steps.", + "terminal_help_manual_update": "Right-click the device and pick {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Choose {#code}Browse my computer for drivers{/code} and select the folder you extracted the driver zip into. Make sure {#code}Include subfolders{/code} is checked.", + "terminal_help_manual_success": "On success, the entry should now read {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Still stuck after all of the above? Hop into our Discord server and ask in the {#code}{channel}{/code} channel. Please include:", + "terminal_help_discord_os": "your operating system and browser", + "terminal_help_discord_device": "the device you're using (board model, where you got it)", + "terminal_help_discord_tried": "what you've already tried from the previous steps", + "terminal_help_discord_errors": "any error messages or relevant terminal output", + "terminal_help_discord_join": "Join our Discord server", + "terminal_risk_title": "⚠️ UNSTABLE FIRMWARE", + "terminal_risk_intro": "You are about to flash {#strong}experimental firmware{/strong} that is {#strong}known to be unstable{/strong}.", + "terminal_risk_brick": "This may permanently brick your device, require manual recovery, or render it unusable.", + "terminal_risk_no_support": "We will NOT provide support for issues caused by this firmware.", + "terminal_risk_acknowledge": "I understand this is entirely my responsibility", + "terminal_risk_abort": "Abort", + "terminal_risk_accept": "I ACCEPT FULL RESPONSIBILITY", + "firmware_channel_recommended": "This is the recommended channel.", + "firmware_channel_danger": "DO NOT USE THIS UNLESS YOU KNOW WHAT YOU ARE DOING", + "firmware_channel_stable": "Stable", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Develop", + "terminal_board_select": "Select a board...", + "terminal_board_search": "Search boards...", + "terminal_board_none": "No board found.", + "terminal_flash_button": "Flash", + "terminal_flash_progress": "Flash Progress: {status}", + "terminal_flash_idle": "Idle", + "terminal_flash_no_device": "No device selected.", + "terminal_flash_resetting": "Resetting...", + "terminal_flash_downloading": "Downloading firmware...", + "terminal_flash_download_failed": "Failed to download firmware.", + "terminal_flash_flashing": "Flashing firmware...", + "terminal_flash_rebooting": "Rebooting device... (Reconnect to power manually if stuck)", + "terminal_flash_done": "Rebooted device! Flashing complete.", + "terminal_port_select": "Select Device", + "terminal_port_disconnect": "Disconnect Device", + "terminal_port_connected": "Device connected: {#strong}{id}{/strong}", + "terminal_console": "Console", + "terminal_connected_device": "Connected device", + "terminal_resize": "Resize terminal panel", + "terminal_reboot": "Reboot", + "terminal_disconnect": "Disconnect", + "terminal_fullscreen_exit_esc": "Exit fullscreen (Esc)", + "terminal_fullscreen_exit": "Exit fullscreen", + "terminal_fullscreen_fill": "Fill the window", + "terminal_command_label": "Serial command", + "terminal_command_placeholder": "Type a command...", + "terminal_command_send": "Send command", + "terminal_colors": "Colors", + "terminal_colors_menu": "Colors...", + "terminal_colors_label": "Console colors", + "terminal_colors_close": "Close colors", + "terminal_color_input": "{name} color", + "terminal_colors_reset": "Reset to defaults", + "terminal_color_bg": "Background", + "terminal_color_fg": "Text", + "terminal_color_ts": "Timestamp", + "terminal_color_error": "Error", + "terminal_color_warning": "Warning", + "terminal_color_info": "Info", + "terminal_color_debug": "Debug", + "terminal_color_verbose": "Verbose", + "terminal_options": "Options", + "terminal_options_label": "Console options", + "terminal_hide_system": "Hide system messages", + "terminal_stick_bottom": "Stick to bottom", + "terminal_raw_output": "Raw output", + "terminal_timestamps": "Timestamps", + "terminal_timestamp_uptime": "Uptime", + "terminal_timestamp_local": "Local", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Off", + "terminal_copy_settings": "Copy settings", + "terminal_import_settings": "Import settings", + "terminal_copy_selection": "Copy selection", + "terminal_copy_all": "Copy all output", + "terminal_toast_selection_copied": "Selection copied", + "terminal_toast_output_copied": "Console output copied", + "terminal_toast_settings_copied": "Console settings copied", + "terminal_toast_clipboard_unreadable": "Could not read the clipboard", + "terminal_toast_settings_imported": "Console settings imported", + "terminal_toast_settings_invalid": "Clipboard does not contain console settings", + + "common_try_again": "Try again", + "terminal_cfg_intro": "Values are sent to the device via UART. Read the device's response in the console below. Commands without an argument act as getters; use the {#eye/} button next to each field to read the current value.", + "terminal_cfg_rf_title": "RF Transmitter", + "terminal_cfg_rf_desc": "Controls the shocker RF output.", + "terminal_cfg_tx_pin": "TX GPIO pin", + "terminal_cfg_example": "e.g. {value}", + "terminal_cfg_read_value": "Read current value", + "terminal_cfg_set": "Set", + "terminal_cfg_read": "Read", + "terminal_cfg_reading": "Reading…", + "terminal_cfg_apply": "Apply", + "terminal_cfg_keepalive": "Keepalive enabled", + "terminal_cfg_keepalive_desc": "Periodically pings paired shockers to keep them awake.", + "terminal_cfg_estop_title": "Emergency Stop", + "terminal_cfg_estop_desc": "Hardware button that halts all output.", + "terminal_cfg_estop_enabled": "EStop enabled", + "terminal_cfg_estop_pin": "EStop GPIO pin", + "terminal_cfg_estop_note": "Note: {#code}{latching}{/code} and {#code}{active}{/code} have no dedicated commands; set them via the JSON config below.", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Station credentials and device hostname.", + "terminal_cfg_hostname": "Hostname", + "terminal_cfg_networks": "Networks (JSON array)", + "terminal_cfg_invalid_json_array": "Must be a valid JSON array", + "terminal_cfg_ap_note": "AP settings ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) have no dedicated commands; use the JSON config.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "OpenShock server and authentication.", + "terminal_cfg_domain": "Domain", + "terminal_cfg_domain_restart": "Setting the domain will restart the device.", + "terminal_cfg_auth_token": "Auth token", + "terminal_cfg_auth_token_placeholder": "Paste device token", + "terminal_cfg_hide": "Hide", + "terminal_cfg_show": "Show", + "terminal_cfg_serial_title": "Serial Input", + "terminal_cfg_echo": "Echo enabled", + "terminal_cfg_echo_desc": "Print typed characters back to the console.", + "terminal_cfg_advanced_title": "Advanced: full config", + "terminal_cfg_advanced_desc": "For fields without dedicated commands (captive portal, OTA, LAN, etc.), replace the entire config.", + "terminal_cfg_json_config": "JSON config", + "terminal_cfg_invalid_json": "Must be valid JSON", + "terminal_cfg_read_json": "Read current config as JSON", + "terminal_cfg_json_restart": "Applying a JSON config will restart the device.", + "terminal_cfg_raw_config": "Raw FlatBuffer config (base64)", + "terminal_cfg_invalid_base64": "Must be a valid base64 string", + "terminal_cfg_read_raw": "Read current config as base64", + "terminal_cfg_factory_reset": "Factory reset", + "terminal_cfg_factory_reset_desc": "Wipes the entire device configuration.", + "terminal_cfg_factory_reset_title": "Factory reset device?", + "terminal_cfg_factory_reset_action": "Wipe config", + "terminal_cfg_factory_reset_confirm": "This will erase all configuration on the device; WiFi networks, backend credentials, pins, and all other settings. The device will be reset to defaults.", + "terminal_cfg_read_failed_json_title": "Couldn't read the JSON config", + "terminal_cfg_read_failed_raw_title": "Couldn't read the raw config", + "terminal_cfg_read_failed_desc": "The device didn't respond after {attempts} attempts.", + "terminal_cfg_common_causes": "Common causes:", + "terminal_cfg_cause_busy": "The device is busy handling another command.", + "terminal_cfg_cause_disconnected": "The device disconnected or rebooted.", + "terminal_cfg_cause_unsupported": "The firmware version doesn't support this command.", + + "common_status": "Status", + "common_version": "Version", + "common_created": "Created", + "common_create": "Create", + "common_done": "Done", + "common_enable": "Enable", + "common_disable": "Disable", + "common_are_you_sure": "Are you sure?", + "common_generating": "Generating...", + "hubs_title": "Hubs", + "hubs_subtitle": "Every hub registered to your account.", + "hubs_add": "Add Hub", + "hubs_load_failed": "Failed to load hubs.", + "hubs_empty_title": "No hubs yet", + "hubs_empty_desc": "A hub is the device that relays commands to your shockers. Add one to get started.", + "hubs_create_title": "Create hub", + "hubs_name_label": "Hub Name", + "hubs_name_placeholder": "My Hub", + "hub_toast_not_connected": "Not connected to the server", + "hub_toast_try_later": "Try again in a moment.", + "hub_reboot_title": "Reboot {name}?", + "hub_reboot_desc": "The hub will disconnect and restart. Any shockers paired to it stop responding until it comes back online.", + "hub_reboot": "Reboot", + "hub_hotspot_enable_title": "Enable Wi-Fi hotspot on {name}?", + "hub_hotspot_disable_title": "Disable Wi-Fi hotspot on {name}?", + "hub_hotspot_enable_desc": "The hub broadcasts its own setup network. It stays reachable on your Wi-Fi, but the hotspot is open to anyone in range until you turn it off.", + "hub_hotspot_disable_desc": "The setup hotspot shuts down. If the hub is not already on your Wi-Fi you will need physical access to set it up again.", + "hub_delete_desc": "You are about to delete hub {#strong}{name}{/strong}.", + "hub_delete_shockers": "This will also delete the following shockers:", + "hub_edit_title": "Edit hub", + "hub_edit_apply": "Apply", + "hub_pair_title_generate": "Generate pair code?", + "hub_pair_title_generated": "Pair code generated", + "hub_pair_title_paired": "Hub paired", + "hub_pair_consumed": "{#strong}{name}{/strong} consumed this pair code and is now paired.", + "hub_pair_used": "The code has been used and is no longer valid.", + "hub_pair_generated_for": "Pair code generated for {#strong}{name}{/strong}.", + "hub_copy_now": "The code below will not be accessible later, please copy it now and update clients with it.", + "hub_pair_generate_for": "You are about to generate a pair code for {#strong}{name}{/strong}.", + "hub_pair_valid_for": "It will be valid for 15 minutes after its creation.", + "hub_pair_one_active": "There is only one active pair code per hub, newly generated ones will override the older active ones.", + "hub_pair_complete": "Pairing complete", + "hub_pair_code_label": "Pair code:", + "hub_pair_copied_close": "Code has been copied, close", + "hub_pair_get": "Get Pair Code", + "hub_token_generated": "Token generated", + "hub_token_generated_for": "New token generated for {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "You are about to regenerate the token for {#strong}{name}{/strong}.", + "hub_token_invalidate": "This action will invalidate the current token and disconnect clients using it.", + "hub_token_confirm": "Are you sure you want to do this?", + "hub_token_label": "New token:", + "hub_token_copied_close": "Token has been copied, close", + "hub_token_regenerate": "Regenerate Token", + "hub_menu_update": "Update", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "Enable Wi-Fi hotspot", + "hub_menu_hotspot_disable": "Disable Wi-Fi hotspot", + "hub_menu_pair": "Pair", + "hub_menu_estop": "Emergency Stop", + "hub_update_breadcrumb": "Update", + "hub_update_unknown_hub": "Unknown Hub", + "hub_update_unknown_task": "Unknown Task", + "hub_update_task_metadata": "Fetching Metadata", + "hub_update_task_preparing": "Preparing for Update", + "hub_update_task_flash_fs": "Flashing Filesystem", + "hub_update_task_verify_fs": "Verifying Filesystem", + "hub_update_task_flash_app": "Flashing Application", + "hub_update_task_bootable": "Marking Application Bootable", + "hub_update_task_rebooting": "Rebooting", + "hub_update_status_started": "Started", + "hub_update_status_running": "Running", + "hub_update_status_finished": "Finished", + "hub_update_status_error": "Error", + "hub_update_status_timeout": "Timeout", + "hub_update_confirm_title": "Confirm firmware update", + "hub_update_confirm_desc": "Update {#strong}{name}{/strong} to version {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "This version may not be from the stable channel and could contain bugs.", + "hub_update_title": "Update {name}", + "hub_update_subtitle": "Manage firmware updates for this hub.", + "hub_update_status_title": "Hub Status", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Update", + "hub_update_success": "Update completed successfully", + "hub_update_rolled_back": "Device rolled back to previous version", + "hub_update_back": "Back to Hubs", + "hub_update_flash_again": "Flash Again", + "hub_update_card_title": "Firmware Update", + "hub_update_card_desc": "Select a firmware channel and version to install.", + "hub_update_to": "Update to {version}", + "hub_update_must_be_online": "Hub must be online to start an update.", + "hub_update_updating_to": "Updating to {version}...", + "hub_update_total": "Total", + "hub_update_task": "Task", + "hub_update_history": "Update History", + "hub_update_no_history": "No update history found for this hub.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Started", + "hub_update_col_message": "Message", + "hub_update_loading": "Loading hub information...", + "hub_update_not_found": "Hub not found.", + "home_breadcrumb": "Home", + "home_welcome": "Welcome back", + "home_welcome_name": "Welcome back, {name}", + "home_subtitle": "Here's an overview of your OpenShock setup.", + "home_hubs_online": "{count} online", + "home_hub_status": "Hub Status", + "home_no_hubs": "No hubs", + "home_all_online": "All online", + "home_all_offline": "All offline", + "home_some_online": "{online}/{total} online", + "home_quick_links": "Quick Links", + "home_my_shockers": "My Shockers", + "home_my_shockers_desc": "Control your shockers", + "home_hubs_desc": "Manage your hubs", + "home_shared_desc": "Shockers shared with you", + "home_public_desc": "Manage share links", + "home_get_started": "Get Started", + "home_get_started_desc": "You don't have any hubs yet. Create a hub to connect your first device, then add shockers to it.", + "home_set_up_hub": "Set Up a Hub", + "home_first_shocker": "Add Your First Shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "You have {count} hub set up. Add a shocker to start controlling it.", + "countPlural=other": "You have {count} hubs set up. Add a shocker to start controlling it." + } + } + ], + "home_go_to_shockers": "Go to Shockers", + "profile_title": "Profile", + "profile_coming_soon": "Profile is coming soon", + "profile_coming_soon_desc": "Your public profile is not available yet. Account details live under Settings.", + + "common_retry": "Retry", + "common_never_used": "Never used", + "common_expires": "Expires {time}", + "common_search_placeholder": "Search...", + "common_unknown": "Unknown", + "settings_breadcrumb_account": "Account", + "account_subtitle": "Your sign-in details and account actions.", + "account_change_username": "Change Username", + "account_change_email": "Change Email", + "account_change_password": "Change Password", + "account_username_label": "Username", + "account_email_label": "Email", + "account_password_label": "Password", + "account_new_password_label": "New Password", + "account_confirm_password_label": "Confirm New Password", + "account_oauth_only": "Not available for OAuth-only accounts", + "account_oauth_no_password": "This account signs in via OAuth and has no password.", + "account_diagnostics": "Diagnostics", + "account_diagnostics_desc": "Help us fix crashes and slow API calls. Reports include the error message, stack trace and your IP. Off by default.", + "account_diagnostics_level": "Diagnostics level", + "account_telemetry_off": "Off", + "account_telemetry_off_desc": "Send nothing.", + "account_telemetry_errors": "Errors", + "account_telemetry_errors_desc": "Send browser error reports only.", + "account_telemetry_full": "Full", + "account_telemetry_full_desc": "Error reports plus traces of API calls (no page navigations).", + "account_toast_deactivated": "Account deactivated successfully", + "account_deactivate_title": "Deactivate account", + "account_deactivate_desc": "Are you sure you want to deactivate your account?", + "account_deactivate": "Deactivate Account", + "account_email_title": "Change email", + "account_email_desc": "Enter your new email address and confirm with your current password.", + "account_email_toast_sent": "Verification email sent to {email}. Click the link in that email to apply the change.", + "account_new_email": "New Email", + "account_current_password": "Current Password", + "account_password_title": "Change password", + "account_password_desc": "Enter your current password and choose a new one.", + "account_password_toast": "Password has been changed", + "account_username_title": "Change username", + "account_username_desc": "Enter a new username.", + "account_new_username": "New Username", + "account_username_toast": "Username changed successfully", + "tokens_subtitle": "API Tokens are used to authenticate with the OpenShock API.", + "tokens_generate": "Generate Token", + "tokens_toast_refreshed": "Tokens refreshed successfully", + "tokens_empty_title": "No API tokens", + "tokens_empty_desc": "Generate a token to authenticate with the OpenShock API.", + "tokens_created_on": "Created {date}", + "tokens_last_used": "Last used {time}", + "tokens_never_expires": "Never expires", + "tokens_load_failed": "Failed to load API tokens.", + "token_toast_edited": "Token edited successfully", + "token_name_required": "Name is required", + "token_name_too_long": "Name is too long", + "token_edit_title": "Edit API token", + "token_name_label": "Token Name", + "token_name_placeholder": "Token name...", + "token_permissions": "Permissions", + "token_perm_category_shockers": "Shockers", + "token_perm_category_devices": "Hubs", + "token_perm_category_usershares": "User Shares", + "token_perm_category_publicshares": "Public Shares", + "token_perm_use": "Use", + "token_perm_edit": "Edit", + "token_perm_pause": "Pause", + "token_perm_auth": "Authenticate", + "token_shocker_control": "Shocker Control", + "token_toast_paused": "Token paused", + "token_toast_resumed": "Token resumed", + "token_delete_title": "Delete API token", + "token_delete_desc": "Are you sure you want to delete {#strong}{name}{/strong}?", + "token_delete_permanent": "This action cannot be undone. This will permanently delete the token.", + "token_toast_deleted": "Token deleted successfully", + "token_resume": "Resume token", + "token_pause": "Pause token", + "token_mode_clamp_desc": "Clamp: requests outside the allowed range are capped to the nearest limit (the min or the max).", + "token_mode_lerp_desc": "Lerp: the full input range is linearly rescaled so it fits within your allowed min–max range.", + "token_paused_desc": "A paused token may not send shocker control messages.", + "token_intensity_range": "Intensity range", + "token_duration_range": "Duration range", + "token_new_breadcrumb": "New", + "token_redirect_not_allowed": "The provided redirect_uri is not allowed. Only loopback addresses or custom application schemes are permitted.", + "token_params_missing": "Required get parameters are missing. Make sure name, redirect_uri, and permissions are provided.", + "token_invalid_permissions": "Invalid permissions provided: {list}", + "token_toast_created": "Token created successfully", + "token_request_title": "API Token Request", + "token_access_granted": "Access granted", + "token_shared_redirecting": "The token has been created and shared with the application. Redirecting you back to {#b}{uri}{/b}.", + "token_not_redirected": "If you are not redirected automatically, use the button below.", + "token_finish": "Finish", + "token_generated_title": "API Token Generated", + "token_copy_now": "Please copy your API Token now, you will not be able to view it again later!", + "token_new_title": "New API Token", + "token_external_desc": "An external application is requesting access to your account. Review and adjust the permissions below before allowing access.", + "token_new_desc": "Configure and generate a new API token for your account.", + "token_external_requesting": "{#b}{name}{/b} is requesting an API Token. Your token will be shared with the application at {#b}{uri}{/b}.", + "token_allow": "Allow", + "token_generate": "Generate", + "token_deny": "Deny", + "sessions_subtitle": "Every active session on your account. Revoke any you do not recognize.", + "sessions_unknown_device": "Unknown device", + "sessions_toast_refreshed": "Sessions refreshed successfully", + "sessions_load_failed": "Failed to load sessions.", + "sessions_empty_title": "No active sessions", + "sessions_empty_desc": "Sessions appear here once you sign in from a browser or app.", + "sessions_last_seen": "Last seen {time}", + "sessions_signed_in": "Signed in {time}", + "session_toast_revoked": "Session revoked successfully", + "session_revoke_title": "Revoke session", + "session_revoke": "Revoke", + "session_revoke_desc": "Are you sure you want to revoke this session?", + "session_revoke_from": "Session logged in from {#strong}{ip}{/strong} using {#strong}{agent}{/strong}", + "connections_title": "OAuth Connections", + "connections_subtitle": "Link or unlink third-party accounts to sign in faster and keep your profile in sync.", + "connections_toast_linked": "Account linked.", + "connections_toast_cancelled": "Link flow cancelled.", + "connections_toast_failed": "Linking failed.", + "connections_toast_removed": "Connection removed", + "connections_refreshing": "Refreshing…", + "connections_link_new": "Link new provider", + "connections_empty_title": "No connections yet", + "connections_empty_desc": "Choose “Link new provider” above to connect available providers.", + "connections_unlink": "Unlink", + "connections_load_failed": "Failed to load OAuth connections.", + "connections_unlink_title": "Unlink {name}?", + "connections_unlink_title_generic": "Unlink this account?", + "connections_unlink_desc": "You'll no longer be able to sign in with this provider unless you link it again.", + "provider_starting": "Starting {name}...", + "provider_link": "Link {name}", + "audit_subtitle": "Security-relevant activity on your account. Review anything you do not recognize.", + "audit_col_time": "Time", + "audit_col_action": "Action", + "audit_col_details": "Details", + "audit_col_reason": "Reason", + "audit_col_ip": "IP address", + "audit_col_device": "Device", + "audit_action_login": "Signed in", + "audit_action_logout": "Signed out", + "audit_action_password_changed": "Password changed", + "audit_action_email_change_requested": "Email change requested", + "audit_action_email_changed": "Email changed", + "audit_action_username_changed": "Username changed", + "audit_action_api_token_created": "API token created", + "audit_action_api_token_deleted": "API token deleted", + "audit_action_oauth_connected": "Connection added", + "audit_action_oauth_disconnected": "Connection removed", + "audit_action_account_deactivated": "Account deactivated", + "audit_action_account_reactivated": "Account reactivated", + "audit_action_account_deleted": "Account deleted", + "audit_action_automation_token_created": "Automation token created", + "audit_action_automation_token_updated": "Automation token updated", + "audit_action_automation_token_rotated": "Automation token rotated", + "audit_action_automation_token_deleted": "Automation token deleted", + "audit_action_automation_token_used": "Automation token used", + "audit_meta_session": "Session {id}", + "audit_meta_changed": "{old} to {new}", + "audit_meta_email_requested": "Requested change to {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} account removed)", + "countPlural=other": "{name} ({count} accounts removed)" + } + } + ], + "audit_meta_scheduled_deletion": "Scheduled for deletion", + "audit_meta_kept": "Kept for reactivation", + + "common_view": "View", + "common_save": "Save", + "common_saving": "Saving...", + "common_back": "Back", + "common_shared_by": "Shared by", + "common_user_avatar": "User Avatar", + "common_toast_saved": "Changes saved successfully", + "pause_reason_shocker": "Paused at shocker level", + "pause_reason_shocker_user_share": "Paused at shocker and user share level", + "pause_reason_shocker_public_share": "Paused at shocker and public share level", + "pause_reason_user_share": "Paused at user share level", + "pause_reason_public_share": "Paused at public share level", + "public_shares_subtitle": "A link anyone can use, no account required.", + "public_shares_new": "New Share", + "public_share_never_expires": "Never expires", + "public_shares_empty_title": "No public shares yet", + "public_shares_empty_desc": "Create a link that anyone can use to control your shockers.", + "public_share_expired": "Expired", + "public_share_no_expiry": "No expiry", + "public_share_label": "Public Share", + "public_share_toast_created": "Created new public share", + "public_share_create_title": "Create public share", + "public_share_toast_deleted": "Deleted public share", + "public_share_delete_title": "Delete public share", + "public_share_delete_desc": "Are you sure you want to delete public share {#strong}{name}{/strong}?", + "public_share_edit_title": "Public Share: {name}", + "public_share_edit_subtitle": "Editing: changes apply when you save.", + "public_share_add_shocker": "Add Shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Added {count} shocker to share", + "countPlural=other": "Added {count} shockers to share" + } + } + ], + "public_share_empty_shockers_title": "No shockers in this share", + "public_share_empty_shockers_desc": "Add a shocker and anyone with the link will be able to control it.", + "public_share_load_failed": "Error fetching public share details", + "public_share_paused_here": "Paused for this share", + "public_share_resume_shocker": "Resume shocker", + "public_share_pause_shocker": "Pause shocker", + "public_share_remove": "Remove from share", + "public_share_toast_removed": "Shocker removed from share", + "public_share_add_title": "Add shockers", + "public_share_add_desc": "Add shockers to this public share. You can set their limits once they are added.", + "public_share_add_placeholder": "Select shockers to share...", + "public_share_add_no_match": "No matching shockers", + "public_share_add_submit": "Add Shockers", + "public_share_view_loading": "Loading share details...", + "public_share_view_title": "Public Share Link", + "public_share_view_desc": "Enter as a guest or login with your OpenShock account", + "public_share_view_guest_name": "Guest Name", + "public_share_view_enter": "Enter", + "public_share_view_enter_guest": "Enter as Guest", + "public_share_login": "Login", + "perm_shock_on": "Shock enabled", + "perm_shock_off": "Shock disabled", + "perm_vibrate_on": "Vibrate enabled", + "perm_vibrate_off": "Vibrate disabled", + "perm_sound_on": "Sound enabled", + "perm_sound_off": "Sound disabled", + "perm_live_on": "Live enabled", + "perm_live_off": "Live disabled", + "perm_live_control": "Live Control", + "user_selector_avatar_of": "{name}'s avatar", + "user_selector_placeholder": "Enter user name", + "user_selector_aria": "Username to search", + "user_selector_search": "Search user", + "user_selector_found": "User found", + + "common_remove": "Remove", + "user_shares_subtitle": "Direct permanent shares with other users.", + "user_shares_toast_invited": "Sent a shocker invite to {name}", + "user_shares_redeem": "Redeem Code", + "user_shares_new": "New Share", + "user_shares_tab_shares": "Shares", + "user_shares_tab_incoming": "Shared with Me", + "user_shares_tab_invites": "Invites", + "share_code_create_title": "New share code", + "share_code_create_desc": "Create a Share Code or Invite", + "share_code_shocker_placeholder": "Select shockers to share...", + "share_code_no_match": "No matching shockers", + "share_code_send_invite": "Send Share Invite", + "share_code_create": "Create Share Code", + "share_code_created_title": "Share code generated", + "share_code_created_desc": "Please copy share code or code link!", + "share_code_redeem_title": "Redeem share code", + "share_code_redeem_desc": "Enter the share code to redeem", + "share_code_redeem_placeholder": "Enter share code", + "share_code_redeemed": "Redeemed successfully!", + "share_code_shared_shockers": "Shared shockers", + "share_code_redeeming": "Redeeming...", + "share_code_redeem": "Redeem", + "incoming_shares_empty_title": "Nothing shared with you", + "incoming_shares_empty_desc": "No one has shared a shocker with you yet.", + "incoming_share_toast_removed": "Removed share for {name}", + "incoming_share_remove_title": "Remove Share", + "incoming_share_remove_desc": "Are you sure you want to remove the share for {#strong}{name}{/strong}?", + "incoming_share_toast_removed_shocker": "Removed {shocker} shared by {name}", + "incoming_share_remove_shocker_title": "Remove this shared shocker?", + "incoming_share_remove_shocker_desc": "Are you sure you want to remove the shocker share {#strong}{shocker}{/strong} by {#strong}{name}{/strong}?", + "incoming_share_manage_from": "Manage shares from", + "share_remove": "Remove share", + "invites_empty_title": "No invites yet", + "invites_empty_desc": "You have no incoming or outgoing share invites.", + "invites_outgoing": "Outgoing", + "invites_outgoing_empty_title": "No outgoing invites", + "invites_outgoing_empty_desc": "You have no outgoing share invites.", + "invites_incoming": "Incoming", + "invites_incoming_empty_title": "No incoming invites", + "invites_incoming_empty_desc": "You have no incoming share invites.", + "invite_toast_accepted": "Accepted share invite from {name}", + "invite_toast_declined": "Declined share invite from {name}", + "invite_deny_title": "Deny Invite", + "invite_deny_label": "Deny Invite", + "invite_deny": "Deny", + "invite_deny_desc": "Are you sure you want to deny the invite from {#strong}{name}{/strong}?", + "invite_accept": "Accept Invite", + "invite_toast_cancelled_for": "Cancelled invite for {name} ({id})", + "invite_toast_cancelled": "Cancelled invite {id}", + "invite_cancel_title": "Cancel Invite", + "invite_cancel": "Cancel", + "invite_cancel_for_desc": "Are you sure you want to cancel the invite for {#strong}{name}{/strong}?", + "invite_cancel_code_desc": "Are you sure you want to cancel the invite with code {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Cancel Outstanding Invite", + "outgoing_shares_empty_title": "No shared shockers", + "outgoing_shares_empty_desc": "You haven't shared any shockers with other users yet.", + "outgoing_share_toast_removed": "Removed shocker share {name}", + "outgoing_share_remove_title": "Stop sharing this shocker?", + "outgoing_share_editing_for": "Editing shares for", + "outgoing_share_limits": "Limits & Permissions", + "outgoing_share_same": "Same restrictions on every shocker", + "outgoing_share_per_desc": "Tune restrictions per shocker", + "outgoing_share_all": "All", + "outgoing_share_per": "Per shocker", + + "outgoing_share_remove_desc": "Are you sure you want to stop sharing {#strong}{shocker}{/strong} with {#strong}{name}{/strong}?", + + "report_breadcrumb": "Report API Tokens", + "report_toast_clipboard_failed": "Failed to read clipboard: {error}", + "report_title": "Report Leaked API Tokens", + "report_paste": "Paste from clipboard", + "report_warning": "This form is only for reporting accidentally leaked API tokens.", + "report_abuse_warning": "Intentional abuse will result in bans or severe endpoint restrictions.", + "report_detected": "Detected Tokens", + "report_invalid": "One or more tokens appear to be invalid. Please check for formatting issues.", + "report_acknowledge": "I confirm I understand what this feature is for and accept responsibility.", + "report_submit": "Submit Report", + "turnstile_disabled": "Turnstile disabled", + "common_internal_error": "Internal error", + "resend_toast_sent": "Activation email sent. Check your inbox and spam folder.", + "resend_toast_throttled": "Too many activation emails have been requested. Please try again later.", + "resend_toast_unavailable": "No activation email can be resent from this browser. If your account isn't activated yet, logging in sends a new link.", + "resend_button": "Didn't get the email? Resend", + "expiration_label": "Expiration", + "expiration_never": "Never", + "expiration_custom": "Custom", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} Day", "countPlural=other": "{count} Days" } + } + ], + "expiration_required": "Expire date is required", + "expiration_never_desc": "This will never expire", + "expiration_expires_at": "Expires {time} ({date})", + "date_picker_placeholder": "Pick a date", + "telemetry_toast_title": "Help improve OpenShock?", + "telemetry_toast_desc": "Send diagnostics to help us fix crashes and slow API calls. Reports include the error message, stack trace and your IP. You can change this any time in Account settings.", + "telemetry_toast_no": "No thanks", + "telemetry_toast_errors": "Errors only", + "telemetry_toast_full": "Full", + "table_show_details": "Show details", + "table_hide_details": "Hide details", + "table_no_results": "No results.", + "table_sort_asc": "Sort by {name}, ascending", + "table_sort_desc": "Sort by {name}, descending", + "table_sort_none": "Sort by {name}, unsorted", + "cell_na": "N/A", + "cell_not_applicable": "Not applicable", + "cell_invalid": "Invalid", + "cell_unavailable": "Unavailable", + "cell_none": "None", + "oauth_login_with": "Login with {provider}", + "oauth_signup_with": "Signup with {provider}", + "signalr_connect_failed": "Failed to connect to server!", + "signalr_disconnect_failed": "Encountered error while disconnecting from server!", + "signalr_invalid_update": "Received invalid update from server!", + "signalr_invalid_log": "Received invalid log data from server!", + "signalr_invalid_ota": "Received invalid firmware update data from server!", + "ota_toast_failed": "Hub firmware update failed: {message}", + "ota_toast_succeeded": "Hub firmware update completed successfully!", + "ota_toast_rolled_back": "Hub firmware rolled back to previous version", + "lcg_connect_failed": "Failed to connect to live control gateway", + "terminal_toast_bootloader_failed": "Failed to enter bootloader: {error}", + "terminal_toast_app_mode_failed": "Failed to enter application mode: {error}", + + "problem_account_account_not_activated_title": "Account not activated", + "problem_account_account_not_activated_desc": "Check your inbox for the activation email.", + "problem_account_activation_not_found_title": "Activation link is invalid", + "problem_account_activation_not_found_desc": "The link may have expired or already been used.", + "problem_account_activation_resend_too_many_title": "Too many activation emails requested", + "problem_account_activation_resend_too_many_desc": "Please wait a while before trying again.", + "problem_account_activation_resend_unavailable_title": "Cannot resend activation email", + "problem_account_activation_resend_unavailable_desc": "Log in again to request a new activation link.", + "problem_account_deactivate_already_deactivated_title": "Account is already deactivated", + "problem_account_deactivate_denied_privileged_title": "Privileged accounts cannot be deactivated", + "problem_account_deactivate_unauthorized_title": "You are not allowed to do this", + "problem_account_deactivated_title": "This account has been deactivated", + "problem_account_email_already_in_use_title": "That email address is already in use", + "problem_account_email_invalid_title": "That email address is not valid", + "problem_account_email_taken_title": "That email address is already in use", + "problem_account_email_too_many_requests_title": "Too many email change requests", + "problem_account_email_too_many_requests_desc": "Please wait a while before trying again.", + "problem_account_email_unchanged_title": "That is already your email address", + "problem_account_email_verify_not_found_title": "Verification link is invalid", + "problem_account_email_verify_not_found_desc": "The link may have expired or already been used.", + "problem_account_o_auth_only_title": "This account has no password", + "problem_account_o_auth_only_desc": "Sign in with the provider you signed up with.", + "problem_account_password_not_set_title": "No password set", + "problem_account_password_not_set_desc": "This account signs in through an external provider.", + "problem_account_password_old_password_invalid_title": "Current password is incorrect", + "problem_account_username_invalid_title": "That username is not allowed", + "problem_account_username_recently_changed_title": "Username changed too recently", + "problem_account_username_recently_changed_desc": "You can change your username once every 7 days.", + "problem_account_username_taken_title": "That username is already taken", + "problem_admin_user_deactivated_title": "This user is deactivated", + "problem_admin_user_not_activated_title": "This user has not been activated yet", + "problem_api_token_can_only_delete_self_title": "An API token can only delete itself", + "problem_api_token_not_found_title": "API token not found", + "problem_api_token_paused_title": "This API token is paused", + "problem_assign_lcg_bad_schema_version_title": "Unsupported hub protocol version", + "problem_assign_lcg_bad_schema_version_desc": "Update the hub firmware to connect.", + "problem_assign_lcg_no_lcg_available_title": "No gateway available", + "problem_assign_lcg_no_lcg_available_desc": "No live control gateway is available right now. Please try again later.", + "problem_authentication_account_deactivated_title": "This account has been deactivated", + "problem_authentication_account_not_activated_title": "This account has not been activated", + "problem_authentication_cookie_missing_or_invalid_title": "You are not logged in", + "problem_authentication_cookie_missing_or_invalid_desc": "Your session may have expired. Please log in again.", + "problem_authentication_header_missing_or_invalid_title": "Invalid API token", + "problem_authentication_session_invalid_title": "Session expired", + "problem_authentication_session_invalid_desc": "Please log in again.", + "problem_authentication_token_invalid_title": "Invalid API token", + "problem_authentication_unknown_error_title": "Authentication failed", + "problem_authorization_policy_not_met_title": "You do not have permission to do this", + "problem_authorization_token_only_title": "This action requires an API token", + "problem_authorization_token_permission_missing_title": "This API token is missing a required permission", + "problem_authorization_unknown_error_title": "Authorization failed", + "problem_authorization_user_session_only_title": "This action requires a logged-in session", + "problem_automation_token_not_allowed_for_account_title": "Automation tokens cannot be used with privileged accounts", + "problem_configuration_already_exists_title": "A configuration entry with that name already exists", + "problem_configuration_invalid_name_format_title": "Invalid configuration name", + "problem_configuration_invalid_name_format_desc": "Only A to Z and underscores are allowed.", + "problem_configuration_invalid_value_format_title": "Value does not match the configuration type", + "problem_configuration_not_found_title": "Configuration entry not found", + "problem_control_stats_invalid_range_title": "The from date must not be after the to date", + "problem_control_stats_invalid_time_zone_title": "Unknown time zone", + "problem_control_stats_missing_capability_title": "Control statistics are not available on this server", + "problem_device_not_found_title": "Hub not found", + "problem_device_not_online_title": "Hub is offline", + "problem_device_too_many_hubs_title": "You have reached the maximum number of hubs", + "problem_device_too_many_shockers_title": "This hub has reached its maximum number of shockers", + "problem_endpoint_retired_title": "This feature is no longer available", + "problem_expression_error_title": "Invalid filter expression", + "problem_internal_server_error_title": "Something went wrong on our end", + "problem_login_invalid_credentials_title": "Invalid username or password", + "problem_login_invalid_domain_title": "Logging in from this address is not allowed", + "problem_o_auth_connection_already_exists_title": "Your account is already connected to this provider", + "problem_o_auth_connection_already_linked_title": "This external account is already linked to another user", + "problem_o_auth_flow_anonymous_only_title": "You are already signed in", + "problem_o_auth_flow_mismatch_title": "Sign-in attempt does not match", + "problem_o_auth_flow_mismatch_desc": "Please start over.", + "problem_o_auth_flow_missing_data_title": "The provider did not return your account details", + "problem_o_auth_flow_missing_data_desc": "Please try again.", + "problem_o_auth_flow_not_found_title": "Sign-in attempt expired", + "problem_o_auth_flow_not_found_desc": "Please start over.", + "problem_o_auth_flow_unsupported_title": "Unsupported sign-in flow", + "problem_o_auth_internal_error_title": "Something went wrong during sign-in", + "problem_o_auth_internal_error_desc": "Please try again in a moment.", + "problem_o_auth_link_authenticated_user_only_title": "You must be signed in to link an external account", + "problem_o_auth_provider_mismatch_title": "Sign-in attempt does not match the provider", + "problem_o_auth_provider_mismatch_desc": "Please start over.", + "problem_o_auth_provider_unsupported_title": "This sign-in provider is not supported", + "problem_pair_code_not_found_title": "Pair code not found", + "problem_password_reset_not_found_title": "Password reset link is invalid", + "problem_password_reset_not_found_desc": "The link may have expired or already been used.", + "problem_session_not_found_title": "Session not found", + "problem_share_get_no_shares_title": "You have no shares with this user", + "problem_share_request_create_cannot_share_with_self_title": "You cannot share with yourself", + "problem_share_request_create_shocker_not_found_title": "One or more shockers were not found", + "problem_share_request_create_shocker_not_found_desc": "They may have been removed or do not belong to you.", + "problem_share_request_not_found_title": "Share invite not found", + "problem_share_user_not_found_title": "Share not found", + "problem_share_code_already_linked_title": "Shocker is already linked to your account", + "problem_share_code_cant_link_own_share_code_title": "You cannot redeem your own share code", + "problem_share_code_not_found_title": "Share code not found", + "problem_share_link_expiry_date_in_past_title": "Expiry date cannot be in the past", + "problem_share_link_not_found_title": "Public share not found", + "problem_share_link_shocker_already_in_share_link_title": "Shocker is already in this public share", + "problem_share_link_shocker_not_in_share_link_title": "Shocker is not in this public share", + "problem_shocker_control_no_permission_title": "You do not have permission to control this shocker", + "problem_shocker_control_not_found_title": "Shocker not found", + "problem_shocker_control_paused_title": "Shocker is paused", + "problem_shocker_not_found_title": "Shocker not found", + "problem_signup_registration_disabled_title": "Registration is currently disabled", + "problem_signup_username_or_email_exists_title": "That username or email is already in use", + "problem_turnstile_invalid_title": "Verification failed", + "problem_turnstile_invalid_desc": "Please complete the challenge again and retry.", + "problem_user_not_found_title": "User not found", + "problem_user_privileged_delete_denied_title": "Privileged users cannot be deleted", + "problem_validation_error_title": "Some fields are invalid", + "problem_webhook_not_found_title": "Webhook not found", + "problem_webhook_unsupported_title": "Only Discord webhooks are supported", + "problem_webhook_unsupported_desc": "Use a discord.com URL, not canary or ptb.", + + "error_too_many_requests": "Too many requests", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Try again in {seconds} second.", + "secondsPlural=other": "Try again in {seconds} seconds." + } + } + ], + "error_unexpected_response": "Unexpected server response", + "error_internal": "Internal error occurred", + "error_network": "Network error occurred", + + "dev_banner": "This is the OpenShock {#b}DEVELOPMENT{/b} environment. {#u}No data is saved{/u}, and it is regularly overwritten by production data.", + "firmware_channel_bugs_warning": "This channel might contain bugs." +} diff --git a/messages/es.json b/messages/es.json new file mode 100644 index 00000000..55b90656 --- /dev/null +++ b/messages/es.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "La plataforma de referencia para controlar shockers a distancia de forma segura, fiable y con una latencia realmente baja.", + "landing_section_label": "Inicio", + "landing_hubs_online": "Shockers conectados ahora: ", + "landing_learn_more": "Más información", + "landing_wiki": "Wiki", + "landing_meta_description": "Te damos la bienvenida a OpenShock, un ecosistema libre y de código abierto para controlar distintos shockers a través de internet.", + "instance_meta_description": "Te damos la bienvenida a {siteName}, una instancia independiente de OpenShock, un ecosistema libre y de código abierto para controlar distintos shockers a través de internet.", + "header_sidebar_toggle": "Mostrar u ocultar la barra lateral", + "header_avatar_alt": "Avatar de {name}", + "header_menu_profile": "Perfil", + "header_menu_settings": "Ajustes", + "header_menu_logout": "Cerrar sesión", + "header_login": "Iniciar sesión", + "header_signup": "Registrarse", + "header_github_title": "OpenShock en GitHub", + "header_discord_title": "Discord de la comunidad", + + "footer_made_with": "Hecho con {#heart/} por el {#team}equipo de OpenShock{/team}", + "footer_connection_status_label": "Estado de la conexión con el servidor", + "footer_signalr_state": "Estado de SignalR", + "footer_frontend_version": "Versión del frontend", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Versión del backend", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Idioma", + + "sidebar_home_link_label": "Página de inicio de OpenShock", + "sidebar_group_general": "General", + "sidebar_home": "Inicio", + "sidebar_shockers": "Shockers", + "sidebar_shared_shockers": "Shockers compartidos", + "sidebar_hubs": "Hubs", + "sidebar_user_shares": "Comparticiones con usuarios", + "sidebar_public_shares": "Comparticiones públicas", + "sidebar_serial_terminal": "Terminal serie", + "sidebar_group_admin": "Administración", + "sidebar_admin_monitoring": "Monitorización", + "sidebar_admin_online_hubs": "Hubs en línea", + "sidebar_admin_online_gateways": "Gateways en línea", + "sidebar_admin_management": "Gestión", + "sidebar_admin_users": "Usuarios", + "sidebar_admin_blacklists": "Listas de bloqueo", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "Correo", + "sidebar_admin_automation_tokens": "Tokens de automatización", + "sidebar_admin_configuration": "Configuración", + "sidebar_group_settings": "Ajustes", + "sidebar_settings_api_tokens": "Tokens de API", + "sidebar_settings_sessions": "Sesiones", + "sidebar_settings_audit_log": "Registro de actividad", + "sidebar_settings_connections": "Conexiones", + "sidebar_settings_account": "Ajustes de la cuenta", + + "error_meta_title": "Servicio no disponible", + "error_meta_description": "OpenShock no está disponible en este momento", + "error_meta_logo_alt": "Logotipo de OpenShock", + "error_fallback_message": "Algo ha salido mal.", + "error_not_found_message": "Página no encontrada", + "error_not_found_description": "La página que buscas no existe.", + "error_unexpected_description": "Se ha producido un error inesperado.", + "error_go_back": "Volver", + + "auth_layout_logo_alt": "Logotipo de OpenShock", + "auth_layout_invalid_redirect_removed": "Se ha eliminado una URL de redirección no válida por tu seguridad.", + + "auth_activate_breadcrumb": "Activar cuenta", + "auth_activate_title": "Activar cuenta", + "auth_activate_activating": "Activando tu cuenta...", + "auth_activate_success": "Tu cuenta se ha activado", + "auth_activate_failed": "Este enlace de activación no es válido o ha caducado", + "auth_activate_missing_token": "Falta el token de activación", + "auth_activate_continue": "Continuar al inicio de sesión", + "auth_activate_toast_success": "Cuenta activada", + + "auth_forgot_breadcrumb": "Contraseña olvidada", + "auth_forgot_title": "Contraseña olvidada", + "auth_forgot_description": "Introduce tu correo electrónico para restablecer tu contraseña", + "auth_forgot_email_label": "Correo electrónico", + "auth_forgot_email_placeholder": "Correo electrónico", + "auth_forgot_submit": "Restablecer contraseña", + "auth_forgot_signin_prompt": "¿Recuerdas tu contraseña? {#signin}Inicia sesión{/signin}", + "auth_forgot_mail_disabled": "No es posible restablecer contraseñas en esta instancia porque no tiene ningún proveedor de correo configurado. Ponte en contacto con tu administrador para recuperar el acceso a tu cuenta.", + "auth_forgot_toast_sent": "Se ha enviado la solicitud de restablecimiento de contraseña al correo indicado", + + "auth_login_breadcrumb": "Iniciar sesión", + "auth_login_title": "Hola de nuevo", + "auth_login_loading_methods": "Cargando los métodos de inicio de sesión disponibles", + "auth_login_choose_method": "Inicia sesión con uno de estos métodos", + "auth_login_with_account": "Inicia sesión con tu cuenta de OpenShock", + "auth_login_activation_after_signup": "Tu cuenta se ha creado. Te hemos enviado un enlace de activación a tu correo electrónico. Revisa tu bandeja de entrada y la carpeta de spam.", + "auth_login_activation_pending": "Tu cuenta aún no está activada. Te hemos enviado un enlace de activación a tu correo electrónico. Revisa tu bandeja de entrada y la carpeta de spam. Si no te llega nada, vuelve a iniciar sesión más tarde para recibir un enlace nuevo.", + "auth_login_oauth_only": "Esta cuenta no tiene contraseña. Inicia sesión con el proveedor con el que te registraste.", + "auth_login_oauth_only_with_buttons": "Esta cuenta no tiene contraseña. Inicia sesión con el proveedor con el que te registraste usando los botones de arriba.", + "auth_login_or_continue_with": "O continúa con", + "auth_login_username_label": "Nombre de usuario o correo electrónico", + "auth_login_password_label": "Contraseña", + "auth_login_submit": "Iniciar sesión", + "auth_login_signup_prompt": "¿No tienes cuenta? {#signup}Regístrate{/signup}", + "auth_login_legal": "Al hacer clic en «Iniciar sesión», aceptas nuestros {#tos}Términos del servicio{/tos} y nuestra {#privacy}Política de privacidad{/privacy}.", + + "auth_oauth_create_breadcrumb": "Registrarse con {provider}", + "auth_oauth_create_title": "Registrarse con {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Completa los datos de tu cuenta", + "auth_oauth_create_username_label": "Nombre de usuario", + "auth_oauth_create_username_placeholder": "Nombre de usuario", + "auth_oauth_create_email_label": "Correo electrónico", + "auth_oauth_create_email_placeholder": "Correo electrónico", + "auth_oauth_create_submit": "Registrarse", + "auth_oauth_create_legal": "Al hacer clic en «Registrarse», aceptas nuestros {#tos}Términos del servicio{/tos} y nuestra {#privacy}Política de privacidad{/privacy}.", + + "auth_oauth_error_breadcrumb": "Error de autenticación", + "auth_oauth_error_title": "Error de autenticación", + "auth_oauth_error_back": "Volver al inicio de sesión", + + "auth_reset_breadcrumb": "Restablecer contraseña", + "auth_reset_title": "Restablecer contraseña", + "auth_reset_checking": "Comprobando el enlace de restablecimiento...", + "auth_reset_choose_password": "Elige una contraseña nueva para tu cuenta", + "auth_reset_invalid": "Este enlace de restablecimiento no es válido o ha caducado", + "auth_reset_password_label": "Contraseña nueva", + "auth_reset_password_placeholder": "Contraseña nueva", + "auth_reset_confirm_label": "Confirmar contraseña nueva", + "auth_reset_confirm_placeholder": "Confirmar contraseña nueva", + "auth_reset_submit": "Restablecer contraseña", + "auth_reset_request_new": "Solicitar un enlace nuevo", + "auth_reset_toast_success": "Se ha restablecido la contraseña", + + "auth_signup_breadcrumb": "Registrarse", + "auth_signup_toast_created_mail": "Cuenta creada correctamente. Revisa tu correo electrónico para verificar tu cuenta.", + "auth_signup_toast_created_no_mail": "Cuenta creada correctamente. Ya puedes iniciar sesión.", + "auth_signup_dialog_title": "¡Te damos la bienvenida! ¡Gracias por registrarte! ❤️", + "auth_signup_dialog_created_mail": "Tu cuenta se ha creado. 🎉 Revisa tu correo electrónico para verificar tu cuenta.", + "auth_signup_dialog_verify_then_login": "Cuando hayas verificado tu correo electrónico, podrás iniciar sesión en tu cuenta.", + "auth_signup_dialog_created_no_mail": "Tu cuenta se ha creado y ya está lista para usarse. 🎉", + "auth_signup_dialog_login_now": "Ya puedes iniciar sesión en tu cuenta.", + "auth_signup_title": "Crea tu cuenta", + "auth_signup_loading_methods": "Cargando los métodos de registro disponibles", + "auth_signup_using_email": "Registro con correo electrónico", + "auth_signup_choose_method": "Elige cómo quieres registrarte", + "auth_signup_back": "Atrás", + "auth_signup_username_label": "Nombre de usuario", + "auth_signup_username_placeholder": "Juan OpenShock", + "auth_signup_email_label": "Correo electrónico", + "auth_signup_email_placeholder": "juan@example.com", + "auth_signup_password_label": "Contraseña", + "auth_signup_password_placeholder": "Contraseña", + "auth_signup_confirm_label": "Confirmar contraseña", + "auth_signup_confirm_placeholder": "Confirmar contraseña", + "auth_signup_submit": "Crear cuenta", + "auth_signup_signin_prompt": "¿Ya tienes cuenta? {#signin}Inicia sesión{/signin}", + "auth_signup_or": "O", + "auth_signup_with_email": "Registrarse con correo electrónico", + "auth_signup_legal": "Al hacer clic en «Crear cuenta», aceptas nuestros {#tos}Términos del servicio{/tos} y nuestra {#privacy}Política de privacidad{/privacy}.", + + "auth_verify_breadcrumb": "Verificar correo electrónico", + "auth_verify_title": "Verificar correo electrónico", + "auth_verify_verifying": "Verificando tu correo electrónico...", + "auth_verify_success": "Tu correo electrónico se ha verificado", + "auth_verify_failed": "Este enlace de verificación no es válido o ha caducado", + "auth_verify_missing_token": "Falta el token de verificación", + "auth_verify_continue": "Continuar al inicio de sesión", + "auth_verify_toast_success": "Correo electrónico verificado", + + "common_cancel": "Cancelar", + "common_delete": "Eliminar", + "common_edit": "Editar", + "common_share": "Compartir", + "common_copy_id": "Copiar ID", + "common_id_copied": "ID copiado al portapapeles", + "common_open_menu": "Abrir menú", + "common_refresh": "Actualizar", + "common_settings": "Ajustes", + "common_clear": "Borrar", + "common_online": "En línea", + "common_offline": "Sin conexión", + "common_paused": "En pausa", + "common_resume": "Reanudar", + "common_resuming": "Reanudando...", + "common_coming_soon": "(Próximamente)", + "common_save_changes": "Guardar cambios", + "common_danger_zone": "Zona de peligro", + "common_name": "Nombre", + "control_intensity": "Intensidad", + "control_duration": "Duración", + "control_max_intensity": "Intensidad máx.", + "control_max_duration": "Duración máx.", + "control_vibration": "Vibración", + "control_value": "Valor", + "control_live_intensity": "Intensidad en directo", + "control_type_stop": "Detener", + "control_type_shock": "Descarga", + "control_type_vibrate": "Vibrar", + "control_type_sound": "Sonido", + "live_tooltip_active": "En directo vía {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Conectando...", + "live_tooltip_connect": "Conectar al control en directo", + "live_tooltip_hub_start": "Ctrl+clic para iniciar todo el hub", + "live_tooltip_hub_stop": "Ctrl+clic para detener todo el hub", + "pause_resume_shocker": "Reanudar shocker", + "pause_pause_shocker": "Pausar shocker", + "pause_resume_all": "Reanudar todos los shockers", + "pause_pause_all": "Pausar todos los shockers", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Seleccionar hub", + "shocker_rf_id": "ID de RF", + "shocker_rf_id_invalid": "El ID de RF debe ser un número entero entre {min} y {max}.", + "shocker_model": "Modelo", + "shocker_select_model": "Seleccionar modelo", + "shocker_name_placeholder": "Nombre del shocker", + "shocker_menu_view_logs": "Ver registros", + "shocker_delete_title": "Eliminar shocker", + "shocker_delete_desc": "¿Seguro que quieres eliminar «{name}»? Esta acción no se puede deshacer.", + "shocker_toast_deleted": "Shocker «{name}» eliminado", + "shocker_toast_paused": "Shocker en pausa", + "shocker_toast_resumed": "Shocker reanudado", + "shocker_add_desc": "Registra un nuevo shocker en uno de tus hubs.", + "shocker_add_name_placeholder": "Mi shocker", + "shockers_title": "Shockers", + "shockers_subtitle": "Todos los shockers vinculados a tus hubs.", + "shockers_loading": "Cargando shockers...", + "shockers_toast_refreshed": "Shockers actualizados", + "shockers_toast_need_hub": "Necesitas crear un hub antes de añadir shockers.", + "shockers_toast_added": "Shocker añadido", + "shockers_unknown_module": "Tipo de módulo desconocido", + "shockers_add": "Añadir shocker", + "shockers_view_mode": "Modo de vista", + "shockers_mode_classic": "Clásico", + "shockers_mode_rich": "Completo", + "shockers_mode_simple": "Sencillo", + "shockers_mode_map": "Mapa", + "shockers_group_by_hub": "Agrupar por hub", + "shockers_global_limits": "Límites globales", + "shockers_logs_label": "Registros", + "shockers_empty_title": "Aún no hay shockers", + "shockers_empty_no_hubs": "Primero crea un hub y luego añade shockers.", + "shockers_empty_has_hubs": "Añade un shocker a uno de tus hubs para empezar.", + "shockers_create_hub": "Crear un hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockers" } + } + ], + "shared_shockers_title": "Shockers compartidos", + "shared_shockers_subtitle": "Shockers que otros usuarios han compartido contigo.", + "shared_shockers_empty_title": "Todavía nadie ha compartido shockers contigo.", + "shared_shockers_empty_desc": "Cuando alguien comparta sus shockers contigo, aparecerán aquí.", + "shocker_logs_title": "Registros de shockers", + "shocker_logs_subtitle": "Todos los comandos de control enviados a tus shockers.", + "shocker_logs_live_title": "Los nuevos registros aparecen en tiempo real", + "shocker_logs_paused_title": "Las actualizaciones en directo se pausan al ordenar o al ver una página distinta de la primera", + "shocker_logs_live": "En directo", + "shocker_logs_col_time": "Hora", + "shocker_logs_col_type": "Tipo", + "shocker_logs_col_by": "Por", + "shocker_logs_filter_label": "Filtrar por shocker", + "shocker_logs_filter_placeholder": "Buscar shockers...", + "shocker_logs_filter_all": "Todos los shockers", + "shocker_logs_filter_none": "No hay shockers que coincidan", + "shocker_edit_title": "Editar shocker", + "shocker_edit_subtitle": "Cambia los detalles de este shocker o elimínalo.", + "shocker_edit_back": "Volver a los shockers", + "shocker_edit_load_failed": "No se pudo cargar el shocker.", + "shocker_edit_loading": "Cargando shocker...", + "shocker_edit_details_title": "Detalles del shocker", + "shocker_edit_details_desc": "Actualiza el nombre, el ID de RF y el modelo de este shocker.", + "shocker_edit_pause_state": "Estado de pausa", + "shocker_edit_is_paused": "El shocker está en pausa", + "shocker_edit_is_active": "El shocker está activo", + "shocker_edit_toast_updated": "Shocker actualizado", + "shocker_edit_delete_desc": "Elimina este shocker de forma permanente. Esta acción no se puede deshacer.", + + "common_close": "Cerrar", + "common_continue": "Continuar", + "common_loading": "Cargando...", + "common_previous": "Anterior", + "common_next": "Siguiente", + "common_steps": "Pasos", + "common_step_label": "Paso {number}: {title}", + "common_copy": "Copiar", + "common_copied": "Copiado", + "common_never": "Nunca", + "common_error": "Error: {message}", + "terminal_title": "Terminal serie", + "terminal_connecting": "Conectando...", + "terminal_help_button": "¿Tienes problemas? Ayuda", + "terminal_back_to_modes": "Volver a la selección de modo", + "terminal_mode_configure": "Configurar dispositivo", + "terminal_mode_configure_desc": "Configura el WiFi, la autenticación y más. Incluye una consola serie interactiva.", + "terminal_mode_flash": "Flashear firmware", + "terminal_mode_flash_desc": "Instala o actualiza el firmware de un dispositivo conectado.", + "terminal_mode_raw": "Monitor serie", + "terminal_mode_raw_desc": "Solo la consola. Lee los registros del dispositivo y envía comandos.", + "terminal_step_channel": "Seleccionar canal", + "terminal_step_board": "Seleccionar placa", + "terminal_go_to_step": "Ir al paso {number}: {title}", + "terminal_erase": "Borrar antes de flashear", + "terminal_erase_desc": "Borra todos los datos del dispositivo, incluidas las configuraciones existentes", + "terminal_unsupported": "Tu navegador no admite esta función.", + "terminal_update_browser": "Actualiza tu navegador a la última versión.", + "terminal_use_browsers": "Usa uno de los siguientes navegadores:", + "terminal_connect_failed_bootloader": "No se pudo entrar en modo bootloader", + "terminal_connect_failed": "Error al conectar con el dispositivo", + "terminal_connect_failed_desc": "No pudimos establecer una conexión serie con el dispositivo.", + "terminal_quick_tries": "Prueba esto:", + "terminal_try_replug": "Desconecta y vuelve a conectar el dispositivo.", + "terminal_try_cable": "Prueba con otro cable o puerto USB.", + "terminal_try_driver": "Asegúrate de que el controlador serie esté instalado.", + "terminal_open_troubleshooter": "Abrir el solucionador de problemas", + "terminal_log_reset_no_device": "Error del host durante el reinicio: ¡no hay dispositivo!", + "terminal_log_reset_error": "Error del host durante el reinicio: {error}", + "terminal_log_send_no_device": "No se pudo enviar: ¡no hay dispositivo!", + "terminal_log_send_error": "No se pudo enviar: {error}", + "terminal_log_firmware_disconnected": "Firmware desconectado: {error}", + "terminal_log_erase_failed": "No se pudo borrar la flash: {error}", + "terminal_log_hard_reset_failed": "Error al reiniciar por hardware: {error}", + "terminal_log_flash_complete": "Flasheo completado", + "terminal_log_flash_failed": "Error al flashear: {error}", + "terminal_log_command_failed": "No se pudo escribir el comando: {error}", + "terminal_help_title": "Solucionador de problemas", + "terminal_help_desc": "Sigue estos pasos en orden. Cada uno descarta una causa habitual.", + "terminal_help_step_cable": "Cable USB", + "terminal_help_step_port": "Puerto USB", + "terminal_help_step_driver": "Instalar controlador", + "terminal_help_step_manual": "Actualización manual del controlador", + "terminal_help_step_discord": "Pregunta en Discord", + "terminal_help_cable_body": "Muchos cables USB-C y micro-USB solo sirven para cargar y no transmiten datos. Usa un cable de datos que sepas que funciona (uno con el que hayas transferido archivos o conectado otros dispositivos) y vuelve a conectar el hub.", + "terminal_help_port_body": "Conecta el dispositivo directamente a un puerto USB del ordenador. Evita, si puedes, los hubs USB, las bases de conexión y los puertos frontales; suelen causar problemas de alimentación y de señal. Si usas un ordenador de sobremesa, prueba un puerto de la parte trasera.", + "terminal_help_driver_download": "Descarga el controlador CP210x:", + "terminal_help_driver_extract": "Extrae el contenido del archivo zip en una carpeta de tu ordenador.", + "terminal_help_driver_run": "Abre la carpeta y ejecuta {#code}{installer}{/code}. Sigue las instrucciones para instalarlo.", + "terminal_help_driver_reconnect": "Vuelve a conectar el dispositivo.", + "terminal_help_manual_intro": "Si el instalador del controlador se ejecutó pero el dispositivo sigue sin aparecer:", + "terminal_help_manual_open": "Abre el Administrador de dispositivos (pulsa {#key}Win{/key} + {#key}X{/key} y selecciona {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "En {#code}Ports (COM & LPT){/code}, busca una entrada como:", + "terminal_help_manual_missing": "Si no aparece, Windows no detecta el dispositivo; repasa los pasos del cable y del puerto.", + "terminal_help_manual_update": "Haz clic derecho en el dispositivo y elige {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Elige {#code}Browse my computer for drivers{/code} y selecciona la carpeta donde extrajiste el zip del controlador. Asegúrate de que {#code}Include subfolders{/code} esté marcado.", + "terminal_help_manual_success": "Si todo va bien, la entrada debería mostrar {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "¿Sigues sin solución? Entra en nuestro servidor de Discord y pregunta en el canal {#code}{channel}{/code}. Incluye:", + "terminal_help_discord_os": "tu sistema operativo y navegador", + "terminal_help_discord_device": "el dispositivo que usas (modelo de placa, dónde lo conseguiste)", + "terminal_help_discord_tried": "lo que ya has probado de los pasos anteriores", + "terminal_help_discord_errors": "cualquier mensaje de error o salida relevante del terminal", + "terminal_help_discord_join": "Únete a nuestro servidor de Discord", + "terminal_risk_title": "⚠️ FIRMWARE INESTABLE", + "terminal_risk_intro": "Estás a punto de flashear {#strong}firmware experimental{/strong} que se sabe que es {#strong}inestable{/strong}.", + "terminal_risk_brick": "Esto puede inutilizar tu dispositivo de forma permanente o requerir una recuperación manual.", + "terminal_risk_no_support": "NO daremos soporte para problemas causados por este firmware.", + "terminal_risk_acknowledge": "Entiendo que es completamente mi responsabilidad", + "terminal_risk_abort": "Cancelar", + "terminal_risk_accept": "ACEPTO TODA LA RESPONSABILIDAD", + "firmware_channel_recommended": "Este es el canal recomendado.", + "firmware_channel_danger": "NO LO USES SALVO QUE SEPAS LO QUE HACES", + "firmware_channel_stable": "Estable", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Desarrollo", + "terminal_board_select": "Selecciona una placa...", + "terminal_board_search": "Buscar placas...", + "terminal_board_none": "No se encontró ninguna placa.", + "terminal_flash_button": "Flashear", + "terminal_flash_progress": "Progreso: {status}", + "terminal_flash_idle": "En espera", + "terminal_flash_no_device": "No hay ningún dispositivo seleccionado.", + "terminal_flash_resetting": "Reiniciando...", + "terminal_flash_downloading": "Descargando firmware...", + "terminal_flash_download_failed": "No se pudo descargar el firmware.", + "terminal_flash_flashing": "Flasheando firmware...", + "terminal_flash_rebooting": "Reiniciando el dispositivo... (Si se queda atascado, desconecta y vuelve a conectar la alimentación)", + "terminal_flash_done": "¡Dispositivo reiniciado! Flasheo completado.", + "terminal_port_select": "Seleccionar dispositivo", + "terminal_port_disconnect": "Desconectar dispositivo", + "terminal_port_connected": "Dispositivo conectado: {#strong}{id}{/strong}", + "terminal_console": "Consola", + "terminal_connected_device": "Dispositivo conectado", + "terminal_resize": "Cambiar el tamaño del panel del terminal", + "terminal_reboot": "Reiniciar", + "terminal_disconnect": "Desconectar", + "terminal_fullscreen_exit_esc": "Salir de pantalla completa (Esc)", + "terminal_fullscreen_exit": "Salir de pantalla completa", + "terminal_fullscreen_fill": "Llenar la ventana", + "terminal_command_label": "Comando serie", + "terminal_command_placeholder": "Escribe un comando...", + "terminal_command_send": "Enviar comando", + "terminal_colors": "Colores", + "terminal_colors_menu": "Colores...", + "terminal_colors_label": "Colores de la consola", + "terminal_colors_close": "Cerrar colores", + "terminal_color_input": "Color de {name}", + "terminal_colors_reset": "Restablecer valores predeterminados", + "terminal_color_bg": "Fondo", + "terminal_color_fg": "Texto", + "terminal_color_ts": "Marca de tiempo", + "terminal_color_error": "Error", + "terminal_color_warning": "Advertencia", + "terminal_color_info": "Info", + "terminal_color_debug": "Depuración", + "terminal_color_verbose": "Detallado", + "terminal_options": "Opciones", + "terminal_options_label": "Opciones de la consola", + "terminal_hide_system": "Ocultar mensajes del sistema", + "terminal_stick_bottom": "Mantener al final", + "terminal_raw_output": "Salida sin procesar", + "terminal_timestamps": "Marcas de tiempo", + "terminal_timestamp_uptime": "Tiempo activo", + "terminal_timestamp_local": "Local", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Desactivado", + "terminal_copy_settings": "Copiar ajustes", + "terminal_import_settings": "Importar ajustes", + "terminal_copy_selection": "Copiar selección", + "terminal_copy_all": "Copiar toda la salida", + "terminal_toast_selection_copied": "Selección copiada", + "terminal_toast_output_copied": "Salida de la consola copiada", + "terminal_toast_settings_copied": "Ajustes de la consola copiados", + "terminal_toast_clipboard_unreadable": "No se pudo leer el portapapeles", + "terminal_toast_settings_imported": "Ajustes de la consola importados", + "terminal_toast_settings_invalid": "El portapapeles no contiene ajustes de la consola", + + "common_try_again": "Reintentar", + "terminal_cfg_intro": "Los valores se envían al dispositivo por UART. La respuesta del dispositivo aparece en la consola de abajo. Los comandos sin argumento leen el valor; usa el botón {#eye/} junto a cada campo para leer el valor actual.", + "terminal_cfg_rf_title": "Transmisor RF", + "terminal_cfg_rf_desc": "Controla la salida RF hacia los shockers.", + "terminal_cfg_tx_pin": "Pin GPIO de TX", + "terminal_cfg_example": "p. ej. {value}", + "terminal_cfg_read_value": "Leer el valor actual", + "terminal_cfg_set": "Establecer", + "terminal_cfg_read": "Leer", + "terminal_cfg_reading": "Leyendo…", + "terminal_cfg_apply": "Aplicar", + "terminal_cfg_keepalive": "Keepalive activado", + "terminal_cfg_keepalive_desc": "Envía pings periódicos a los shockers vinculados para mantenerlos activos.", + "terminal_cfg_estop_title": "Parada de emergencia", + "terminal_cfg_estop_desc": "Botón físico que detiene toda la salida.", + "terminal_cfg_estop_enabled": "Parada de emergencia activada", + "terminal_cfg_estop_pin": "Pin GPIO de parada de emergencia", + "terminal_cfg_estop_note": "Nota: {#code}{latching}{/code} y {#code}{active}{/code} no tienen comandos propios; configúralos con la configuración JSON de abajo.", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Credenciales de red y nombre de host del dispositivo.", + "terminal_cfg_hostname": "Nombre de host", + "terminal_cfg_networks": "Redes (array JSON)", + "terminal_cfg_invalid_json_array": "Debe ser un array JSON válido", + "terminal_cfg_ap_note": "Los ajustes de AP ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) no tienen comandos propios; usa la configuración JSON.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "Servidor de OpenShock y autenticación.", + "terminal_cfg_domain": "Dominio", + "terminal_cfg_domain_restart": "Establecer el dominio reiniciará el dispositivo.", + "terminal_cfg_auth_token": "Token de autenticación", + "terminal_cfg_auth_token_placeholder": "Pega el token del dispositivo", + "terminal_cfg_hide": "Ocultar", + "terminal_cfg_show": "Mostrar", + "terminal_cfg_serial_title": "Entrada serie", + "terminal_cfg_echo": "Eco activado", + "terminal_cfg_echo_desc": "Muestra en la consola los caracteres escritos.", + "terminal_cfg_advanced_title": "Avanzado: configuración completa", + "terminal_cfg_advanced_desc": "Para los campos sin comandos propios (portal cautivo, OTA, LAN, etc.), reemplaza toda la configuración.", + "terminal_cfg_json_config": "Configuración JSON", + "terminal_cfg_invalid_json": "Debe ser JSON válido", + "terminal_cfg_read_json": "Leer la configuración actual como JSON", + "terminal_cfg_json_restart": "Aplicar una configuración JSON reiniciará el dispositivo.", + "terminal_cfg_raw_config": "Configuración FlatBuffer sin procesar (base64)", + "terminal_cfg_invalid_base64": "Debe ser una cadena base64 válida", + "terminal_cfg_read_raw": "Leer la configuración actual como base64", + "terminal_cfg_factory_reset": "Restablecer valores de fábrica", + "terminal_cfg_factory_reset_desc": "Borra toda la configuración del dispositivo.", + "terminal_cfg_factory_reset_title": "¿Restablecer el dispositivo a los valores de fábrica?", + "terminal_cfg_factory_reset_action": "Borrar configuración", + "terminal_cfg_factory_reset_confirm": "Esto borrará toda la configuración del dispositivo: redes WiFi, credenciales del backend, pines y todos los demás ajustes. El dispositivo volverá a los valores predeterminados.", + "terminal_cfg_read_failed_json_title": "No se pudo leer la configuración JSON", + "terminal_cfg_read_failed_raw_title": "No se pudo leer la configuración sin procesar", + "terminal_cfg_read_failed_desc": "El dispositivo no respondió tras {attempts} intentos.", + "terminal_cfg_common_causes": "Causas habituales:", + "terminal_cfg_cause_busy": "El dispositivo está ocupado con otro comando.", + "terminal_cfg_cause_disconnected": "El dispositivo se desconectó o se reinició.", + "terminal_cfg_cause_unsupported": "La versión del firmware no admite este comando.", + + "common_status": "Estado", + "common_version": "Versión", + "common_created": "Creado", + "common_create": "Crear", + "common_done": "Listo", + "common_enable": "Activar", + "common_disable": "Desactivar", + "common_are_you_sure": "¿Estás seguro?", + "common_generating": "Generando...", + "hubs_title": "Hubs", + "hubs_subtitle": "Todos los hubs registrados en tu cuenta.", + "hubs_add": "Añadir hub", + "hubs_load_failed": "No se pudieron cargar los hubs.", + "hubs_empty_title": "Aún no hay hubs", + "hubs_empty_desc": "Un hub es el dispositivo que transmite los comandos a tus shockers. Añade uno para empezar.", + "hubs_create_title": "Crear hub", + "hubs_name_label": "Nombre del hub", + "hubs_name_placeholder": "Mi hub", + "hub_toast_not_connected": "No conectado al servidor", + "hub_toast_try_later": "Inténtalo de nuevo en un momento.", + "hub_reboot_title": "¿Reiniciar {name}?", + "hub_reboot_desc": "El hub se desconectará y se reiniciará. Los shockers vinculados dejarán de responder hasta que vuelva a estar en línea.", + "hub_reboot": "Reiniciar", + "hub_hotspot_enable_title": "¿Activar el punto de acceso Wi-Fi en {name}?", + "hub_hotspot_disable_title": "¿Desactivar el punto de acceso Wi-Fi en {name}?", + "hub_hotspot_enable_desc": "El hub emite su propia red de configuración. Sigue accesible en tu Wi-Fi, pero el punto de acceso queda abierto a cualquiera que esté cerca hasta que lo desactives.", + "hub_hotspot_disable_desc": "El punto de acceso de configuración se apagará. Si el hub aún no está en tu Wi-Fi, necesitarás acceso físico para volver a configurarlo.", + "hub_delete_desc": "Estás a punto de eliminar el hub {#strong}{name}{/strong}.", + "hub_delete_shockers": "También se eliminarán los siguientes shockers:", + "hub_edit_title": "Editar hub", + "hub_edit_apply": "Aplicar", + "hub_pair_title_generate": "¿Generar código de vinculación?", + "hub_pair_title_generated": "Código de vinculación generado", + "hub_pair_title_paired": "Hub vinculado", + "hub_pair_consumed": "{#strong}{name}{/strong} usó este código de vinculación y ya está vinculado.", + "hub_pair_used": "El código ya se usó y ha dejado de ser válido.", + "hub_pair_generated_for": "Código de vinculación generado para {#strong}{name}{/strong}.", + "hub_copy_now": "El código de abajo no estará disponible más adelante. Cópialo ahora y actualiza tus clientes con él.", + "hub_pair_generate_for": "Estás a punto de generar un código de vinculación para {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Será válido durante 15 minutos tras su creación.", + "hub_pair_one_active": "Solo hay un código de vinculación activo por hub; los nuevos sustituyen a los anteriores.", + "hub_pair_complete": "Vinculación completada", + "hub_pair_code_label": "Código de vinculación:", + "hub_pair_copied_close": "Código copiado, cerrar", + "hub_pair_get": "Obtener código", + "hub_token_generated": "Token generado", + "hub_token_generated_for": "Nuevo token generado para {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Estás a punto de regenerar el token de {#strong}{name}{/strong}.", + "hub_token_invalidate": "Esto invalidará el token actual y desconectará a los clientes que lo usen.", + "hub_token_confirm": "¿Seguro que quieres hacerlo?", + "hub_token_label": "Nuevo token:", + "hub_token_copied_close": "Token copiado, cerrar", + "hub_token_regenerate": "Regenerar token", + "hub_menu_update": "Actualizar", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "Activar punto de acceso Wi-Fi", + "hub_menu_hotspot_disable": "Desactivar punto de acceso Wi-Fi", + "hub_menu_pair": "Vincular", + "hub_menu_estop": "Parada de emergencia", + "hub_update_breadcrumb": "Actualizar", + "hub_update_unknown_hub": "Hub desconocido", + "hub_update_unknown_task": "Tarea desconocida", + "hub_update_task_metadata": "Obteniendo metadatos", + "hub_update_task_preparing": "Preparando la actualización", + "hub_update_task_flash_fs": "Flasheando el sistema de archivos", + "hub_update_task_verify_fs": "Verificando el sistema de archivos", + "hub_update_task_flash_app": "Flasheando la aplicación", + "hub_update_task_bootable": "Marcando la aplicación como arrancable", + "hub_update_task_rebooting": "Reiniciando", + "hub_update_status_started": "Iniciado", + "hub_update_status_running": "En curso", + "hub_update_status_finished": "Finalizado", + "hub_update_status_error": "Error", + "hub_update_status_timeout": "Tiempo agotado", + "hub_update_confirm_title": "Confirmar actualización de firmware", + "hub_update_confirm_desc": "¿Actualizar {#strong}{name}{/strong} a la versión {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Puede que esta versión no sea del canal estable y contenga errores.", + "hub_update_title": "Actualizar {name}", + "hub_update_subtitle": "Gestiona las actualizaciones de firmware de este hub.", + "hub_update_status_title": "Estado del hub", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Actualizar", + "hub_update_success": "Actualización completada correctamente", + "hub_update_rolled_back": "El dispositivo volvió a la versión anterior", + "hub_update_back": "Volver a los hubs", + "hub_update_flash_again": "Volver a flashear", + "hub_update_card_title": "Actualización de firmware", + "hub_update_card_desc": "Selecciona un canal y una versión de firmware para instalar.", + "hub_update_to": "Actualizar a {version}", + "hub_update_must_be_online": "El hub debe estar en línea para iniciar una actualización.", + "hub_update_updating_to": "Actualizando a {version}...", + "hub_update_total": "Total", + "hub_update_task": "Tarea", + "hub_update_history": "Historial de actualizaciones", + "hub_update_no_history": "No hay historial de actualizaciones para este hub.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Inicio", + "hub_update_col_message": "Mensaje", + "hub_update_loading": "Cargando información del hub...", + "hub_update_not_found": "No se encontró el hub.", + "home_breadcrumb": "Inicio", + "home_welcome": "Bienvenido de nuevo", + "home_welcome_name": "Bienvenido de nuevo, {name}", + "home_subtitle": "Este es un resumen de tu configuración de OpenShock.", + "home_hubs_online": "{count} en línea", + "home_hub_status": "Estado de los hubs", + "home_no_hubs": "Sin hubs", + "home_all_online": "Todos en línea", + "home_all_offline": "Todos sin conexión", + "home_some_online": "{online}/{total} en línea", + "home_quick_links": "Accesos rápidos", + "home_my_shockers": "Mis shockers", + "home_my_shockers_desc": "Controla tus shockers", + "home_hubs_desc": "Gestiona tus hubs", + "home_shared_desc": "Shockers compartidos contigo", + "home_public_desc": "Gestiona los enlaces para compartir", + "home_get_started": "Empezar", + "home_get_started_desc": "Aún no tienes hubs. Crea un hub para conectar tu primer dispositivo y luego añádele shockers.", + "home_set_up_hub": "Configurar un hub", + "home_first_shocker": "Añade tu primer shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Tienes {count} hub configurado. Añade un shocker para empezar a controlarlo.", + "countPlural=other": "Tienes {count} hubs configurados. Añade un shocker para empezar a controlarlo." + } + } + ], + "home_go_to_shockers": "Ir a los shockers", + "profile_title": "Perfil", + "profile_coming_soon": "El perfil llegará pronto", + "profile_coming_soon_desc": "Tu perfil público aún no está disponible. Los datos de tu cuenta están en Ajustes.", + + "common_retry": "Reintentar", + "common_never_used": "Nunca usado", + "common_expires": "Caduca {time}", + "common_search_placeholder": "Buscar...", + "common_unknown": "Desconocido", + "settings_breadcrumb_account": "Cuenta", + "account_subtitle": "Tus datos de inicio de sesión y acciones de la cuenta.", + "account_change_username": "Cambiar usuario", + "account_change_email": "Cambiar correo", + "account_change_password": "Cambiar contraseña", + "account_username_label": "Nombre de usuario", + "account_email_label": "Correo electrónico", + "account_password_label": "Contraseña", + "account_new_password_label": "Contraseña nueva", + "account_confirm_password_label": "Confirmar contraseña nueva", + "account_oauth_only": "No disponible para cuentas solo con OAuth", + "account_oauth_no_password": "Esta cuenta inicia sesión con OAuth y no tiene contraseña.", + "account_diagnostics": "Diagnóstico", + "account_diagnostics_desc": "Ayúdanos a corregir fallos y llamadas lentas a la API. Los informes incluyen el mensaje de error, la traza de la pila y tu IP. Desactivado por defecto.", + "account_diagnostics_level": "Nivel de diagnóstico", + "account_telemetry_off": "No", + "account_telemetry_off_desc": "No enviar nada.", + "account_telemetry_errors": "Errores", + "account_telemetry_errors_desc": "Enviar solo informes de errores del navegador.", + "account_telemetry_full": "Completo", + "account_telemetry_full_desc": "Informes de errores y trazas de llamadas a la API (sin navegación entre páginas).", + "account_toast_deactivated": "Cuenta desactivada correctamente", + "account_deactivate_title": "Desactivar cuenta", + "account_deactivate_desc": "¿Seguro que quieres desactivar tu cuenta?", + "account_deactivate": "Desactivar cuenta", + "account_email_title": "Cambiar correo", + "account_email_desc": "Introduce tu nuevo correo electrónico y confírmalo con tu contraseña actual.", + "account_email_toast_sent": "Correo de verificación enviado a {email}. Haz clic en el enlace del correo para aplicar el cambio.", + "account_new_email": "Nuevo correo", + "account_current_password": "Contraseña actual", + "account_password_title": "Cambiar contraseña", + "account_password_desc": "Introduce tu contraseña actual y elige una nueva.", + "account_password_toast": "La contraseña se ha cambiado", + "account_username_title": "Cambiar nombre de usuario", + "account_username_desc": "Introduce un nuevo nombre de usuario.", + "account_new_username": "Nuevo nombre de usuario", + "account_username_toast": "Nombre de usuario cambiado correctamente", + "tokens_subtitle": "Los tokens de API sirven para autenticarse en la API de OpenShock.", + "tokens_generate": "Generar token", + "tokens_toast_refreshed": "Tokens actualizados", + "tokens_empty_title": "No hay tokens de API", + "tokens_empty_desc": "Genera un token para autenticarte en la API de OpenShock.", + "tokens_created_on": "Creado el {date}", + "tokens_last_used": "Usado por última vez {time}", + "tokens_never_expires": "No caduca", + "tokens_load_failed": "No se pudieron cargar los tokens de API.", + "token_toast_edited": "Token editado correctamente", + "token_name_required": "El nombre es obligatorio", + "token_name_too_long": "El nombre es demasiado largo", + "token_edit_title": "Editar token de API", + "token_name_label": "Nombre del token", + "token_name_placeholder": "Nombre del token...", + "token_permissions": "Permisos", + "token_perm_category_shockers": "Shockers", + "token_perm_category_devices": "Hubs", + "token_perm_category_usershares": "Comparticiones con usuarios", + "token_perm_category_publicshares": "Comparticiones públicas", + "token_perm_use": "Usar", + "token_perm_edit": "Editar", + "token_perm_pause": "Pausar", + "token_perm_auth": "Autenticar", + "token_shocker_control": "Control de shockers", + "token_toast_paused": "Token en pausa", + "token_toast_resumed": "Token reanudado", + "token_delete_title": "Eliminar token de API", + "token_delete_desc": "¿Seguro que quieres eliminar {#strong}{name}{/strong}?", + "token_delete_permanent": "Esta acción no se puede deshacer. El token se eliminará de forma permanente.", + "token_toast_deleted": "Token eliminado correctamente", + "token_resume": "Reanudar token", + "token_pause": "Pausar token", + "token_mode_clamp_desc": "Clamp: las solicitudes fuera del rango permitido se ajustan al límite más cercano (el mínimo o el máximo).", + "token_mode_lerp_desc": "Lerp: todo el rango de entrada se reescala linealmente para que quepa en tu rango permitido de mínimo a máximo.", + "token_paused_desc": "Un token en pausa no puede enviar mensajes de control a los shockers.", + "token_intensity_range": "Rango de intensidad", + "token_duration_range": "Rango de duración", + "token_new_breadcrumb": "Nuevo", + "token_redirect_not_allowed": "La redirect_uri indicada no está permitida. Solo se admiten direcciones de bucle local o esquemas de aplicación propios.", + "token_params_missing": "Faltan parámetros GET obligatorios. Asegúrate de indicar name, redirect_uri y permissions.", + "token_invalid_permissions": "Permisos no válidos: {list}", + "token_toast_created": "Token creado correctamente", + "token_request_title": "Solicitud de token de API", + "token_access_granted": "Acceso concedido", + "token_shared_redirecting": "El token se ha creado y compartido con la aplicación. Te estamos redirigiendo a {#b}{uri}{/b}.", + "token_not_redirected": "Si no se te redirige automáticamente, usa el botón de abajo.", + "token_finish": "Finalizar", + "token_generated_title": "Token de API generado", + "token_copy_now": "Copia tu token de API ahora, ¡no podrás volver a verlo más tarde!", + "token_new_title": "Nuevo token de API", + "token_external_desc": "Una aplicación externa solicita acceso a tu cuenta. Revisa y ajusta los permisos de abajo antes de permitir el acceso.", + "token_new_desc": "Configura y genera un nuevo token de API para tu cuenta.", + "token_external_requesting": "{#b}{name}{/b} solicita un token de API. Tu token se compartirá con la aplicación en {#b}{uri}{/b}.", + "token_allow": "Permitir", + "token_generate": "Generar", + "token_deny": "Denegar", + "sessions_subtitle": "Todas las sesiones activas de tu cuenta. Revoca las que no reconozcas.", + "sessions_unknown_device": "Dispositivo desconocido", + "sessions_toast_refreshed": "Sesiones actualizadas", + "sessions_load_failed": "No se pudieron cargar las sesiones.", + "sessions_empty_title": "No hay sesiones activas", + "sessions_empty_desc": "Las sesiones aparecen aquí cuando inicias sesión desde un navegador o una aplicación.", + "sessions_last_seen": "Visto por última vez {time}", + "sessions_signed_in": "Sesión iniciada {time}", + "session_toast_revoked": "Sesión revocada correctamente", + "session_revoke_title": "Revocar sesión", + "session_revoke": "Revocar", + "session_revoke_desc": "¿Seguro que quieres revocar esta sesión?", + "session_revoke_from": "Sesión iniciada desde {#strong}{ip}{/strong} con {#strong}{agent}{/strong}", + "connections_title": "Conexiones OAuth", + "connections_subtitle": "Vincula o desvincula cuentas de terceros para iniciar sesión más rápido y mantener tu perfil sincronizado.", + "connections_toast_linked": "Cuenta vinculada.", + "connections_toast_cancelled": "Vinculación cancelada.", + "connections_toast_failed": "La vinculación falló.", + "connections_toast_removed": "Conexión eliminada", + "connections_refreshing": "Actualizando…", + "connections_link_new": "Vincular nuevo proveedor", + "connections_empty_title": "Aún no hay conexiones", + "connections_empty_desc": "Elige «Vincular nuevo proveedor» arriba para conectar los proveedores disponibles.", + "connections_unlink": "Desvincular", + "connections_load_failed": "No se pudieron cargar las conexiones OAuth.", + "connections_unlink_title": "¿Desvincular {name}?", + "connections_unlink_title_generic": "¿Desvincular esta cuenta?", + "connections_unlink_desc": "Ya no podrás iniciar sesión con este proveedor a menos que lo vuelvas a vincular.", + "provider_starting": "Iniciando {name}...", + "provider_link": "Vincular {name}", + "audit_subtitle": "Actividad de seguridad en tu cuenta. Revisa todo lo que no reconozcas.", + "audit_col_time": "Hora", + "audit_col_action": "Acción", + "audit_col_details": "Detalles", + "audit_col_reason": "Motivo", + "audit_col_ip": "Dirección IP", + "audit_col_device": "Dispositivo", + "audit_action_login": "Sesión iniciada", + "audit_action_logout": "Sesión cerrada", + "audit_action_password_changed": "Contraseña cambiada", + "audit_action_email_change_requested": "Cambio de correo solicitado", + "audit_action_email_changed": "Correo cambiado", + "audit_action_username_changed": "Nombre de usuario cambiado", + "audit_action_api_token_created": "Token de API creado", + "audit_action_api_token_deleted": "Token de API eliminado", + "audit_action_oauth_connected": "Conexión añadida", + "audit_action_oauth_disconnected": "Conexión eliminada", + "audit_action_account_deactivated": "Cuenta desactivada", + "audit_action_account_reactivated": "Cuenta reactivada", + "audit_action_account_deleted": "Cuenta eliminada", + "audit_action_automation_token_created": "Token de automatización creado", + "audit_action_automation_token_updated": "Token de automatización actualizado", + "audit_action_automation_token_rotated": "Token de automatización rotado", + "audit_action_automation_token_deleted": "Token de automatización eliminado", + "audit_action_automation_token_used": "Token de automatización usado", + "audit_meta_session": "Sesión {id}", + "audit_meta_changed": "{old} a {new}", + "audit_meta_email_requested": "Cambio solicitado a {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} cuenta eliminada)", + "countPlural=other": "{name} ({count} cuentas eliminadas)" + } + } + ], + "audit_meta_scheduled_deletion": "Programada para eliminación", + "audit_meta_kept": "Conservada para reactivación", + + "common_view": "Ver", + "common_save": "Guardar", + "common_saving": "Guardando...", + "common_back": "Atrás", + "common_shared_by": "Compartido por", + "common_user_avatar": "Avatar del usuario", + "common_toast_saved": "Cambios guardados correctamente", + "pause_reason_shocker": "En pausa a nivel de shocker", + "pause_reason_shocker_user_share": "En pausa a nivel de shocker y de uso compartido", + "pause_reason_shocker_public_share": "En pausa a nivel de shocker y de enlace público", + "pause_reason_user_share": "En pausa a nivel de uso compartido", + "pause_reason_public_share": "En pausa a nivel de enlace público", + "public_shares_subtitle": "Un enlace que cualquiera puede usar, sin necesidad de cuenta.", + "public_shares_new": "Nuevo enlace", + "public_share_never_expires": "No caduca", + "public_shares_empty_title": "Aún no hay enlaces públicos", + "public_shares_empty_desc": "Crea un enlace que cualquiera pueda usar para controlar tus shockers.", + "public_share_expired": "Caducado", + "public_share_no_expiry": "Sin caducidad", + "public_share_label": "Enlace público", + "public_share_toast_created": "Nuevo enlace público creado", + "public_share_create_title": "Crear enlace público", + "public_share_toast_deleted": "Enlace público eliminado", + "public_share_delete_title": "Eliminar enlace público", + "public_share_delete_desc": "¿Seguro que quieres eliminar el enlace público {#strong}{name}{/strong}?", + "public_share_edit_title": "Enlace público: {name}", + "public_share_edit_subtitle": "Edición: los cambios se aplican al guardar.", + "public_share_add_shocker": "Añadir shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Se añadió {count} shocker al enlace", + "countPlural=other": "Se añadieron {count} shockers al enlace" + } + } + ], + "public_share_empty_shockers_title": "No hay shockers en este enlace", + "public_share_empty_shockers_desc": "Añade un shocker y cualquiera con el enlace podrá controlarlo.", + "public_share_load_failed": "Error al obtener los detalles del enlace público", + "public_share_paused_here": "En pausa en este enlace", + "public_share_resume_shocker": "Reanudar shocker", + "public_share_pause_shocker": "Pausar shocker", + "public_share_remove": "Quitar del enlace", + "public_share_toast_removed": "Shocker quitado del enlace", + "public_share_add_title": "Añadir shockers", + "public_share_add_desc": "Añade shockers a este enlace público. Podrás fijar sus límites después.", + "public_share_add_placeholder": "Selecciona shockers para compartir...", + "public_share_add_no_match": "No hay shockers que coincidan", + "public_share_add_submit": "Añadir shockers", + "public_share_view_loading": "Cargando detalles del enlace...", + "public_share_view_title": "Enlace público", + "public_share_view_desc": "Entra como invitado o inicia sesión con tu cuenta de OpenShock", + "public_share_view_guest_name": "Nombre de invitado", + "public_share_view_enter": "Entrar", + "public_share_view_enter_guest": "Entrar como invitado", + "public_share_login": "Iniciar sesión", + "perm_shock_on": "Descarga activada", + "perm_shock_off": "Descarga desactivada", + "perm_vibrate_on": "Vibración activada", + "perm_vibrate_off": "Vibración desactivada", + "perm_sound_on": "Sonido activado", + "perm_sound_off": "Sonido desactivado", + "perm_live_on": "Live activado", + "perm_live_off": "Live desactivado", + "perm_live_control": "Control en vivo", + "user_selector_avatar_of": "Avatar de {name}", + "user_selector_placeholder": "Introduce el nombre de usuario", + "user_selector_aria": "Nombre de usuario a buscar", + "user_selector_search": "Buscar usuario", + "user_selector_found": "Usuario encontrado", + + "common_remove": "Quitar", + "user_shares_subtitle": "Comparticiones directas y permanentes con otros usuarios.", + "user_shares_toast_invited": "Invitación de shocker enviada a {name}", + "user_shares_redeem": "Canjear código", + "user_shares_new": "Nuevo enlace", + "user_shares_tab_shares": "Compartidos", + "user_shares_tab_incoming": "Compartidos conmigo", + "user_shares_tab_invites": "Invitaciones", + "share_code_create_title": "Nuevo código para compartir", + "share_code_create_desc": "Crea un código para compartir o una invitación", + "share_code_shocker_placeholder": "Selecciona shockers para compartir...", + "share_code_no_match": "No hay shockers que coincidan", + "share_code_send_invite": "Enviar invitación", + "share_code_create": "Crear código", + "share_code_created_title": "Código generado", + "share_code_created_desc": "¡Copia el código o el enlace!", + "share_code_redeem_title": "Canjear código", + "share_code_redeem_desc": "Introduce el código que quieres canjear", + "share_code_redeem_placeholder": "Introduce el código", + "share_code_redeemed": "¡Canjeado correctamente!", + "share_code_shared_shockers": "Shockers compartidos", + "share_code_redeeming": "Canjeando...", + "share_code_redeem": "Canjear", + "incoming_shares_empty_title": "Nada compartido contigo", + "incoming_shares_empty_desc": "Nadie ha compartido un shocker contigo todavía.", + "incoming_share_toast_removed": "Se quitó lo compartido por {name}", + "incoming_share_remove_title": "Quitar compartido", + "incoming_share_remove_desc": "¿Seguro que quieres quitar lo compartido por {#strong}{name}{/strong}?", + "incoming_share_toast_removed_shocker": "Se quitó {shocker} compartido por {name}", + "incoming_share_remove_shocker_title": "¿Quitar este shocker compartido?", + "incoming_share_remove_shocker_desc": "¿Seguro que quieres quitar el shocker {#strong}{shocker}{/strong} compartido por {#strong}{name}{/strong}?", + "incoming_share_manage_from": "Gestionar lo compartido por", + "share_remove": "Quitar compartido", + "invites_empty_title": "Aún no hay invitaciones", + "invites_empty_desc": "No tienes invitaciones entrantes ni salientes.", + "invites_outgoing": "Salientes", + "invites_outgoing_empty_title": "No hay invitaciones salientes", + "invites_outgoing_empty_desc": "No tienes invitaciones salientes.", + "invites_incoming": "Entrantes", + "invites_incoming_empty_title": "No hay invitaciones entrantes", + "invites_incoming_empty_desc": "No tienes invitaciones entrantes.", + "invite_toast_accepted": "Aceptaste la invitación de {name}", + "invite_toast_declined": "Rechazaste la invitación de {name}", + "invite_deny_title": "Rechazar invitación", + "invite_deny_label": "Rechazar invitación", + "invite_deny": "Rechazar", + "invite_deny_desc": "¿Seguro que quieres rechazar la invitación de {#strong}{name}{/strong}?", + "invite_accept": "Aceptar invitación", + "invite_toast_cancelled_for": "Invitación para {name} cancelada ({id})", + "invite_toast_cancelled": "Invitación {id} cancelada", + "invite_cancel_title": "Cancelar invitación", + "invite_cancel": "Retirar", + "invite_cancel_for_desc": "¿Seguro que quieres cancelar la invitación para {#strong}{name}{/strong}?", + "invite_cancel_code_desc": "¿Seguro que quieres cancelar la invitación con el código {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Cancelar invitación pendiente", + "outgoing_shares_empty_title": "No hay shockers compartidos", + "outgoing_shares_empty_desc": "Aún no has compartido ningún shocker con otros usuarios.", + "outgoing_share_toast_removed": "Se quitó el shocker compartido {name}", + "outgoing_share_remove_title": "¿Dejar de compartir este shocker?", + "outgoing_share_editing_for": "Editando lo compartido con", + "outgoing_share_limits": "Límites y permisos", + "outgoing_share_same": "Las mismas restricciones en todos los shockers", + "outgoing_share_per_desc": "Ajusta las restricciones de cada shocker", + "outgoing_share_all": "Todos", + "outgoing_share_per": "Por shocker", + + "outgoing_share_remove_desc": "¿Seguro que quieres dejar de compartir {#strong}{shocker}{/strong} con {#strong}{name}{/strong}?", + + "report_breadcrumb": "Denunciar tokens de API", + "report_toast_clipboard_failed": "No se pudo leer el portapapeles: {error}", + "report_title": "Denunciar tokens de API filtrados", + "report_paste": "Pegar del portapapeles", + "report_warning": "Este formulario es solo para denunciar tokens de API filtrados por accidente.", + "report_abuse_warning": "El abuso intencionado se castigará con bloqueos o fuertes restricciones.", + "report_detected": "Tokens detectados", + "report_invalid": "Uno o más tokens parecen no ser válidos. Revisa el formato.", + "report_acknowledge": "Confirmo que entiendo para qué sirve esta función y acepto la responsabilidad.", + "report_submit": "Enviar denuncia", + "turnstile_disabled": "Turnstile desactivado", + "common_internal_error": "Error interno", + "resend_toast_sent": "Correo de activación enviado. Revisa tu bandeja de entrada y la carpeta de spam.", + "resend_toast_throttled": "Se han solicitado demasiados correos de activación. Inténtalo más tarde.", + "resend_toast_unavailable": "No se puede reenviar el correo de activación desde este navegador. Si tu cuenta aún no está activada, al iniciar sesión se envía un nuevo enlace.", + "resend_button": "¿No recibiste el correo? Reenviar", + "expiration_label": "Caducidad", + "expiration_never": "Nunca", + "expiration_custom": "Personalizado", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} día", "countPlural=other": "{count} días" } + } + ], + "expiration_required": "La fecha de caducidad es obligatoria", + "expiration_never_desc": "Nunca caducará", + "expiration_expires_at": "Caduca {time} ({date})", + "date_picker_placeholder": "Elige una fecha", + "telemetry_toast_title": "¿Nos ayudas a mejorar OpenShock?", + "telemetry_toast_desc": "Envía diagnósticos para ayudarnos a corregir fallos y llamadas lentas a la API. Los informes incluyen el mensaje de error, la traza de la pila y tu IP. Puedes cambiarlo cuando quieras en los ajustes de la cuenta.", + "telemetry_toast_no": "No, gracias", + "telemetry_toast_errors": "Solo errores", + "telemetry_toast_full": "Completo", + "table_show_details": "Mostrar detalles", + "table_hide_details": "Ocultar detalles", + "table_no_results": "Sin resultados.", + "table_sort_asc": "Ordenar por {name}, ascendente", + "table_sort_desc": "Ordenar por {name}, descendente", + "table_sort_none": "Ordenar por {name}, sin ordenar", + "cell_na": "N/D", + "cell_not_applicable": "No aplica", + "cell_invalid": "No válido", + "cell_unavailable": "No disponible", + "cell_none": "Ninguno", + "oauth_login_with": "Iniciar sesión con {provider}", + "oauth_signup_with": "Registrarse con {provider}", + "signalr_connect_failed": "¡No se pudo conectar con el servidor!", + "signalr_disconnect_failed": "¡Error al desconectarse del servidor!", + "signalr_invalid_update": "¡Se recibió una actualización no válida del servidor!", + "signalr_invalid_log": "¡Se recibieron datos de registro no válidos del servidor!", + "signalr_invalid_ota": "¡Se recibieron datos de actualización de firmware no válidos!", + "ota_toast_failed": "La actualización de firmware del hub falló: {message}", + "ota_toast_succeeded": "¡La actualización de firmware del hub se completó!", + "ota_toast_rolled_back": "El firmware del hub volvió a la versión anterior", + "lcg_connect_failed": "No se pudo conectar con la pasarela de control en vivo", + "terminal_toast_bootloader_failed": "No se pudo entrar en el cargador de arranque: {error}", + "terminal_toast_app_mode_failed": "No se pudo entrar en el modo de aplicación: {error}", + + "problem_account_account_not_activated_title": "Cuenta no activada", + "problem_account_account_not_activated_desc": "Busca el correo de activación en tu bandeja de entrada.", + "problem_account_activation_not_found_title": "El enlace de activación no es válido", + "problem_account_activation_not_found_desc": "Puede que el enlace haya caducado o ya se haya usado.", + "problem_account_activation_resend_too_many_title": "Se han solicitado demasiados correos de activación", + "problem_account_activation_resend_too_many_desc": "Espera un rato antes de volver a intentarlo.", + "problem_account_activation_resend_unavailable_title": "No se puede reenviar el correo de activación", + "problem_account_activation_resend_unavailable_desc": "Vuelve a iniciar sesión para pedir un nuevo enlace de activación.", + "problem_account_deactivate_already_deactivated_title": "La cuenta ya está desactivada", + "problem_account_deactivate_denied_privileged_title": "Las cuentas privilegiadas no se pueden desactivar", + "problem_account_deactivate_unauthorized_title": "No tienes permiso para hacer esto", + "problem_account_deactivated_title": "Esta cuenta se ha desactivado", + "problem_account_email_already_in_use_title": "Esa dirección de correo ya está en uso", + "problem_account_email_invalid_title": "Esa dirección de correo no es válida", + "problem_account_email_taken_title": "Esa dirección de correo ya está en uso", + "problem_account_email_too_many_requests_title": "Demasiadas solicitudes de cambio de correo", + "problem_account_email_too_many_requests_desc": "Espera un rato antes de volver a intentarlo.", + "problem_account_email_unchanged_title": "Ya es tu dirección de correo", + "problem_account_email_verify_not_found_title": "El enlace de verificación no es válido", + "problem_account_email_verify_not_found_desc": "Puede que el enlace haya caducado o ya se haya usado.", + "problem_account_o_auth_only_title": "Esta cuenta no tiene contraseña", + "problem_account_o_auth_only_desc": "Inicia sesión con el proveedor con el que te registraste.", + "problem_account_password_not_set_title": "No hay contraseña establecida", + "problem_account_password_not_set_desc": "Esta cuenta inicia sesión mediante un proveedor externo.", + "problem_account_password_old_password_invalid_title": "La contraseña actual es incorrecta", + "problem_account_username_invalid_title": "Ese nombre de usuario no está permitido", + "problem_account_username_recently_changed_title": "El nombre de usuario se cambió hace poco", + "problem_account_username_recently_changed_desc": "Puedes cambiar tu nombre de usuario una vez cada 7 días.", + "problem_account_username_taken_title": "Ese nombre de usuario ya está en uso", + "problem_admin_user_deactivated_title": "Este usuario está desactivado", + "problem_admin_user_not_activated_title": "Este usuario aún no se ha activado", + "problem_api_token_can_only_delete_self_title": "Un token de API solo puede eliminarse a sí mismo", + "problem_api_token_not_found_title": "No se encontró el token de API", + "problem_api_token_paused_title": "Este token de API está en pausa", + "problem_assign_lcg_bad_schema_version_title": "Versión del protocolo del hub no compatible", + "problem_assign_lcg_bad_schema_version_desc": "Actualiza el firmware del hub para conectarte.", + "problem_assign_lcg_no_lcg_available_title": "No hay ninguna gateway disponible", + "problem_assign_lcg_no_lcg_available_desc": "Ahora mismo no hay ninguna gateway de control en vivo disponible. Inténtalo de nuevo más tarde.", + "problem_authentication_account_deactivated_title": "Esta cuenta se ha desactivado", + "problem_authentication_account_not_activated_title": "Esta cuenta no se ha activado", + "problem_authentication_cookie_missing_or_invalid_title": "No has iniciado sesión", + "problem_authentication_cookie_missing_or_invalid_desc": "Puede que tu sesión haya caducado. Vuelve a iniciar sesión.", + "problem_authentication_header_missing_or_invalid_title": "Token de API no válido", + "problem_authentication_session_invalid_title": "La sesión ha caducado", + "problem_authentication_session_invalid_desc": "Vuelve a iniciar sesión.", + "problem_authentication_token_invalid_title": "Token de API no válido", + "problem_authentication_unknown_error_title": "Error de autenticación", + "problem_authorization_policy_not_met_title": "No tienes permiso para hacer esto", + "problem_authorization_token_only_title": "Esta acción requiere un token de API", + "problem_authorization_token_permission_missing_title": "A este token de API le falta un permiso necesario", + "problem_authorization_unknown_error_title": "Error de autorización", + "problem_authorization_user_session_only_title": "Esta acción requiere una sesión iniciada", + "problem_automation_token_not_allowed_for_account_title": "Los tokens de automatización no se pueden usar con cuentas privilegiadas", + "problem_configuration_already_exists_title": "Ya existe una entrada de configuración con ese nombre", + "problem_configuration_invalid_name_format_title": "Nombre de configuración no válido", + "problem_configuration_invalid_name_format_desc": "Solo se permiten letras de la A a la Z y guiones bajos.", + "problem_configuration_invalid_value_format_title": "El valor no coincide con el tipo de configuración", + "problem_configuration_not_found_title": "No se encontró la entrada de configuración", + "problem_control_stats_invalid_range_title": "La fecha de inicio no puede ser posterior a la de fin", + "problem_control_stats_invalid_time_zone_title": "Zona horaria desconocida", + "problem_control_stats_missing_capability_title": "Las estadísticas de control no están disponibles en este servidor", + "problem_device_not_found_title": "No se encontró el hub", + "problem_device_not_online_title": "El hub está sin conexión", + "problem_device_too_many_hubs_title": "Has alcanzado el número máximo de hubs", + "problem_device_too_many_shockers_title": "Este hub ha alcanzado su número máximo de shockers", + "problem_endpoint_retired_title": "Esta función ya no está disponible", + "problem_expression_error_title": "Expresión de filtro no válida", + "problem_internal_server_error_title": "Algo salió mal por nuestra parte", + "problem_login_invalid_credentials_title": "Usuario o contraseña no válidos", + "problem_login_invalid_domain_title": "No se permite iniciar sesión desde esta dirección", + "problem_o_auth_connection_already_exists_title": "Tu cuenta ya está conectada a este proveedor", + "problem_o_auth_connection_already_linked_title": "Esta cuenta externa ya está vinculada a otro usuario", + "problem_o_auth_flow_anonymous_only_title": "Ya has iniciado sesión", + "problem_o_auth_flow_mismatch_title": "El intento de inicio de sesión no coincide", + "problem_o_auth_flow_mismatch_desc": "Vuelve a empezar.", + "problem_o_auth_flow_missing_data_title": "El proveedor no devolvió los datos de tu cuenta", + "problem_o_auth_flow_missing_data_desc": "Inténtalo de nuevo.", + "problem_o_auth_flow_not_found_title": "El intento de inicio de sesión ha caducado", + "problem_o_auth_flow_not_found_desc": "Vuelve a empezar.", + "problem_o_auth_flow_unsupported_title": "Flujo de inicio de sesión no compatible", + "problem_o_auth_internal_error_title": "Algo salió mal al iniciar sesión", + "problem_o_auth_internal_error_desc": "Inténtalo de nuevo en un momento.", + "problem_o_auth_link_authenticated_user_only_title": "Debes iniciar sesión para vincular una cuenta externa", + "problem_o_auth_provider_mismatch_title": "El intento de inicio de sesión no coincide con el proveedor", + "problem_o_auth_provider_mismatch_desc": "Vuelve a empezar.", + "problem_o_auth_provider_unsupported_title": "Este proveedor de inicio de sesión no es compatible", + "problem_pair_code_not_found_title": "No se encontró el código de vinculación", + "problem_password_reset_not_found_title": "El enlace para restablecer la contraseña no es válido", + "problem_password_reset_not_found_desc": "Puede que el enlace haya caducado o ya se haya usado.", + "problem_session_not_found_title": "No se encontró la sesión", + "problem_share_get_no_shares_title": "No tienes nada compartido con este usuario", + "problem_share_request_create_cannot_share_with_self_title": "No puedes compartir contigo mismo", + "problem_share_request_create_shocker_not_found_title": "No se encontraron uno o más shockers", + "problem_share_request_create_shocker_not_found_desc": "Puede que se hayan eliminado o que no sean tuyos.", + "problem_share_request_not_found_title": "No se encontró la invitación", + "problem_share_user_not_found_title": "No se encontró lo compartido", + "problem_share_code_already_linked_title": "El shocker ya está vinculado a tu cuenta", + "problem_share_code_cant_link_own_share_code_title": "No puedes canjear tu propio código", + "problem_share_code_not_found_title": "No se encontró el código", + "problem_share_link_expiry_date_in_past_title": "La fecha de caducidad no puede estar en el pasado", + "problem_share_link_not_found_title": "No se encontró el enlace público", + "problem_share_link_shocker_already_in_share_link_title": "El shocker ya está en este enlace público", + "problem_share_link_shocker_not_in_share_link_title": "El shocker no está en este enlace público", + "problem_shocker_control_no_permission_title": "No tienes permiso para controlar este shocker", + "problem_shocker_control_not_found_title": "No se encontró el shocker", + "problem_shocker_control_paused_title": "El shocker está en pausa", + "problem_shocker_not_found_title": "No se encontró el shocker", + "problem_signup_registration_disabled_title": "El registro está desactivado en este momento", + "problem_signup_username_or_email_exists_title": "Ese nombre de usuario o correo ya está en uso", + "problem_turnstile_invalid_title": "La verificación falló", + "problem_turnstile_invalid_desc": "Vuelve a completar la verificación e inténtalo de nuevo.", + "problem_user_not_found_title": "No se encontró el usuario", + "problem_user_privileged_delete_denied_title": "Los usuarios privilegiados no se pueden eliminar", + "problem_validation_error_title": "Algunos campos no son válidos", + "problem_webhook_not_found_title": "No se encontró el webhook", + "problem_webhook_unsupported_title": "Solo se admiten webhooks de Discord", + "problem_webhook_unsupported_desc": "Usa una URL de discord.com, no de canary ni ptb.", + + "error_too_many_requests": "Demasiadas solicitudes", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Inténtalo de nuevo en {seconds} segundo.", + "secondsPlural=other": "Inténtalo de nuevo en {seconds} segundos." + } + } + ], + "error_unexpected_response": "Respuesta inesperada del servidor", + "error_internal": "Se produjo un error interno", + "error_network": "Se produjo un error de red", + + "dev_banner": "Este es el entorno de {#b}DESARROLLO{/b} de OpenShock. {#u}No se guarda ningún dato{/u} y se sobrescribe a menudo con datos de producción.", + "firmware_channel_bugs_warning": "Este canal puede contener errores." +} diff --git a/messages/et.json b/messages/et.json new file mode 100644 index 00000000..e881c5b6 --- /dev/null +++ b/messages/et.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Platvorm shockerite turvaliseks ja töökindlaks kaugjuhtimiseks väga väikese viivitusega.", + "landing_section_label": "Avaleht", + "landing_hubs_online": "Praegu võrgus: ", + "landing_learn_more": "Loe edasi", + "landing_wiki": "Viki", + "landing_meta_description": "Tere tulemast OpenShocki, mis on tasuta ja avatud lähtekoodiga ökosüsteem erinevate shockerite juhtimiseks interneti kaudu.", + "instance_meta_description": "Tere tulemast {siteName} lehele. See on OpenShocki sõltumatu instants: tasuta ja avatud lähtekoodiga ökosüsteem erinevate shockerite juhtimiseks interneti kaudu.", + "header_sidebar_toggle": "Näita või peida külgriba", + "header_avatar_alt": "Kasutaja {name} avatar", + "header_menu_profile": "Profiil", + "header_menu_settings": "Seaded", + "header_menu_logout": "Logi välja", + "header_login": "Logi sisse", + "header_signup": "Registreeru", + "header_github_title": "Projekt GitHubis", + "header_discord_title": "Meie Discord", + + "footer_made_with": "Tehtud {#heart/}-ga – {#team}OpenShocki meeskond{/team}", + "footer_connection_status_label": "Serveriühenduse staatus", + "footer_signalr_state": "SignalR-i staatus", + "footer_frontend_version": "Esiliidese versioon", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Tagarakenduse versioon", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Keel", + + "sidebar_home_link_label": "OpenShocki avaleht", + "sidebar_group_general": "Üldine", + "sidebar_home": "Avaleht", + "sidebar_shockers": "Shockerid", + "sidebar_shared_shockers": "Jagatud shockerid", + "sidebar_hubs": "Jaoturid", + "sidebar_user_shares": "Kasutajatega jagamised", + "sidebar_public_shares": "Avalikud jagamised", + "sidebar_serial_terminal": "Jadaterminal", + "sidebar_group_admin": "Haldus", + "sidebar_admin_monitoring": "Monitooring", + "sidebar_admin_online_hubs": "Ühendatud jaoturid", + "sidebar_admin_online_gateways": "Ühendatud lüüsid", + "sidebar_admin_management": "Haldamine", + "sidebar_admin_users": "Kasutajad", + "sidebar_admin_blacklists": "Blokeerimisloendid", + "sidebar_admin_webhooks": "Veebihaagid", + "sidebar_admin_mail": "E-post", + "sidebar_admin_automation_tokens": "Automatiseerimisvõtmed", + "sidebar_admin_configuration": "Konfiguratsioon", + "sidebar_group_settings": "Seaded", + "sidebar_settings_api_tokens": "API-võtmed", + "sidebar_settings_sessions": "Seansid", + "sidebar_settings_audit_log": "Auditilogi", + "sidebar_settings_connections": "Seotud kontod", + "sidebar_settings_account": "Konto seaded", + + "error_meta_title": "Teenus pole saadaval", + "error_meta_description": "OpenShock pole praegu saadaval", + "error_meta_logo_alt": "OpenShocki logo", + "error_fallback_message": "Midagi läks valesti.", + "error_not_found_message": "Lehte ei leitud", + "error_not_found_description": "Otsitavat lehte pole olemas.", + "error_unexpected_description": "Tekkis ootamatu viga.", + "error_go_back": "Tagasi", + + "auth_layout_logo_alt": "OpenShocki logo", + "auth_layout_invalid_redirect_removed": "Kehtetu ümbersuunamise URL eemaldati sinu turvalisuse huvides.", + + "auth_activate_breadcrumb": "Konto aktiveerimine", + "auth_activate_title": "Konto aktiveerimine", + "auth_activate_activating": "Sinu kontot aktiveeritakse...", + "auth_activate_success": "Sinu konto on aktiveeritud", + "auth_activate_failed": "See aktiveerimislink on kehtetu või aegunud", + "auth_activate_missing_token": "Aktiveerimisvõti puudub", + "auth_activate_continue": "Jätka sisselogimisega", + "auth_activate_toast_success": "Konto on aktiveeritud", + + "auth_forgot_breadcrumb": "Unustatud parool", + "auth_forgot_title": "Unustatud parool", + "auth_forgot_description": "Sisesta oma e-posti aadress, et parool lähtestada", + "auth_forgot_email_label": "E-post", + "auth_forgot_email_placeholder": "E-post", + "auth_forgot_submit": "Lähtesta parool", + "auth_forgot_signin_prompt": "Mäletad oma parooli? {#signin}Logi sisse{/signin}", + "auth_forgot_mail_disabled": "Paroolide lähtestamine pole selles instantsis saadaval, sest e-posti teenusepakkujat pole seadistatud. Konto taastamiseks võta ühendust oma administraatoriga.", + "auth_forgot_toast_sent": "Parooli lähtestamise taotlus saadeti antud e-posti aadressile", + + "auth_login_breadcrumb": "Sisselogimine", + "auth_login_title": "Tere tulemast tagasi", + "auth_login_loading_methods": "Saadaolevate sisselogimisviiside laadimine", + "auth_login_choose_method": "Logi sisse ühega neist viisidest", + "auth_login_with_account": "Logi sisse oma OpenShocki kontoga", + "auth_login_activation_after_signup": "Sinu konto on loodud. Saatsime aktiveerimislingi sinu e-posti aadressile. Kontrolli postkasti ja rämpsposti kausta.", + "auth_login_activation_pending": "Sinu konto pole veel aktiveeritud. Saatsime aktiveerimislingi sinu e-posti aadressile. Kontrolli postkasti ja rämpsposti kausta. Kui midagi ei saabu, proovi hiljem uuesti sisse logida, et saada uus link.", + "auth_login_oauth_only": "Sellel kontol pole parooli. Logi sisse teenusepakkujaga, millega registreerusid.", + "auth_login_oauth_only_with_buttons": "Sellel kontol pole parooli. Logi ülal olevate nuppude abil sisse teenusepakkujaga, millega registreerusid.", + "auth_login_or_continue_with": "Või jätka teenusega", + "auth_login_username_label": "Kasutajanimi või e-post", + "auth_login_password_label": "Parool", + "auth_login_submit": "Logi sisse", + "auth_login_signup_prompt": "Pole veel kontot? {#signup}Registreeru{/signup}", + "auth_login_legal": "Klõpsates „Logi sisse“, nõustud meie {#tos}kasutustingimustega{/tos} ja {#privacy}privaatsuspoliisiga{/privacy}.", + + "auth_oauth_create_breadcrumb": "Registreeru teenusega {provider}", + "auth_oauth_create_title": "Registreeru teenusega {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Täida oma konto andmed", + "auth_oauth_create_username_label": "Kasutajanimi", + "auth_oauth_create_username_placeholder": "Kasutajanimi", + "auth_oauth_create_email_label": "E-post", + "auth_oauth_create_email_placeholder": "E-post", + "auth_oauth_create_submit": "Registreeru", + "auth_oauth_create_legal": "Klõpsates „Registreeru“, nõustud meie {#tos}kasutustingimustega{/tos} ja {#privacy}privaatsuspoliisiga{/privacy}.", + + "auth_oauth_error_breadcrumb": "Autentimise viga", + "auth_oauth_error_title": "Autentimise viga", + "auth_oauth_error_back": "Tagasi sisselogimise juurde", + + "auth_reset_breadcrumb": "Parooli lähtestamine", + "auth_reset_title": "Parooli lähtestamine", + "auth_reset_checking": "Lähtestamislingi kontrollimine...", + "auth_reset_choose_password": "Vali oma kontole uus parool", + "auth_reset_invalid": "See lähtestamislink on kehtetu või aegunud", + "auth_reset_password_label": "Uus parool", + "auth_reset_password_placeholder": "Uus parool", + "auth_reset_confirm_label": "Kinnita uus parool", + "auth_reset_confirm_placeholder": "Kinnita uus parool", + "auth_reset_submit": "Lähtesta parool", + "auth_reset_request_new": "Taotle uut linki", + "auth_reset_toast_success": "Parool on lähtestatud", + + "auth_signup_breadcrumb": "Registreerumine", + "auth_signup_toast_created_mail": "Konto loodi edukalt. Konto kinnitamiseks vaata oma e-posti.", + "auth_signup_toast_created_no_mail": "Konto loodi edukalt. Võid nüüd sisse logida.", + "auth_signup_dialog_title": "Tere tulemast! Aitäh, et registreerusid! ❤️", + "auth_signup_dialog_created_mail": "Sinu konto on loodud. 🎉 Konto kinnitamiseks vaata oma e-posti.", + "auth_signup_dialog_verify_then_login": "Pärast e-posti aadressi kinnitamist saad oma kontole sisse logida.", + "auth_signup_dialog_created_no_mail": "Sinu konto on loodud ja kasutusvalmis. 🎉", + "auth_signup_dialog_login_now": "Võid nüüd oma kontole sisse logida.", + "auth_signup_title": "Loo konto", + "auth_signup_loading_methods": "Saadaolevate registreerumisviiside laadimine", + "auth_signup_using_email": "Registreerumine e-postiga", + "auth_signup_choose_method": "Vali, kuidas soovid registreeruda", + "auth_signup_back": "Tagasi", + "auth_signup_username_label": "Kasutajanimi", + "auth_signup_username_placeholder": "Jaan OpenShock", + "auth_signup_email_label": "E-post", + "auth_signup_email_placeholder": "jaan@example.com", + "auth_signup_password_label": "Parool", + "auth_signup_password_placeholder": "Parool", + "auth_signup_confirm_label": "Kinnita parool", + "auth_signup_confirm_placeholder": "Kinnita parool", + "auth_signup_submit": "Loo konto", + "auth_signup_signin_prompt": "Sul on juba konto? {#signin}Logi sisse{/signin}", + "auth_signup_or": "Või", + "auth_signup_with_email": "Registreeru e-postiga", + "auth_signup_legal": "Klõpsates „Loo konto“, nõustud meie {#tos}kasutustingimustega{/tos} ja {#privacy}privaatsuspoliisiga{/privacy}.", + + "auth_verify_breadcrumb": "E-posti kinnitamine", + "auth_verify_title": "E-posti kinnitamine", + "auth_verify_verifying": "Kinnitame sinu e-posti aadressi...", + "auth_verify_success": "Sinu e-posti aadress on kinnitatud", + "auth_verify_failed": "See kinnituslink on kehtetu või aegunud", + "auth_verify_missing_token": "Kinnitusvõti puudub", + "auth_verify_continue": "Jätka sisselogimisega", + "auth_verify_toast_success": "E-posti aadress on kinnitatud", + + "common_cancel": "Tühista", + "common_delete": "Kustuta", + "common_edit": "Muuda", + "common_share": "Jaga", + "common_copy_id": "Kopeeri ID", + "common_id_copied": "ID kopeeriti lõikelauale", + "common_open_menu": "Ava menüü", + "common_refresh": "Värskenda", + "common_settings": "Seaded", + "common_clear": "Tühjenda", + "common_online": "Võrgus", + "common_offline": "Võrguühenduseta", + "common_paused": "Peatatud", + "common_resume": "Jätka", + "common_resuming": "Jätkamine...", + "common_coming_soon": "(Tulekul)", + "common_save_changes": "Salvesta muudatused", + "common_danger_zone": "Ohutsoon", + "common_name": "Nimi", + "control_intensity": "Tugevus", + "control_duration": "Kestus", + "control_max_intensity": "Maksimaalne intensiivsus", + "control_max_duration": "Maksimaalne kestus", + "control_vibration": "Värin", + "control_value": "Väärtus", + "control_live_intensity": "Reaalajas intensiivsus", + "control_type_stop": "Peata", + "control_type_shock": "Šokk", + "control_type_vibrate": "Vibreeri", + "control_type_sound": "Heli", + "live_tooltip_active": "Reaalajas läbi {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Ühendamine...", + "live_tooltip_connect": "Ühenda reaalajas juhtimisega", + "live_tooltip_hub_start": "Ctrl+klõps käivitab kogu jaoturi", + "live_tooltip_hub_stop": "Ctrl+klõps peatab kogu jaoturi", + "pause_resume_shocker": "Jätka shockeriga", + "pause_pause_shocker": "Peata shocker", + "pause_resume_all": "Jätka kõigi shockeritega", + "pause_pause_all": "Peata kõik shockerid", + "shocker_label": "Shocker", + "shocker_hub": "Jaotur", + "shocker_select_hub": "Vali jaotur", + "shocker_rf_id": "RF-ID", + "shocker_rf_id_invalid": "RF-ID peab olema täisarv vahemikus {min}–{max}.", + "shocker_model": "Mudel", + "shocker_select_model": "Vali mudel", + "shocker_name_placeholder": "Shockeri nimi", + "shocker_menu_view_logs": "Vaata logisid", + "shocker_delete_title": "Kustuta shocker", + "shocker_delete_desc": "Kas soovid kindlasti „{name}“ kustutada? Seda toimingut ei saa tagasi võtta.", + "shocker_toast_deleted": "Shocker „{name}“ kustutati", + "shocker_toast_paused": "Shocker peatati", + "shocker_toast_resumed": "Shocker jätkab", + "shocker_add_desc": "Registreeri uus shocker mõnele oma jaoturile.", + "shocker_add_name_placeholder": "Minu shocker", + "shockers_title": "Shockerid", + "shockers_subtitle": "Kõik sinu jaoturitega seotud shockerid.", + "shockers_loading": "Shockerite laadimine...", + "shockers_toast_refreshed": "Shockerid värskendati", + "shockers_toast_need_hub": "Enne shockerite lisamist pead looma jaoturi.", + "shockers_toast_added": "Shocker lisati", + "shockers_unknown_module": "Tundmatu mooduli tüüp", + "shockers_add": "Lisa shocker", + "shockers_view_mode": "Vaade", + "shockers_mode_classic": "Klassikaline", + "shockers_mode_rich": "Laiendatud", + "shockers_mode_simple": "Lihtne", + "shockers_mode_map": "Kaart", + "shockers_group_by_hub": "Rühmita jaoturi järgi", + "shockers_global_limits": "Üldised piirangud", + "shockers_logs_label": "Logid", + "shockers_empty_title": "Shockereid pole veel", + "shockers_empty_no_hubs": "Loo esmalt jaotur ja lisa sellele siis shockerid.", + "shockers_empty_has_hubs": "Alustamiseks lisa shocker mõnele oma jaoturile.", + "shockers_create_hub": "Loo jaotur", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockerit" } + } + ], + "shared_shockers_title": "Jagatud shockerid", + "shared_shockers_subtitle": "Teiste kasutajate sinuga jagatud shockerid.", + "shared_shockers_empty_title": "Sinuga pole veel ühtegi shockerit jagatud.", + "shared_shockers_empty_desc": "Kui keegi jagab sinuga oma shockereid, ilmuvad need siia.", + "shocker_logs_title": "Shockerite logid", + "shocker_logs_subtitle": "Kõik sinu shockeritele saadetud juhtkäsud.", + "shocker_logs_live_title": "Uued logid ilmuvad reaalajas", + "shocker_logs_paused_title": "Reaalajas uuendused peatuvad sortimisel või muu kui esimese lehe vaatamisel", + "shocker_logs_live": "Reaalajas", + "shocker_logs_col_time": "Aeg", + "shocker_logs_col_type": "Tüüp", + "shocker_logs_col_by": "Saatja", + "shocker_logs_filter_label": "Filtreeri shockeri järgi", + "shocker_logs_filter_placeholder": "Otsi shockereid...", + "shocker_logs_filter_all": "Kõik shockerid", + "shocker_logs_filter_none": "Sobivaid shockereid pole", + "shocker_edit_title": "Muuda shockerit", + "shocker_edit_subtitle": "Muuda selle shockeri andmeid või eemalda see.", + "shocker_edit_back": "Tagasi shockerite juurde", + "shocker_edit_load_failed": "Shockeri laadimine ebaõnnestus.", + "shocker_edit_loading": "Shockeri laadimine...", + "shocker_edit_details_title": "Shockeri andmed", + "shocker_edit_details_desc": "Uuenda selle shockeri nime, RF-ID-d ja mudelit.", + "shocker_edit_pause_state": "Pausi olek", + "shocker_edit_is_paused": "Shocker on peatatud", + "shocker_edit_is_active": "Shocker on aktiivne", + "shocker_edit_toast_updated": "Shocker uuendati", + "shocker_edit_delete_desc": "Kustuta see shocker jäädavalt. Seda toimingut ei saa tagasi võtta.", + + "common_close": "Sulge", + "common_continue": "Jätka", + "common_loading": "Laadimine...", + "common_previous": "Eelmine", + "common_next": "Järgmine", + "common_steps": "Sammud", + "common_step_label": "Samm {number}: {title}", + "common_copy": "Kopeeri", + "common_copied": "Kopeeritud", + "common_never": "Mitte kunagi", + "common_error": "Viga: {message}", + "terminal_title": "Jadaterminal", + "terminal_connecting": "Ühendamine...", + "terminal_help_button": "Probleemid? Abi", + "terminal_back_to_modes": "Tagasi režiimi valikusse", + "terminal_mode_configure": "Seadista seade", + "terminal_mode_configure_desc": "Seadista WiFi, autentimine ja muu. Sisaldab interaktiivset jadakonsooli.", + "terminal_mode_flash": "Paigalda püsivara", + "terminal_mode_flash_desc": "Paigalda või uuenda ühendatud seadme püsivara.", + "terminal_mode_raw": "Jadamonitor", + "terminal_mode_raw_desc": "Ainult konsool. Loe seadme logisid ja saada käske.", + "terminal_step_channel": "Vali kanal", + "terminal_step_board": "Vali plaat", + "terminal_go_to_step": "Mine sammu {number} juurde: {title}", + "terminal_erase": "Kustuta enne paigaldamist", + "terminal_erase_desc": "Kustutab seadmest kõik andmed, sealhulgas olemasolevad seadistused", + "terminal_unsupported": "Sinu brauser ei toeta seda funktsiooni.", + "terminal_update_browser": "Palun uuenda oma brauser uusimale versioonile.", + "terminal_use_browsers": "Palun kasuta ühte järgmistest brauseritest:", + "terminal_connect_failed_bootloader": "Alglaadurirežiimi ei õnnestunud siseneda", + "terminal_connect_failed": "Seadmega ühendamine ebaõnnestus", + "terminal_connect_failed_desc": "Seadmega ei õnnestunud jadaühendust luua.", + "terminal_quick_tries": "Proovi järgmist:", + "terminal_try_replug": "Ühenda seade lahti ja uuesti külge.", + "terminal_try_cable": "Proovi teist USB-kaablit või porti.", + "terminal_try_driver": "Veendu, et jadadraiver on paigaldatud.", + "terminal_open_troubleshooter": "Ava tõrkeotsing", + "terminal_log_reset_no_device": "Hostipoolne viga lähtestamisel: seade puudub!", + "terminal_log_reset_error": "Hostipoolne viga lähtestamisel: {error}", + "terminal_log_send_no_device": "Saatmine ebaõnnestus: seade puudub!", + "terminal_log_send_error": "Saatmine ebaõnnestus: {error}", + "terminal_log_firmware_disconnected": "Püsivara ühendus katkes: {error}", + "terminal_log_erase_failed": "Välkmälu kustutamine ebaõnnestus: {error}", + "terminal_log_hard_reset_failed": "Riistvaraline lähtestamine ebaõnnestus: {error}", + "terminal_log_flash_complete": "Paigaldamine lõpetatud", + "terminal_log_flash_failed": "Paigaldamine ebaõnnestus: {error}", + "terminal_log_command_failed": "Käsu kirjutamine ebaõnnestus: {error}", + "terminal_help_title": "Tõrkeotsing", + "terminal_help_desc": "Läbi need sammud järjest. Iga samm välistab ühe levinud põhjuse.", + "terminal_help_step_cable": "USB-kaabel", + "terminal_help_step_port": "USB-port", + "terminal_help_step_driver": "Paigalda draiver", + "terminal_help_step_manual": "Draiveri käsitsi uuendamine", + "terminal_help_step_discord": "Küsi Discordis", + "terminal_help_cable_body": "Paljud USB-C ja micro-USB kaablid on ainult laadimiseks ega edasta andmeid. Vaheta kindlalt töötava andmekaabli vastu (mida oled kasutanud failide edastamiseks või teiste seadmete ühendamiseks) ja ühenda jaotur uuesti.", + "terminal_help_port_body": "Ühenda seade otse arvuti USB-porti. Võimalusel väldi USB-jaotureid, dokke ja esipaneeli porte, sest need põhjustavad sageli toite- ja signaaliprobleeme. Lauaarvuti puhul proovi masina tagaküljel olevat porti.", + "terminal_help_driver_download": "Laadi alla CP210x draiver:", + "terminal_help_driver_extract": "Paki zip-faili sisu lahti oma arvuti kausta.", + "terminal_help_driver_run": "Ava kaust ja käivita {#code}{installer}{/code}. Paigaldamiseks järgi juhiseid.", + "terminal_help_driver_reconnect": "Ühenda seade uuesti.", + "terminal_help_manual_intro": "Kui draiver paigaldati, kuid seade ikka ei ilmu:", + "terminal_help_manual_open": "Ava seadmehaldur (vajuta {#key}Win{/key} + {#key}X{/key} ja vali {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Otsi jaotisest {#code}Ports (COM & LPT){/code} sellist kirjet:", + "terminal_help_manual_missing": "Kui see puudub, ei tuvasta Windows seadet üldse; vaata uuesti üle kaabli ja pordi sammud.", + "terminal_help_manual_update": "Paremklõpsa seadmel ja vali {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Vali {#code}Browse my computer for drivers{/code} ja seejärel kaust, kuhu draiveri zip-faili lahti pakkisid. Veendu, et {#code}Include subfolders{/code} on märgitud.", + "terminal_help_manual_success": "Õnnestumise korral peaks kirje nüüd olema {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Ikka ei õnnestu? Tule meie Discordi serverisse ja küsi kanalis {#code}{channel}{/code}. Lisa järgmine info:", + "terminal_help_discord_os": "oma operatsioonisüsteem ja brauser", + "terminal_help_discord_device": "kasutatav seade (plaadi mudel, kust selle said)", + "terminal_help_discord_tried": "mida oled eelmistest sammudest juba proovinud", + "terminal_help_discord_errors": "veateated või asjakohane terminali väljund", + "terminal_help_discord_join": "Liitu meie Discordi serveriga", + "terminal_risk_title": "⚠️ EBASTABIILNE PÜSIVARA", + "terminal_risk_intro": "Oled paigaldamas {#strong}katsetuslikku püsivara{/strong}, mis on {#strong}teadaolevalt ebastabiilne{/strong}.", + "terminal_risk_brick": "See võib seadme jäädavalt rikkuda, nõuda käsitsi taastamist või muuta selle kasutuskõlbmatuks.", + "terminal_risk_no_support": "Me EI paku tuge selle püsivara põhjustatud probleemidele.", + "terminal_risk_acknowledge": "Saan aru, et see on täielikult minu vastutus", + "terminal_risk_abort": "Katkesta", + "terminal_risk_accept": "VÕTAN TÄIELIKU VASTUTUSE", + "firmware_channel_recommended": "See on soovitatud kanal.", + "firmware_channel_danger": "ÄRA KASUTA SEDA, KUI SA EI TEA, MIDA TEED", + "firmware_channel_stable": "Stabiilne", + "firmware_channel_beta": "Beeta", + "firmware_channel_develop": "Arendus", + "terminal_board_select": "Vali plaat...", + "terminal_board_search": "Otsi plaate...", + "terminal_board_none": "Plaati ei leitud.", + "terminal_flash_button": "Paigalda", + "terminal_flash_progress": "Edenemine: {status}", + "terminal_flash_idle": "Ootel", + "terminal_flash_no_device": "Seadet pole valitud.", + "terminal_flash_resetting": "Lähtestamine...", + "terminal_flash_downloading": "Püsivara allalaadimine...", + "terminal_flash_download_failed": "Püsivara allalaadimine ebaõnnestus.", + "terminal_flash_flashing": "Püsivara paigaldamine...", + "terminal_flash_rebooting": "Seadme taaskäivitamine... (Kui see jääb kinni, ühenda toide käsitsi lahti ja uuesti)", + "terminal_flash_done": "Seade taaskäivitati! Paigaldamine lõpetatud.", + "terminal_port_select": "Vali seade", + "terminal_port_disconnect": "Katkesta ühendus seadmega", + "terminal_port_connected": "Seade ühendatud: {#strong}{id}{/strong}", + "terminal_console": "Konsool", + "terminal_connected_device": "Ühendatud seade", + "terminal_resize": "Muuda terminalipaneeli suurust", + "terminal_reboot": "Taaskäivita", + "terminal_disconnect": "Katkesta", + "terminal_fullscreen_exit_esc": "Välju täisekraanist (Esc)", + "terminal_fullscreen_exit": "Välju täisekraanist", + "terminal_fullscreen_fill": "Täida aken", + "terminal_command_label": "Jadakäsk", + "terminal_command_placeholder": "Sisesta käsk...", + "terminal_command_send": "Saada käsk", + "terminal_colors": "Värvid", + "terminal_colors_menu": "Värvid...", + "terminal_colors_label": "Konsooli värvid", + "terminal_colors_close": "Sulge värvid", + "terminal_color_input": "{name} värv", + "terminal_colors_reset": "Lähtesta vaikeväärtustele", + "terminal_color_bg": "Taust", + "terminal_color_fg": "Tekst", + "terminal_color_ts": "Ajatempel", + "terminal_color_error": "Viga", + "terminal_color_warning": "Hoiatus", + "terminal_color_info": "Teave", + "terminal_color_debug": "Silumine", + "terminal_color_verbose": "Paljusõnaline", + "terminal_options": "Valikud", + "terminal_options_label": "Konsooli valikud", + "terminal_hide_system": "Peida süsteemiteated", + "terminal_stick_bottom": "Hoia all", + "terminal_raw_output": "Toorväljund", + "terminal_timestamps": "Ajatemplid", + "terminal_timestamp_uptime": "Tööaeg", + "terminal_timestamp_local": "Kohalik", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Väljas", + "terminal_copy_settings": "Kopeeri seaded", + "terminal_import_settings": "Impordi seaded", + "terminal_copy_selection": "Kopeeri valik", + "terminal_copy_all": "Kopeeri kogu väljund", + "terminal_toast_selection_copied": "Valik kopeeriti", + "terminal_toast_output_copied": "Konsooli väljund kopeeriti", + "terminal_toast_settings_copied": "Konsooli seaded kopeeriti", + "terminal_toast_clipboard_unreadable": "Lõikelauda ei õnnestunud lugeda", + "terminal_toast_settings_imported": "Konsooli seaded imporditi", + "terminal_toast_settings_invalid": "Lõikelaual pole konsooli seadeid", + + "common_try_again": "Proovi uuesti", + "terminal_cfg_intro": "Väärtused saadetakse seadmele UART-i kaudu. Seadme vastust näed allolevas konsoolis. Ilma argumendita käsud loevad väärtust; praeguse väärtuse lugemiseks kasuta iga välja kõrval olevat nuppu {#eye/}.", + "terminal_cfg_rf_title": "RF-saatja", + "terminal_cfg_rf_desc": "Juhib shockeritele saadetavat RF-signaali.", + "terminal_cfg_tx_pin": "TX GPIO viik", + "terminal_cfg_example": "nt {value}", + "terminal_cfg_read_value": "Loe praegune väärtus", + "terminal_cfg_set": "Määra", + "terminal_cfg_read": "Loe", + "terminal_cfg_reading": "Lugemine…", + "terminal_cfg_apply": "Rakenda", + "terminal_cfg_keepalive": "Keepalive lubatud", + "terminal_cfg_keepalive_desc": "Saadab seotud shockeritele regulaarselt signaali, et need ärkvel püsiksid.", + "terminal_cfg_estop_title": "Hädaseiskamine", + "terminal_cfg_estop_desc": "Riistvaraline nupp, mis peatab kogu väljundi.", + "terminal_cfg_estop_enabled": "Hädaseiskamine lubatud", + "terminal_cfg_estop_pin": "Hädaseiskamise GPIO viik", + "terminal_cfg_estop_note": "Märkus: {#code}{latching}{/code} ja {#code}{active}{/code} jaoks pole eraldi käske; määra need allpool JSON-seadistuse kaudu.", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Võrgu andmed ja seadme hostinimi.", + "terminal_cfg_hostname": "Hostinimi", + "terminal_cfg_networks": "Võrgud (JSON-massiiv)", + "terminal_cfg_invalid_json_array": "Peab olema kehtiv JSON-massiiv", + "terminal_cfg_ap_note": "AP seadete ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) jaoks pole eraldi käske; kasuta JSON-seadistust.", + "terminal_cfg_backend_title": "Taustserver", + "terminal_cfg_backend_desc": "OpenShocki server ja autentimine.", + "terminal_cfg_domain": "Domeen", + "terminal_cfg_domain_restart": "Domeeni määramine taaskäivitab seadme.", + "terminal_cfg_auth_token": "Autentimistõend", + "terminal_cfg_auth_token_placeholder": "Kleebi seadme tõend", + "terminal_cfg_hide": "Peida", + "terminal_cfg_show": "Näita", + "terminal_cfg_serial_title": "Jadasisend", + "terminal_cfg_echo": "Kaja lubatud", + "terminal_cfg_echo_desc": "Kuvab sisestatud märgid konsoolis tagasi.", + "terminal_cfg_advanced_title": "Täpsem: kogu seadistus", + "terminal_cfg_advanced_desc": "Väljade puhul, millel pole eraldi käske (captive portal, OTA, LAN jne), asenda kogu seadistus.", + "terminal_cfg_json_config": "JSON-seadistus", + "terminal_cfg_invalid_json": "Peab olema kehtiv JSON", + "terminal_cfg_read_json": "Loe praegune seadistus JSON-ina", + "terminal_cfg_json_restart": "JSON-seadistuse rakendamine taaskäivitab seadme.", + "terminal_cfg_raw_config": "Toores FlatBufferi seadistus (base64)", + "terminal_cfg_invalid_base64": "Peab olema kehtiv base64-string", + "terminal_cfg_read_raw": "Loe praegune seadistus base64-na", + "terminal_cfg_factory_reset": "Tehaseseadete taastamine", + "terminal_cfg_factory_reset_desc": "Kustutab kogu seadme seadistuse.", + "terminal_cfg_factory_reset_title": "Kas taastada seadme tehaseseaded?", + "terminal_cfg_factory_reset_action": "Kustuta seadistus", + "terminal_cfg_factory_reset_confirm": "See kustutab seadmest kogu seadistuse: WiFi-võrgud, taustserveri andmed, viigud ja kõik muud seaded. Seade lähtestatakse vaikeseadetele.", + "terminal_cfg_read_failed_json_title": "JSON-seadistust ei õnnestunud lugeda", + "terminal_cfg_read_failed_raw_title": "Toorseadistust ei õnnestunud lugeda", + "terminal_cfg_read_failed_desc": "Seade ei vastanud {attempts} katse järel.", + "terminal_cfg_common_causes": "Levinud põhjused:", + "terminal_cfg_cause_busy": "Seade töötleb parasjagu teist käsku.", + "terminal_cfg_cause_disconnected": "Seadme ühendus katkes või see taaskäivitus.", + "terminal_cfg_cause_unsupported": "Püsivara versioon ei toeta seda käsku.", + + "common_status": "Olek", + "common_version": "Versioon", + "common_created": "Loodud", + "common_create": "Loo", + "common_done": "Valmis", + "common_enable": "Luba", + "common_disable": "Keela", + "common_are_you_sure": "Kas oled kindel?", + "common_generating": "Genereerimine...", + "hubs_title": "Jaoturid", + "hubs_subtitle": "Kõik sinu kontole registreeritud jaoturid.", + "hubs_add": "Lisa jaotur", + "hubs_load_failed": "Jaoturite laadimine ebaõnnestus.", + "hubs_empty_title": "Jaotureid pole veel", + "hubs_empty_desc": "Jaotur on seade, mis edastab käsud sinu shockeritele. Alustamiseks lisa üks.", + "hubs_create_title": "Loo jaotur", + "hubs_name_label": "Jaoturi nimi", + "hubs_name_placeholder": "Minu jaotur", + "hub_toast_not_connected": "Serveriga pole ühendust", + "hub_toast_try_later": "Proovi hetke pärast uuesti.", + "hub_reboot_title": "Kas taaskäivitada {name}?", + "hub_reboot_desc": "Jaotur katkestab ühenduse ja taaskäivitub. Sellega seotud shockerid ei reageeri enne, kui see on taas võrgus.", + "hub_reboot": "Taaskäivita", + "hub_hotspot_enable_title": "Kas lubada Wi-Fi kuumkoht seadmes {name}?", + "hub_hotspot_disable_title": "Kas keelata Wi-Fi kuumkoht seadmes {name}?", + "hub_hotspot_enable_desc": "Jaotur levitab oma seadistusvõrku. See jääb sinu Wi-Fi kaudu kättesaadavaks, kuid kuumkoht on avatud kõigile levialas olijatele, kuni selle välja lülitad.", + "hub_hotspot_disable_desc": "Seadistuse kuumkoht lülitub välja. Kui jaotur pole veel sinu Wi-Fi-võrgus, vajad selle uuesti seadistamiseks füüsilist ligipääsu.", + "hub_delete_desc": "Oled kustutamas jaoturit {#strong}{name}{/strong}.", + "hub_delete_shockers": "See kustutab ka järgmised shockerid:", + "hub_edit_title": "Muuda jaoturit", + "hub_edit_apply": "Rakenda", + "hub_pair_title_generate": "Kas luua sidumiskood?", + "hub_pair_title_generated": "Sidumiskood loodud", + "hub_pair_title_paired": "Jaotur seotud", + "hub_pair_consumed": "{#strong}{name}{/strong} kasutas seda sidumiskoodi ja on nüüd seotud.", + "hub_pair_used": "Koodi on kasutatud ja see ei kehti enam.", + "hub_pair_generated_for": "Sidumiskood loodud jaoturile {#strong}{name}{/strong}.", + "hub_copy_now": "Allolevat koodi ei saa hiljem enam vaadata. Kopeeri see kohe ja uuenda sellega oma kliente.", + "hub_pair_generate_for": "Oled loomas sidumiskoodi jaoturile {#strong}{name}{/strong}.", + "hub_pair_valid_for": "See kehtib 15 minutit pärast loomist.", + "hub_pair_one_active": "Igal jaoturil on korraga ainult üks kehtiv sidumiskood; uus kood asendab vanema.", + "hub_pair_complete": "Sidumine lõpetatud", + "hub_pair_code_label": "Sidumiskood:", + "hub_pair_copied_close": "Kood kopeeritud, sulge", + "hub_pair_get": "Hangi sidumiskood", + "hub_token_generated": "Tõend loodud", + "hub_token_generated_for": "Jaoturile {#strong}{name}{/strong} loodi uus tõend.", + "hub_token_regenerate_for": "Oled loomas jaoturile {#strong}{name}{/strong} uut tõendit.", + "hub_token_invalidate": "See muudab praeguse tõendi kehtetuks ja katkestab seda kasutavate klientide ühenduse.", + "hub_token_confirm": "Kas oled kindel, et soovid seda teha?", + "hub_token_label": "Uus tõend:", + "hub_token_copied_close": "Tõend kopeeritud, sulge", + "hub_token_regenerate": "Loo uus tõend", + "hub_menu_update": "Uuenda", + "hub_menu_label": "Jaotur", + "hub_menu_hotspot_enable": "Luba Wi-Fi kuumkoht", + "hub_menu_hotspot_disable": "Keela Wi-Fi kuumkoht", + "hub_menu_pair": "Seo", + "hub_menu_estop": "Hädaseiskamine", + "hub_update_breadcrumb": "Uuenda", + "hub_update_unknown_hub": "Tundmatu jaotur", + "hub_update_unknown_task": "Tundmatu toiming", + "hub_update_task_metadata": "Metaandmete hankimine", + "hub_update_task_preparing": "Uuenduseks valmistumine", + "hub_update_task_flash_fs": "Failisüsteemi paigaldamine", + "hub_update_task_verify_fs": "Failisüsteemi kontrollimine", + "hub_update_task_flash_app": "Rakenduse paigaldamine", + "hub_update_task_bootable": "Rakenduse käivitatavaks märkimine", + "hub_update_task_rebooting": "Taaskäivitamine", + "hub_update_status_started": "Alustatud", + "hub_update_status_running": "Käimas", + "hub_update_status_finished": "Lõpetatud", + "hub_update_status_error": "Viga", + "hub_update_status_timeout": "Aegumine", + "hub_update_confirm_title": "Kinnita püsivara uuendus", + "hub_update_confirm_desc": "Kas uuendada {#strong}{name}{/strong} versioonile {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "See versioon ei pruugi olla stabiilsest kanalist ja võib sisaldada vigu.", + "hub_update_title": "Uuenda: {name}", + "hub_update_subtitle": "Halda selle jaoturi püsivara uuendusi.", + "hub_update_status_title": "Jaoturi olek", + "hub_update_firmware": "Püsivara: {#mono}{version}{/mono}", + "hub_update_confirm": "Uuenda", + "hub_update_success": "Uuendus õnnestus", + "hub_update_rolled_back": "Seade naasis eelmisele versioonile", + "hub_update_back": "Tagasi jaoturite juurde", + "hub_update_flash_again": "Paigalda uuesti", + "hub_update_card_title": "Püsivara uuendus", + "hub_update_card_desc": "Vali paigaldatav püsivara kanal ja versioon.", + "hub_update_to": "Uuenda versioonile {version}", + "hub_update_must_be_online": "Uuenduse alustamiseks peab jaotur olema võrgus.", + "hub_update_updating_to": "Uuendamine versioonile {version}...", + "hub_update_total": "Kokku", + "hub_update_task": "Toiming", + "hub_update_history": "Uuenduste ajalugu", + "hub_update_no_history": "Selle jaoturi uuenduste ajalugu ei leitud.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Algus", + "hub_update_col_message": "Sõnum", + "hub_update_loading": "Jaoturi teabe laadimine...", + "hub_update_not_found": "Jaoturit ei leitud.", + "home_breadcrumb": "Avaleht", + "home_welcome": "Tere tulemast tagasi", + "home_welcome_name": "Tere tulemast tagasi, {name}", + "home_subtitle": "Siin on ülevaade sinu OpenShocki seadistusest.", + "home_hubs_online": "{count} võrgus", + "home_hub_status": "Jaoturite olek", + "home_no_hubs": "Jaotureid pole", + "home_all_online": "Kõik võrgus", + "home_all_offline": "Kõik võrguühenduseta", + "home_some_online": "{online}/{total} võrgus", + "home_quick_links": "Kiirlingid", + "home_my_shockers": "Minu shockerid", + "home_my_shockers_desc": "Juhi oma shockereid", + "home_hubs_desc": "Halda oma jaotureid", + "home_shared_desc": "Sinuga jagatud shockerid", + "home_public_desc": "Halda jagamislinke", + "home_get_started": "Alusta", + "home_get_started_desc": "Sul pole veel jaotureid. Loo jaotur, et ühendada oma esimene seade, ja lisa sellele siis shockerid.", + "home_set_up_hub": "Seadista jaotur", + "home_first_shocker": "Lisa oma esimene shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Sul on seadistatud {count} jaotur. Lisa shocker, et seda juhtima hakata.", + "countPlural=other": "Sul on seadistatud {count} jaoturit. Lisa shocker, et seda juhtima hakata." + } + } + ], + "home_go_to_shockers": "Mine shockerite juurde", + "profile_title": "Profiil", + "profile_coming_soon": "Profiil tuleb peagi", + "profile_coming_soon_desc": "Sinu avalik profiil pole veel saadaval. Konto andmed leiad seadetest.", + + "common_retry": "Proovi uuesti", + "common_never_used": "Pole kunagi kasutatud", + "common_expires": "Aegub {time}", + "common_search_placeholder": "Otsi...", + "common_unknown": "Tundmatu", + "settings_breadcrumb_account": "Konto", + "account_subtitle": "Sinu sisselogimisandmed ja konto toimingud.", + "account_change_username": "Muuda kasutajanime", + "account_change_email": "Muuda e-posti", + "account_change_password": "Muuda parooli", + "account_username_label": "Kasutajanimi", + "account_email_label": "E-post", + "account_password_label": "Parool", + "account_new_password_label": "Uus parool", + "account_confirm_password_label": "Kinnita uus parool", + "account_oauth_only": "Pole saadaval ainult OAuthi kasutavatele kontodele", + "account_oauth_no_password": "See konto logib sisse OAuthi kaudu ja sellel pole parooli.", + "account_diagnostics": "Diagnostika", + "account_diagnostics_desc": "Aita meil parandada krahhe ja aeglaseid API-päringuid. Aruanded sisaldavad veateadet, pinujälge ja sinu IP-aadressi. Vaikimisi väljas.", + "account_diagnostics_level": "Diagnostika tase", + "account_telemetry_off": "Väljas", + "account_telemetry_off_desc": "Ära saada midagi.", + "account_telemetry_errors": "Vead", + "account_telemetry_errors_desc": "Saada ainult brauseri vearaportid.", + "account_telemetry_full": "Täielik", + "account_telemetry_full_desc": "Vearaportid ja API-päringute jäljed (lehel liikumist ei saadeta).", + "account_toast_deactivated": "Konto on deaktiveeritud", + "account_deactivate_title": "Deaktiveeri konto", + "account_deactivate_desc": "Kas oled kindel, et soovid oma konto deaktiveerida?", + "account_deactivate": "Deaktiveeri konto", + "account_email_title": "Muuda e-posti", + "account_email_desc": "Sisesta uus e-posti aadress ja kinnita see praeguse parooliga.", + "account_email_toast_sent": "Kinnitusmeil saadeti aadressile {email}. Muudatuse rakendamiseks klõpsa meilis oleval lingil.", + "account_new_email": "Uus e-post", + "account_current_password": "Praegune parool", + "account_password_title": "Muuda parooli", + "account_password_desc": "Sisesta praegune parool ja vali uus.", + "account_password_toast": "Parool on muudetud", + "account_username_title": "Muuda kasutajanime", + "account_username_desc": "Sisesta uus kasutajanimi.", + "account_new_username": "Uus kasutajanimi", + "account_username_toast": "Kasutajanimi on muudetud", + "tokens_subtitle": "API-tõendeid kasutatakse OpenShocki API-ga autentimiseks.", + "tokens_generate": "Loo tõend", + "tokens_toast_refreshed": "Tõendid värskendatud", + "tokens_empty_title": "API-tõendeid pole", + "tokens_empty_desc": "Loo tõend, et OpenShocki API-ga autentida.", + "tokens_created_on": "Loodud {date}", + "tokens_last_used": "Viimati kasutatud {time}", + "tokens_never_expires": "Ei aegu kunagi", + "tokens_load_failed": "API-tõendite laadimine ebaõnnestus.", + "token_toast_edited": "Tõendit muudeti", + "token_name_required": "Nimi on kohustuslik", + "token_name_too_long": "Nimi on liiga pikk", + "token_edit_title": "Muuda API-tõendit", + "token_name_label": "Tõendi nimi", + "token_name_placeholder": "Tõendi nimi...", + "token_permissions": "Õigused", + "token_perm_category_shockers": "Shockerid", + "token_perm_category_devices": "Jaoturid", + "token_perm_category_usershares": "Kasutajatega jagamised", + "token_perm_category_publicshares": "Avalikud jagamised", + "token_perm_use": "Kasuta", + "token_perm_edit": "Muuda", + "token_perm_pause": "Peata", + "token_perm_auth": "Autendi", + "token_shocker_control": "Shockerite juhtimine", + "token_toast_paused": "Tõend peatatud", + "token_toast_resumed": "Tõend jätkab", + "token_delete_title": "Kustuta API-tõend", + "token_delete_desc": "Kas oled kindel, et soovid kustutada {#strong}{name}{/strong}?", + "token_delete_permanent": "Seda ei saa tagasi võtta. Tõend kustutatakse jäädavalt.", + "token_toast_deleted": "Tõend kustutati", + "token_resume": "Jätka tõendit", + "token_pause": "Peata tõend", + "token_mode_clamp_desc": "Clamp: lubatud vahemikust väljas olevad päringud piiratakse lähima piirini (miinimum või maksimum).", + "token_mode_lerp_desc": "Lerp: kogu sisendvahemik skaleeritakse lineaarselt sinu lubatud miinimum–maksimum vahemikku.", + "token_paused_desc": "Peatatud tõend ei saa shockeritele juhtsõnumeid saata.", + "token_intensity_range": "Tugevuse vahemik", + "token_duration_range": "Kestuse vahemik", + "token_new_breadcrumb": "Uus", + "token_redirect_not_allowed": "Antud redirect_uri pole lubatud. Lubatud on ainult loopback-aadressid või rakenduse enda skeemid.", + "token_params_missing": "Kohustuslikud GET-parameetrid puuduvad. Veendu, et name, redirect_uri ja permissions on antud.", + "token_invalid_permissions": "Antud on vigased õigused: {list}", + "token_toast_created": "Tõend loodi", + "token_request_title": "API-tõendi taotlus", + "token_access_granted": "Juurdepääs antud", + "token_shared_redirecting": "Tõend loodi ja jagati rakendusega. Suuname sind tagasi aadressile {#b}{uri}{/b}.", + "token_not_redirected": "Kui sind automaatselt ei suunata, kasuta allolevat nuppu.", + "token_finish": "Lõpeta", + "token_generated_title": "API-tõend loodud", + "token_copy_now": "Kopeeri oma API-tõend kohe, hiljem seda enam näha ei saa!", + "token_new_title": "Uus API-tõend", + "token_external_desc": "Väline rakendus taotleb juurdepääsu sinu kontole. Vaata allolevad õigused üle ja kohanda neid enne juurdepääsu lubamist.", + "token_new_desc": "Seadista ja loo oma kontole uus API-tõend.", + "token_external_requesting": "{#b}{name}{/b} taotleb API-tõendit. Sinu tõend jagatakse rakendusega aadressil {#b}{uri}{/b}.", + "token_allow": "Luba", + "token_generate": "Loo", + "token_deny": "Keeldu", + "sessions_subtitle": "Kõik sinu konto aktiivsed seansid. Tühista need, mida sa ei tunne.", + "sessions_unknown_device": "Tundmatu seade", + "sessions_toast_refreshed": "Seansid värskendatud", + "sessions_load_failed": "Seansside laadimine ebaõnnestus.", + "sessions_empty_title": "Aktiivseid seansse pole", + "sessions_empty_desc": "Seansid ilmuvad siia, kui logid sisse brauserist või rakendusest.", + "sessions_last_seen": "Viimati nähtud {time}", + "sessions_signed_in": "Sisse logitud {time}", + "session_toast_revoked": "Seanss tühistati", + "session_revoke_title": "Tühista seanss", + "session_revoke": "Tühista", + "session_revoke_desc": "Kas oled kindel, et soovid selle seansi tühistada?", + "session_revoke_from": "Seanss logiti sisse aadressilt {#strong}{ip}{/strong}, kasutades {#strong}{agent}{/strong}", + "connections_title": "OAuthi ühendused", + "connections_subtitle": "Seo või eemalda kolmandate osapoolte kontosid, et kiiremini sisse logida ja profiili sünkroonis hoida.", + "connections_toast_linked": "Konto seotud.", + "connections_toast_cancelled": "Sidumine katkestati.", + "connections_toast_failed": "Sidumine ebaõnnestus.", + "connections_toast_removed": "Ühendus eemaldati", + "connections_refreshing": "Värskendamine…", + "connections_link_new": "Seo uus teenusepakkuja", + "connections_empty_title": "Ühendusi pole veel", + "connections_empty_desc": "Saadaolevate teenusepakkujate ühendamiseks vali ülalt „Seo uus teenusepakkuja“.", + "connections_unlink": "Eemalda", + "connections_load_failed": "OAuthi ühenduste laadimine ebaõnnestus.", + "connections_unlink_title": "Kas eemaldada {name}?", + "connections_unlink_title_generic": "Kas eemaldada see konto?", + "connections_unlink_desc": "Sa ei saa selle teenusepakkujaga enam sisse logida, kui sa seda uuesti ei seo.", + "provider_starting": "{name} käivitamine...", + "provider_link": "Seo {name}", + "audit_subtitle": "Sinu konto turvalisusega seotud tegevused. Vaata üle kõik, mida sa ei tunne.", + "audit_col_time": "Aeg", + "audit_col_action": "Toiming", + "audit_col_details": "Üksikasjad", + "audit_col_reason": "Põhjus", + "audit_col_ip": "IP-aadress", + "audit_col_device": "Seade", + "audit_action_login": "Sisse logitud", + "audit_action_logout": "Välja logitud", + "audit_action_password_changed": "Parool muudetud", + "audit_action_email_change_requested": "E-posti muutmist taotletud", + "audit_action_email_changed": "E-post muudetud", + "audit_action_username_changed": "Kasutajanimi muudetud", + "audit_action_api_token_created": "API-tõend loodud", + "audit_action_api_token_deleted": "API-tõend kustutatud", + "audit_action_oauth_connected": "Ühendus lisatud", + "audit_action_oauth_disconnected": "Ühendus eemaldatud", + "audit_action_account_deactivated": "Konto deaktiveeritud", + "audit_action_account_reactivated": "Konto taasaktiveeritud", + "audit_action_account_deleted": "Konto kustutatud", + "audit_action_automation_token_created": "Automatiseerimistõend loodud", + "audit_action_automation_token_updated": "Automatiseerimistõend uuendatud", + "audit_action_automation_token_rotated": "Automatiseerimistõend vahetatud", + "audit_action_automation_token_deleted": "Automatiseerimistõend kustutatud", + "audit_action_automation_token_used": "Automatiseerimistõendit kasutatud", + "audit_meta_session": "Seanss {id}", + "audit_meta_changed": "{old} → {new}", + "audit_meta_email_requested": "Taotleti muutmist aadressiks {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} konto eemaldatud)", + "countPlural=other": "{name} ({count} kontot eemaldatud)" + } + } + ], + "audit_meta_scheduled_deletion": "Kustutamine ajastatud", + "audit_meta_kept": "Säilitatud taasaktiveerimiseks", + + "common_view": "Vaata", + "common_save": "Salvesta", + "common_saving": "Salvestamine...", + "common_back": "Tagasi", + "common_shared_by": "Jagas", + "common_user_avatar": "Kasutaja avatar", + "common_toast_saved": "Muudatused salvestatud", + "pause_reason_shocker": "Peatatud shockeri tasemel", + "pause_reason_shocker_user_share": "Peatatud shockeri ja kasutajajagamise tasemel", + "pause_reason_shocker_public_share": "Peatatud shockeri ja avaliku jagamise tasemel", + "pause_reason_user_share": "Peatatud kasutajajagamise tasemel", + "pause_reason_public_share": "Peatatud avaliku jagamise tasemel", + "public_shares_subtitle": "Link, mida saab kasutada igaüks, kontot pole vaja.", + "public_shares_new": "Uus jagamine", + "public_share_never_expires": "Ei aegu kunagi", + "public_shares_empty_title": "Avalikke jagamisi pole veel", + "public_shares_empty_desc": "Loo link, millega igaüks saab sinu shockereid juhtida.", + "public_share_expired": "Aegunud", + "public_share_no_expiry": "Aegumiseta", + "public_share_label": "Avalik jagamine", + "public_share_toast_created": "Uus avalik jagamine loodud", + "public_share_create_title": "Loo avalik jagamine", + "public_share_toast_deleted": "Avalik jagamine kustutatud", + "public_share_delete_title": "Kustuta avalik jagamine", + "public_share_delete_desc": "Kas oled kindel, et soovid avaliku jagamise {#strong}{name}{/strong} kustutada?", + "public_share_edit_title": "Avalik jagamine: {name}", + "public_share_edit_subtitle": "Muutmine: muudatused jõustuvad salvestamisel.", + "public_share_add_shocker": "Lisa shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Jagamisse lisati {count} shocker", + "countPlural=other": "Jagamisse lisati {count} shockerit" + } + } + ], + "public_share_empty_shockers_title": "Selles jagamises pole shockereid", + "public_share_empty_shockers_desc": "Lisa shocker ja igaüks, kellel on link, saab seda juhtida.", + "public_share_load_failed": "Avaliku jagamise andmete laadimine ebaõnnestus", + "public_share_paused_here": "Selles jagamises peatatud", + "public_share_resume_shocker": "Jätka shockerit", + "public_share_pause_shocker": "Peata shocker", + "public_share_remove": "Eemalda jagamisest", + "public_share_toast_removed": "Shocker eemaldati jagamisest", + "public_share_add_title": "Lisa shockereid", + "public_share_add_desc": "Lisa sellesse avalikku jagamisse shockereid. Nende piirid saad määrata pärast lisamist.", + "public_share_add_placeholder": "Vali jagatavad shockerid...", + "public_share_add_no_match": "Sobivaid shockereid pole", + "public_share_add_submit": "Lisa shockerid", + "public_share_view_loading": "Jagamise andmete laadimine...", + "public_share_view_title": "Avalik jagamislink", + "public_share_view_desc": "Sisene külalisena või logi sisse oma OpenShocki kontoga", + "public_share_view_guest_name": "Külalise nimi", + "public_share_view_enter": "Sisene", + "public_share_view_enter_guest": "Sisene külalisena", + "public_share_login": "Logi sisse", + "perm_shock_on": "Šokk lubatud", + "perm_shock_off": "Šokk keelatud", + "perm_vibrate_on": "Värin lubatud", + "perm_vibrate_off": "Värin keelatud", + "perm_sound_on": "Heli lubatud", + "perm_sound_off": "Heli keelatud", + "perm_live_on": "Live lubatud", + "perm_live_off": "Live keelatud", + "perm_live_control": "Otsejuhtimine", + "user_selector_avatar_of": "Kasutaja {name} avatar", + "user_selector_placeholder": "Sisesta kasutajanimi", + "user_selector_aria": "Otsitav kasutajanimi", + "user_selector_search": "Otsi kasutajat", + "user_selector_found": "Kasutaja leitud", + + "common_remove": "Eemalda", + "user_shares_subtitle": "Otsesed ja püsivad jagamised teiste kasutajatega.", + "user_shares_toast_invited": "Kasutajale {name} saadeti shockeri kutse", + "user_shares_redeem": "Lunasta kood", + "user_shares_new": "Uus jagamine", + "user_shares_tab_shares": "Jagamised", + "user_shares_tab_incoming": "Minuga jagatud", + "user_shares_tab_invites": "Kutsed", + "share_code_create_title": "Uus jagamiskood", + "share_code_create_desc": "Loo jagamiskood või kutse", + "share_code_shocker_placeholder": "Vali jagatavad shockerid...", + "share_code_no_match": "Sobivaid shockereid pole", + "share_code_send_invite": "Saada kutse", + "share_code_create": "Loo jagamiskood", + "share_code_created_title": "Jagamiskood loodud", + "share_code_created_desc": "Kopeeri jagamiskood või link!", + "share_code_redeem_title": "Lunasta jagamiskood", + "share_code_redeem_desc": "Sisesta lunastatav jagamiskood", + "share_code_redeem_placeholder": "Sisesta jagamiskood", + "share_code_redeemed": "Lunastatud!", + "share_code_shared_shockers": "Jagatud shockerid", + "share_code_redeeming": "Lunastamine...", + "share_code_redeem": "Lunasta", + "incoming_shares_empty_title": "Sinuga pole midagi jagatud", + "incoming_shares_empty_desc": "Keegi pole sinuga veel shockerit jaganud.", + "incoming_share_toast_removed": "Kasutaja {name} jagamine eemaldati", + "incoming_share_remove_title": "Eemalda jagamine", + "incoming_share_remove_desc": "Kas oled kindel, et soovid kasutaja {#strong}{name}{/strong} jagamise eemaldada?", + "incoming_share_toast_removed_shocker": "Kasutaja {name} jagatud {shocker} eemaldati", + "incoming_share_remove_shocker_title": "Kas eemaldada see jagatud shocker?", + "incoming_share_remove_shocker_desc": "Kas oled kindel, et soovid kasutaja {#strong}{name}{/strong} jagatud shockeri {#strong}{shocker}{/strong} eemaldada?", + "incoming_share_manage_from": "Halda jagamisi kasutajalt", + "share_remove": "Eemalda jagamine", + "invites_empty_title": "Kutseid pole veel", + "invites_empty_desc": "Sul pole sissetulevaid ega väljaminevaid kutseid.", + "invites_outgoing": "Väljaminevad", + "invites_outgoing_empty_title": "Väljaminevaid kutseid pole", + "invites_outgoing_empty_desc": "Sul pole väljaminevaid kutseid.", + "invites_incoming": "Sissetulevad", + "invites_incoming_empty_title": "Sissetulevaid kutseid pole", + "invites_incoming_empty_desc": "Sul pole sissetulevaid kutseid.", + "invite_toast_accepted": "Kasutaja {name} kutse vastu võetud", + "invite_toast_declined": "Kasutaja {name} kutsest keelduti", + "invite_deny_title": "Keeldu kutsest", + "invite_deny_label": "Keeldu kutsest", + "invite_deny": "Keeldu", + "invite_deny_desc": "Kas oled kindel, et soovid kasutaja {#strong}{name}{/strong} kutsest keelduda?", + "invite_accept": "Võta kutse vastu", + "invite_toast_cancelled_for": "Kasutaja {name} kutse tühistati ({id})", + "invite_toast_cancelled": "Kutse {id} tühistati", + "invite_cancel_title": "Tühista kutse", + "invite_cancel": "Tühista", + "invite_cancel_for_desc": "Kas oled kindel, et soovid kasutaja {#strong}{name}{/strong} kutse tühistada?", + "invite_cancel_code_desc": "Kas oled kindel, et soovid koodiga {#strong}{code}{/strong} kutse tühistada?", + "invite_cancel_outstanding": "Tühista ootel kutse", + "outgoing_shares_empty_title": "Jagatud shockereid pole", + "outgoing_shares_empty_desc": "Sa pole veel teiste kasutajatega ühtegi shockerit jaganud.", + "outgoing_share_toast_removed": "Jagatud shocker {name} eemaldati", + "outgoing_share_remove_title": "Kas lõpetada selle shockeri jagamine?", + "outgoing_share_editing_for": "Jagamiste muutmine kasutajale", + "outgoing_share_limits": "Piirid ja õigused", + "outgoing_share_same": "Kõigil shockeritel samad piirangud", + "outgoing_share_per_desc": "Kohanda piiranguid shockeri kaupa", + "outgoing_share_all": "Kõik", + "outgoing_share_per": "Shockeri kaupa", + + "outgoing_share_remove_desc": "Kas oled kindel, et soovid lõpetada shockeri {#strong}{shocker}{/strong} jagamise kasutajaga {#strong}{name}{/strong}?", + + "report_breadcrumb": "Teata API-tõenditest", + "report_toast_clipboard_failed": "Lõikelaua lugemine ebaõnnestus: {error}", + "report_title": "Teata lekkinud API-tõenditest", + "report_paste": "Kleebi lõikelaualt", + "report_warning": "See vorm on ainult kogemata lekkinud API-tõenditest teatamiseks.", + "report_abuse_warning": "Tahtlik kuritarvitamine toob kaasa blokeerimise või ranged piirangud.", + "report_detected": "Tuvastatud tõendid", + "report_invalid": "Üks või mitu tõendit tunduvad vigased. Kontrolli vormingut.", + "report_acknowledge": "Kinnitan, et saan aru, milleks see funktsioon on, ja võtan vastutuse.", + "report_submit": "Saada teade", + "turnstile_disabled": "Turnstile on keelatud", + "common_internal_error": "Sisemine viga", + "resend_toast_sent": "Aktiveerimismeil saadeti. Vaata postkasti ja rämpsposti kausta.", + "resend_toast_throttled": "Liiga palju aktiveerimismeile on küsitud. Proovi hiljem uuesti.", + "resend_toast_unavailable": "Sellest brauserist ei saa aktiveerimismeili uuesti saata. Kui sinu konto pole veel aktiveeritud, saadab sisselogimine uue lingi.", + "resend_button": "Meili ei tulnud? Saada uuesti", + "expiration_label": "Aegumine", + "expiration_never": "Mitte kunagi", + "expiration_custom": "Kohandatud", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} päev", "countPlural=other": "{count} päeva" } + } + ], + "expiration_required": "Aegumiskuupäev on kohustuslik", + "expiration_never_desc": "See ei aegu kunagi", + "expiration_expires_at": "Aegub {time} ({date})", + "date_picker_placeholder": "Vali kuupäev", + "telemetry_toast_title": "Kas aitad OpenShocki paremaks teha?", + "telemetry_toast_desc": "Saada diagnostikat, et saaksime parandada krahhe ja aeglaseid API-päringuid. Aruanded sisaldavad veateadet, pinujälge ja sinu IP-aadressi. Saad seda igal ajal konto seadetes muuta.", + "telemetry_toast_no": "Ei, aitäh", + "telemetry_toast_errors": "Ainult vead", + "telemetry_toast_full": "Täielik", + "table_show_details": "Näita üksikasju", + "table_hide_details": "Peida üksikasjad", + "table_no_results": "Tulemusi pole.", + "table_sort_asc": "Sorteeri: {name}, kasvav", + "table_sort_desc": "Sorteeri: {name}, kahanev", + "table_sort_none": "Sorteeri: {name}, sortimata", + "cell_na": "Puudub", + "cell_not_applicable": "Ei kohaldu", + "cell_invalid": "Vigane", + "cell_unavailable": "Pole saadaval", + "cell_none": "Puudub", + "oauth_login_with": "Logi sisse teenusega {provider}", + "oauth_signup_with": "Registreeru teenusega {provider}", + "signalr_connect_failed": "Serveriga ühendumine ebaõnnestus!", + "signalr_disconnect_failed": "Serverist lahtiühendamisel tekkis viga!", + "signalr_invalid_update": "Serverilt saadi vigane uuendus!", + "signalr_invalid_log": "Serverilt saadi vigased logiandmed!", + "signalr_invalid_ota": "Serverilt saadi vigased püsivara uuenduse andmed!", + "ota_toast_failed": "Jaoturi püsivara uuendus ebaõnnestus: {message}", + "ota_toast_succeeded": "Jaoturi püsivara uuendus õnnestus!", + "ota_toast_rolled_back": "Jaoturi püsivara naasis eelmisele versioonile", + "lcg_connect_failed": "Otsejuhtimise lüüsiga ühendumine ebaõnnestus", + "terminal_toast_bootloader_failed": "Alglaadurisse sisenemine ebaõnnestus: {error}", + "terminal_toast_app_mode_failed": "Rakendusrežiimi sisenemine ebaõnnestus: {error}", + + "problem_account_account_not_activated_title": "Konto pole aktiveeritud", + "problem_account_account_not_activated_desc": "Otsi aktiveerimismeili oma postkastist.", + "problem_account_activation_not_found_title": "Aktiveerimislink on vigane", + "problem_account_activation_not_found_desc": "Link võib olla aegunud või juba kasutatud.", + "problem_account_activation_resend_too_many_title": "Liiga palju aktiveerimismeile küsitud", + "problem_account_activation_resend_too_many_desc": "Oota natuke, enne kui uuesti proovid.", + "problem_account_activation_resend_unavailable_title": "Aktiveerimismeili ei saa uuesti saata", + "problem_account_activation_resend_unavailable_desc": "Uue aktiveerimislingi saamiseks logi uuesti sisse.", + "problem_account_deactivate_already_deactivated_title": "Konto on juba deaktiveeritud", + "problem_account_deactivate_denied_privileged_title": "Privilegeeritud kontosid ei saa deaktiveerida", + "problem_account_deactivate_unauthorized_title": "Sul pole lubatud seda teha", + "problem_account_deactivated_title": "See konto on deaktiveeritud", + "problem_account_email_already_in_use_title": "See e-posti aadress on juba kasutusel", + "problem_account_email_invalid_title": "See e-posti aadress on vigane", + "problem_account_email_taken_title": "See e-posti aadress on juba kasutusel", + "problem_account_email_too_many_requests_title": "Liiga palju e-posti muutmise taotlusi", + "problem_account_email_too_many_requests_desc": "Oota natuke, enne kui uuesti proovid.", + "problem_account_email_unchanged_title": "See on juba sinu e-posti aadress", + "problem_account_email_verify_not_found_title": "Kinnituslink on vigane", + "problem_account_email_verify_not_found_desc": "Link võib olla aegunud või juba kasutatud.", + "problem_account_o_auth_only_title": "Sellel kontol pole parooli", + "problem_account_o_auth_only_desc": "Logi sisse teenusepakkujaga, millega registreerusid.", + "problem_account_password_not_set_title": "Parooli pole määratud", + "problem_account_password_not_set_desc": "See konto logib sisse välise teenusepakkuja kaudu.", + "problem_account_password_old_password_invalid_title": "Praegune parool on vale", + "problem_account_username_invalid_title": "See kasutajanimi pole lubatud", + "problem_account_username_recently_changed_title": "Kasutajanime muudeti hiljuti", + "problem_account_username_recently_changed_desc": "Kasutajanime saab muuta kord 7 päeva jooksul.", + "problem_account_username_taken_title": "See kasutajanimi on juba võetud", + "problem_admin_user_deactivated_title": "See kasutaja on deaktiveeritud", + "problem_admin_user_not_activated_title": "Seda kasutajat pole veel aktiveeritud", + "problem_api_token_can_only_delete_self_title": "API-tõend saab kustutada ainult iseennast", + "problem_api_token_not_found_title": "API-tõendit ei leitud", + "problem_api_token_paused_title": "See API-tõend on peatatud", + "problem_assign_lcg_bad_schema_version_title": "Jaoturi protokolliversioon ei ole toetatud", + "problem_assign_lcg_bad_schema_version_desc": "Ühendumiseks uuenda jaoturi püsivara.", + "problem_assign_lcg_no_lcg_available_title": "Lüüs pole saadaval", + "problem_assign_lcg_no_lcg_available_desc": "Praegu pole ükski otsejuhtimise lüüs saadaval. Proovi hiljem uuesti.", + "problem_authentication_account_deactivated_title": "See konto on deaktiveeritud", + "problem_authentication_account_not_activated_title": "See konto pole aktiveeritud", + "problem_authentication_cookie_missing_or_invalid_title": "Sa pole sisse logitud", + "problem_authentication_cookie_missing_or_invalid_desc": "Sinu seanss võis aeguda. Palun logi uuesti sisse.", + "problem_authentication_header_missing_or_invalid_title": "Vigane API-tõend", + "problem_authentication_session_invalid_title": "Seanss aegus", + "problem_authentication_session_invalid_desc": "Palun logi uuesti sisse.", + "problem_authentication_token_invalid_title": "Vigane API-tõend", + "problem_authentication_unknown_error_title": "Autentimine ebaõnnestus", + "problem_authorization_policy_not_met_title": "Sul pole selleks õigust", + "problem_authorization_token_only_title": "See toiming nõuab API-tõendit", + "problem_authorization_token_permission_missing_title": "Sellel API-tõendil puudub vajalik õigus", + "problem_authorization_unknown_error_title": "Volitamine ebaõnnestus", + "problem_authorization_user_session_only_title": "See toiming nõuab sisselogitud seanssi", + "problem_automation_token_not_allowed_for_account_title": "Automatiseerimistõendeid ei saa kasutada privilegeeritud kontodega", + "problem_configuration_already_exists_title": "Selle nimega seadistuse kirje on juba olemas", + "problem_configuration_invalid_name_format_title": "Vigane seadistuse nimi", + "problem_configuration_invalid_name_format_desc": "Lubatud on ainult A kuni Z ja alakriipsud.", + "problem_configuration_invalid_value_format_title": "Väärtus ei vasta seadistuse tüübile", + "problem_configuration_not_found_title": "Seadistuse kirjet ei leitud", + "problem_control_stats_invalid_range_title": "Algkuupäev ei tohi olla pärast lõppkuupäeva", + "problem_control_stats_invalid_time_zone_title": "Tundmatu ajavöönd", + "problem_control_stats_missing_capability_title": "Juhtimisstatistika pole sellel serveril saadaval", + "problem_device_not_found_title": "Jaoturit ei leitud", + "problem_device_not_online_title": "Jaotur pole võrgus", + "problem_device_too_many_hubs_title": "Oled jõudnud jaoturite maksimumarvuni", + "problem_device_too_many_shockers_title": "See jaotur on jõudnud shockerite maksimumarvuni", + "problem_endpoint_retired_title": "See funktsioon pole enam saadaval", + "problem_expression_error_title": "Vigane filtriavaldis", + "problem_internal_server_error_title": "Meie poolel läks midagi valesti", + "problem_login_invalid_credentials_title": "Vale kasutajanimi või parool", + "problem_login_invalid_domain_title": "Sellelt aadressilt sisselogimine pole lubatud", + "problem_o_auth_connection_already_exists_title": "Sinu konto on juba selle teenusepakkujaga ühendatud", + "problem_o_auth_connection_already_linked_title": "See väline konto on juba seotud teise kasutajaga", + "problem_o_auth_flow_anonymous_only_title": "Oled juba sisse logitud", + "problem_o_auth_flow_mismatch_title": "Sisselogimiskatse ei klapi", + "problem_o_auth_flow_mismatch_desc": "Palun alusta otsast.", + "problem_o_auth_flow_missing_data_title": "Teenusepakkuja ei tagastanud sinu konto andmeid", + "problem_o_auth_flow_missing_data_desc": "Palun proovi uuesti.", + "problem_o_auth_flow_not_found_title": "Sisselogimiskatse aegus", + "problem_o_auth_flow_not_found_desc": "Palun alusta otsast.", + "problem_o_auth_flow_unsupported_title": "Toetamata sisselogimisviis", + "problem_o_auth_internal_error_title": "Sisselogimisel läks midagi valesti", + "problem_o_auth_internal_error_desc": "Proovi hetke pärast uuesti.", + "problem_o_auth_link_authenticated_user_only_title": "Välise konto sidumiseks pead olema sisse logitud", + "problem_o_auth_provider_mismatch_title": "Sisselogimiskatse ei klapi teenusepakkujaga", + "problem_o_auth_provider_mismatch_desc": "Palun alusta otsast.", + "problem_o_auth_provider_unsupported_title": "Seda sisselogimise teenusepakkujat ei toetata", + "problem_pair_code_not_found_title": "Sidumiskoodi ei leitud", + "problem_password_reset_not_found_title": "Parooli lähtestamise link on vigane", + "problem_password_reset_not_found_desc": "Link võib olla aegunud või juba kasutatud.", + "problem_session_not_found_title": "Seanssi ei leitud", + "problem_share_get_no_shares_title": "Sul pole selle kasutajaga jagamisi", + "problem_share_request_create_cannot_share_with_self_title": "Sa ei saa iseendaga jagada", + "problem_share_request_create_shocker_not_found_title": "Ühte või mitut shockerit ei leitud", + "problem_share_request_create_shocker_not_found_desc": "Need võivad olla eemaldatud või ei kuulu sulle.", + "problem_share_request_not_found_title": "Kutset ei leitud", + "problem_share_user_not_found_title": "Jagamist ei leitud", + "problem_share_code_already_linked_title": "Shocker on juba sinu kontoga seotud", + "problem_share_code_cant_link_own_share_code_title": "Sa ei saa lunastada omaenda jagamiskoodi", + "problem_share_code_not_found_title": "Jagamiskoodi ei leitud", + "problem_share_link_expiry_date_in_past_title": "Aegumiskuupäev ei saa olla minevikus", + "problem_share_link_not_found_title": "Avalikku jagamist ei leitud", + "problem_share_link_shocker_already_in_share_link_title": "Shocker on juba selles avalikus jagamises", + "problem_share_link_shocker_not_in_share_link_title": "Shocker pole selles avalikus jagamises", + "problem_shocker_control_no_permission_title": "Sul pole õigust seda shockerit juhtida", + "problem_shocker_control_not_found_title": "Shockerit ei leitud", + "problem_shocker_control_paused_title": "Shocker on peatatud", + "problem_shocker_not_found_title": "Shockerit ei leitud", + "problem_signup_registration_disabled_title": "Registreerimine on praegu keelatud", + "problem_signup_username_or_email_exists_title": "See kasutajanimi või e-post on juba kasutusel", + "problem_turnstile_invalid_title": "Kontroll ebaõnnestus", + "problem_turnstile_invalid_desc": "Läbi kontroll uuesti ja proovi siis veel kord.", + "problem_user_not_found_title": "Kasutajat ei leitud", + "problem_user_privileged_delete_denied_title": "Privilegeeritud kasutajaid ei saa kustutada", + "problem_validation_error_title": "Mõned väljad on vigased", + "problem_webhook_not_found_title": "Veebihaaki ei leitud", + "problem_webhook_unsupported_title": "Toetatud on ainult Discordi veebihaagid", + "problem_webhook_unsupported_desc": "Kasuta discord.com-i URL-i, mitte canary või ptb oma.", + + "error_too_many_requests": "Liiga palju päringuid", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Proovi uuesti {seconds} sekundi pärast.", + "secondsPlural=other": "Proovi uuesti {seconds} sekundi pärast." + } + } + ], + "error_unexpected_response": "Ootamatu serveri vastus", + "error_internal": "Tekkis sisemine viga", + "error_network": "Tekkis võrguviga", + + "dev_banner": "See on OpenShocki {#b}ARENDUSKESKKOND{/b}. {#u}Andmeid ei salvestata{/u} ja see kirjutatakse regulaarselt üle tootmisandmetega.", + "firmware_channel_bugs_warning": "See kanal võib sisaldada vigu." +} diff --git a/messages/fi.json b/messages/fi.json new file mode 100644 index 00000000..586c19a0 --- /dev/null +++ b/messages/fi.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Alusta turvalliseen ja luotettavaan shockerien etäohjaukseen erittäin pienellä viiveellä.", + "landing_section_label": "Etusivu", + "landing_hubs_online": "Hubeja verkossa nyt: ", + "landing_learn_more": "Lue lisää", + "landing_wiki": "Wiki", + "landing_meta_description": "Tervetuloa OpenShockiin, joka on ilmainen avoimen lähdekoodin ekosysteemi erilaisten shockerien ohjaamiseen internetin kautta.", + "instance_meta_description": "Tervetuloa {siteName}-palveluun, joka on OpenShockin itsenäinen instanssi. OpenShock on ilmainen avoimen lähdekoodin ekosysteemi erilaisten shockerien ohjaamiseen internetin kautta.", + "header_sidebar_toggle": "Näytä tai piilota sivupalkki", + "header_avatar_alt": "Käyttäjän {name} avatar", + "header_menu_profile": "Profiili", + "header_menu_settings": "Asetukset", + "header_menu_logout": "Kirjaudu ulos", + "header_login": "Kirjaudu sisään", + "header_signup": "Rekisteröidy", + "header_github_title": "OpenShock GitHubissa", + "header_discord_title": "Yhteisön Discord", + + "footer_made_with": "Tehty rakkaudella {#heart/} – {#team}OpenShock-tiimi{/team}", + "footer_connection_status_label": "Palvelinyhteyden tila", + "footer_signalr_state": "SignalR-tila", + "footer_frontend_version": "Frontendin versio", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backendin versio", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Kieli", + + "sidebar_home_link_label": "OpenShockin etusivu", + "sidebar_group_general": "Yleiset", + "sidebar_home": "Etusivu", + "sidebar_shockers": "Shockerit", + "sidebar_shared_shockers": "Jaetut shockerit", + "sidebar_hubs": "Hubit", + "sidebar_user_shares": "Käyttäjäjaot", + "sidebar_public_shares": "Julkiset jaot", + "sidebar_serial_terminal": "Sarjapääte", + "sidebar_group_admin": "Ylläpito", + "sidebar_admin_monitoring": "Valvonta", + "sidebar_admin_online_hubs": "Yhdistetyt hubit", + "sidebar_admin_online_gateways": "Yhdistetyt yhdyskäytävät", + "sidebar_admin_management": "Hallinta", + "sidebar_admin_users": "Käyttäjät", + "sidebar_admin_blacklists": "Estolistat", + "sidebar_admin_webhooks": "Webhookit", + "sidebar_admin_mail": "Sähköposti", + "sidebar_admin_automation_tokens": "Automaatiotunnukset", + "sidebar_admin_configuration": "Määritykset", + "sidebar_group_settings": "Asetukset", + "sidebar_settings_api_tokens": "API-tunnukset", + "sidebar_settings_sessions": "Istunnot", + "sidebar_settings_audit_log": "Tapahtumaloki", + "sidebar_settings_connections": "Yhdistetyt tilit", + "sidebar_settings_account": "Tilin asetukset", + + "error_meta_title": "Palvelu ei ole käytettävissä", + "error_meta_description": "OpenShock ei ole tällä hetkellä käytettävissä", + "error_meta_logo_alt": "OpenShockin logo", + "error_fallback_message": "Jokin meni pieleen.", + "error_not_found_message": "Sivua ei löytynyt", + "error_not_found_description": "Etsimääsi sivua ei ole olemassa.", + "error_unexpected_description": "Tapahtui odottamaton virhe.", + "error_go_back": "Takaisin", + + "auth_layout_logo_alt": "OpenShockin logo", + "auth_layout_invalid_redirect_removed": "Virheellinen uudelleenohjausosoite poistettiin turvallisuutesi vuoksi.", + + "auth_activate_breadcrumb": "Aktivoi tili", + "auth_activate_title": "Aktivoi tili", + "auth_activate_activating": "Tiliäsi aktivoidaan...", + "auth_activate_success": "Tilisi on aktivoitu", + "auth_activate_failed": "Tämä aktivointilinkki on virheellinen tai vanhentunut", + "auth_activate_missing_token": "Aktivointitunnus puuttuu", + "auth_activate_continue": "Jatka kirjautumiseen", + "auth_activate_toast_success": "Tili aktivoitu", + + "auth_forgot_breadcrumb": "Unohtunut salasana", + "auth_forgot_title": "Unohtunut salasana", + "auth_forgot_description": "Anna sähköpostiosoitteesi salasanan palauttamista varten", + "auth_forgot_email_label": "Sähköposti", + "auth_forgot_email_placeholder": "Sähköposti", + "auth_forgot_submit": "Palauta salasana", + "auth_forgot_signin_prompt": "Muistatko salasanasi? {#signin}Kirjaudu sisään{/signin}", + "auth_forgot_mail_disabled": "Salasanan palautus ei ole käytettävissä tässä instanssissa, koska sähköpostipalvelua ei ole määritetty. Ota yhteyttä ylläpitäjään saadaksesi apua tilisi palauttamiseen.", + "auth_forgot_toast_sent": "Salasanan palautuspyyntö on lähetetty annettuun sähköpostiosoitteeseen", + + "auth_login_breadcrumb": "Kirjaudu sisään", + "auth_login_title": "Tervetuloa takaisin", + "auth_login_loading_methods": "Ladataan käytettävissä olevia kirjautumistapoja", + "auth_login_choose_method": "Kirjaudu jollakin näistä tavoista", + "auth_login_with_account": "Kirjaudu OpenShock-tililläsi", + "auth_login_activation_after_signup": "Tilisi on luotu. Lähetimme aktivointilinkin sähköpostiosoitteeseesi. Tarkista saapuneet viestit ja roskapostikansio.", + "auth_login_activation_pending": "Tiliäsi ei ole vielä aktivoitu. Lähetimme aktivointilinkin sähköpostiosoitteeseesi. Tarkista saapuneet viestit ja roskapostikansio. Jos mitään ei tule, yritä kirjautua myöhemmin uudelleen saadaksesi uuden linkin.", + "auth_login_oauth_only": "Tällä tilillä ei ole salasanaa. Kirjaudu sisään palvelulla, jolla rekisteröidyit.", + "auth_login_oauth_only_with_buttons": "Tällä tilillä ei ole salasanaa. Kirjaudu sisään yllä olevilla painikkeilla palvelulla, jolla rekisteröidyit.", + "auth_login_or_continue_with": "Tai jatka käyttäen", + "auth_login_username_label": "Käyttäjänimi tai sähköposti", + "auth_login_password_label": "Salasana", + "auth_login_submit": "Kirjaudu sisään", + "auth_login_signup_prompt": "Eikö sinulla ole tiliä? {#signup}Rekisteröidy{/signup}", + "auth_login_legal": "Napsauttamalla ”Kirjaudu sisään” hyväksyt {#tos}käyttöehtomme{/tos} ja {#privacy}tietosuojakäytäntömme{/privacy}.", + + "auth_oauth_create_breadcrumb": "Rekisteröidy palvelulla {provider}", + "auth_oauth_create_title": "Rekisteröidy palvelulla {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Täydennä tilisi tiedot", + "auth_oauth_create_username_label": "Käyttäjänimi", + "auth_oauth_create_username_placeholder": "Käyttäjänimi", + "auth_oauth_create_email_label": "Sähköposti", + "auth_oauth_create_email_placeholder": "Sähköposti", + "auth_oauth_create_submit": "Rekisteröidy", + "auth_oauth_create_legal": "Napsauttamalla ”Rekisteröidy” hyväksyt {#tos}käyttöehtomme{/tos} ja {#privacy}tietosuojakäytäntömme{/privacy}.", + + "auth_oauth_error_breadcrumb": "Tunnistautumisvirhe", + "auth_oauth_error_title": "Tunnistautumisvirhe", + "auth_oauth_error_back": "Takaisin kirjautumiseen", + + "auth_reset_breadcrumb": "Palauta salasana", + "auth_reset_title": "Palauta salasana", + "auth_reset_checking": "Tarkistetaan palautuslinkkiä...", + "auth_reset_choose_password": "Valitse tilillesi uusi salasana", + "auth_reset_invalid": "Tämä palautuslinkki on virheellinen tai vanhentunut", + "auth_reset_password_label": "Uusi salasana", + "auth_reset_password_placeholder": "Uusi salasana", + "auth_reset_confirm_label": "Vahvista uusi salasana", + "auth_reset_confirm_placeholder": "Vahvista uusi salasana", + "auth_reset_submit": "Palauta salasana", + "auth_reset_request_new": "Pyydä uusi palautuslinkki", + "auth_reset_toast_success": "Salasana on palautettu", + + "auth_signup_breadcrumb": "Rekisteröidy", + "auth_signup_toast_created_mail": "Tili luotiin onnistuneesti. Vahvista tilisi sähköpostiisi lähetetyllä linkillä.", + "auth_signup_toast_created_no_mail": "Tili luotiin onnistuneesti. Voit nyt kirjautua sisään.", + "auth_signup_dialog_title": "Tervetuloa! Kiitos rekisteröitymisestä! ❤️", + "auth_signup_dialog_created_mail": "Tilisi on luotu. 🎉 Vahvista tilisi sähköpostiisi lähetetyllä linkillä.", + "auth_signup_dialog_verify_then_login": "Kun olet vahvistanut sähköpostiosoitteesi, voit kirjautua tilillesi.", + "auth_signup_dialog_created_no_mail": "Tilisi on luotu ja valmis käytettäväksi. 🎉", + "auth_signup_dialog_login_now": "Voit nyt kirjautua tilillesi.", + "auth_signup_title": "Luo tili", + "auth_signup_loading_methods": "Ladataan käytettävissä olevia rekisteröitymistapoja", + "auth_signup_using_email": "Rekisteröityminen sähköpostilla", + "auth_signup_choose_method": "Valitse, miten haluat rekisteröityä", + "auth_signup_back": "Takaisin", + "auth_signup_username_label": "Käyttäjänimi", + "auth_signup_username_placeholder": "Matti OpenShock", + "auth_signup_email_label": "Sähköposti", + "auth_signup_email_placeholder": "matti@example.com", + "auth_signup_password_label": "Salasana", + "auth_signup_password_placeholder": "Salasana", + "auth_signup_confirm_label": "Vahvista salasana", + "auth_signup_confirm_placeholder": "Vahvista salasana", + "auth_signup_submit": "Luo tili", + "auth_signup_signin_prompt": "Onko sinulla jo tili? {#signin}Kirjaudu sisään{/signin}", + "auth_signup_or": "Tai", + "auth_signup_with_email": "Rekisteröidy sähköpostilla", + "auth_signup_legal": "Napsauttamalla ”Luo tili” hyväksyt {#tos}käyttöehtomme{/tos} ja {#privacy}tietosuojakäytäntömme{/privacy}.", + + "auth_verify_breadcrumb": "Vahvista sähköposti", + "auth_verify_title": "Vahvista sähköposti", + "auth_verify_verifying": "Vahvistetaan sähköpostiosoitettasi...", + "auth_verify_success": "Sähköpostiosoitteesi on vahvistettu", + "auth_verify_failed": "Tämä vahvistuslinkki on virheellinen tai vanhentunut", + "auth_verify_missing_token": "Vahvistustunnus puuttuu", + "auth_verify_continue": "Jatka kirjautumiseen", + "auth_verify_toast_success": "Sähköpostiosoite vahvistettu", + + "common_cancel": "Peruuta", + "common_delete": "Poista", + "common_edit": "Muokkaa", + "common_share": "Jaa", + "common_copy_id": "Kopioi tunniste", + "common_id_copied": "Tunniste kopioitu leikepöydälle", + "common_open_menu": "Avaa valikko", + "common_refresh": "Päivitä", + "common_settings": "Asetukset", + "common_clear": "Tyhjennä", + "common_online": "Verkossa", + "common_offline": "Ei verkossa", + "common_paused": "Tauotettu", + "common_resume": "Jatka", + "common_resuming": "Jatketaan...", + "common_coming_soon": "(Tulossa pian)", + "common_save_changes": "Tallenna muutokset", + "common_danger_zone": "Vaaravyöhyke", + "common_name": "Nimi", + "control_intensity": "Voimakkuus", + "control_duration": "Kesto", + "control_max_intensity": "Suurin voimakkuus", + "control_max_duration": "Pisin kesto", + "control_vibration": "Värinä", + "control_value": "Arvo", + "control_live_intensity": "Reaaliaikainen voimakkuus", + "control_type_stop": "Pysäytä", + "control_type_shock": "Isku", + "control_type_vibrate": "Väristä", + "control_type_sound": "Ääni", + "live_tooltip_active": "Reaaliaikainen yhteys: {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Yhdistetään...", + "live_tooltip_connect": "Yhdistä reaaliaikaiseen ohjaukseen", + "live_tooltip_hub_start": "Ctrl+napsautus käynnistää koko hubin", + "live_tooltip_hub_stop": "Ctrl+napsautus pysäyttää koko hubin", + "pause_resume_shocker": "Jatka shockeria", + "pause_pause_shocker": "Tauota shocker", + "pause_resume_all": "Jatka kaikkia shockereita", + "pause_pause_all": "Tauota kaikki shockerit", + "shocker_label": "Shocker", + "shocker_hub": "Hubi", + "shocker_select_hub": "Valitse hubi", + "shocker_rf_id": "RF-tunniste", + "shocker_rf_id_invalid": "RF-tunnisteen on oltava kokonaisluku väliltä {min}–{max}.", + "shocker_model": "Malli", + "shocker_select_model": "Valitse malli", + "shocker_name_placeholder": "Shockerin nimi", + "shocker_menu_view_logs": "Näytä lokit", + "shocker_delete_title": "Poista shocker", + "shocker_delete_desc": "Haluatko varmasti poistaa shockerin ”{name}”? Toimintoa ei voi kumota.", + "shocker_toast_deleted": "Shocker ”{name}” poistettu", + "shocker_toast_paused": "Shocker tauotettu", + "shocker_toast_resumed": "Shockeria jatkettu", + "shocker_add_desc": "Rekisteröi uusi shocker johonkin hubeistasi.", + "shocker_add_name_placeholder": "Oma shocker", + "shockers_title": "Shockerit", + "shockers_subtitle": "Kaikki hubeihisi yhdistetyt shockerit.", + "shockers_loading": "Ladataan shockereita...", + "shockers_toast_refreshed": "Shockerit päivitetty", + "shockers_toast_need_hub": "Luo hubi ennen kuin lisäät shockereita.", + "shockers_toast_added": "Shocker lisätty", + "shockers_unknown_module": "Tuntematon moduulityyppi", + "shockers_add": "Lisää shocker", + "shockers_view_mode": "Näkymä", + "shockers_mode_classic": "Perinteinen", + "shockers_mode_rich": "Laaja", + "shockers_mode_simple": "Yksinkertainen", + "shockers_mode_map": "Kartta", + "shockers_group_by_hub": "Ryhmittele hubin mukaan", + "shockers_global_limits": "Yleiset rajat", + "shockers_logs_label": "Lokit", + "shockers_empty_title": "Ei vielä shockereita", + "shockers_empty_no_hubs": "Luo ensin hubi ja lisää siihen sitten shockereita.", + "shockers_empty_has_hubs": "Aloita lisäämällä shocker johonkin hubeistasi.", + "shockers_create_hub": "Luo hubi", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockeria" } + } + ], + "shared_shockers_title": "Jaetut shockerit", + "shared_shockers_subtitle": "Muiden käyttäjien kanssasi jakamat shockerit.", + "shared_shockers_empty_title": "Kanssasi ei ole vielä jaettu shockereita.", + "shared_shockers_empty_desc": "Kun joku jakaa shockerinsa kanssasi, ne näkyvät täällä.", + "shocker_logs_title": "Shockerien lokit", + "shocker_logs_subtitle": "Kaikki shockereillesi lähetetyt ohjauskomennot.", + "shocker_logs_live_title": "Uudet lokit näkyvät reaaliajassa", + "shocker_logs_paused_title": "Reaaliaikaiset päivitykset tauotetaan, kun lajittelet tai katsot muuta kuin ensimmäistä sivua", + "shocker_logs_live": "Reaaliaikainen", + "shocker_logs_col_time": "Aika", + "shocker_logs_col_type": "Tyyppi", + "shocker_logs_col_by": "Lähettäjä", + "shocker_logs_filter_label": "Suodata shockerin mukaan", + "shocker_logs_filter_placeholder": "Hae shockereita...", + "shocker_logs_filter_all": "Kaikki shockerit", + "shocker_logs_filter_none": "Ei vastaavia shockereita", + "shocker_edit_title": "Muokkaa shockeria", + "shocker_edit_subtitle": "Muuta tämän shockerin tietoja tai poista se.", + "shocker_edit_back": "Takaisin shockereihin", + "shocker_edit_load_failed": "Shockerin lataaminen epäonnistui.", + "shocker_edit_loading": "Ladataan shockeria...", + "shocker_edit_details_title": "Shockerin tiedot", + "shocker_edit_details_desc": "Päivitä tämän shockerin nimi, RF-tunniste ja malli.", + "shocker_edit_pause_state": "Taukotila", + "shocker_edit_is_paused": "Shocker on tauotettu", + "shocker_edit_is_active": "Shocker on aktiivinen", + "shocker_edit_toast_updated": "Shocker päivitetty", + "shocker_edit_delete_desc": "Poista tämä shocker pysyvästi. Toimintoa ei voi kumota.", + + "common_close": "Sulje", + "common_continue": "Jatka", + "common_loading": "Ladataan...", + "common_previous": "Edellinen", + "common_next": "Seuraava", + "common_steps": "Vaiheet", + "common_step_label": "Vaihe {number}: {title}", + "common_copy": "Kopioi", + "common_copied": "Kopioitu", + "common_never": "Ei koskaan", + "common_error": "Virhe: {message}", + "terminal_title": "Sarjapääte", + "terminal_connecting": "Yhdistetään...", + "terminal_help_button": "Ongelmia? Hae apua", + "terminal_back_to_modes": "Takaisin tilan valintaan", + "terminal_mode_configure": "Määritä laite", + "terminal_mode_configure_desc": "Määritä WiFi, todennus ja muuta. Sisältää interaktiivisen sarjakonsolin.", + "terminal_mode_flash": "Asenna laiteohjelmisto", + "terminal_mode_flash_desc": "Asenna tai päivitä yhdistetyn laitteen laiteohjelmisto.", + "terminal_mode_raw": "Sarjamonitori", + "terminal_mode_raw_desc": "Pelkkä konsoli. Lue laitteen lokeja ja lähetä komentoja.", + "terminal_step_channel": "Valitse kanava", + "terminal_step_board": "Valitse piirilevy", + "terminal_go_to_step": "Siirry vaiheeseen {number}: {title}", + "terminal_erase": "Tyhjennä ennen asennusta", + "terminal_erase_desc": "Tyhjentää kaikki laitteen tiedot, myös nykyiset asetukset", + "terminal_unsupported": "Selaimesi ei tue tätä ominaisuutta.", + "terminal_update_browser": "Päivitä selaimesi uusimpaan versioon.", + "terminal_use_browsers": "Käytä jotakin seuraavista selaimista:", + "terminal_connect_failed_bootloader": "Bootloader-tilaan siirtyminen epäonnistui", + "terminal_connect_failed": "Yhteys laitteeseen epäonnistui", + "terminal_connect_failed_desc": "Sarjayhteyttä laitteeseen ei saatu muodostettua.", + "terminal_quick_tries": "Kokeile näitä:", + "terminal_try_replug": "Irrota laite ja kytke se uudelleen.", + "terminal_try_cable": "Kokeile toista USB-kaapelia tai -porttia.", + "terminal_try_driver": "Varmista, että sarjaportin ajuri on asennettu.", + "terminal_open_troubleshooter": "Avaa vianmääritys", + "terminal_log_reset_no_device": "Isäntäpuolen virhe nollauksessa: ei laitetta!", + "terminal_log_reset_error": "Isäntäpuolen virhe nollauksessa: {error}", + "terminal_log_send_no_device": "Lähetys epäonnistui: ei laitetta!", + "terminal_log_send_error": "Lähetys epäonnistui: {error}", + "terminal_log_firmware_disconnected": "Laiteohjelmiston yhteys katkesi: {error}", + "terminal_log_erase_failed": "Flashin tyhjennys epäonnistui: {error}", + "terminal_log_hard_reset_failed": "Laitteistonollaus epäonnistui: {error}", + "terminal_log_flash_complete": "Asennus valmis", + "terminal_log_flash_failed": "Asennus epäonnistui: {error}", + "terminal_log_command_failed": "Komennon kirjoittaminen epäonnistui: {error}", + "terminal_help_title": "Vianmääritys", + "terminal_help_desc": "Käy nämä vaiheet läpi järjestyksessä. Jokainen sulkee pois yleisen syyn.", + "terminal_help_step_cable": "USB-kaapeli", + "terminal_help_step_port": "USB-portti", + "terminal_help_step_driver": "Asenna ajuri", + "terminal_help_step_manual": "Ajurin manuaalinen päivitys", + "terminal_help_step_discord": "Kysy Discordissa", + "terminal_help_cable_body": "Monet USB-C- ja micro-USB-kaapelit ovat pelkkiä latauskaapeleita eivätkä siirrä dataa. Vaihda toimivaksi tiedettyyn datakaapeliin (sellaiseen, jolla olet siirtänyt tiedostoja tai yhdistänyt muita laitteita) ja kytke hubi uudelleen.", + "terminal_help_port_body": "Kytke laite suoraan tietokoneen USB-porttiin. Vältä mahdollisuuksien mukaan USB-keskittimiä, telakoita ja etupaneelin portteja, sillä ne aiheuttavat usein virta- ja signaaliongelmia. Pöytäkoneessa kokeile koneen takana olevaa porttia.", + "terminal_help_driver_download": "Lataa CP210x-ajuri:", + "terminal_help_driver_extract": "Pura zip-tiedoston sisältö tietokoneesi kansioon.", + "terminal_help_driver_run": "Avaa kansio ja suorita {#code}{installer}{/code}. Asenna noudattamalla ohjeita.", + "terminal_help_driver_reconnect": "Kytke laite uudelleen.", + "terminal_help_manual_intro": "Jos ajurin asennus onnistui, mutta laite ei vieläkään näy:", + "terminal_help_manual_open": "Avaa Laitehallinta (paina {#key}Win{/key} + {#key}X{/key} ja valitse {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Etsi kohdasta {#code}Ports (COM & LPT){/code} esimerkiksi tällaista merkintää:", + "terminal_help_manual_missing": "Jos merkintää ei ole, Windows ei tunnista laitetta lainkaan; käy kaapeli- ja porttivaiheet läpi uudelleen.", + "terminal_help_manual_update": "Napsauta laitetta hiiren kakkospainikkeella ja valitse {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Valitse {#code}Browse my computer for drivers{/code} ja valitse kansio, johon purit ajurin zip-tiedoston. Varmista, että {#code}Include subfolders{/code} on valittuna.", + "terminal_help_manual_success": "Jos päivitys onnistui, merkinnän pitäisi nyt olla {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Etkö vieläkään pääse eteenpäin? Liity Discord-palvelimellemme ja kysy kanavalla {#code}{channel}{/code}. Kerro seuraavat:", + "terminal_help_discord_os": "käyttöjärjestelmäsi ja selaimesi", + "terminal_help_discord_device": "käyttämäsi laite (piirilevyn malli, mistä hankit sen)", + "terminal_help_discord_tried": "mitä olet jo kokeillut edellisistä vaiheista", + "terminal_help_discord_errors": "mahdolliset virheilmoitukset tai olennainen päätteen tuloste", + "terminal_help_discord_join": "Liity Discord-palvelimellemme", + "terminal_risk_title": "⚠️ EPÄVAKAA LAITEOHJELMISTO", + "terminal_risk_intro": "Olet asentamassa {#strong}kokeellista laiteohjelmistoa{/strong}, jonka tiedetään olevan {#strong}epävakaa{/strong}.", + "terminal_risk_brick": "Tämä voi rikkoa laitteesi pysyvästi, vaatia manuaalisen palautuksen tai tehdä siitä käyttökelvottoman.", + "terminal_risk_no_support": "Emme tarjoa tukea tämän laiteohjelmiston aiheuttamiin ongelmiin.", + "terminal_risk_acknowledge": "Ymmärrän, että tämä on täysin omalla vastuullani", + "terminal_risk_abort": "Keskeytä", + "terminal_risk_accept": "OTAN TÄYDEN VASTUUN", + "firmware_channel_recommended": "Tämä on suositeltu kanava.", + "firmware_channel_danger": "ÄLÄ KÄYTÄ TÄTÄ, ELLET TIEDÄ MITÄ TEET", + "firmware_channel_stable": "Vakaa", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Kehitys", + "terminal_board_select": "Valitse piirilevy...", + "terminal_board_search": "Hae piirilevyjä...", + "terminal_board_none": "Piirilevyä ei löytynyt.", + "terminal_flash_button": "Asenna", + "terminal_flash_progress": "Edistyminen: {status}", + "terminal_flash_idle": "Valmiina", + "terminal_flash_no_device": "Laitetta ei ole valittu.", + "terminal_flash_resetting": "Nollataan...", + "terminal_flash_downloading": "Ladataan laiteohjelmistoa...", + "terminal_flash_download_failed": "Laiteohjelmiston lataaminen epäonnistui.", + "terminal_flash_flashing": "Asennetaan laiteohjelmistoa...", + "terminal_flash_rebooting": "Käynnistetään laite uudelleen... (Jos se jumittuu, irrota virta ja kytke se takaisin)", + "terminal_flash_done": "Laite käynnistetty uudelleen! Asennus valmis.", + "terminal_port_select": "Valitse laite", + "terminal_port_disconnect": "Katkaise yhteys laitteeseen", + "terminal_port_connected": "Laite yhdistetty: {#strong}{id}{/strong}", + "terminal_console": "Konsoli", + "terminal_connected_device": "Yhdistetty laite", + "terminal_resize": "Muuta päätepaneelin kokoa", + "terminal_reboot": "Käynnistä uudelleen", + "terminal_disconnect": "Katkaise", + "terminal_fullscreen_exit_esc": "Poistu koko näytöstä (Esc)", + "terminal_fullscreen_exit": "Poistu koko näytöstä", + "terminal_fullscreen_fill": "Täytä ikkuna", + "terminal_command_label": "Sarjakomento", + "terminal_command_placeholder": "Kirjoita komento...", + "terminal_command_send": "Lähetä komento", + "terminal_colors": "Värit", + "terminal_colors_menu": "Värit...", + "terminal_colors_label": "Konsolin värit", + "terminal_colors_close": "Sulje värit", + "terminal_color_input": "Väri: {name}", + "terminal_colors_reset": "Palauta oletukset", + "terminal_color_bg": "Tausta", + "terminal_color_fg": "Teksti", + "terminal_color_ts": "Aikaleima", + "terminal_color_error": "Virhe", + "terminal_color_warning": "Varoitus", + "terminal_color_info": "Tieto", + "terminal_color_debug": "Virheenjäljitys", + "terminal_color_verbose": "Monisanainen", + "terminal_options": "Asetukset", + "terminal_options_label": "Konsolin asetukset", + "terminal_hide_system": "Piilota järjestelmäviestit", + "terminal_stick_bottom": "Pysy alhaalla", + "terminal_raw_output": "Raakatuloste", + "terminal_timestamps": "Aikaleimat", + "terminal_timestamp_uptime": "Käyttöaika", + "terminal_timestamp_local": "Paikallinen", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Pois", + "terminal_copy_settings": "Kopioi asetukset", + "terminal_import_settings": "Tuo asetukset", + "terminal_copy_selection": "Kopioi valinta", + "terminal_copy_all": "Kopioi koko tuloste", + "terminal_toast_selection_copied": "Valinta kopioitu", + "terminal_toast_output_copied": "Konsolin tuloste kopioitu", + "terminal_toast_settings_copied": "Konsolin asetukset kopioitu", + "terminal_toast_clipboard_unreadable": "Leikepöydän lukeminen epäonnistui", + "terminal_toast_settings_imported": "Konsolin asetukset tuotu", + "terminal_toast_settings_invalid": "Leikepöydällä ei ole konsolin asetuksia", + + "common_try_again": "Yritä uudelleen", + "terminal_cfg_intro": "Arvot lähetetään laitteelle UARTin kautta. Laitteen vastaus näkyy alla olevassa konsolissa. Komennot ilman argumenttia lukevat arvon; lue nykyinen arvo kentän vieressä olevalla {#eye/}-painikkeella.", + "terminal_cfg_rf_title": "RF-lähetin", + "terminal_cfg_rf_desc": "Ohjaa shockereille lähtevää RF-signaalia.", + "terminal_cfg_tx_pin": "TX GPIO -nasta", + "terminal_cfg_example": "esim. {value}", + "terminal_cfg_read_value": "Lue nykyinen arvo", + "terminal_cfg_set": "Aseta", + "terminal_cfg_read": "Lue", + "terminal_cfg_reading": "Luetaan…", + "terminal_cfg_apply": "Käytä", + "terminal_cfg_keepalive": "Keepalive käytössä", + "terminal_cfg_keepalive_desc": "Lähettää paritetuille shockereille säännöllisesti viestin, jotta ne pysyvät hereillä.", + "terminal_cfg_estop_title": "Hätäpysäytys", + "terminal_cfg_estop_desc": "Laitteistopainike, joka pysäyttää kaikki signaalit.", + "terminal_cfg_estop_enabled": "Hätäpysäytys käytössä", + "terminal_cfg_estop_pin": "Hätäpysäytyksen GPIO-nasta", + "terminal_cfg_estop_note": "Huom: {#code}{latching}{/code}- ja {#code}{active}{/code}-asetuksille ei ole omia komentoja; aseta ne alla olevalla JSON-määrityksellä.", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Verkkojen tunnukset ja laitteen isäntänimi.", + "terminal_cfg_hostname": "Isäntänimi", + "terminal_cfg_networks": "Verkot (JSON-taulukko)", + "terminal_cfg_invalid_json_array": "Oltava kelvollinen JSON-taulukko", + "terminal_cfg_ap_note": "AP-asetuksille ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) ei ole omia komentoja; käytä JSON-määritystä.", + "terminal_cfg_backend_title": "Taustapalvelu", + "terminal_cfg_backend_desc": "OpenShock-palvelin ja todennus.", + "terminal_cfg_domain": "Verkkotunnus", + "terminal_cfg_domain_restart": "Verkkotunnuksen asettaminen käynnistää laitteen uudelleen.", + "terminal_cfg_auth_token": "Todennustunniste", + "terminal_cfg_auth_token_placeholder": "Liitä laitteen tunniste", + "terminal_cfg_hide": "Piilota", + "terminal_cfg_show": "Näytä", + "terminal_cfg_serial_title": "Sarjasyöte", + "terminal_cfg_echo": "Kaiku käytössä", + "terminal_cfg_echo_desc": "Tulostaa kirjoitetut merkit takaisin konsoliin.", + "terminal_cfg_advanced_title": "Lisäasetukset: koko määritys", + "terminal_cfg_advanced_desc": "Kentille, joilla ei ole omia komentoja (captive portal, OTA, LAN jne.), korvaa koko määritys.", + "terminal_cfg_json_config": "JSON-määritys", + "terminal_cfg_invalid_json": "Oltava kelvollista JSONia", + "terminal_cfg_read_json": "Lue nykyinen määritys JSON-muodossa", + "terminal_cfg_json_restart": "JSON-määrityksen käyttäminen käynnistää laitteen uudelleen.", + "terminal_cfg_raw_config": "Raaka FlatBuffer-määritys (base64)", + "terminal_cfg_invalid_base64": "Oltava kelvollinen base64-merkkijono", + "terminal_cfg_read_raw": "Lue nykyinen määritys base64-muodossa", + "terminal_cfg_factory_reset": "Palauta tehdasasetukset", + "terminal_cfg_factory_reset_desc": "Tyhjentää laitteen koko määrityksen.", + "terminal_cfg_factory_reset_title": "Palautetaanko laitteen tehdasasetukset?", + "terminal_cfg_factory_reset_action": "Tyhjennä määritys", + "terminal_cfg_factory_reset_confirm": "Tämä tyhjentää laitteen kaikki määritykset: WiFi-verkot, taustapalvelun tunnukset, nastat ja kaikki muut asetukset. Laite palautetaan oletusasetuksiin.", + "terminal_cfg_read_failed_json_title": "JSON-asetuksia ei voitu lukea", + "terminal_cfg_read_failed_raw_title": "Raaka-asetuksia ei voitu lukea", + "terminal_cfg_read_failed_desc": "Laite ei vastannut {attempts} yrityksen jälkeen.", + "terminal_cfg_common_causes": "Yleisiä syitä:", + "terminal_cfg_cause_busy": "Laite käsittelee toista komentoa.", + "terminal_cfg_cause_disconnected": "Laitteen yhteys katkesi tai se käynnistyi uudelleen.", + "terminal_cfg_cause_unsupported": "Laiteohjelmiston versio ei tue tätä komentoa.", + + "common_status": "Tila", + "common_version": "Versio", + "common_created": "Luotu", + "common_create": "Luo", + "common_done": "Valmis", + "common_enable": "Ota käyttöön", + "common_disable": "Poista käytöstä", + "common_are_you_sure": "Oletko varma?", + "common_generating": "Luodaan...", + "hubs_title": "Hubit", + "hubs_subtitle": "Kaikki tiliisi rekisteröidyt hubit.", + "hubs_add": "Lisää hubi", + "hubs_load_failed": "Hubien lataaminen epäonnistui.", + "hubs_empty_title": "Ei vielä hubeja", + "hubs_empty_desc": "Hubi on laite, joka välittää komennot shockereillesi. Aloita lisäämällä hubi.", + "hubs_create_title": "Luo hubi", + "hubs_name_label": "Hubin nimi", + "hubs_name_placeholder": "Oma hubi", + "hub_toast_not_connected": "Ei yhteyttä palvelimeen", + "hub_toast_try_later": "Yritä hetken päästä uudelleen.", + "hub_reboot_title": "Käynnistetäänkö {name} uudelleen?", + "hub_reboot_desc": "Hubi katkaisee yhteyden ja käynnistyy uudelleen. Siihen paritetut shockerit eivät vastaa, ennen kuin se on taas verkossa.", + "hub_reboot": "Käynnistä uudelleen", + "hub_hotspot_enable_title": "Otetaanko Wi-Fi-tukiasema käyttöön laitteessa {name}?", + "hub_hotspot_disable_title": "Poistetaanko Wi-Fi-tukiasema käytöstä laitteessa {name}?", + "hub_hotspot_enable_desc": "Hubi lähettää oman asennusverkkonsa. Se on edelleen tavoitettavissa Wi-Fi-verkossasi, mutta tukiasema on avoin kaikille kantaman sisällä, kunnes poistat sen käytöstä.", + "hub_hotspot_disable_desc": "Asennustukiasema sammuu. Jos hubi ei ole jo Wi-Fi-verkossasi, tarvitset fyysisen pääsyn laitteeseen sen määrittämiseksi uudelleen.", + "hub_delete_desc": "Olet poistamassa hubin {#strong}{name}{/strong}.", + "hub_delete_shockers": "Tämä poistaa myös seuraavat shockerit:", + "hub_edit_title": "Muokkaa hubia", + "hub_edit_apply": "Käytä", + "hub_pair_title_generate": "Luodaanko parituskoodi?", + "hub_pair_title_generated": "Parituskoodi luotu", + "hub_pair_title_paired": "Hubi paritettu", + "hub_pair_consumed": "{#strong}{name}{/strong} käytti tämän parituskoodin ja on nyt paritettu.", + "hub_pair_used": "Koodi on käytetty, eikä se ole enää voimassa.", + "hub_pair_generated_for": "Parituskoodi luotu hubille {#strong}{name}{/strong}.", + "hub_copy_now": "Alla olevaa koodia ei voi näyttää myöhemmin. Kopioi se nyt ja päivitä se asiakasohjelmiisi.", + "hub_pair_generate_for": "Olet luomassa parituskoodia hubille {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Se on voimassa 15 minuuttia luomisesta.", + "hub_pair_one_active": "Hubilla on vain yksi voimassa oleva parituskoodi; uusi koodi korvaa vanhemman.", + "hub_pair_complete": "Paritus valmis", + "hub_pair_code_label": "Parituskoodi:", + "hub_pair_copied_close": "Koodi kopioitu, sulje", + "hub_pair_get": "Hae parituskoodi", + "hub_token_generated": "Tunniste luotu", + "hub_token_generated_for": "Uusi tunniste luotu hubille {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Olet luomassa uutta tunnistetta hubille {#strong}{name}{/strong}.", + "hub_token_invalidate": "Tämä mitätöi nykyisen tunnisteen ja katkaisee sitä käyttävien asiakasohjelmien yhteyden.", + "hub_token_confirm": "Haluatko varmasti tehdä tämän?", + "hub_token_label": "Uusi tunniste:", + "hub_token_copied_close": "Tunniste kopioitu, sulje", + "hub_token_regenerate": "Luo uusi tunniste", + "hub_menu_update": "Päivitä", + "hub_menu_label": "Hubi", + "hub_menu_hotspot_enable": "Ota Wi-Fi-tukiasema käyttöön", + "hub_menu_hotspot_disable": "Poista Wi-Fi-tukiasema käytöstä", + "hub_menu_pair": "Parita", + "hub_menu_estop": "Hätäpysäytys", + "hub_update_breadcrumb": "Päivitä", + "hub_update_unknown_hub": "Tuntematon hubi", + "hub_update_unknown_task": "Tuntematon tehtävä", + "hub_update_task_metadata": "Haetaan metatietoja", + "hub_update_task_preparing": "Valmistellaan päivitystä", + "hub_update_task_flash_fs": "Asennetaan tiedostojärjestelmää", + "hub_update_task_verify_fs": "Tarkistetaan tiedostojärjestelmää", + "hub_update_task_flash_app": "Asennetaan sovellusta", + "hub_update_task_bootable": "Merkitään sovellus käynnistettäväksi", + "hub_update_task_rebooting": "Käynnistetään uudelleen", + "hub_update_status_started": "Aloitettu", + "hub_update_status_running": "Käynnissä", + "hub_update_status_finished": "Valmis", + "hub_update_status_error": "Virhe", + "hub_update_status_timeout": "Aikakatkaisu", + "hub_update_confirm_title": "Vahvista laiteohjelmiston päivitys", + "hub_update_confirm_desc": "Päivitetäänkö {#strong}{name}{/strong} versioon {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Tämä versio ei välttämättä ole vakaalta kanavalta, ja siinä voi olla bugin paskiaisia.", + "hub_update_title": "Päivitä {name}", + "hub_update_subtitle": "Hallitse tämän hubin laiteohjelmistopäivityksiä.", + "hub_update_status_title": "Hubin tila", + "hub_update_firmware": "Laiteohjelmisto: {#mono}{version}{/mono}", + "hub_update_confirm": "Päivitä", + "hub_update_success": "Päivitys onnistui", + "hub_update_rolled_back": "Laite palasi edelliseen versioon", + "hub_update_back": "Takaisin hubeihin", + "hub_update_flash_again": "Asenna uudelleen", + "hub_update_card_title": "Laiteohjelmiston päivitys", + "hub_update_card_desc": "Valitse asennettava laiteohjelmiston kanava ja versio.", + "hub_update_to": "Päivitä versioon {version}", + "hub_update_must_be_online": "Hubin on oltava verkossa päivityksen aloittamiseksi.", + "hub_update_updating_to": "Päivitetään versioon {version}...", + "hub_update_total": "Yhteensä", + "hub_update_task": "Tehtävä", + "hub_update_history": "Päivityshistoria", + "hub_update_no_history": "Tälle hubille ei löytynyt päivityshistoriaa.", + "hub_update_col_id": "Tunniste", + "hub_update_col_started": "Aloitettu", + "hub_update_col_message": "Viesti", + "hub_update_loading": "Ladataan hubin tietoja...", + "hub_update_not_found": "Hubia ei löytynyt.", + "home_breadcrumb": "Etusivu", + "home_welcome": "Tervetuloa takaisin", + "home_welcome_name": "Tervetuloa takaisin, {name}", + "home_subtitle": "Tässä on yleiskatsaus OpenShock-asetuksistasi.", + "home_hubs_online": "{count} verkossa", + "home_hub_status": "Hubien tila", + "home_no_hubs": "Ei hubeja", + "home_all_online": "Kaikki verkossa", + "home_all_offline": "Kaikki poissa verkosta", + "home_some_online": "{online}/{total} verkossa", + "home_quick_links": "Pikalinkit", + "home_my_shockers": "Omat shockerit", + "home_my_shockers_desc": "Ohjaa shockereitasi", + "home_hubs_desc": "Hallitse hubejasi", + "home_shared_desc": "Kanssasi jaetut shockerit", + "home_public_desc": "Hallitse jakolinkkejä", + "home_get_started": "Aloita", + "home_get_started_desc": "Sinulla ei ole vielä hubeja. Luo hubi ensimmäisen laitteesi yhdistämiseksi ja lisää siihen sitten shockereita.", + "home_set_up_hub": "Määritä hubi", + "home_first_shocker": "Lisää ensimmäinen shockerisi", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Sinulla on {count} hubi määritettynä. Lisää shocker, niin voit alkaa ohjata sitä.", + "countPlural=other": "Sinulla on {count} hubia määritettynä. Lisää shocker, niin voit alkaa ohjata sitä." + } + } + ], + "home_go_to_shockers": "Siirry shockereihin", + "profile_title": "Profiili", + "profile_coming_soon": "Profiili on tulossa pian", + "profile_coming_soon_desc": "Julkinen profiilisi ei ole vielä käytettävissä. Tilin tiedot löytyvät asetuksista.", + + "common_retry": "Yritä uudelleen", + "common_never_used": "Ei koskaan käytetty", + "common_expires": "Vanhenee {time}", + "common_search_placeholder": "Hae...", + "common_unknown": "Tuntematon", + "settings_breadcrumb_account": "Tili", + "account_subtitle": "Kirjautumistietosi ja tilin toiminnot.", + "account_change_username": "Vaihda käyttäjänimi", + "account_change_email": "Vaihda sähköposti", + "account_change_password": "Vaihda salasana", + "account_username_label": "Käyttäjänimi", + "account_email_label": "Sähköposti", + "account_password_label": "Salasana", + "account_new_password_label": "Uusi salasana", + "account_confirm_password_label": "Vahvista uusi salasana", + "account_oauth_only": "Ei käytettävissä pelkkää OAuthia käyttäville tileille", + "account_oauth_no_password": "Tämä tili kirjautuu OAuthin kautta, eikä sillä ole salasanaa.", + "account_diagnostics": "Diagnostiikka", + "account_diagnostics_desc": "Auta meitä korjaamaan kaatumisia ja hitaita API-kutsuja. Raportit sisältävät virheilmoituksen, pinojäljityksen ja IP-osoitteesi. Oletuksena pois päältä.", + "account_diagnostics_level": "Diagnostiikan taso", + "account_telemetry_off": "Pois", + "account_telemetry_off_desc": "Älä lähetä mitään.", + "account_telemetry_errors": "Virheet", + "account_telemetry_errors_desc": "Lähetä vain selaimen virheraportit.", + "account_telemetry_full": "Täysi", + "account_telemetry_full_desc": "Virheraportit sekä API-kutsujen jäljitykset (ei sivulatauksia).", + "account_toast_deactivated": "Tili poistettiin käytöstä", + "account_deactivate_title": "Poista tili käytöstä", + "account_deactivate_desc": "Haluatko varmasti poistaa tilisi käytöstä?", + "account_deactivate": "Poista tili käytöstä", + "account_email_title": "Vaihda sähköposti", + "account_email_desc": "Anna uusi sähköpostiosoitteesi ja vahvista nykyisellä salasanallasi.", + "account_email_toast_sent": "Vahvistusviesti lähetettiin osoitteeseen {email}. Ota muutos käyttöön napsauttamalla viestin linkkiä.", + "account_new_email": "Uusi sähköposti", + "account_current_password": "Nykyinen salasana", + "account_password_title": "Vaihda salasana", + "account_password_desc": "Anna nykyinen salasanasi ja valitse uusi.", + "account_password_toast": "Salasana vaihdettiin", + "account_username_title": "Vaihda käyttäjänimi", + "account_username_desc": "Anna uusi käyttäjänimi.", + "account_new_username": "Uusi käyttäjänimi", + "account_username_toast": "Käyttäjänimi vaihdettiin", + "tokens_subtitle": "API-tunnisteilla tunnistaudutaan OpenShockin API:in.", + "tokens_generate": "Luo tunniste", + "tokens_toast_refreshed": "Tunnisteet päivitetty", + "tokens_empty_title": "Ei API-tunnisteita", + "tokens_empty_desc": "Luo tunniste tunnistautuaksesi OpenShockin API:in.", + "tokens_created_on": "Luotu {date}", + "tokens_last_used": "Viimeksi käytetty {time}", + "tokens_never_expires": "Ei vanhene", + "tokens_load_failed": "API-tunnisteiden lataaminen epäonnistui.", + "token_toast_edited": "Tunnistetta muokattiin", + "token_name_required": "Nimi on pakollinen", + "token_name_too_long": "Nimi on liian pitkä", + "token_edit_title": "Muokkaa API-tunnistetta", + "token_name_label": "Tunnisteen nimi", + "token_name_placeholder": "Tunnisteen nimi...", + "token_permissions": "Käyttöoikeudet", + "token_perm_category_shockers": "Shockerit", + "token_perm_category_devices": "Hubit", + "token_perm_category_usershares": "Käyttäjäjaot", + "token_perm_category_publicshares": "Julkiset jaot", + "token_perm_use": "Käytä", + "token_perm_edit": "Muokkaa", + "token_perm_pause": "Keskeytä", + "token_perm_auth": "Todenna", + "token_shocker_control": "Shockerien ohjaus", + "token_toast_paused": "Tunniste keskeytetty", + "token_toast_resumed": "Tunniste jatkuu", + "token_delete_title": "Poista API-tunniste", + "token_delete_desc": "Haluatko varmasti poistaa tunnisteen {#strong}{name}{/strong}?", + "token_delete_permanent": "Tätä ei voi perua. Tunniste poistetaan pysyvästi.", + "token_toast_deleted": "Tunniste poistettiin", + "token_resume": "Jatka tunnistetta", + "token_pause": "Keskeytä tunniste", + "token_mode_clamp_desc": "Clamp: sallitun alueen ulkopuoliset pyynnöt rajataan lähimpään rajaan (minimiin tai maksimiin).", + "token_mode_lerp_desc": "Lerp: koko syötealue skaalataan lineaarisesti sallitulle minimi–maksimi-alueellesi.", + "token_paused_desc": "Keskeytetty tunniste ei voi lähettää shockerien ohjausviestejä.", + "token_intensity_range": "Voimakkuusalue", + "token_duration_range": "Kestoalue", + "token_new_breadcrumb": "Uusi", + "token_redirect_not_allowed": "Annettu redirect_uri ei ole sallittu. Vain loopback-osoitteet tai sovelluksen omat skeemat ovat sallittuja.", + "token_params_missing": "Pakollisia GET-parametreja puuttuu. Varmista, että name, redirect_uri ja permissions on annettu.", + "token_invalid_permissions": "Virheellisiä käyttöoikeuksia: {list}", + "token_toast_created": "Tunniste luotiin", + "token_request_title": "API-tunnistepyyntö", + "token_access_granted": "Pääsy myönnetty", + "token_shared_redirecting": "Tunniste luotiin ja jaettiin sovellukselle. Sinut ohjataan takaisin osoitteeseen {#b}{uri}{/b}.", + "token_not_redirected": "Jos sinua ei ohjata automaattisesti, käytä alla olevaa painiketta.", + "token_finish": "Valmis", + "token_generated_title": "API-tunniste luotu", + "token_copy_now": "Kopioi API-tunnisteesi nyt, et näe sitä myöhemmin uudelleen!", + "token_new_title": "Uusi API-tunniste", + "token_external_desc": "Ulkoinen sovellus pyytää pääsyä tiliisi. Tarkista ja säädä alla olevat käyttöoikeudet ennen kuin sallit pääsyn.", + "token_new_desc": "Määritä ja luo tilillesi uusi API-tunniste.", + "token_external_requesting": "{#b}{name}{/b} pyytää API-tunnistetta. Tunnisteesi jaetaan sovellukselle osoitteessa {#b}{uri}{/b}.", + "token_allow": "Salli", + "token_generate": "Luo", + "token_deny": "Estä", + "sessions_subtitle": "Kaikki tilisi aktiiviset istunnot. Peru ne, joita et tunnista.", + "sessions_unknown_device": "Tuntematon laite", + "sessions_toast_refreshed": "Istunnot päivitetty", + "sessions_load_failed": "Istuntojen lataaminen epäonnistui.", + "sessions_empty_title": "Ei aktiivisia istuntoja", + "sessions_empty_desc": "Istunnot näkyvät täällä, kun kirjaudut sisään selaimella tai sovelluksella.", + "sessions_last_seen": "Viimeksi nähty {time}", + "sessions_signed_in": "Kirjautunut {time}", + "session_toast_revoked": "Istunto peruttiin", + "session_revoke_title": "Peru istunto", + "session_revoke": "Peru", + "session_revoke_desc": "Haluatko varmasti perua tämän istunnon?", + "session_revoke_from": "Istunto kirjautui osoitteesta {#strong}{ip}{/strong} käyttäen {#strong}{agent}{/strong}", + "connections_title": "OAuth-yhteydet", + "connections_subtitle": "Yhdistä tai irrota kolmannen osapuolen tilejä, niin kirjaudut nopeammin ja profiilisi pysyy ajan tasalla.", + "connections_toast_linked": "Tili yhdistetty.", + "connections_toast_cancelled": "Yhdistäminen peruttiin.", + "connections_toast_failed": "Yhdistäminen epäonnistui.", + "connections_toast_removed": "Yhteys poistettiin", + "connections_refreshing": "Päivitetään…", + "connections_link_new": "Yhdistä uusi palvelu", + "connections_empty_title": "Ei vielä yhteyksiä", + "connections_empty_desc": "Yhdistä saatavilla olevia palveluja valitsemalla yltä ”Yhdistä uusi palvelu”.", + "connections_unlink": "Irrota", + "connections_load_failed": "OAuth-yhteyksien lataaminen epäonnistui.", + "connections_unlink_title": "Irrotetaanko {name}?", + "connections_unlink_title_generic": "Irrotetaanko tämä tili?", + "connections_unlink_desc": "Et voi enää kirjautua tällä palvelulla, ellet yhdistä sitä uudelleen.", + "provider_starting": "Käynnistetään {name}...", + "provider_link": "Yhdistä {name}", + "audit_subtitle": "Tilisi tietoturvan kannalta olennainen toiminta. Tarkista kaikki, mitä et tunnista.", + "audit_col_time": "Aika", + "audit_col_action": "Toiminto", + "audit_col_details": "Tiedot", + "audit_col_reason": "Syy", + "audit_col_ip": "IP-osoite", + "audit_col_device": "Laite", + "audit_action_login": "Kirjauduttu sisään", + "audit_action_logout": "Kirjauduttu ulos", + "audit_action_password_changed": "Salasana vaihdettu", + "audit_action_email_change_requested": "Sähköpostin vaihtoa pyydetty", + "audit_action_email_changed": "Sähköposti vaihdettu", + "audit_action_username_changed": "Käyttäjänimi vaihdettu", + "audit_action_api_token_created": "API-tunniste luotu", + "audit_action_api_token_deleted": "API-tunniste poistettu", + "audit_action_oauth_connected": "Yhteys lisätty", + "audit_action_oauth_disconnected": "Yhteys poistettu", + "audit_action_account_deactivated": "Tili poistettu käytöstä", + "audit_action_account_reactivated": "Tili otettu uudelleen käyttöön", + "audit_action_account_deleted": "Tili poistettu", + "audit_action_automation_token_created": "Automaatiotunniste luotu", + "audit_action_automation_token_updated": "Automaatiotunniste päivitetty", + "audit_action_automation_token_rotated": "Automaatiotunniste vaihdettu", + "audit_action_automation_token_deleted": "Automaatiotunniste poistettu", + "audit_action_automation_token_used": "Automaatiotunnistetta käytetty", + "audit_meta_session": "Istunto {id}", + "audit_meta_changed": "{old} → {new}", + "audit_meta_email_requested": "Pyydetty vaihto osoitteeseen {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} tili poistettu)", + "countPlural=other": "{name} ({count} tiliä poistettu)" + } + } + ], + "audit_meta_scheduled_deletion": "Ajastettu poistettavaksi", + "audit_meta_kept": "Säilytetty uudelleenaktivointia varten", + + "common_view": "Näytä", + "common_save": "Tallenna", + "common_saving": "Tallennetaan...", + "common_back": "Takaisin", + "common_shared_by": "Jakanut", + "common_user_avatar": "Profiilikuva", + "common_toast_saved": "Muutokset tallennettu", + "pause_reason_shocker": "Keskeytetty shockerin tasolla", + "pause_reason_shocker_user_share": "Keskeytetty shockerin ja käyttäjäjaon tasolla", + "pause_reason_shocker_public_share": "Keskeytetty shockerin ja julkisen jaon tasolla", + "pause_reason_user_share": "Keskeytetty käyttäjäjaon tasolla", + "pause_reason_public_share": "Keskeytetty julkisen jaon tasolla", + "public_shares_subtitle": "Linkki, jota kuka tahansa voi käyttää ilman tiliä.", + "public_shares_new": "Uusi jako", + "public_share_never_expires": "Ei vanhene", + "public_shares_empty_title": "Ei vielä julkisia jakoja", + "public_shares_empty_desc": "Luo linkki, jolla kuka tahansa voi ohjata shockereitasi.", + "public_share_expired": "Vanhentunut", + "public_share_no_expiry": "Ei vanhenemista", + "public_share_label": "Julkinen jako", + "public_share_toast_created": "Uusi julkinen jako luotu", + "public_share_create_title": "Luo julkinen jako", + "public_share_toast_deleted": "Julkinen jako poistettu", + "public_share_delete_title": "Poista julkinen jako", + "public_share_delete_desc": "Haluatko varmasti poistaa julkisen jaon {#strong}{name}{/strong}?", + "public_share_edit_title": "Julkinen jako: {name}", + "public_share_edit_subtitle": "Muokkaus: muutokset tulevat voimaan, kun tallennat.", + "public_share_add_shocker": "Lisää shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} shocker lisättiin jakoon", + "countPlural=other": "{count} shockeria lisättiin jakoon" + } + } + ], + "public_share_empty_shockers_title": "Tässä jaossa ei ole shockereita", + "public_share_empty_shockers_desc": "Lisää shocker, niin kuka tahansa linkin saanut voi ohjata sitä.", + "public_share_load_failed": "Julkisen jaon tietojen hakeminen epäonnistui", + "public_share_paused_here": "Keskeytetty tässä jaossa", + "public_share_resume_shocker": "Jatka shockeria", + "public_share_pause_shocker": "Keskeytä shocker", + "public_share_remove": "Poista jaosta", + "public_share_toast_removed": "Shocker poistettiin jaosta", + "public_share_add_title": "Lisää shockereita", + "public_share_add_desc": "Lisää shockereita tähän julkiseen jakoon. Voit asettaa niiden rajat lisäämisen jälkeen.", + "public_share_add_placeholder": "Valitse jaettavat shockerit...", + "public_share_add_no_match": "Ei vastaavia shockereita", + "public_share_add_submit": "Lisää shockerit", + "public_share_view_loading": "Ladataan jaon tietoja...", + "public_share_view_title": "Julkinen jakolinkki", + "public_share_view_desc": "Jatka vieraana tai kirjaudu OpenShock-tililläsi", + "public_share_view_guest_name": "Vieraan nimi", + "public_share_view_enter": "Jatka", + "public_share_view_enter_guest": "Jatka vieraana", + "public_share_login": "Kirjaudu sisään", + "perm_shock_on": "Shokki käytössä", + "perm_shock_off": "Shokki pois käytöstä", + "perm_vibrate_on": "Värinä käytössä", + "perm_vibrate_off": "Värinä pois käytöstä", + "perm_sound_on": "Ääni käytössä", + "perm_sound_off": "Ääni pois käytöstä", + "perm_live_on": "Live käytössä", + "perm_live_off": "Live pois käytöstä", + "perm_live_control": "Live-ohjaus", + "user_selector_avatar_of": "Käyttäjän {name} profiilikuva", + "user_selector_placeholder": "Anna käyttäjänimi", + "user_selector_aria": "Haettava käyttäjänimi", + "user_selector_search": "Hae käyttäjää", + "user_selector_found": "Käyttäjä löytyi", + + "common_remove": "Poista", + "user_shares_subtitle": "Suorat, pysyvät jaot muiden käyttäjien kanssa.", + "user_shares_toast_invited": "Shocker-kutsu lähetettiin käyttäjälle {name}", + "user_shares_redeem": "Lunasta koodi", + "user_shares_new": "Uusi jako", + "user_shares_tab_shares": "Jaot", + "user_shares_tab_incoming": "Kanssani jaetut", + "user_shares_tab_invites": "Kutsut", + "share_code_create_title": "Uusi jakokoodi", + "share_code_create_desc": "Luo jakokoodi tai kutsu", + "share_code_shocker_placeholder": "Valitse jaettavat shockerit...", + "share_code_no_match": "Ei vastaavia shockereita", + "share_code_send_invite": "Lähetä kutsu", + "share_code_create": "Luo jakokoodi", + "share_code_created_title": "Jakokoodi luotu", + "share_code_created_desc": "Kopioi jakokoodi tai linkki!", + "share_code_redeem_title": "Lunasta jakokoodi", + "share_code_redeem_desc": "Anna lunastettava jakokoodi", + "share_code_redeem_placeholder": "Anna jakokoodi", + "share_code_redeemed": "Lunastettu!", + "share_code_shared_shockers": "Jaetut shockerit", + "share_code_redeeming": "Lunastetaan...", + "share_code_redeem": "Lunasta", + "incoming_shares_empty_title": "Kanssasi ei ole jaettu mitään", + "incoming_shares_empty_desc": "Kukaan ei ole vielä jakanut shockeria kanssasi.", + "incoming_share_toast_removed": "Käyttäjän {name} jako poistettiin", + "incoming_share_remove_title": "Poista jako", + "incoming_share_remove_desc": "Haluatko varmasti poistaa käyttäjän {#strong}{name}{/strong} jaon?", + "incoming_share_toast_removed_shocker": "Käyttäjän {name} jakama {shocker} poistettiin", + "incoming_share_remove_shocker_title": "Poistetaanko tämä jaettu shocker?", + "incoming_share_remove_shocker_desc": "Haluatko varmasti poistaa käyttäjän {#strong}{name}{/strong} jakaman shockerin {#strong}{shocker}{/strong}?", + "incoming_share_manage_from": "Hallitse jakoja käyttäjältä", + "share_remove": "Poista jako", + "invites_empty_title": "Ei vielä kutsuja", + "invites_empty_desc": "Sinulla ei ole saapuvia eikä lähteviä kutsuja.", + "invites_outgoing": "Lähtevät", + "invites_outgoing_empty_title": "Ei lähteviä kutsuja", + "invites_outgoing_empty_desc": "Sinulla ei ole lähteviä kutsuja.", + "invites_incoming": "Saapuvat", + "invites_incoming_empty_title": "Ei saapuvia kutsuja", + "invites_incoming_empty_desc": "Sinulla ei ole saapuvia kutsuja.", + "invite_toast_accepted": "Hyväksyit käyttäjän {name} kutsun", + "invite_toast_declined": "Hylkäsit käyttäjän {name} kutsun", + "invite_deny_title": "Hylkää kutsu", + "invite_deny_label": "Hylkää kutsu", + "invite_deny": "Hylkää", + "invite_deny_desc": "Haluatko varmasti hylätä käyttäjän {#strong}{name}{/strong} kutsun?", + "invite_accept": "Hyväksy kutsu", + "invite_toast_cancelled_for": "Käyttäjän {name} kutsu peruttiin ({id})", + "invite_toast_cancelled": "Kutsu {id} peruttiin", + "invite_cancel_title": "Peru kutsu", + "invite_cancel": "Peru", + "invite_cancel_for_desc": "Haluatko varmasti perua käyttäjän {#strong}{name}{/strong} kutsun?", + "invite_cancel_code_desc": "Haluatko varmasti perua kutsun, jonka koodi on {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Peru odottava kutsu", + "outgoing_shares_empty_title": "Ei jaettuja shockereita", + "outgoing_shares_empty_desc": "Et ole vielä jakanut shockereita muiden käyttäjien kanssa.", + "outgoing_share_toast_removed": "Jaettu shocker {name} poistettiin", + "outgoing_share_remove_title": "Lopetetaanko tämän shockerin jakaminen?", + "outgoing_share_editing_for": "Muokataan jakoja käyttäjälle", + "outgoing_share_limits": "Rajat ja käyttöoikeudet", + "outgoing_share_same": "Samat rajoitukset kaikille shockereille", + "outgoing_share_per_desc": "Säädä rajoituksia shockerikohtaisesti", + "outgoing_share_all": "Kaikki", + "outgoing_share_per": "Shockerikohtaisesti", + + "outgoing_share_remove_desc": "Haluatko varmasti lopettaa shockerin {#strong}{shocker}{/strong} jakamisen käyttäjälle {#strong}{name}{/strong}?", + + "report_breadcrumb": "Ilmoita API-tunnisteista", + "report_toast_clipboard_failed": "Leikepöydän lukeminen epäonnistui: {error}", + "report_title": "Ilmoita vuotaneista API-tunnisteista", + "report_paste": "Liitä leikepöydältä", + "report_warning": "Tämä lomake on vain vahingossa vuotaneista API-tunnisteista ilmoittamiseen.", + "report_abuse_warning": "Tahallinen väärinkäyttö johtaa estoihin tai tiukkoihin rajoituksiin.", + "report_detected": "Havaitut tunnisteet", + "report_invalid": "Yksi tai useampi tunniste näyttää virheelliseltä. Tarkista muotoilu.", + "report_acknowledge": "Vahvistan ymmärtäväni, mihin tämä toiminto on tarkoitettu, ja otan vastuun.", + "report_submit": "Lähetä ilmoitus", + "turnstile_disabled": "Turnstile pois käytöstä", + "common_internal_error": "Sisäinen virhe", + "resend_toast_sent": "Aktivointiviesti lähetetty. Tarkista saapuneet ja roskaposti.", + "resend_toast_throttled": "Aktivointiviestejä on pyydetty liian monta. Yritä myöhemmin uudelleen.", + "resend_toast_unavailable": "Aktivointiviestiä ei voi lähettää uudelleen tästä selaimesta. Jos tiliäsi ei ole vielä aktivoitu, kirjautuminen lähettää uuden linkin.", + "resend_button": "Eikö viesti tullut? Lähetä uudelleen", + "expiration_label": "Vanheneminen", + "expiration_never": "Ei koskaan", + "expiration_custom": "Mukautettu", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} päivä", "countPlural=other": "{count} päivää" } + } + ], + "expiration_required": "Vanhenemispäivä on pakollinen", + "expiration_never_desc": "Ei vanhene koskaan", + "expiration_expires_at": "Vanhenee {time} ({date})", + "date_picker_placeholder": "Valitse päivä", + "telemetry_toast_title": "Autatko parantamaan OpenShockia?", + "telemetry_toast_desc": "Lähetä diagnostiikkaa, niin voimme korjata kaatumisia ja hitaita API-kutsuja. Raportit sisältävät virheilmoituksen, pinojäljityksen ja IP-osoitteesi. Voit muuttaa tätä milloin tahansa tilin asetuksissa.", + "telemetry_toast_no": "Ei kiitos", + "telemetry_toast_errors": "Vain virheet", + "telemetry_toast_full": "Täysi", + "table_show_details": "Näytä tiedot", + "table_hide_details": "Piilota tiedot", + "table_no_results": "Ei tuloksia.", + "table_sort_asc": "Lajittele: {name}, nouseva", + "table_sort_desc": "Lajittele: {name}, laskeva", + "table_sort_none": "Lajittele: {name}, lajittelematon", + "cell_na": "Ei sovellu", + "cell_not_applicable": "Ei sovellu", + "cell_invalid": "Virheellinen", + "cell_unavailable": "Ei saatavilla", + "cell_none": "Ei mitään", + "oauth_login_with": "Kirjaudu palvelulla {provider}", + "oauth_signup_with": "Rekisteröidy palvelulla {provider}", + "signalr_connect_failed": "Yhteys palvelimeen epäonnistui!", + "signalr_disconnect_failed": "Virhe katkaistaessa yhteyttä palvelimeen!", + "signalr_invalid_update": "Palvelimelta saatiin virheellinen päivitys!", + "signalr_invalid_log": "Palvelimelta saatiin virheellisiä lokitietoja!", + "signalr_invalid_ota": "Palvelimelta saatiin virheellisiä laiteohjelmistopäivityksen tietoja!", + "ota_toast_failed": "Hubin laiteohjelmistopäivitys epäonnistui: {message}", + "ota_toast_succeeded": "Hubin laiteohjelmistopäivitys onnistui!", + "ota_toast_rolled_back": "Hubin laiteohjelmisto palasi edelliseen versioon", + "lcg_connect_failed": "Yhteys live-ohjauksen yhdyskäytävään epäonnistui", + "terminal_toast_bootloader_failed": "Käynnistyslataimeen siirtyminen epäonnistui: {error}", + "terminal_toast_app_mode_failed": "Sovellustilaan siirtyminen epäonnistui: {error}", + + "problem_account_account_not_activated_title": "Tiliä ei ole aktivoitu", + "problem_account_account_not_activated_desc": "Etsi aktivointiviesti saapuneista.", + "problem_account_activation_not_found_title": "Aktivointilinkki on virheellinen", + "problem_account_activation_not_found_desc": "Linkki on ehkä vanhentunut tai jo käytetty.", + "problem_account_activation_resend_too_many_title": "Aktivointiviestejä pyydetty liian monta", + "problem_account_activation_resend_too_many_desc": "Odota hetki ennen kuin yrität uudelleen.", + "problem_account_activation_resend_unavailable_title": "Aktivointiviestiä ei voi lähettää uudelleen", + "problem_account_activation_resend_unavailable_desc": "Kirjaudu uudelleen pyytääksesi uuden aktivointilinkin.", + "problem_account_deactivate_already_deactivated_title": "Tili on jo poistettu käytöstä", + "problem_account_deactivate_denied_privileged_title": "Etuoikeutettuja tilejä ei voi poistaa käytöstä", + "problem_account_deactivate_unauthorized_title": "Sinulla ei ole lupaa tehdä tätä", + "problem_account_deactivated_title": "Tämä tili on poistettu käytöstä", + "problem_account_email_already_in_use_title": "Sähköpostiosoite on jo käytössä", + "problem_account_email_invalid_title": "Sähköpostiosoite on virheellinen", + "problem_account_email_taken_title": "Sähköpostiosoite on jo käytössä", + "problem_account_email_too_many_requests_title": "Liian monta sähköpostin vaihtopyyntöä", + "problem_account_email_too_many_requests_desc": "Odota hetki ennen kuin yrität uudelleen.", + "problem_account_email_unchanged_title": "Se on jo sähköpostiosoitteesi", + "problem_account_email_verify_not_found_title": "Vahvistuslinkki on virheellinen", + "problem_account_email_verify_not_found_desc": "Linkki on ehkä vanhentunut tai jo käytetty.", + "problem_account_o_auth_only_title": "Tällä tilillä ei ole salasanaa", + "problem_account_o_auth_only_desc": "Kirjaudu palvelulla, jolla rekisteröidyit.", + "problem_account_password_not_set_title": "Salasanaa ei ole asetettu", + "problem_account_password_not_set_desc": "Tämä tili kirjautuu ulkoisen palvelun kautta.", + "problem_account_password_old_password_invalid_title": "Nykyinen salasana on väärin", + "problem_account_username_invalid_title": "Käyttäjänimi ei ole sallittu", + "problem_account_username_recently_changed_title": "Käyttäjänimi vaihdettiin äskettäin", + "problem_account_username_recently_changed_desc": "Voit vaihtaa käyttäjänimesi kerran 7 päivässä.", + "problem_account_username_taken_title": "Käyttäjänimi on jo varattu", + "problem_admin_user_deactivated_title": "Tämä käyttäjä on poistettu käytöstä", + "problem_admin_user_not_activated_title": "Tätä käyttäjää ei ole vielä aktivoitu", + "problem_api_token_can_only_delete_self_title": "API-tunniste voi poistaa vain itsensä", + "problem_api_token_not_found_title": "API-tunnistetta ei löytynyt", + "problem_api_token_paused_title": "Tämä API-tunniste on keskeytetty", + "problem_assign_lcg_bad_schema_version_title": "Hubin protokollaversiota ei tueta", + "problem_assign_lcg_bad_schema_version_desc": "Päivitä hubin laiteohjelmisto yhdistääksesi.", + "problem_assign_lcg_no_lcg_available_title": "Yhdyskäytävää ei ole saatavilla", + "problem_assign_lcg_no_lcg_available_desc": "Live control -yhdyskäytävää ei ole juuri nyt saatavilla. Yritä myöhemmin uudelleen.", + "problem_authentication_account_deactivated_title": "Tämä tili on poistettu käytöstä", + "problem_authentication_account_not_activated_title": "Tätä tiliä ei ole aktivoitu", + "problem_authentication_cookie_missing_or_invalid_title": "Et ole kirjautunut sisään", + "problem_authentication_cookie_missing_or_invalid_desc": "Istuntosi on ehkä vanhentunut. Kirjaudu uudelleen.", + "problem_authentication_header_missing_or_invalid_title": "Virheellinen API-tunniste", + "problem_authentication_session_invalid_title": "Istunto vanheni", + "problem_authentication_session_invalid_desc": "Kirjaudu uudelleen.", + "problem_authentication_token_invalid_title": "Virheellinen API-tunniste", + "problem_authentication_unknown_error_title": "Tunnistautuminen epäonnistui", + "problem_authorization_policy_not_met_title": "Sinulla ei ole oikeutta tehdä tätä", + "problem_authorization_token_only_title": "Tämä toiminto vaatii API-tunnisteen", + "problem_authorization_token_permission_missing_title": "Tältä API-tunnisteelta puuttuu vaadittu käyttöoikeus", + "problem_authorization_unknown_error_title": "Valtuutus epäonnistui", + "problem_authorization_user_session_only_title": "Tämä toiminto vaatii kirjautuneen istunnon", + "problem_automation_token_not_allowed_for_account_title": "Automaatiotunnisteita ei voi käyttää etuoikeutettujen tilien kanssa", + "problem_configuration_already_exists_title": "Samanniminen asetus on jo olemassa", + "problem_configuration_invalid_name_format_title": "Virheellinen asetuksen nimi", + "problem_configuration_invalid_name_format_desc": "Vain A–Z ja alaviivat ovat sallittuja.", + "problem_configuration_invalid_value_format_title": "Arvo ei vastaa asetuksen tyyppiä", + "problem_configuration_not_found_title": "Asetusta ei löytynyt", + "problem_control_stats_invalid_range_title": "Alkupäivä ei voi olla loppupäivän jälkeen", + "problem_control_stats_invalid_time_zone_title": "Tuntematon aikavyöhyke", + "problem_control_stats_missing_capability_title": "Ohjaustilastot eivät ole käytettävissä tällä palvelimella", + "problem_device_not_found_title": "Hubia ei löytynyt", + "problem_device_not_online_title": "Hubi ei ole verkossa", + "problem_device_too_many_hubs_title": "Olet saavuttanut hubien enimmäismäärän", + "problem_device_too_many_shockers_title": "Tämä hubi on saavuttanut shockereiden enimmäismäärän", + "problem_endpoint_retired_title": "Tämä ominaisuus ei ole enää käytettävissä", + "problem_expression_error_title": "Virheellinen suodatinlauseke", + "problem_internal_server_error_title": "Meillä tapahtui virhe", + "problem_login_invalid_credentials_title": "Virheellinen käyttäjänimi tai salasana", + "problem_login_invalid_domain_title": "Kirjautuminen tästä osoitteesta ei ole sallittua", + "problem_o_auth_connection_already_exists_title": "Tilisi on jo yhdistetty tähän palveluun", + "problem_o_auth_connection_already_linked_title": "Tämä ulkoinen tili on jo liitetty toiseen käyttäjään", + "problem_o_auth_flow_anonymous_only_title": "Olet jo kirjautunut sisään", + "problem_o_auth_flow_mismatch_title": "Kirjautumisyritys ei täsmää", + "problem_o_auth_flow_mismatch_desc": "Aloita alusta.", + "problem_o_auth_flow_missing_data_title": "Palvelu ei palauttanut tilisi tietoja", + "problem_o_auth_flow_missing_data_desc": "Yritä uudelleen.", + "problem_o_auth_flow_not_found_title": "Kirjautumisyritys vanheni", + "problem_o_auth_flow_not_found_desc": "Aloita alusta.", + "problem_o_auth_flow_unsupported_title": "Kirjautumistapaa ei tueta", + "problem_o_auth_internal_error_title": "Kirjautumisessa tapahtui virhe", + "problem_o_auth_internal_error_desc": "Yritä hetken päästä uudelleen.", + "problem_o_auth_link_authenticated_user_only_title": "Sinun on kirjauduttava sisään liittääksesi ulkoisen tilin", + "problem_o_auth_provider_mismatch_title": "Kirjautumisyritys ei vastaa palvelua", + "problem_o_auth_provider_mismatch_desc": "Aloita alusta.", + "problem_o_auth_provider_unsupported_title": "Tätä kirjautumispalvelua ei tueta", + "problem_pair_code_not_found_title": "Parituskoodia ei löytynyt", + "problem_password_reset_not_found_title": "Salasanan palautuslinkki on virheellinen", + "problem_password_reset_not_found_desc": "Linkki on ehkä vanhentunut tai jo käytetty.", + "problem_session_not_found_title": "Istuntoa ei löytynyt", + "problem_share_get_no_shares_title": "Sinulla ei ole jakoja tämän käyttäjän kanssa", + "problem_share_request_create_cannot_share_with_self_title": "Et voi jakaa itsellesi", + "problem_share_request_create_shocker_not_found_title": "Yhtä tai useampaa shockeria ei löytynyt", + "problem_share_request_create_shocker_not_found_desc": "Ne on ehkä poistettu, tai ne eivät kuulu sinulle.", + "problem_share_request_not_found_title": "Kutsua ei löytynyt", + "problem_share_user_not_found_title": "Jakoa ei löytynyt", + "problem_share_code_already_linked_title": "Shocker on jo liitetty tiliisi", + "problem_share_code_cant_link_own_share_code_title": "Et voi lunastaa omaa jakokoodiasi", + "problem_share_code_not_found_title": "Jakokoodia ei löytynyt", + "problem_share_link_expiry_date_in_past_title": "Vanhenemispäivä ei voi olla menneisyydessä", + "problem_share_link_not_found_title": "Julkista jakoa ei löytynyt", + "problem_share_link_shocker_already_in_share_link_title": "Shocker on jo tässä julkisessa jaossa", + "problem_share_link_shocker_not_in_share_link_title": "Shocker ei ole tässä julkisessa jaossa", + "problem_shocker_control_no_permission_title": "Sinulla ei ole oikeutta ohjata tätä shockeria", + "problem_shocker_control_not_found_title": "Shockeria ei löytynyt", + "problem_shocker_control_paused_title": "Shocker on keskeytetty", + "problem_shocker_not_found_title": "Shockeria ei löytynyt", + "problem_signup_registration_disabled_title": "Rekisteröityminen on tällä hetkellä poissa käytöstä", + "problem_signup_username_or_email_exists_title": "Käyttäjänimi tai sähköpostiosoite on jo käytössä", + "problem_turnstile_invalid_title": "Tarkistus epäonnistui", + "problem_turnstile_invalid_desc": "Suorita tarkistus uudelleen ja yritä uudestaan.", + "problem_user_not_found_title": "Käyttäjää ei löytynyt", + "problem_user_privileged_delete_denied_title": "Etuoikeutettuja käyttäjiä ei voi poistaa", + "problem_validation_error_title": "Jotkin kentät ovat virheellisiä", + "problem_webhook_not_found_title": "Webhookia ei löytynyt", + "problem_webhook_unsupported_title": "Vain Discord-webhookit ovat tuettuja", + "problem_webhook_unsupported_desc": "Käytä discord.com-osoitetta, ei canary- tai ptb-osoitetta.", + + "error_too_many_requests": "Liian monta pyyntöä", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Yritä uudelleen {seconds} sekunnin päästä.", + "secondsPlural=other": "Yritä uudelleen {seconds} sekunnin päästä." + } + } + ], + "error_unexpected_response": "Odottamaton vastaus palvelimelta", + "error_internal": "Tapahtui sisäinen virhe", + "error_network": "Tapahtui verkkovirhe", + + "dev_banner": "Tämä on OpenShockin {#b}KEHITYSYMPÄRISTÖ{/b}. {#u}Tietoja ei tallenneta{/u}, ja ympäristö korvataan säännöllisesti tuotantotiedoilla.", + "firmware_channel_bugs_warning": "Tällä kanavalla voi olla bugin paskiaisia." +} diff --git a/messages/fr.json b/messages/fr.json new file mode 100644 index 00000000..6f7a6067 --- /dev/null +++ b/messages/fr.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "La plateforme de référence pour piloter des shockers à distance, en toute sécurité et avec une latence vraiment faible.", + "landing_section_label": "Accueil", + "landing_hubs_online": "Hubs en ligne actuellement : ", + "landing_learn_more": "En savoir plus", + "landing_wiki": "Wiki", + "landing_meta_description": "Bienvenue sur OpenShock, un écosystème libre et open source pour piloter différents shockers via Internet.", + "instance_meta_description": "Bienvenue sur {siteName}, une instance indépendante d’OpenShock, un écosystème libre et open source pour piloter différents shockers via Internet.", + "header_sidebar_toggle": "Afficher ou masquer la barre latérale", + "header_avatar_alt": "Avatar de {name}", + "header_menu_profile": "Profil", + "header_menu_settings": "Paramètres", + "header_menu_logout": "Se déconnecter", + "header_login": "Se connecter", + "header_signup": "S'inscrire", + "header_github_title": "OpenShock sur GitHub", + "header_discord_title": "Discord de la communauté", + + "footer_made_with": "Fait avec {#heart/} par l'{#team}équipe OpenShock{/team}", + "footer_connection_status_label": "État de la connexion au serveur", + "footer_signalr_state": "État de SignalR", + "footer_frontend_version": "Version du frontend", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Version du backend", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Langue", + + "sidebar_home_link_label": "Accueil d'OpenShock", + "sidebar_group_general": "Général", + "sidebar_home": "Accueil", + "sidebar_shockers": "Shockers", + "sidebar_shared_shockers": "Shockers partagés", + "sidebar_hubs": "Hubs", + "sidebar_user_shares": "Partages avec des utilisateurs", + "sidebar_public_shares": "Partages publics", + "sidebar_serial_terminal": "Terminal série", + "sidebar_group_admin": "Administration", + "sidebar_admin_monitoring": "Surveillance", + "sidebar_admin_online_hubs": "Hubs en ligne", + "sidebar_admin_online_gateways": "Passerelles en ligne", + "sidebar_admin_management": "Gestion", + "sidebar_admin_users": "Utilisateurs", + "sidebar_admin_blacklists": "Listes de blocage", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "E-mail", + "sidebar_admin_automation_tokens": "Jetons d'automatisation", + "sidebar_admin_configuration": "Configuration", + "sidebar_group_settings": "Paramètres", + "sidebar_settings_api_tokens": "Jetons d'API", + "sidebar_settings_sessions": "Sessions", + "sidebar_settings_audit_log": "Journal d'activité", + "sidebar_settings_connections": "Comptes associés", + "sidebar_settings_account": "Paramètres du compte", + + "error_meta_title": "Service indisponible", + "error_meta_description": "OpenShock est actuellement indisponible", + "error_meta_logo_alt": "Logo d'OpenShock", + "error_fallback_message": "Une erreur s'est produite.", + "error_not_found_message": "Page introuvable", + "error_not_found_description": "La page que vous cherchez n'existe pas.", + "error_unexpected_description": "Une erreur inattendue s'est produite.", + "error_go_back": "Retour", + + "auth_layout_logo_alt": "Logo d'OpenShock", + "auth_layout_invalid_redirect_removed": "Une URL de redirection invalide a été supprimée pour votre sécurité.", + + "auth_activate_breadcrumb": "Activer le compte", + "auth_activate_title": "Activer le compte", + "auth_activate_activating": "Activation de votre compte...", + "auth_activate_success": "Votre compte a été activé", + "auth_activate_failed": "Ce lien d'activation est invalide ou a expiré", + "auth_activate_missing_token": "Jeton d'activation manquant", + "auth_activate_continue": "Continuer vers la connexion", + "auth_activate_toast_success": "Compte activé", + + "auth_forgot_breadcrumb": "Mot de passe oublié", + "auth_forgot_title": "Mot de passe oublié", + "auth_forgot_description": "Saisissez votre adresse e-mail pour réinitialiser votre mot de passe", + "auth_forgot_email_label": "E-mail", + "auth_forgot_email_placeholder": "E-mail", + "auth_forgot_submit": "Réinitialiser le mot de passe", + "auth_forgot_signin_prompt": "Vous vous souvenez de votre mot de passe ? {#signin}Se connecter{/signin}", + "auth_forgot_mail_disabled": "La réinitialisation des mots de passe n'est pas disponible sur cette instance, car aucun fournisseur d'e-mail n'est configuré. Contactez votre administrateur pour récupérer l'accès à votre compte.", + "auth_forgot_toast_sent": "La demande de réinitialisation du mot de passe a été envoyée à l'adresse e-mail indiquée", + + "auth_login_breadcrumb": "Connexion", + "auth_login_title": "Bon retour parmi nous", + "auth_login_loading_methods": "Chargement des méthodes de connexion disponibles", + "auth_login_choose_method": "Connectez-vous avec l'une de ces méthodes", + "auth_login_with_account": "Connectez-vous avec votre compte OpenShock", + "auth_login_activation_after_signup": "Votre compte a été créé. Nous avons envoyé un lien d'activation à votre adresse e-mail. Vérifiez votre boîte de réception et vos courriers indésirables.", + "auth_login_activation_pending": "Votre compte n'est pas encore activé. Nous avons envoyé un lien d'activation à votre adresse e-mail. Vérifiez votre boîte de réception et vos courriers indésirables. Si vous ne recevez rien, reconnectez-vous plus tard pour obtenir un nouveau lien.", + "auth_login_oauth_only": "Ce compte n'a pas de mot de passe. Connectez-vous avec le fournisseur utilisé lors de votre inscription.", + "auth_login_oauth_only_with_buttons": "Ce compte n'a pas de mot de passe. Connectez-vous avec le fournisseur utilisé lors de votre inscription à l'aide des boutons ci-dessus.", + "auth_login_or_continue_with": "Ou continuer avec", + "auth_login_username_label": "Nom d'utilisateur ou e-mail", + "auth_login_password_label": "Mot de passe", + "auth_login_submit": "Se connecter", + "auth_login_signup_prompt": "Vous n'avez pas de compte ? {#signup}S'inscrire{/signup}", + "auth_login_legal": "En cliquant sur « Se connecter », vous acceptez nos {#tos}Conditions d'utilisation{/tos} et notre {#privacy}Politique de confidentialité{/privacy}.", + + "auth_oauth_create_breadcrumb": "S'inscrire avec {provider}", + "auth_oauth_create_title": "S'inscrire avec {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Complétez les informations de votre compte", + "auth_oauth_create_username_label": "Nom d'utilisateur", + "auth_oauth_create_username_placeholder": "Nom d'utilisateur", + "auth_oauth_create_email_label": "E-mail", + "auth_oauth_create_email_placeholder": "E-mail", + "auth_oauth_create_submit": "S'inscrire", + "auth_oauth_create_legal": "En cliquant sur « S'inscrire », vous acceptez nos {#tos}Conditions d'utilisation{/tos} et notre {#privacy}Politique de confidentialité{/privacy}.", + + "auth_oauth_error_breadcrumb": "Erreur d'authentification", + "auth_oauth_error_title": "Erreur d'authentification", + "auth_oauth_error_back": "Retour à la connexion", + + "auth_reset_breadcrumb": "Réinitialiser le mot de passe", + "auth_reset_title": "Réinitialiser le mot de passe", + "auth_reset_checking": "Vérification du lien de réinitialisation...", + "auth_reset_choose_password": "Choisissez un nouveau mot de passe pour votre compte", + "auth_reset_invalid": "Ce lien de réinitialisation est invalide ou a expiré", + "auth_reset_password_label": "Nouveau mot de passe", + "auth_reset_password_placeholder": "Nouveau mot de passe", + "auth_reset_confirm_label": "Confirmer le nouveau mot de passe", + "auth_reset_confirm_placeholder": "Confirmer le nouveau mot de passe", + "auth_reset_submit": "Réinitialiser le mot de passe", + "auth_reset_request_new": "Demander un nouveau lien", + "auth_reset_toast_success": "Le mot de passe a été réinitialisé", + + "auth_signup_breadcrumb": "Inscription", + "auth_signup_toast_created_mail": "Compte créé avec succès. Consultez vos e-mails pour vérifier votre compte.", + "auth_signup_toast_created_no_mail": "Compte créé avec succès. Vous pouvez vous connecter dès maintenant.", + "auth_signup_dialog_title": "Bienvenue ! Merci de vous être inscrit ! ❤️", + "auth_signup_dialog_created_mail": "Votre compte a été créé. 🎉 Consultez vos e-mails pour vérifier votre compte.", + "auth_signup_dialog_verify_then_login": "Une fois votre adresse e-mail vérifiée, vous pourrez vous connecter à votre compte.", + "auth_signup_dialog_created_no_mail": "Votre compte a été créé et est prêt à l'emploi. 🎉", + "auth_signup_dialog_login_now": "Vous pouvez vous connecter à votre compte dès maintenant.", + "auth_signup_title": "Créez votre compte", + "auth_signup_loading_methods": "Chargement des méthodes d'inscription disponibles", + "auth_signup_using_email": "Inscription par e-mail", + "auth_signup_choose_method": "Choisissez votre méthode d'inscription", + "auth_signup_back": "Retour", + "auth_signup_username_label": "Nom d'utilisateur", + "auth_signup_username_placeholder": "Jean OpenShock", + "auth_signup_email_label": "E-mail", + "auth_signup_email_placeholder": "jean@example.com", + "auth_signup_password_label": "Mot de passe", + "auth_signup_password_placeholder": "Mot de passe", + "auth_signup_confirm_label": "Confirmer le mot de passe", + "auth_signup_confirm_placeholder": "Confirmer le mot de passe", + "auth_signup_submit": "Créer un compte", + "auth_signup_signin_prompt": "Vous avez déjà un compte ? {#signin}Se connecter{/signin}", + "auth_signup_or": "Ou", + "auth_signup_with_email": "S'inscrire par e-mail", + "auth_signup_legal": "En cliquant sur « Créer un compte », vous acceptez nos {#tos}Conditions d'utilisation{/tos} et notre {#privacy}Politique de confidentialité{/privacy}.", + + "auth_verify_breadcrumb": "Vérifier l'e-mail", + "auth_verify_title": "Vérifier l'e-mail", + "auth_verify_verifying": "Vérification de votre adresse e-mail...", + "auth_verify_success": "Votre adresse e-mail a été vérifiée", + "auth_verify_failed": "Ce lien de vérification est invalide ou a expiré", + "auth_verify_missing_token": "Jeton de vérification manquant", + "auth_verify_continue": "Continuer vers la connexion", + "auth_verify_toast_success": "Adresse e-mail vérifiée", + + "common_cancel": "Annuler", + "common_delete": "Supprimer", + "common_edit": "Modifier", + "common_share": "Partager", + "common_copy_id": "Copier l'ID", + "common_id_copied": "ID copié dans le presse-papiers", + "common_open_menu": "Ouvrir le menu", + "common_refresh": "Actualiser", + "common_settings": "Paramètres", + "common_clear": "Effacer", + "common_online": "En ligne", + "common_offline": "Hors ligne", + "common_paused": "En pause", + "common_resume": "Reprendre", + "common_resuming": "Reprise...", + "common_coming_soon": "(Bientôt disponible)", + "common_save_changes": "Enregistrer les modifications", + "common_danger_zone": "Zone de danger", + "common_name": "Nom", + "control_intensity": "Intensité", + "control_duration": "Durée", + "control_max_intensity": "Intensité max.", + "control_max_duration": "Durée max.", + "control_vibration": "Vibration", + "control_value": "Valeur", + "control_live_intensity": "Intensité en direct", + "control_type_stop": "Arrêt", + "control_type_shock": "Choc", + "control_type_vibrate": "Vibrer", + "control_type_sound": "Son", + "live_tooltip_active": "En direct via {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Connexion...", + "live_tooltip_connect": "Se connecter au contrôle en direct", + "live_tooltip_hub_start": "Ctrl+clic pour démarrer tout le hub", + "live_tooltip_hub_stop": "Ctrl+clic pour arrêter tout le hub", + "pause_resume_shocker": "Reprendre le shocker", + "pause_pause_shocker": "Mettre le shocker en pause", + "pause_resume_all": "Reprendre tous les shockers", + "pause_pause_all": "Mettre tous les shockers en pause", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Sélectionner un hub", + "shocker_rf_id": "ID RF", + "shocker_rf_id_invalid": "L'ID RF doit être un nombre entier compris entre {min} et {max}.", + "shocker_model": "Modèle", + "shocker_select_model": "Sélectionner un modèle", + "shocker_name_placeholder": "Nom du shocker", + "shocker_menu_view_logs": "Voir les journaux", + "shocker_delete_title": "Supprimer le shocker", + "shocker_delete_desc": "Voulez-vous vraiment supprimer « {name} » ? Cette action est irréversible.", + "shocker_toast_deleted": "Shocker « {name} » supprimé", + "shocker_toast_paused": "Shocker mis en pause", + "shocker_toast_resumed": "Shocker repris", + "shocker_add_desc": "Enregistrez un nouveau shocker sur l'un de vos hubs.", + "shocker_add_name_placeholder": "Mon shocker", + "shockers_title": "Shockers", + "shockers_subtitle": "Tous les shockers associés à vos hubs.", + "shockers_loading": "Chargement des shockers...", + "shockers_toast_refreshed": "Shockers actualisés", + "shockers_toast_need_hub": "Vous devez créer un hub avant d'ajouter des shockers.", + "shockers_toast_added": "Shocker ajouté", + "shockers_unknown_module": "Type de module inconnu", + "shockers_add": "Ajouter un shocker", + "shockers_view_mode": "Mode d'affichage", + "shockers_mode_classic": "Classique", + "shockers_mode_rich": "Complet", + "shockers_mode_simple": "Simple", + "shockers_mode_map": "Carte", + "shockers_group_by_hub": "Grouper par hub", + "shockers_global_limits": "Limites globales", + "shockers_logs_label": "Journaux", + "shockers_empty_title": "Aucun shocker pour l'instant", + "shockers_empty_no_hubs": "Créez d'abord un hub, puis ajoutez-y des shockers.", + "shockers_empty_has_hubs": "Ajoutez un shocker à l'un de vos hubs pour commencer.", + "shockers_create_hub": "Créer un hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockers" } + } + ], + "shared_shockers_title": "Shockers partagés", + "shared_shockers_subtitle": "Les shockers que d'autres utilisateurs ont partagés avec vous.", + "shared_shockers_empty_title": "Aucun shocker n'a encore été partagé avec vous.", + "shared_shockers_empty_desc": "Lorsque quelqu'un partagera ses shockers avec vous, ils apparaîtront ici.", + "shocker_logs_title": "Journaux des shockers", + "shocker_logs_subtitle": "Toutes les commandes envoyées à vos shockers.", + "shocker_logs_live_title": "Les nouveaux journaux apparaissent en temps réel", + "shocker_logs_paused_title": "Les mises à jour en direct sont suspendues lors d'un tri ou sur une autre page que la première", + "shocker_logs_live": "En direct", + "shocker_logs_col_time": "Heure", + "shocker_logs_col_type": "Type", + "shocker_logs_col_by": "Par", + "shocker_logs_filter_label": "Filtrer par shocker", + "shocker_logs_filter_placeholder": "Rechercher des shockers...", + "shocker_logs_filter_all": "Tous les shockers", + "shocker_logs_filter_none": "Aucun shocker correspondant", + "shocker_edit_title": "Modifier le shocker", + "shocker_edit_subtitle": "Modifiez les informations de ce shocker ou supprimez-le.", + "shocker_edit_back": "Retour aux shockers", + "shocker_edit_load_failed": "Impossible de charger le shocker.", + "shocker_edit_loading": "Chargement du shocker...", + "shocker_edit_details_title": "Informations du shocker", + "shocker_edit_details_desc": "Mettez à jour le nom, l'ID RF et le modèle de ce shocker.", + "shocker_edit_pause_state": "État de pause", + "shocker_edit_is_paused": "Le shocker est en pause", + "shocker_edit_is_active": "Le shocker est actif", + "shocker_edit_toast_updated": "Shocker mis à jour", + "shocker_edit_delete_desc": "Supprimez définitivement ce shocker. Cette action est irréversible.", + + "common_close": "Fermer", + "common_continue": "Continuer", + "common_loading": "Chargement...", + "common_previous": "Précédent", + "common_next": "Suivant", + "common_steps": "Étapes", + "common_step_label": "Étape {number} : {title}", + "common_copy": "Copier", + "common_copied": "Copié", + "common_never": "Jamais", + "common_error": "Erreur : {message}", + "terminal_title": "Terminal série", + "terminal_connecting": "Connexion...", + "terminal_help_button": "Un problème ? Aide", + "terminal_back_to_modes": "Retour au choix du mode", + "terminal_mode_configure": "Configurer l'appareil", + "terminal_mode_configure_desc": "Configurez le Wi-Fi, l'authentification et plus encore. Inclut une console série interactive.", + "terminal_mode_flash": "Flasher le firmware", + "terminal_mode_flash_desc": "Installez ou mettez à jour le firmware d'un appareil connecté.", + "terminal_mode_raw": "Moniteur série", + "terminal_mode_raw_desc": "Juste la console. Lisez les journaux de l'appareil et envoyez des commandes.", + "terminal_step_channel": "Sélectionner le canal", + "terminal_step_board": "Sélectionner la carte", + "terminal_go_to_step": "Aller à l'étape {number} : {title}", + "terminal_erase": "Effacer avant de flasher", + "terminal_erase_desc": "Efface toutes les données de l'appareil, y compris les configurations existantes", + "terminal_unsupported": "Votre navigateur ne prend pas en charge cette fonctionnalité.", + "terminal_update_browser": "Veuillez mettre à jour votre navigateur vers la dernière version.", + "terminal_use_browsers": "Veuillez utiliser l'un des navigateurs suivants :", + "terminal_connect_failed_bootloader": "Impossible de passer en mode bootloader", + "terminal_connect_failed": "Échec de la connexion à l'appareil", + "terminal_connect_failed_desc": "Nous n'avons pas pu établir de connexion série avec l'appareil.", + "terminal_quick_tries": "À essayer rapidement :", + "terminal_try_replug": "Débranchez puis rebranchez l'appareil.", + "terminal_try_cable": "Essayez un autre câble ou port USB.", + "terminal_try_driver": "Vérifiez que le pilote série est installé.", + "terminal_open_troubleshooter": "Ouvrir le dépannage", + "terminal_log_reset_no_device": "Erreur côté hôte pendant la réinitialisation : aucun appareil !", + "terminal_log_reset_error": "Erreur côté hôte pendant la réinitialisation : {error}", + "terminal_log_send_no_device": "Envoi impossible : aucun appareil !", + "terminal_log_send_error": "Envoi impossible : {error}", + "terminal_log_firmware_disconnected": "Firmware déconnecté : {error}", + "terminal_log_erase_failed": "Impossible d'effacer la mémoire flash : {error}", + "terminal_log_hard_reset_failed": "Échec de la réinitialisation matérielle : {error}", + "terminal_log_flash_complete": "Flash terminé", + "terminal_log_flash_failed": "Échec du flash : {error}", + "terminal_log_command_failed": "Impossible d'écrire la commande : {error}", + "terminal_help_title": "Dépannage", + "terminal_help_desc": "Suivez ces étapes dans l'ordre. Chacune écarte une cause fréquente.", + "terminal_help_step_cable": "Câble USB", + "terminal_help_step_port": "Port USB", + "terminal_help_step_driver": "Installer le pilote", + "terminal_help_step_manual": "Mise à jour manuelle du pilote", + "terminal_help_step_discord": "Demander sur Discord", + "terminal_help_cable_body": "De nombreux câbles USB-C et micro-USB servent uniquement à la charge et ne transmettent pas de données. Utilisez un câble de données dont vous êtes sûr (un câble qui vous a déjà servi à transférer des fichiers ou à connecter d'autres appareils) et reconnectez le hub.", + "terminal_help_port_body": "Branchez l'appareil directement sur un port USB de votre ordinateur. Évitez si possible les hubs USB, les stations d'accueil et les ports en façade, qui causent souvent des problèmes d'alimentation et de signal. Sur un ordinateur de bureau, essayez un port à l'arrière de la machine.", + "terminal_help_driver_download": "Téléchargez le pilote CP210x :", + "terminal_help_driver_extract": "Extrayez le contenu du fichier zip dans un dossier de votre ordinateur.", + "terminal_help_driver_run": "Ouvrez le dossier et lancez {#code}{installer}{/code}. Suivez les instructions pour l'installer.", + "terminal_help_driver_reconnect": "Reconnectez l'appareil.", + "terminal_help_manual_intro": "Si le pilote a été installé mais que l'appareil n'apparaît toujours pas :", + "terminal_help_manual_open": "Ouvrez le Gestionnaire de périphériques (appuyez sur {#key}Win{/key} + {#key}X{/key} et sélectionnez {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Sous {#code}Ports (COM & LPT){/code}, cherchez une entrée comme :", + "terminal_help_manual_missing": "Si elle est absente, Windows ne détecte pas du tout l'appareil ; reprenez les étapes du câble et du port.", + "terminal_help_manual_update": "Faites un clic droit sur l'appareil et choisissez {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Choisissez {#code}Browse my computer for drivers{/code} et sélectionnez le dossier où vous avez extrait le zip du pilote. Vérifiez que {#code}Include subfolders{/code} est coché.", + "terminal_help_manual_success": "En cas de réussite, l'entrée doit maintenant indiquer {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Toujours bloqué ? Rejoignez notre serveur Discord et posez votre question dans le salon {#code}{channel}{/code}. Indiquez :", + "terminal_help_discord_os": "votre système d'exploitation et votre navigateur", + "terminal_help_discord_device": "l'appareil utilisé (modèle de carte, où vous l'avez obtenu)", + "terminal_help_discord_tried": "ce que vous avez déjà essayé parmi les étapes précédentes", + "terminal_help_discord_errors": "les messages d'erreur ou la sortie du terminal utiles", + "terminal_help_discord_join": "Rejoindre notre serveur Discord", + "terminal_risk_title": "⚠️ FIRMWARE INSTABLE", + "terminal_risk_intro": "Vous êtes sur le point de flasher un {#strong}firmware expérimental{/strong} {#strong}connu pour être instable{/strong}.", + "terminal_risk_brick": "Cela peut rendre votre appareil définitivement inutilisable ou nécessiter une récupération manuelle.", + "terminal_risk_no_support": "Nous n'assurerons AUCUN support pour les problèmes causés par ce firmware.", + "terminal_risk_acknowledge": "Je comprends que c'est entièrement ma responsabilité", + "terminal_risk_abort": "Annuler", + "terminal_risk_accept": "J'ACCEPTE L'ENTIÈRE RESPONSABILITÉ", + "firmware_channel_recommended": "C'est le canal recommandé.", + "firmware_channel_danger": "NE L'UTILISEZ PAS SI VOUS NE SAVEZ PAS CE QUE VOUS FAITES", + "firmware_channel_stable": "Stable", + "firmware_channel_beta": "Bêta", + "firmware_channel_develop": "Développement", + "terminal_board_select": "Sélectionnez une carte...", + "terminal_board_search": "Rechercher des cartes...", + "terminal_board_none": "Aucune carte trouvée.", + "terminal_flash_button": "Flasher", + "terminal_flash_progress": "Progression : {status}", + "terminal_flash_idle": "En attente", + "terminal_flash_no_device": "Aucun appareil sélectionné.", + "terminal_flash_resetting": "Réinitialisation...", + "terminal_flash_downloading": "Téléchargement du firmware...", + "terminal_flash_download_failed": "Impossible de télécharger le firmware.", + "terminal_flash_flashing": "Flash du firmware...", + "terminal_flash_rebooting": "Redémarrage de l'appareil... (Débranchez et rebranchez l'alimentation si cela bloque)", + "terminal_flash_done": "Appareil redémarré ! Flash terminé.", + "terminal_port_select": "Sélectionner l'appareil", + "terminal_port_disconnect": "Déconnecter l'appareil", + "terminal_port_connected": "Appareil connecté : {#strong}{id}{/strong}", + "terminal_console": "Console", + "terminal_connected_device": "Appareil connecté", + "terminal_resize": "Redimensionner le panneau du terminal", + "terminal_reboot": "Redémarrer", + "terminal_disconnect": "Déconnecter", + "terminal_fullscreen_exit_esc": "Quitter le plein écran (Échap)", + "terminal_fullscreen_exit": "Quitter le plein écran", + "terminal_fullscreen_fill": "Remplir la fenêtre", + "terminal_command_label": "Commande série", + "terminal_command_placeholder": "Saisissez une commande...", + "terminal_command_send": "Envoyer la commande", + "terminal_colors": "Couleurs", + "terminal_colors_menu": "Couleurs...", + "terminal_colors_label": "Couleurs de la console", + "terminal_colors_close": "Fermer les couleurs", + "terminal_color_input": "Couleur {name}", + "terminal_colors_reset": "Rétablir les valeurs par défaut", + "terminal_color_bg": "Arrière-plan", + "terminal_color_fg": "Texte", + "terminal_color_ts": "Horodatage", + "terminal_color_error": "Erreur", + "terminal_color_warning": "Avertissement", + "terminal_color_info": "Info", + "terminal_color_debug": "Débogage", + "terminal_color_verbose": "Détaillé", + "terminal_options": "Options", + "terminal_options_label": "Options de la console", + "terminal_hide_system": "Masquer les messages système", + "terminal_stick_bottom": "Rester en bas", + "terminal_raw_output": "Sortie brute", + "terminal_timestamps": "Horodatages", + "terminal_timestamp_uptime": "Temps de fonctionnement", + "terminal_timestamp_local": "Locale", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Désactivé", + "terminal_copy_settings": "Copier les paramètres", + "terminal_import_settings": "Importer les paramètres", + "terminal_copy_selection": "Copier la sélection", + "terminal_copy_all": "Copier toute la sortie", + "terminal_toast_selection_copied": "Sélection copiée", + "terminal_toast_output_copied": "Sortie de la console copiée", + "terminal_toast_settings_copied": "Paramètres de la console copiés", + "terminal_toast_clipboard_unreadable": "Impossible de lire le presse-papiers", + "terminal_toast_settings_imported": "Paramètres de la console importés", + "terminal_toast_settings_invalid": "Le presse-papiers ne contient pas de paramètres de console", + + "common_try_again": "Réessayer", + "terminal_cfg_intro": "Les valeurs sont envoyées à l'appareil via UART. La réponse de l'appareil s'affiche dans la console ci-dessous. Les commandes sans argument lisent la valeur ; utilisez le bouton {#eye/} à côté de chaque champ pour lire la valeur actuelle.", + "terminal_cfg_rf_title": "Émetteur RF", + "terminal_cfg_rf_desc": "Contrôle la sortie RF vers les shockers.", + "terminal_cfg_tx_pin": "Broche GPIO TX", + "terminal_cfg_example": "ex. : {value}", + "terminal_cfg_read_value": "Lire la valeur actuelle", + "terminal_cfg_set": "Définir", + "terminal_cfg_read": "Lire", + "terminal_cfg_reading": "Lecture…", + "terminal_cfg_apply": "Appliquer", + "terminal_cfg_keepalive": "Keepalive activé", + "terminal_cfg_keepalive_desc": "Envoie régulièrement un signal aux shockers associés pour les garder éveillés.", + "terminal_cfg_estop_title": "Arrêt d'urgence", + "terminal_cfg_estop_desc": "Bouton matériel qui interrompt toute sortie.", + "terminal_cfg_estop_enabled": "Arrêt d'urgence activé", + "terminal_cfg_estop_pin": "Broche GPIO de l'arrêt d'urgence", + "terminal_cfg_estop_note": "Remarque : {#code}{latching}{/code} et {#code}{active}{/code} n'ont pas de commande dédiée ; définissez-les via la configuration JSON ci-dessous.", + "terminal_cfg_wifi_title": "Wi-Fi", + "terminal_cfg_wifi_desc": "Identifiants réseau et nom d'hôte de l'appareil.", + "terminal_cfg_hostname": "Nom d'hôte", + "terminal_cfg_networks": "Réseaux (tableau JSON)", + "terminal_cfg_invalid_json_array": "Doit être un tableau JSON valide", + "terminal_cfg_ap_note": "Les paramètres AP ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) n'ont pas de commande dédiée ; utilisez la configuration JSON.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "Serveur OpenShock et authentification.", + "terminal_cfg_domain": "Domaine", + "terminal_cfg_domain_restart": "Définir le domaine redémarrera l'appareil.", + "terminal_cfg_auth_token": "Jeton d'authentification", + "terminal_cfg_auth_token_placeholder": "Collez le jeton de l'appareil", + "terminal_cfg_hide": "Masquer", + "terminal_cfg_show": "Afficher", + "terminal_cfg_serial_title": "Entrée série", + "terminal_cfg_echo": "Écho activé", + "terminal_cfg_echo_desc": "Renvoie les caractères saisis dans la console.", + "terminal_cfg_advanced_title": "Avancé : configuration complète", + "terminal_cfg_advanced_desc": "Pour les champs sans commande dédiée (portail captif, OTA, LAN, etc.), remplacez toute la configuration.", + "terminal_cfg_json_config": "Configuration JSON", + "terminal_cfg_invalid_json": "Doit être un JSON valide", + "terminal_cfg_read_json": "Lire la configuration actuelle en JSON", + "terminal_cfg_json_restart": "Appliquer une configuration JSON redémarrera l'appareil.", + "terminal_cfg_raw_config": "Configuration FlatBuffer brute (base64)", + "terminal_cfg_invalid_base64": "Doit être une chaîne base64 valide", + "terminal_cfg_read_raw": "Lire la configuration actuelle en base64", + "terminal_cfg_factory_reset": "Réinitialisation d'usine", + "terminal_cfg_factory_reset_desc": "Efface toute la configuration de l'appareil.", + "terminal_cfg_factory_reset_title": "Réinitialiser l'appareil aux paramètres d'usine ?", + "terminal_cfg_factory_reset_action": "Effacer la configuration", + "terminal_cfg_factory_reset_confirm": "Cela effacera toute la configuration de l'appareil : réseaux Wi-Fi, identifiants du backend, broches et tous les autres paramètres. L'appareil sera réinitialisé à ses valeurs par défaut.", + "terminal_cfg_read_failed_json_title": "Impossible de lire la configuration JSON", + "terminal_cfg_read_failed_raw_title": "Impossible de lire la configuration brute", + "terminal_cfg_read_failed_desc": "L'appareil n'a pas répondu après {attempts} tentatives.", + "terminal_cfg_common_causes": "Causes fréquentes :", + "terminal_cfg_cause_busy": "L'appareil est occupé à traiter une autre commande.", + "terminal_cfg_cause_disconnected": "L'appareil s'est déconnecté ou a redémarré.", + "terminal_cfg_cause_unsupported": "La version du firmware ne prend pas en charge cette commande.", + + "common_status": "État", + "common_version": "Version", + "common_created": "Créé", + "common_create": "Créer", + "common_done": "Terminé", + "common_enable": "Activer", + "common_disable": "Désactiver", + "common_are_you_sure": "Êtes-vous sûr ?", + "common_generating": "Génération...", + "hubs_title": "Hubs", + "hubs_subtitle": "Tous les hubs enregistrés sur votre compte.", + "hubs_add": "Ajouter un hub", + "hubs_load_failed": "Impossible de charger les hubs.", + "hubs_empty_title": "Aucun hub pour l'instant", + "hubs_empty_desc": "Un hub est l'appareil qui relaie les commandes vers vos shockers. Ajoutez-en un pour commencer.", + "hubs_create_title": "Créer un hub", + "hubs_name_label": "Nom du hub", + "hubs_name_placeholder": "Mon hub", + "hub_toast_not_connected": "Non connecté au serveur", + "hub_toast_try_later": "Réessayez dans un instant.", + "hub_reboot_title": "Redémarrer {name} ?", + "hub_reboot_desc": "Le hub va se déconnecter et redémarrer. Les shockers associés ne répondront plus jusqu'à son retour en ligne.", + "hub_reboot": "Redémarrer", + "hub_hotspot_enable_title": "Activer le point d'accès Wi-Fi sur {name} ?", + "hub_hotspot_disable_title": "Désactiver le point d'accès Wi-Fi sur {name} ?", + "hub_hotspot_enable_desc": "Le hub diffuse son propre réseau de configuration. Il reste accessible sur votre Wi-Fi, mais le point d'accès est ouvert à toute personne à portée jusqu'à ce que vous le désactiviez.", + "hub_hotspot_disable_desc": "Le point d'accès de configuration s'arrête. Si le hub n'est pas déjà sur votre Wi-Fi, vous aurez besoin d'un accès physique pour le reconfigurer.", + "hub_delete_desc": "Vous êtes sur le point de supprimer le hub {#strong}{name}{/strong}.", + "hub_delete_shockers": "Cela supprimera aussi les shockers suivants :", + "hub_edit_title": "Modifier le hub", + "hub_edit_apply": "Appliquer", + "hub_pair_title_generate": "Générer un code d'association ?", + "hub_pair_title_generated": "Code d'association généré", + "hub_pair_title_paired": "Hub associé", + "hub_pair_consumed": "{#strong}{name}{/strong} a utilisé ce code d'association et est maintenant associé.", + "hub_pair_used": "Le code a été utilisé et n'est plus valide.", + "hub_pair_generated_for": "Code d'association généré pour {#strong}{name}{/strong}.", + "hub_copy_now": "Le code ci-dessous ne sera plus accessible ensuite. Copiez-le maintenant et mettez à jour vos clients.", + "hub_pair_generate_for": "Vous êtes sur le point de générer un code d'association pour {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Il sera valable 15 minutes après sa création.", + "hub_pair_one_active": "Il n'y a qu'un code d'association actif par hub ; un nouveau code remplace l'ancien.", + "hub_pair_complete": "Association terminée", + "hub_pair_code_label": "Code d'association :", + "hub_pair_copied_close": "Code copié, fermer", + "hub_pair_get": "Obtenir le code", + "hub_token_generated": "Jeton généré", + "hub_token_generated_for": "Nouveau jeton généré pour {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Vous êtes sur le point de régénérer le jeton de {#strong}{name}{/strong}.", + "hub_token_invalidate": "Cette action invalidera le jeton actuel et déconnectera les clients qui l'utilisent.", + "hub_token_confirm": "Voulez-vous vraiment continuer ?", + "hub_token_label": "Nouveau jeton :", + "hub_token_copied_close": "Jeton copié, fermer", + "hub_token_regenerate": "Régénérer le jeton", + "hub_menu_update": "Mettre à jour", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "Activer le point d'accès Wi-Fi", + "hub_menu_hotspot_disable": "Désactiver le point d'accès Wi-Fi", + "hub_menu_pair": "Associer", + "hub_menu_estop": "Arrêt d'urgence", + "hub_update_breadcrumb": "Mise à jour", + "hub_update_unknown_hub": "Hub inconnu", + "hub_update_unknown_task": "Tâche inconnue", + "hub_update_task_metadata": "Récupération des métadonnées", + "hub_update_task_preparing": "Préparation de la mise à jour", + "hub_update_task_flash_fs": "Flash du système de fichiers", + "hub_update_task_verify_fs": "Vérification du système de fichiers", + "hub_update_task_flash_app": "Flash de l'application", + "hub_update_task_bootable": "Marquage de l'application comme amorçable", + "hub_update_task_rebooting": "Redémarrage", + "hub_update_status_started": "Démarré", + "hub_update_status_running": "En cours", + "hub_update_status_finished": "Terminé", + "hub_update_status_error": "Erreur", + "hub_update_status_timeout": "Délai dépassé", + "hub_update_confirm_title": "Confirmer la mise à jour du firmware", + "hub_update_confirm_desc": "Mettre à jour {#strong}{name}{/strong} vers la version {#strong}{version}{/strong} ?", + "hub_update_unstable_warning": "Cette version ne provient peut-être pas du canal stable et peut contenir des bugs.", + "hub_update_title": "Mettre à jour {name}", + "hub_update_subtitle": "Gérez les mises à jour du firmware de ce hub.", + "hub_update_status_title": "État du hub", + "hub_update_firmware": "Firmware : {#mono}{version}{/mono}", + "hub_update_confirm": "Mettre à jour", + "hub_update_success": "Mise à jour terminée avec succès", + "hub_update_rolled_back": "L'appareil est revenu à la version précédente", + "hub_update_back": "Retour aux hubs", + "hub_update_flash_again": "Flasher à nouveau", + "hub_update_card_title": "Mise à jour du firmware", + "hub_update_card_desc": "Sélectionnez un canal et une version de firmware à installer.", + "hub_update_to": "Mettre à jour vers {version}", + "hub_update_must_be_online": "Le hub doit être en ligne pour lancer une mise à jour.", + "hub_update_updating_to": "Mise à jour vers {version}...", + "hub_update_total": "Total", + "hub_update_task": "Tâche", + "hub_update_history": "Historique des mises à jour", + "hub_update_no_history": "Aucun historique de mise à jour pour ce hub.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Début", + "hub_update_col_message": "Message", + "hub_update_loading": "Chargement des informations du hub...", + "hub_update_not_found": "Hub introuvable.", + "home_breadcrumb": "Accueil", + "home_welcome": "Bon retour", + "home_welcome_name": "Bon retour, {name}", + "home_subtitle": "Voici un aperçu de votre configuration OpenShock.", + "home_hubs_online": "{count} en ligne", + "home_hub_status": "État des hubs", + "home_no_hubs": "Aucun hub", + "home_all_online": "Tous en ligne", + "home_all_offline": "Tous hors ligne", + "home_some_online": "{online}/{total} en ligne", + "home_quick_links": "Liens rapides", + "home_my_shockers": "Mes shockers", + "home_my_shockers_desc": "Contrôlez vos shockers", + "home_hubs_desc": "Gérez vos hubs", + "home_shared_desc": "Shockers partagés avec vous", + "home_public_desc": "Gérez les liens de partage", + "home_get_started": "Commencer", + "home_get_started_desc": "Vous n'avez pas encore de hub. Créez un hub pour connecter votre premier appareil, puis ajoutez-y des shockers.", + "home_set_up_hub": "Configurer un hub", + "home_first_shocker": "Ajoutez votre premier shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Vous avez configuré {count} hub. Ajoutez un shocker pour commencer à le contrôler.", + "countPlural=other": "Vous avez configuré {count} hubs. Ajoutez un shocker pour commencer à le contrôler." + } + } + ], + "home_go_to_shockers": "Aller aux shockers", + "profile_title": "Profil", + "profile_coming_soon": "Le profil arrive bientôt", + "profile_coming_soon_desc": "Votre profil public n'est pas encore disponible. Les informations du compte se trouvent dans les paramètres.", + + "common_retry": "Réessayer", + "common_never_used": "Jamais utilisé", + "common_expires": "Expire {time}", + "common_search_placeholder": "Rechercher...", + "common_unknown": "Inconnu", + "settings_breadcrumb_account": "Compte", + "account_subtitle": "Vos informations de connexion et les actions du compte.", + "account_change_username": "Changer le nom", + "account_change_email": "Changer l'e-mail", + "account_change_password": "Changer le mot de passe", + "account_username_label": "Nom d'utilisateur", + "account_email_label": "E-mail", + "account_password_label": "Mot de passe", + "account_new_password_label": "Nouveau mot de passe", + "account_confirm_password_label": "Confirmer le nouveau mot de passe", + "account_oauth_only": "Indisponible pour les comptes uniquement OAuth", + "account_oauth_no_password": "Ce compte se connecte via OAuth et n'a pas de mot de passe.", + "account_diagnostics": "Diagnostic", + "account_diagnostics_desc": "Aidez-nous à corriger les plantages et les appels API lents. Les rapports incluent le message d'erreur, la trace de pile et votre IP. Désactivé par défaut.", + "account_diagnostics_level": "Niveau de diagnostic", + "account_telemetry_off": "Non", + "account_telemetry_off_desc": "Ne rien envoyer.", + "account_telemetry_errors": "Erreurs", + "account_telemetry_errors_desc": "Envoyer uniquement les rapports d'erreur du navigateur.", + "account_telemetry_full": "Complet", + "account_telemetry_full_desc": "Rapports d'erreur et traces des appels API (sans les navigations de page).", + "account_toast_deactivated": "Compte désactivé avec succès", + "account_deactivate_title": "Désactiver le compte", + "account_deactivate_desc": "Voulez-vous vraiment désactiver votre compte ?", + "account_deactivate": "Désactiver le compte", + "account_email_title": "Changer l'e-mail", + "account_email_desc": "Saisissez votre nouvelle adresse e-mail et confirmez avec votre mot de passe actuel.", + "account_email_toast_sent": "E-mail de vérification envoyé à {email}. Cliquez sur le lien qu'il contient pour appliquer la modification.", + "account_new_email": "Nouvel e-mail", + "account_current_password": "Mot de passe actuel", + "account_password_title": "Changer le mot de passe", + "account_password_desc": "Saisissez votre mot de passe actuel et choisissez-en un nouveau.", + "account_password_toast": "Le mot de passe a été modifié", + "account_username_title": "Changer le nom d'utilisateur", + "account_username_desc": "Saisissez un nouveau nom d'utilisateur.", + "account_new_username": "Nouveau nom d'utilisateur", + "account_username_toast": "Nom d'utilisateur modifié avec succès", + "tokens_subtitle": "Les jetons d'API servent à s'authentifier auprès de l'API OpenShock.", + "tokens_generate": "Générer un jeton", + "tokens_toast_refreshed": "Jetons actualisés", + "tokens_empty_title": "Aucun jeton d'API", + "tokens_empty_desc": "Générez un jeton pour vous authentifier auprès de l'API OpenShock.", + "tokens_created_on": "Créé le {date}", + "tokens_last_used": "Dernière utilisation {time}", + "tokens_never_expires": "N'expire jamais", + "tokens_load_failed": "Impossible de charger les jetons d'API.", + "token_toast_edited": "Jeton modifié avec succès", + "token_name_required": "Le nom est requis", + "token_name_too_long": "Le nom est trop long", + "token_edit_title": "Modifier le jeton d'API", + "token_name_label": "Nom du jeton", + "token_name_placeholder": "Nom du jeton...", + "token_permissions": "Autorisations", + "token_perm_category_shockers": "Shockers", + "token_perm_category_devices": "Hubs", + "token_perm_category_usershares": "Partages avec des utilisateurs", + "token_perm_category_publicshares": "Partages publics", + "token_perm_use": "Utiliser", + "token_perm_edit": "Modifier", + "token_perm_pause": "Mettre en pause", + "token_perm_auth": "Authentifier", + "token_shocker_control": "Contrôle des shockers", + "token_toast_paused": "Jeton en pause", + "token_toast_resumed": "Jeton réactivé", + "token_delete_title": "Supprimer le jeton d'API", + "token_delete_desc": "Voulez-vous vraiment supprimer {#strong}{name}{/strong} ?", + "token_delete_permanent": "Cette action est irréversible. Le jeton sera définitivement supprimé.", + "token_toast_deleted": "Jeton supprimé avec succès", + "token_resume": "Réactiver le jeton", + "token_pause": "Mettre le jeton en pause", + "token_mode_clamp_desc": "Clamp : les requêtes hors de la plage autorisée sont ramenées à la limite la plus proche (le min ou le max).", + "token_mode_lerp_desc": "Lerp : toute la plage d'entrée est remise à l'échelle linéairement pour tenir dans votre plage min–max autorisée.", + "token_paused_desc": "Un jeton en pause ne peut pas envoyer de commandes aux shockers.", + "token_intensity_range": "Plage d'intensité", + "token_duration_range": "Plage de durée", + "token_new_breadcrumb": "Nouveau", + "token_redirect_not_allowed": "La redirect_uri fournie n'est pas autorisée. Seules les adresses de bouclage ou les schémas d'application personnalisés sont acceptés.", + "token_params_missing": "Des paramètres GET obligatoires sont manquants. Vérifiez que name, redirect_uri et permissions sont fournis.", + "token_invalid_permissions": "Autorisations non valides : {list}", + "token_toast_created": "Jeton créé avec succès", + "token_request_title": "Demande de jeton d'API", + "token_access_granted": "Accès accordé", + "token_shared_redirecting": "Le jeton a été créé et transmis à l'application. Redirection vers {#b}{uri}{/b}.", + "token_not_redirected": "Si vous n'êtes pas redirigé automatiquement, utilisez le bouton ci-dessous.", + "token_finish": "Terminer", + "token_generated_title": "Jeton d'API généré", + "token_copy_now": "Copiez votre jeton d'API maintenant, vous ne pourrez plus le revoir ensuite !", + "token_new_title": "Nouveau jeton d'API", + "token_external_desc": "Une application externe demande l'accès à votre compte. Vérifiez et ajustez les autorisations ci-dessous avant d'autoriser l'accès.", + "token_new_desc": "Configurez et générez un nouveau jeton d'API pour votre compte.", + "token_external_requesting": "{#b}{name}{/b} demande un jeton d'API. Votre jeton sera transmis à l'application à l'adresse {#b}{uri}{/b}.", + "token_allow": "Autoriser", + "token_generate": "Générer", + "token_deny": "Refuser", + "sessions_subtitle": "Toutes les sessions actives de votre compte. Révoquez celles que vous ne reconnaissez pas.", + "sessions_unknown_device": "Appareil inconnu", + "sessions_toast_refreshed": "Sessions actualisées", + "sessions_load_failed": "Impossible de charger les sessions.", + "sessions_empty_title": "Aucune session active", + "sessions_empty_desc": "Les sessions apparaissent ici dès que vous vous connectez depuis un navigateur ou une application.", + "sessions_last_seen": "Vu pour la dernière fois {time}", + "sessions_signed_in": "Connecté {time}", + "session_toast_revoked": "Session révoquée avec succès", + "session_revoke_title": "Révoquer la session", + "session_revoke": "Révoquer", + "session_revoke_desc": "Voulez-vous vraiment révoquer cette session ?", + "session_revoke_from": "Session connectée depuis {#strong}{ip}{/strong} avec {#strong}{agent}{/strong}", + "connections_title": "Connexions OAuth", + "connections_subtitle": "Associez ou dissociez des comptes tiers pour vous connecter plus vite et garder votre profil synchronisé.", + "connections_toast_linked": "Compte associé.", + "connections_toast_cancelled": "Association annulée.", + "connections_toast_failed": "L'association a échoué.", + "connections_toast_removed": "Connexion supprimée", + "connections_refreshing": "Actualisation…", + "connections_link_new": "Associer un fournisseur", + "connections_empty_title": "Aucune connexion pour l'instant", + "connections_empty_desc": "Choisissez « Associer un fournisseur » ci-dessus pour connecter les fournisseurs disponibles.", + "connections_unlink": "Dissocier", + "connections_load_failed": "Impossible de charger les connexions OAuth.", + "connections_unlink_title": "Dissocier {name} ?", + "connections_unlink_title_generic": "Dissocier ce compte ?", + "connections_unlink_desc": "Vous ne pourrez plus vous connecter avec ce fournisseur, sauf si vous l'associez à nouveau.", + "provider_starting": "Lancement de {name}...", + "provider_link": "Associer {name}", + "audit_subtitle": "Activité liée à la sécurité de votre compte. Vérifiez tout ce que vous ne reconnaissez pas.", + "audit_col_time": "Heure", + "audit_col_action": "Action", + "audit_col_details": "Détails", + "audit_col_reason": "Raison", + "audit_col_ip": "Adresse IP", + "audit_col_device": "Appareil", + "audit_action_login": "Connexion", + "audit_action_logout": "Déconnexion", + "audit_action_password_changed": "Mot de passe modifié", + "audit_action_email_change_requested": "Changement d'e-mail demandé", + "audit_action_email_changed": "E-mail modifié", + "audit_action_username_changed": "Nom d'utilisateur modifié", + "audit_action_api_token_created": "Jeton d'API créé", + "audit_action_api_token_deleted": "Jeton d'API supprimé", + "audit_action_oauth_connected": "Connexion ajoutée", + "audit_action_oauth_disconnected": "Connexion supprimée", + "audit_action_account_deactivated": "Compte désactivé", + "audit_action_account_reactivated": "Compte réactivé", + "audit_action_account_deleted": "Compte supprimé", + "audit_action_automation_token_created": "Jeton d'automatisation créé", + "audit_action_automation_token_updated": "Jeton d'automatisation mis à jour", + "audit_action_automation_token_rotated": "Jeton d'automatisation renouvelé", + "audit_action_automation_token_deleted": "Jeton d'automatisation supprimé", + "audit_action_automation_token_used": "Jeton d'automatisation utilisé", + "audit_meta_session": "Session {id}", + "audit_meta_changed": "{old} vers {new}", + "audit_meta_email_requested": "Changement demandé vers {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} compte supprimé)", + "countPlural=other": "{name} ({count} comptes supprimés)" + } + } + ], + "audit_meta_scheduled_deletion": "Suppression programmée", + "audit_meta_kept": "Conservé pour réactivation", + + "common_view": "Voir", + "common_save": "Enregistrer", + "common_saving": "Enregistrement...", + "common_back": "Retour", + "common_shared_by": "Partagé par", + "common_user_avatar": "Avatar de l'utilisateur", + "common_toast_saved": "Modifications enregistrées", + "pause_reason_shocker": "En pause au niveau du shocker", + "pause_reason_shocker_user_share": "En pause au niveau du shocker et du partage utilisateur", + "pause_reason_shocker_public_share": "En pause au niveau du shocker et du partage public", + "pause_reason_user_share": "En pause au niveau du partage utilisateur", + "pause_reason_public_share": "En pause au niveau du partage public", + "public_shares_subtitle": "Un lien utilisable par tous, sans compte.", + "public_shares_new": "Nouveau partage", + "public_share_never_expires": "N'expire jamais", + "public_shares_empty_title": "Aucun partage public pour l'instant", + "public_shares_empty_desc": "Créez un lien que n'importe qui peut utiliser pour contrôler vos shockers.", + "public_share_expired": "Expiré", + "public_share_no_expiry": "Sans expiration", + "public_share_label": "Partage public", + "public_share_toast_created": "Nouveau partage public créé", + "public_share_create_title": "Créer un partage public", + "public_share_toast_deleted": "Partage public supprimé", + "public_share_delete_title": "Supprimer le partage public", + "public_share_delete_desc": "Voulez-vous vraiment supprimer le partage public {#strong}{name}{/strong} ?", + "public_share_edit_title": "Partage public : {name}", + "public_share_edit_subtitle": "Modification : les changements s'appliquent à l'enregistrement.", + "public_share_add_shocker": "Ajouter un shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} shocker ajouté au partage", + "countPlural=other": "{count} shockers ajoutés au partage" + } + } + ], + "public_share_empty_shockers_title": "Aucun shocker dans ce partage", + "public_share_empty_shockers_desc": "Ajoutez un shocker et toute personne disposant du lien pourra le contrôler.", + "public_share_load_failed": "Erreur lors du chargement du partage public", + "public_share_paused_here": "En pause pour ce partage", + "public_share_resume_shocker": "Réactiver le shocker", + "public_share_pause_shocker": "Mettre le shocker en pause", + "public_share_remove": "Retirer du partage", + "public_share_toast_removed": "Shocker retiré du partage", + "public_share_add_title": "Ajouter des shockers", + "public_share_add_desc": "Ajoutez des shockers à ce partage public. Vous pourrez définir leurs limites une fois ajoutés.", + "public_share_add_placeholder": "Sélectionnez les shockers à partager...", + "public_share_add_no_match": "Aucun shocker correspondant", + "public_share_add_submit": "Ajouter les shockers", + "public_share_view_loading": "Chargement du partage...", + "public_share_view_title": "Lien de partage public", + "public_share_view_desc": "Entrez en tant qu'invité ou connectez-vous avec votre compte OpenShock", + "public_share_view_guest_name": "Nom d'invité", + "public_share_view_enter": "Entrer", + "public_share_view_enter_guest": "Entrer en tant qu'invité", + "public_share_login": "Se connecter", + "perm_shock_on": "Choc activé", + "perm_shock_off": "Choc désactivé", + "perm_vibrate_on": "Vibration activée", + "perm_vibrate_off": "Vibration désactivée", + "perm_sound_on": "Son activé", + "perm_sound_off": "Son désactivé", + "perm_live_on": "Live activé", + "perm_live_off": "Live désactivé", + "perm_live_control": "Contrôle en direct", + "user_selector_avatar_of": "Avatar de {name}", + "user_selector_placeholder": "Saisissez un nom d'utilisateur", + "user_selector_aria": "Nom d'utilisateur à rechercher", + "user_selector_search": "Rechercher l'utilisateur", + "user_selector_found": "Utilisateur trouvé", + + "common_remove": "Retirer", + "user_shares_subtitle": "Partages directs et permanents avec d'autres utilisateurs.", + "user_shares_toast_invited": "Invitation de shocker envoyée à {name}", + "user_shares_redeem": "Utiliser un code", + "user_shares_new": "Nouveau partage", + "user_shares_tab_shares": "Partages", + "user_shares_tab_incoming": "Partagés avec moi", + "user_shares_tab_invites": "Invitations", + "share_code_create_title": "Nouveau code de partage", + "share_code_create_desc": "Créez un code de partage ou une invitation", + "share_code_shocker_placeholder": "Sélectionnez les shockers à partager...", + "share_code_no_match": "Aucun shocker correspondant", + "share_code_send_invite": "Envoyer l'invitation", + "share_code_create": "Créer le code", + "share_code_created_title": "Code de partage généré", + "share_code_created_desc": "Copiez le code de partage ou le lien !", + "share_code_redeem_title": "Utiliser un code de partage", + "share_code_redeem_desc": "Saisissez le code de partage à utiliser", + "share_code_redeem_placeholder": "Saisissez le code", + "share_code_redeemed": "Code utilisé avec succès !", + "share_code_shared_shockers": "Shockers partagés", + "share_code_redeeming": "Utilisation...", + "share_code_redeem": "Utiliser", + "incoming_shares_empty_title": "Rien n'est partagé avec vous", + "incoming_shares_empty_desc": "Personne n'a encore partagé de shocker avec vous.", + "incoming_share_toast_removed": "Partage de {name} retiré", + "incoming_share_remove_title": "Retirer le partage", + "incoming_share_remove_desc": "Voulez-vous vraiment retirer le partage de {#strong}{name}{/strong} ?", + "incoming_share_toast_removed_shocker": "{shocker} partagé par {name} retiré", + "incoming_share_remove_shocker_title": "Retirer ce shocker partagé ?", + "incoming_share_remove_shocker_desc": "Voulez-vous vraiment retirer le shocker {#strong}{shocker}{/strong} partagé par {#strong}{name}{/strong} ?", + "incoming_share_manage_from": "Gérer les partages de", + "share_remove": "Retirer le partage", + "invites_empty_title": "Aucune invitation pour l'instant", + "invites_empty_desc": "Vous n'avez aucune invitation reçue ou envoyée.", + "invites_outgoing": "Envoyées", + "invites_outgoing_empty_title": "Aucune invitation envoyée", + "invites_outgoing_empty_desc": "Vous n'avez envoyé aucune invitation.", + "invites_incoming": "Reçues", + "invites_incoming_empty_title": "Aucune invitation reçue", + "invites_incoming_empty_desc": "Vous n'avez reçu aucune invitation.", + "invite_toast_accepted": "Invitation de {name} acceptée", + "invite_toast_declined": "Invitation de {name} refusée", + "invite_deny_title": "Refuser l'invitation", + "invite_deny_label": "Refuser l'invitation", + "invite_deny": "Refuser", + "invite_deny_desc": "Voulez-vous vraiment refuser l'invitation de {#strong}{name}{/strong} ?", + "invite_accept": "Accepter l'invitation", + "invite_toast_cancelled_for": "Invitation pour {name} annulée ({id})", + "invite_toast_cancelled": "Invitation {id} annulée", + "invite_cancel_title": "Annuler l'invitation", + "invite_cancel": "Retirer", + "invite_cancel_for_desc": "Voulez-vous vraiment annuler l'invitation pour {#strong}{name}{/strong} ?", + "invite_cancel_code_desc": "Voulez-vous vraiment annuler l'invitation avec le code {#strong}{code}{/strong} ?", + "invite_cancel_outstanding": "Annuler l'invitation en attente", + "outgoing_shares_empty_title": "Aucun shocker partagé", + "outgoing_shares_empty_desc": "Vous n'avez encore partagé aucun shocker avec d'autres utilisateurs.", + "outgoing_share_toast_removed": "Shocker partagé {name} retiré", + "outgoing_share_remove_title": "Ne plus partager ce shocker ?", + "outgoing_share_editing_for": "Modification des partages pour", + "outgoing_share_limits": "Limites et autorisations", + "outgoing_share_same": "Mêmes restrictions pour chaque shocker", + "outgoing_share_per_desc": "Ajustez les restrictions par shocker", + "outgoing_share_all": "Tous", + "outgoing_share_per": "Par shocker", + + "outgoing_share_remove_desc": "Voulez-vous vraiment ne plus partager {#strong}{shocker}{/strong} avec {#strong}{name}{/strong} ?", + + "report_breadcrumb": "Signaler des jetons d'API", + "report_toast_clipboard_failed": "Impossible de lire le presse-papiers : {error}", + "report_title": "Signaler des jetons d'API divulgués", + "report_paste": "Coller depuis le presse-papiers", + "report_warning": "Ce formulaire sert uniquement à signaler des jetons d'API divulgués par accident.", + "report_abuse_warning": "Tout abus intentionnel entraînera un bannissement ou de fortes restrictions.", + "report_detected": "Jetons détectés", + "report_invalid": "Un ou plusieurs jetons semblent invalides. Vérifiez leur format.", + "report_acknowledge": "Je confirme comprendre l'usage de cette fonction et j'en accepte la responsabilité.", + "report_submit": "Envoyer le signalement", + "turnstile_disabled": "Turnstile désactivé", + "common_internal_error": "Erreur interne", + "resend_toast_sent": "E-mail d'activation envoyé. Vérifiez votre boîte de réception et vos spams.", + "resend_toast_throttled": "Trop d'e-mails d'activation ont été demandés. Réessayez plus tard.", + "resend_toast_unavailable": "Aucun e-mail d'activation ne peut être renvoyé depuis ce navigateur. Si votre compte n'est pas encore activé, la connexion envoie un nouveau lien.", + "resend_button": "Pas reçu l'e-mail ? Renvoyer", + "expiration_label": "Expiration", + "expiration_never": "Jamais", + "expiration_custom": "Personnalisé", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} jour", "countPlural=other": "{count} jours" } + } + ], + "expiration_required": "La date d'expiration est requise", + "expiration_never_desc": "N'expirera jamais", + "expiration_expires_at": "Expire {time} ({date})", + "date_picker_placeholder": "Choisir une date", + "telemetry_toast_title": "Aider à améliorer OpenShock ?", + "telemetry_toast_desc": "Envoyez des diagnostics pour nous aider à corriger les plantages et les appels API lents. Les rapports incluent le message d'erreur, la trace de pile et votre IP. Vous pouvez modifier ce choix à tout moment dans les paramètres du compte.", + "telemetry_toast_no": "Non merci", + "telemetry_toast_errors": "Erreurs seulement", + "telemetry_toast_full": "Complet", + "table_show_details": "Afficher les détails", + "table_hide_details": "Masquer les détails", + "table_no_results": "Aucun résultat.", + "table_sort_asc": "Trier par {name}, croissant", + "table_sort_desc": "Trier par {name}, décroissant", + "table_sort_none": "Trier par {name}, non trié", + "cell_na": "N/A", + "cell_not_applicable": "Non applicable", + "cell_invalid": "Invalide", + "cell_unavailable": "Indisponible", + "cell_none": "Aucun", + "oauth_login_with": "Se connecter avec {provider}", + "oauth_signup_with": "S'inscrire avec {provider}", + "signalr_connect_failed": "Impossible de se connecter au serveur !", + "signalr_disconnect_failed": "Erreur lors de la déconnexion du serveur !", + "signalr_invalid_update": "Mise à jour invalide reçue du serveur !", + "signalr_invalid_log": "Données de journal invalides reçues du serveur !", + "signalr_invalid_ota": "Données de mise à jour du firmware invalides reçues du serveur !", + "ota_toast_failed": "La mise à jour du firmware du hub a échoué : {message}", + "ota_toast_succeeded": "Mise à jour du firmware du hub terminée avec succès !", + "ota_toast_rolled_back": "Le firmware du hub est revenu à la version précédente", + "lcg_connect_failed": "Impossible de se connecter à la passerelle de contrôle en direct", + "terminal_toast_bootloader_failed": "Impossible de passer en mode bootloader : {error}", + "terminal_toast_app_mode_failed": "Impossible de passer en mode application : {error}", + + "problem_account_account_not_activated_title": "Compte non activé", + "problem_account_account_not_activated_desc": "Recherchez l'e-mail d'activation dans votre boîte de réception.", + "problem_account_activation_not_found_title": "Le lien d'activation est invalide", + "problem_account_activation_not_found_desc": "Le lien a peut-être expiré ou a déjà été utilisé.", + "problem_account_activation_resend_too_many_title": "Trop d'e-mails d'activation demandés", + "problem_account_activation_resend_too_many_desc": "Patientez un moment avant de réessayer.", + "problem_account_activation_resend_unavailable_title": "Impossible de renvoyer l'e-mail d'activation", + "problem_account_activation_resend_unavailable_desc": "Reconnectez-vous pour demander un nouveau lien d'activation.", + "problem_account_deactivate_already_deactivated_title": "Le compte est déjà désactivé", + "problem_account_deactivate_denied_privileged_title": "Les comptes privilégiés ne peuvent pas être désactivés", + "problem_account_deactivate_unauthorized_title": "Vous n'êtes pas autorisé à faire cela", + "problem_account_deactivated_title": "Ce compte a été désactivé", + "problem_account_email_already_in_use_title": "Cette adresse e-mail est déjà utilisée", + "problem_account_email_invalid_title": "Cette adresse e-mail n'est pas valide", + "problem_account_email_taken_title": "Cette adresse e-mail est déjà utilisée", + "problem_account_email_too_many_requests_title": "Trop de demandes de changement d'e-mail", + "problem_account_email_too_many_requests_desc": "Patientez un moment avant de réessayer.", + "problem_account_email_unchanged_title": "C'est déjà votre adresse e-mail", + "problem_account_email_verify_not_found_title": "Le lien de vérification est invalide", + "problem_account_email_verify_not_found_desc": "Le lien a peut-être expiré ou a déjà été utilisé.", + "problem_account_o_auth_only_title": "Ce compte n'a pas de mot de passe", + "problem_account_o_auth_only_desc": "Connectez-vous avec le fournisseur utilisé lors de votre inscription.", + "problem_account_password_not_set_title": "Aucun mot de passe défini", + "problem_account_password_not_set_desc": "Ce compte se connecte via un fournisseur externe.", + "problem_account_password_old_password_invalid_title": "Le mot de passe actuel est incorrect", + "problem_account_username_invalid_title": "Ce nom d'utilisateur n'est pas autorisé", + "problem_account_username_recently_changed_title": "Nom d'utilisateur modifié trop récemment", + "problem_account_username_recently_changed_desc": "Vous pouvez changer de nom d'utilisateur une fois tous les 7 jours.", + "problem_account_username_taken_title": "Ce nom d'utilisateur est déjà pris", + "problem_admin_user_deactivated_title": "Cet utilisateur est désactivé", + "problem_admin_user_not_activated_title": "Cet utilisateur n'a pas encore été activé", + "problem_api_token_can_only_delete_self_title": "Un jeton d'API ne peut supprimer que lui-même", + "problem_api_token_not_found_title": "Jeton d'API introuvable", + "problem_api_token_paused_title": "Ce jeton d'API est en pause", + "problem_assign_lcg_bad_schema_version_title": "Version du protocole du hub non prise en charge", + "problem_assign_lcg_bad_schema_version_desc": "Mettez à jour le firmware du hub pour vous connecter.", + "problem_assign_lcg_no_lcg_available_title": "Aucune passerelle disponible", + "problem_assign_lcg_no_lcg_available_desc": "Aucune passerelle de contrôle en direct n'est disponible pour le moment. Réessayez plus tard.", + "problem_authentication_account_deactivated_title": "Ce compte a été désactivé", + "problem_authentication_account_not_activated_title": "Ce compte n'a pas été activé", + "problem_authentication_cookie_missing_or_invalid_title": "Vous n'êtes pas connecté", + "problem_authentication_cookie_missing_or_invalid_desc": "Votre session a peut-être expiré. Veuillez vous reconnecter.", + "problem_authentication_header_missing_or_invalid_title": "Jeton d'API invalide", + "problem_authentication_session_invalid_title": "Session expirée", + "problem_authentication_session_invalid_desc": "Veuillez vous reconnecter.", + "problem_authentication_token_invalid_title": "Jeton d'API invalide", + "problem_authentication_unknown_error_title": "Échec de l'authentification", + "problem_authorization_policy_not_met_title": "Vous n'avez pas l'autorisation de faire cela", + "problem_authorization_token_only_title": "Cette action nécessite un jeton d'API", + "problem_authorization_token_permission_missing_title": "Ce jeton d'API n'a pas une autorisation requise", + "problem_authorization_unknown_error_title": "Échec de l'autorisation", + "problem_authorization_user_session_only_title": "Cette action nécessite une session connectée", + "problem_automation_token_not_allowed_for_account_title": "Les jetons d'automatisation ne peuvent pas être utilisés avec des comptes privilégiés", + "problem_configuration_already_exists_title": "Une entrée de configuration portant ce nom existe déjà", + "problem_configuration_invalid_name_format_title": "Nom de configuration invalide", + "problem_configuration_invalid_name_format_desc": "Seuls les caractères A à Z et le tiret bas sont autorisés.", + "problem_configuration_invalid_value_format_title": "La valeur ne correspond pas au type de configuration", + "problem_configuration_not_found_title": "Entrée de configuration introuvable", + "problem_control_stats_invalid_range_title": "La date de début ne doit pas être postérieure à la date de fin", + "problem_control_stats_invalid_time_zone_title": "Fuseau horaire inconnu", + "problem_control_stats_missing_capability_title": "Les statistiques de contrôle ne sont pas disponibles sur ce serveur", + "problem_device_not_found_title": "Hub introuvable", + "problem_device_not_online_title": "Le hub est hors ligne", + "problem_device_too_many_hubs_title": "Vous avez atteint le nombre maximal de hubs", + "problem_device_too_many_shockers_title": "Ce hub a atteint son nombre maximal de shockers", + "problem_endpoint_retired_title": "Cette fonctionnalité n'est plus disponible", + "problem_expression_error_title": "Expression de filtre invalide", + "problem_internal_server_error_title": "Un problème est survenu de notre côté", + "problem_login_invalid_credentials_title": "Nom d'utilisateur ou mot de passe invalide", + "problem_login_invalid_domain_title": "La connexion depuis cette adresse n'est pas autorisée", + "problem_o_auth_connection_already_exists_title": "Votre compte est déjà connecté à ce fournisseur", + "problem_o_auth_connection_already_linked_title": "Ce compte externe est déjà associé à un autre utilisateur", + "problem_o_auth_flow_anonymous_only_title": "Vous êtes déjà connecté", + "problem_o_auth_flow_mismatch_title": "La tentative de connexion ne correspond pas", + "problem_o_auth_flow_mismatch_desc": "Veuillez recommencer.", + "problem_o_auth_flow_missing_data_title": "Le fournisseur n'a pas renvoyé les informations de votre compte", + "problem_o_auth_flow_missing_data_desc": "Veuillez réessayer.", + "problem_o_auth_flow_not_found_title": "La tentative de connexion a expiré", + "problem_o_auth_flow_not_found_desc": "Veuillez recommencer.", + "problem_o_auth_flow_unsupported_title": "Mode de connexion non pris en charge", + "problem_o_auth_internal_error_title": "Un problème est survenu lors de la connexion", + "problem_o_auth_internal_error_desc": "Réessayez dans un instant.", + "problem_o_auth_link_authenticated_user_only_title": "Vous devez être connecté pour associer un compte externe", + "problem_o_auth_provider_mismatch_title": "La tentative de connexion ne correspond pas au fournisseur", + "problem_o_auth_provider_mismatch_desc": "Veuillez recommencer.", + "problem_o_auth_provider_unsupported_title": "Ce fournisseur de connexion n'est pas pris en charge", + "problem_pair_code_not_found_title": "Code d'association introuvable", + "problem_password_reset_not_found_title": "Le lien de réinitialisation du mot de passe est invalide", + "problem_password_reset_not_found_desc": "Le lien a peut-être expiré ou a déjà été utilisé.", + "problem_session_not_found_title": "Session introuvable", + "problem_share_get_no_shares_title": "Vous n'avez aucun partage avec cet utilisateur", + "problem_share_request_create_cannot_share_with_self_title": "Vous ne pouvez pas partager avec vous-même", + "problem_share_request_create_shocker_not_found_title": "Un ou plusieurs shockers sont introuvables", + "problem_share_request_create_shocker_not_found_desc": "Ils ont peut-être été supprimés ou ne vous appartiennent pas.", + "problem_share_request_not_found_title": "Invitation introuvable", + "problem_share_user_not_found_title": "Partage introuvable", + "problem_share_code_already_linked_title": "Le shocker est déjà associé à votre compte", + "problem_share_code_cant_link_own_share_code_title": "Vous ne pouvez pas utiliser votre propre code de partage", + "problem_share_code_not_found_title": "Code de partage introuvable", + "problem_share_link_expiry_date_in_past_title": "La date d'expiration ne peut pas être dans le passé", + "problem_share_link_not_found_title": "Partage public introuvable", + "problem_share_link_shocker_already_in_share_link_title": "Le shocker est déjà dans ce partage public", + "problem_share_link_shocker_not_in_share_link_title": "Le shocker n'est pas dans ce partage public", + "problem_shocker_control_no_permission_title": "Vous n'êtes pas autorisé à contrôler ce shocker", + "problem_shocker_control_not_found_title": "Shocker introuvable", + "problem_shocker_control_paused_title": "Le shocker est en pause", + "problem_shocker_not_found_title": "Shocker introuvable", + "problem_signup_registration_disabled_title": "Les inscriptions sont actuellement désactivées", + "problem_signup_username_or_email_exists_title": "Ce nom d'utilisateur ou cette adresse e-mail est déjà utilisé", + "problem_turnstile_invalid_title": "Échec de la vérification", + "problem_turnstile_invalid_desc": "Relevez à nouveau le défi puis réessayez.", + "problem_user_not_found_title": "Utilisateur introuvable", + "problem_user_privileged_delete_denied_title": "Les utilisateurs privilégiés ne peuvent pas être supprimés", + "problem_validation_error_title": "Certains champs sont invalides", + "problem_webhook_not_found_title": "Webhook introuvable", + "problem_webhook_unsupported_title": "Seuls les webhooks Discord sont pris en charge", + "problem_webhook_unsupported_desc": "Utilisez une URL discord.com, pas canary ni ptb.", + + "error_too_many_requests": "Trop de requêtes", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Réessayez dans {seconds} seconde.", + "secondsPlural=other": "Réessayez dans {seconds} secondes." + } + } + ], + "error_unexpected_response": "Réponse inattendue du serveur", + "error_internal": "Une erreur interne s'est produite", + "error_network": "Une erreur réseau s'est produite", + + "dev_banner": "Ceci est l'environnement de {#b}DÉVELOPPEMENT{/b} d'OpenShock. {#u}Aucune donnée n'est conservée{/u}, et il est régulièrement écrasé par les données de production.", + "firmware_channel_bugs_warning": "Ce canal peut contenir des bugs." +} diff --git a/messages/ja.json b/messages/ja.json new file mode 100644 index 00000000..7825148f --- /dev/null +++ b/messages/ja.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "安全で信頼性の高い、低遅延のショッカー遠隔操作プラットフォームです。", + "landing_section_label": "ホーム", + "landing_hubs_online": "現在オンラインのハブ数:", + "landing_learn_more": "詳しく見る", + "landing_wiki": "Wiki", + "landing_meta_description": "OpenShockへようこそ。OpenShockは、さまざまなショッカーをインターネット経由で操作できる、無料でオープンソースのエコシステムです。", + "instance_meta_description": "{siteName}へようこそ。ここはOpenShockの独立したインスタンスです。OpenShockは、さまざまなショッカーをインターネット経由で操作できる、無料でオープンソースのエコシステムです。", + "header_sidebar_toggle": "サイドバーの切り替え", + "header_avatar_alt": "{name}のアバター", + "header_menu_profile": "プロフィール", + "header_menu_settings": "設定", + "header_menu_logout": "ログアウト", + "header_login": "ログイン", + "header_signup": "新規登録", + "header_github_title": "GitHub の OpenShock", + "header_discord_title": "コミュニティ Discord", + + "footer_made_with": "{#team}OpenShock チーム{/team}が{#heart/}を込めて制作", + "footer_connection_status_label": "サーバー接続状態", + "footer_signalr_state": "SignalR 状態", + "footer_frontend_version": "フロントエンドのバージョン", + "footer_frontend_commit_title": "コミット {commit}", + "footer_backend_version": "バックエンドのバージョン", + "footer_backend_commit_title": "コミット {commit}", + "footer_language_label": "言語", + + "sidebar_home_link_label": "OpenShock ホーム", + "sidebar_group_general": "一般", + "sidebar_home": "ホーム", + "sidebar_shockers": "ショッカー", + "sidebar_shared_shockers": "共有ショッカー", + "sidebar_hubs": "ハブ", + "sidebar_user_shares": "ユーザー共有", + "sidebar_public_shares": "公開共有", + "sidebar_serial_terminal": "シリアルターミナル", + "sidebar_group_admin": "管理", + "sidebar_admin_monitoring": "モニタリング", + "sidebar_admin_online_hubs": "オンラインのハブ", + "sidebar_admin_online_gateways": "オンラインのゲートウェイ", + "sidebar_admin_management": "管理", + "sidebar_admin_users": "ユーザー", + "sidebar_admin_blacklists": "ブラックリスト", + "sidebar_admin_webhooks": "Webhook", + "sidebar_admin_mail": "メール", + "sidebar_admin_automation_tokens": "自動化トークン", + "sidebar_admin_configuration": "構成", + "sidebar_group_settings": "設定", + "sidebar_settings_api_tokens": "API トークン", + "sidebar_settings_sessions": "セッション", + "sidebar_settings_audit_log": "監査ログ", + "sidebar_settings_connections": "連携", + "sidebar_settings_account": "アカウント設定", + + "error_meta_title": "サービス利用不可", + "error_meta_description": "OpenShock は現在ご利用いただけません", + "error_meta_logo_alt": "OpenShock ロゴ", + "error_fallback_message": "問題が発生しました。", + "error_not_found_message": "ページが見つかりません", + "error_not_found_description": "お探しのページは存在しません。", + "error_unexpected_description": "予期しないエラーが発生しました。", + "error_go_back": "戻る", + + "auth_layout_logo_alt": "OpenShock ロゴ", + "auth_layout_invalid_redirect_removed": "安全のため、無効なリダイレクト URL を削除しました。", + + "auth_activate_breadcrumb": "アカウントの有効化", + "auth_activate_title": "アカウントの有効化", + "auth_activate_activating": "アカウントを有効化しています...", + "auth_activate_success": "アカウントが有効化されました", + "auth_activate_failed": "この有効化リンクは無効か、期限切れです", + "auth_activate_missing_token": "有効化トークンがありません", + "auth_activate_continue": "ログインへ進む", + "auth_activate_toast_success": "アカウントを有効化しました", + + "auth_forgot_breadcrumb": "パスワードを忘れた場合", + "auth_forgot_title": "パスワードを忘れた場合", + "auth_forgot_description": "パスワードをリセットするにはメールアドレスを入力してください", + "auth_forgot_email_label": "メールアドレス", + "auth_forgot_email_placeholder": "メールアドレス", + "auth_forgot_submit": "パスワードをリセット", + "auth_forgot_signin_prompt": "パスワードを思い出しましたか?{#signin}ログイン{/signin}", + "auth_forgot_mail_disabled": "このインスタンスにはメールプロバイダーが設定されていないため、パスワードのリセットはご利用いただけません。アカウントの復旧については管理者にお問い合わせください。", + "auth_forgot_toast_sent": "入力されたメールアドレスにパスワードリセットのリクエストを送信しました", + + "auth_login_breadcrumb": "ログイン", + "auth_login_title": "おかえりなさい", + "auth_login_loading_methods": "利用可能なログイン方法を読み込んでいます", + "auth_login_choose_method": "次のいずれかの方法でログイン", + "auth_login_with_account": "OpenShock アカウントでログイン", + "auth_login_activation_after_signup": "アカウントが作成されました。メールアドレスに有効化リンクを送信しました。受信トレイと迷惑メールフォルダーをご確認ください。", + "auth_login_activation_pending": "アカウントはまだ有効化されていません。メールアドレスに有効化リンクを送信しました。受信トレイと迷惑メールフォルダーをご確認ください。届かない場合は、後でもう一度ログインして新しいリンクを受け取ってください。", + "auth_login_oauth_only": "このアカウントにはパスワードがありません。登録時に使用したプロバイダーでログインしてください。", + "auth_login_oauth_only_with_buttons": "このアカウントにはパスワードがありません。上のボタンから、登録時に使用したプロバイダーでログインしてください。", + "auth_login_or_continue_with": "または次の方法で続行", + "auth_login_username_label": "ユーザー名またはメールアドレス", + "auth_login_password_label": "パスワード", + "auth_login_submit": "ログイン", + "auth_login_signup_prompt": "アカウントをお持ちでないですか?{#signup}新規登録{/signup}", + "auth_login_legal": "「ログイン」をクリックすると、{#tos}利用規約{/tos}と{#privacy}プライバシーポリシー{/privacy}に同意したものとみなされます。", + + "auth_oauth_create_breadcrumb": "{provider} で新規登録", + "auth_oauth_create_title": "{#provider}{provider}{/provider} で新規登録", + "auth_oauth_create_description": "アカウント情報を入力してください", + "auth_oauth_create_username_label": "ユーザー名", + "auth_oauth_create_username_placeholder": "ユーザー名", + "auth_oauth_create_email_label": "メールアドレス", + "auth_oauth_create_email_placeholder": "メールアドレス", + "auth_oauth_create_submit": "新規登録", + "auth_oauth_create_legal": "「新規登録」をクリックすると、{#tos}利用規約{/tos}と{#privacy}プライバシーポリシー{/privacy}に同意したものとみなされます。", + + "auth_oauth_error_breadcrumb": "認証エラー", + "auth_oauth_error_title": "認証エラー", + "auth_oauth_error_back": "ログインに戻る", + + "auth_reset_breadcrumb": "パスワードのリセット", + "auth_reset_title": "パスワードのリセット", + "auth_reset_checking": "リセットリンクを確認しています...", + "auth_reset_choose_password": "アカウントの新しいパスワードを設定してください", + "auth_reset_invalid": "このリセットリンクは無効か、期限切れです", + "auth_reset_password_label": "新しいパスワード", + "auth_reset_password_placeholder": "新しいパスワード", + "auth_reset_confirm_label": "新しいパスワード(確認)", + "auth_reset_confirm_placeholder": "新しいパスワード(確認)", + "auth_reset_submit": "パスワードをリセット", + "auth_reset_request_new": "新しいリセットリンクをリクエスト", + "auth_reset_toast_success": "パスワードをリセットしました", + + "auth_signup_breadcrumb": "新規登録", + "auth_signup_toast_created_mail": "アカウントを作成しました。メールを確認してアカウントを認証してください。", + "auth_signup_toast_created_no_mail": "アカウントを作成しました。今すぐログインできます。", + "auth_signup_dialog_title": "ようこそ!ご登録ありがとうございます!❤️", + "auth_signup_dialog_created_mail": "アカウントが作成されました。🎉 メールを確認してアカウントを認証してください。", + "auth_signup_dialog_verify_then_login": "メールアドレスの認証後、アカウントにログインできます。", + "auth_signup_dialog_created_no_mail": "アカウントが作成され、すぐにご利用いただけます。🎉", + "auth_signup_dialog_login_now": "今すぐアカウントにログインできます。", + "auth_signup_title": "アカウントを作成", + "auth_signup_loading_methods": "利用可能な登録方法を読み込んでいます", + "auth_signup_using_email": "メールアドレスで登録", + "auth_signup_choose_method": "登録方法を選択してください", + "auth_signup_back": "戻る", + "auth_signup_username_label": "ユーザー名", + "auth_signup_username_placeholder": "John OpenShock", + "auth_signup_email_label": "メールアドレス", + "auth_signup_email_placeholder": "john@example.com", + "auth_signup_password_label": "パスワード", + "auth_signup_password_placeholder": "パスワード", + "auth_signup_confirm_label": "パスワード(確認)", + "auth_signup_confirm_placeholder": "パスワード(確認)", + "auth_signup_submit": "アカウントを作成", + "auth_signup_signin_prompt": "すでにアカウントをお持ちですか?{#signin}ログイン{/signin}", + "auth_signup_or": "または", + "auth_signup_with_email": "メールアドレスで登録", + "auth_signup_legal": "「アカウントを作成」をクリックすると、{#tos}利用規約{/tos}と{#privacy}プライバシーポリシー{/privacy}に同意したものとみなされます。", + + "auth_verify_breadcrumb": "メールアドレスの認証", + "auth_verify_title": "メールアドレスの認証", + "auth_verify_verifying": "メールアドレスを認証しています...", + "auth_verify_success": "メールアドレスが認証されました", + "auth_verify_failed": "この認証リンクは無効か、期限切れです", + "auth_verify_missing_token": "認証トークンがありません", + "auth_verify_continue": "ログインへ進む", + "auth_verify_toast_success": "メールアドレスを認証しました", + + "common_cancel": "キャンセル", + "common_delete": "削除", + "common_edit": "編集", + "common_share": "共有", + "common_copy_id": "ID をコピー", + "common_id_copied": "ID をクリップボードにコピーしました", + "common_open_menu": "メニューを開く", + "common_refresh": "更新", + "common_settings": "設定", + "common_clear": "クリア", + "common_online": "オンライン", + "common_offline": "オフライン", + "common_paused": "一時停止中", + "common_resume": "再開", + "common_resuming": "再開しています...", + "common_coming_soon": "(近日公開)", + "common_save_changes": "変更を保存", + "common_danger_zone": "危険な操作", + "common_name": "名前", + "control_intensity": "強度", + "control_duration": "時間", + "control_max_intensity": "最大強度", + "control_max_duration": "最大時間", + "control_vibration": "振動", + "control_value": "値", + "control_live_intensity": "ライブ強度", + "control_type_stop": "停止", + "control_type_shock": "ショック", + "control_type_vibrate": "振動", + "control_type_sound": "音", + "live_tooltip_active": "{gateway}({country})経由でライブ接続中、{latency}ms", + "live_tooltip_connecting": "接続しています...", + "live_tooltip_connect": "ライブコントロールに接続", + "live_tooltip_hub_start": "Ctrl+クリックでハブ全体を開始", + "live_tooltip_hub_stop": "Ctrl+クリックでハブ全体を停止", + "pause_resume_shocker": "ショッカーを再開", + "pause_pause_shocker": "ショッカーを一時停止", + "pause_resume_all": "すべてのショッカーを再開", + "pause_pause_all": "すべてのショッカーを一時停止", + "shocker_label": "ショッカー", + "shocker_hub": "ハブ", + "shocker_select_hub": "ハブを選択", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID は {min} から {max} までの整数で指定してください。", + "shocker_model": "モデル", + "shocker_select_model": "モデルを選択", + "shocker_name_placeholder": "ショッカー名", + "shocker_menu_view_logs": "ログを表示", + "shocker_delete_title": "ショッカーを削除", + "shocker_delete_desc": "「{name}」を削除してもよろしいですか?この操作は元に戻せません。", + "shocker_toast_deleted": "ショッカー「{name}」を削除しました", + "shocker_toast_paused": "ショッカーを一時停止しました", + "shocker_toast_resumed": "ショッカーを再開しました", + "shocker_add_desc": "ハブに新しいショッカーを登録します。", + "shocker_add_name_placeholder": "マイショッカー", + "shockers_title": "ショッカー", + "shockers_subtitle": "ハブとペアリングされているすべてのショッカーです。", + "shockers_loading": "ショッカーを読み込んでいます...", + "shockers_toast_refreshed": "ショッカーを更新しました", + "shockers_toast_need_hub": "ショッカーを追加する前にハブを作成する必要があります。", + "shockers_toast_added": "ショッカーを追加しました", + "shockers_unknown_module": "不明なモジュールタイプ", + "shockers_add": "ショッカーを追加", + "shockers_view_mode": "表示モード", + "shockers_mode_classic": "クラシック", + "shockers_mode_rich": "リッチ", + "shockers_mode_simple": "シンプル", + "shockers_mode_map": "マップ", + "shockers_group_by_hub": "ハブごとにグループ化", + "shockers_global_limits": "全体の上限", + "shockers_logs_label": "ログ", + "shockers_empty_title": "ショッカーはまだありません", + "shockers_empty_no_hubs": "まずハブを作成してから、ショッカーを追加してください。", + "shockers_empty_has_hubs": "ハブにショッカーを追加して始めましょう。", + "shockers_create_hub": "ハブを作成", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 台のショッカー" + } + } + ], + "shared_shockers_title": "共有ショッカー", + "shared_shockers_subtitle": "他のユーザーがあなたと共有したショッカーです。", + "shared_shockers_empty_title": "共有されたショッカーはまだありません。", + "shared_shockers_empty_desc": "誰かがショッカーを共有すると、ここに表示されます。", + "shocker_logs_title": "ショッカーログ", + "shocker_logs_subtitle": "ショッカーに送信されたすべての制御コマンドです。", + "shocker_logs_live_title": "新しいログはリアルタイムで表示されます", + "shocker_logs_paused_title": "並べ替え中または最初以外のページを表示中は、ライブ更新が一時停止します", + "shocker_logs_live": "ライブ", + "shocker_logs_col_time": "時刻", + "shocker_logs_col_type": "種類", + "shocker_logs_col_by": "実行者", + "shocker_logs_filter_label": "ショッカーで絞り込み", + "shocker_logs_filter_placeholder": "ショッカーを検索...", + "shocker_logs_filter_all": "すべてのショッカー", + "shocker_logs_filter_none": "一致するショッカーはありません", + "shocker_edit_title": "ショッカーを編集", + "shocker_edit_subtitle": "このショッカーの詳細を変更、または削除します。", + "shocker_edit_back": "ショッカーに戻る", + "shocker_edit_load_failed": "ショッカーを読み込めませんでした。", + "shocker_edit_loading": "ショッカーを読み込んでいます...", + "shocker_edit_details_title": "ショッカーの詳細", + "shocker_edit_details_desc": "このショッカーの名前、RF ID、モデルを更新します。", + "shocker_edit_pause_state": "一時停止状態", + "shocker_edit_is_paused": "ショッカーは一時停止中です", + "shocker_edit_is_active": "ショッカーは有効です", + "shocker_edit_toast_updated": "ショッカーを更新しました", + "shocker_edit_delete_desc": "このショッカーを完全に削除します。この操作は元に戻せません。", + + "common_close": "閉じる", + "common_continue": "続行", + "common_loading": "読み込んでいます...", + "common_previous": "前へ", + "common_next": "次へ", + "common_steps": "手順", + "common_step_label": "手順 {number}: {title}", + "common_copy": "コピー", + "common_copied": "コピーしました", + "common_never": "なし", + "common_error": "エラー: {message}", + "terminal_title": "シリアルターミナル", + "terminal_connecting": "接続しています...", + "terminal_help_button": "うまくいかない場合はこちら", + "terminal_back_to_modes": "モード選択に戻る", + "terminal_mode_configure": "デバイスの設定", + "terminal_mode_configure_desc": "WiFi、認証などを設定します。対話型シリアルコンソール付きです。", + "terminal_mode_flash": "ファームウェアの書き込み", + "terminal_mode_flash_desc": "接続したデバイスにファームウェアをインストールまたは更新します。", + "terminal_mode_raw": "シリアルモニター", + "terminal_mode_raw_desc": "コンソールのみです。デバイスのログを読み、コマンドを送信します。", + "terminal_step_channel": "チャンネルを選択", + "terminal_step_board": "ボードを選択", + "terminal_go_to_step": "手順 {number} に移動: {title}", + "terminal_erase": "書き込み前に消去", + "terminal_erase_desc": "既存の設定を含め、デバイス上のすべてのデータを消去します", + "terminal_unsupported": "お使いのブラウザーはこの機能に対応していません。", + "terminal_update_browser": "ブラウザーを最新バージョンに更新してください。", + "terminal_use_browsers": "次のいずれかのブラウザーをご使用ください:", + "terminal_connect_failed_bootloader": "ブートローダーモードに入れませんでした", + "terminal_connect_failed": "デバイスに接続できませんでした", + "terminal_connect_failed_desc": "デバイスとのシリアル接続を確立できませんでした。", + "terminal_quick_tries": "簡単な対処法:", + "terminal_try_replug": "デバイスを抜き差ししてください。", + "terminal_try_cable": "別の USB ケーブルまたはポートを試してください。", + "terminal_try_driver": "シリアルドライバーがインストールされているか確認してください。", + "terminal_open_troubleshooter": "トラブルシューティングを開く", + "terminal_log_reset_no_device": "リセット中にホスト側でエラー: デバイスがありません!", + "terminal_log_reset_error": "リセット中にホスト側でエラー: {error}", + "terminal_log_send_no_device": "送信できません: デバイスがありません!", + "terminal_log_send_error": "送信できません: {error}", + "terminal_log_firmware_disconnected": "ファームウェアが切断されました: {error}", + "terminal_log_erase_failed": "フラッシュを消去できませんでした: {error}", + "terminal_log_hard_reset_failed": "ハードリセットに失敗しました: {error}", + "terminal_log_flash_complete": "書き込み完了", + "terminal_log_flash_failed": "書き込みに失敗しました: {error}", + "terminal_log_command_failed": "アプリケーションコマンドを書き込めませんでした: {error}", + "terminal_help_title": "トラブルシューティング", + "terminal_help_desc": "以下の手順を順番に試してください。それぞれ一般的な原因を切り分けます。", + "terminal_help_step_cable": "USB ケーブル", + "terminal_help_step_port": "USB ポート", + "terminal_help_step_driver": "ドライバーのインストール", + "terminal_help_step_manual": "ドライバーの手動更新", + "terminal_help_step_discord": "Discord で質問", + "terminal_help_cable_body": "USB-C や micro-USB ケーブルの多くは充電専用で、データを転送できません。動作が確認できているデータ用ケーブル(ファイル転送や他のデバイスの接続に使ったもの)に交換し、ハブを再接続してください。", + "terminal_help_port_body": "デバイスをコンピューターの USB ポートに直接接続してください。USB ハブ、ドッキングステーション、前面ポートは電源や信号の問題が起きやすいため、できるだけ避けてください。デスクトップの場合は背面のポートをお試しください。", + "terminal_help_driver_download": "CP210x ドライバーをダウンロード:", + "terminal_help_driver_extract": "zip ファイルの内容をコンピューター上のフォルダーに展開します。", + "terminal_help_driver_run": "フォルダーを開き、{#code}{installer}{/code} を実行します。画面の指示に従ってインストールしてください。", + "terminal_help_driver_reconnect": "デバイスを再接続します。", + "terminal_help_manual_intro": "ドライバーのインストーラーを実行してもデバイスが表示されない場合:", + "terminal_help_manual_open": "デバイスマネージャーを開きます({#key}Win{/key} + {#key}X{/key} を押して {#code}Device Manager{/code} を選択)。", + "terminal_help_manual_ports": "{#code}Ports (COM & LPT){/code} の下で、次のような項目を探します:", + "terminal_help_manual_missing": "見つからない場合、デバイスは Windows にまったく検出されていません。ケーブルとポートの手順をもう一度確認してください。", + "terminal_help_manual_update": "デバイスを右クリックし、{#code}Update Driver{/code} を選択します。", + "terminal_help_manual_browse": "{#code}Browse my computer for drivers{/code} を選び、ドライバーの zip を展開したフォルダーを選択します。{#code}Include subfolders{/code} にチェックが入っていることを確認してください。", + "terminal_help_manual_success": "成功すると、項目が {#code}{deviceName}{/code} と表示されます。", + "terminal_help_discord_intro": "それでも解決しない場合は、Discord サーバーの {#code}{channel}{/code} チャンネルで質問してください。次の情報を含めてください:", + "terminal_help_discord_os": "お使いの OS とブラウザー", + "terminal_help_discord_device": "使用しているデバイス(ボードのモデル、入手先)", + "terminal_help_discord_tried": "これまでの手順で試したこと", + "terminal_help_discord_errors": "エラーメッセージや関連するターミナル出力", + "terminal_help_discord_join": "Discord サーバーに参加", + "terminal_risk_title": "⚠️ 不安定なファームウェア", + "terminal_risk_intro": "{#strong}不安定であることが判明している{/strong}{#strong}実験的なファームウェア{/strong}を書き込もうとしています。", + "terminal_risk_brick": "デバイスが完全に起動しなくなる、手動での復旧が必要になる、または使用できなくなる可能性があります。", + "terminal_risk_no_support": "このファームウェアが原因の問題についてはサポートを提供しません。", + "terminal_risk_acknowledge": "これはすべて自己責任であることを理解しました", + "terminal_risk_abort": "中止", + "terminal_risk_accept": "すべての責任を負います", + "firmware_channel_recommended": "これは推奨チャンネルです。", + "firmware_channel_danger": "内容を理解していない場合は使用しないでください", + "firmware_channel_stable": "安定版", + "firmware_channel_beta": "ベータ版", + "firmware_channel_develop": "開発版", + "terminal_board_select": "ボードを選択...", + "terminal_board_search": "ボードを検索...", + "terminal_board_none": "ボードが見つかりません。", + "terminal_flash_button": "書き込み", + "terminal_flash_progress": "書き込みの進行状況: {status}", + "terminal_flash_idle": "待機中", + "terminal_flash_no_device": "デバイスが選択されていません。", + "terminal_flash_resetting": "リセットしています...", + "terminal_flash_downloading": "ファームウェアをダウンロードしています...", + "terminal_flash_download_failed": "ファームウェアをダウンロードできませんでした。", + "terminal_flash_flashing": "ファームウェアを書き込んでいます...", + "terminal_flash_rebooting": "デバイスを再起動しています...(止まった場合は手動で電源を入れ直してください)", + "terminal_flash_done": "デバイスを再起動しました。書き込み完了です。", + "terminal_port_select": "デバイスを選択", + "terminal_port_disconnect": "デバイスを切断", + "terminal_port_connected": "接続中のデバイス: {#strong}{id}{/strong}", + "terminal_console": "コンソール", + "terminal_connected_device": "接続中のデバイス", + "terminal_resize": "ターミナルパネルのサイズを変更", + "terminal_reboot": "再起動", + "terminal_disconnect": "切断", + "terminal_fullscreen_exit_esc": "全画面を終了(Esc)", + "terminal_fullscreen_exit": "全画面を終了", + "terminal_fullscreen_fill": "ウィンドウ全体に表示", + "terminal_command_label": "シリアルコマンド", + "terminal_command_placeholder": "コマンドを入力...", + "terminal_command_send": "コマンドを送信", + "terminal_colors": "色", + "terminal_colors_menu": "色...", + "terminal_colors_label": "コンソールの色", + "terminal_colors_close": "色設定を閉じる", + "terminal_color_input": "{name}の色", + "terminal_colors_reset": "デフォルトに戻す", + "terminal_color_bg": "背景", + "terminal_color_fg": "テキスト", + "terminal_color_ts": "タイムスタンプ", + "terminal_color_error": "エラー", + "terminal_color_warning": "警告", + "terminal_color_info": "情報", + "terminal_color_debug": "デバッグ", + "terminal_color_verbose": "詳細", + "terminal_options": "オプション", + "terminal_options_label": "コンソールのオプション", + "terminal_hide_system": "システムメッセージを非表示", + "terminal_stick_bottom": "最下部に固定", + "terminal_raw_output": "生の出力", + "terminal_timestamps": "タイムスタンプ", + "terminal_timestamp_uptime": "稼働時間", + "terminal_timestamp_local": "ローカル", + "terminal_timestamp_ms": "ミリ秒", + "terminal_timestamp_off": "オフ", + "terminal_copy_settings": "設定をコピー", + "terminal_import_settings": "設定をインポート", + "terminal_copy_selection": "選択範囲をコピー", + "terminal_copy_all": "出力をすべてコピー", + "terminal_toast_selection_copied": "選択範囲をコピーしました", + "terminal_toast_output_copied": "コンソール出力をコピーしました", + "terminal_toast_settings_copied": "コンソール設定をコピーしました", + "terminal_toast_clipboard_unreadable": "クリップボードを読み取れませんでした", + "terminal_toast_settings_imported": "コンソール設定をインポートしました", + "terminal_toast_settings_invalid": "クリップボードにコンソール設定が含まれていません", + + "common_try_again": "再試行", + "terminal_cfg_intro": "値は UART 経由でデバイスに送信されます。デバイスの応答は下のコンソールで確認できます。引数なしのコマンドは値の取得として動作します。各フィールドの横にある {#eye/} ボタンで現在の値を読み取れます。", + "terminal_cfg_rf_title": "RF 送信機", + "terminal_cfg_rf_desc": "ショッカーの RF 出力を制御します。", + "terminal_cfg_tx_pin": "TX GPIO ピン", + "terminal_cfg_example": "例: {value}", + "terminal_cfg_read_value": "現在の値を読み取る", + "terminal_cfg_set": "設定", + "terminal_cfg_read": "読み取り", + "terminal_cfg_reading": "読み取り中…", + "terminal_cfg_apply": "適用", + "terminal_cfg_keepalive": "キープアライブを有効化", + "terminal_cfg_keepalive_desc": "ペアリング済みのショッカーに定期的に信号を送り、スリープを防ぎます。", + "terminal_cfg_estop_title": "緊急停止", + "terminal_cfg_estop_desc": "すべての出力を停止するハードウェアボタンです。", + "terminal_cfg_estop_enabled": "EStop を有効化", + "terminal_cfg_estop_pin": "EStop GPIO ピン", + "terminal_cfg_estop_note": "注: {#code}{latching}{/code} と {#code}{active}{/code} には専用コマンドがありません。下の JSON 設定で指定してください。", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "ステーションの認証情報とデバイスのホスト名です。", + "terminal_cfg_hostname": "ホスト名", + "terminal_cfg_networks": "ネットワーク(JSON 配列)", + "terminal_cfg_invalid_json_array": "有効な JSON 配列である必要があります", + "terminal_cfg_ap_note": "AP 設定({#code}{ssid}{/code}、{#code}{password}{/code}、{#code}{disabled}{/code}、{#code}{staDisabled}{/code}、{#code}{offlineMode}{/code})には専用コマンドがありません。JSON 設定を使用してください。", + "terminal_cfg_backend_title": "バックエンド", + "terminal_cfg_backend_desc": "OpenShock サーバーと認証です。", + "terminal_cfg_domain": "ドメイン", + "terminal_cfg_domain_restart": "ドメインを設定するとデバイスが再起動します。", + "terminal_cfg_auth_token": "認証トークン", + "terminal_cfg_auth_token_placeholder": "デバイストークンを貼り付け", + "terminal_cfg_hide": "非表示", + "terminal_cfg_show": "表示", + "terminal_cfg_serial_title": "シリアル入力", + "terminal_cfg_echo": "エコーを有効化", + "terminal_cfg_echo_desc": "入力した文字をコンソールに表示します。", + "terminal_cfg_advanced_title": "詳細: 全体の設定", + "terminal_cfg_advanced_desc": "専用コマンドのない項目(キャプティブポータル、OTA、LAN など)は、設定全体を置き換えてください。", + "terminal_cfg_json_config": "JSON 設定", + "terminal_cfg_invalid_json": "有効な JSON である必要があります", + "terminal_cfg_read_json": "現在の設定を JSON で読み取る", + "terminal_cfg_json_restart": "JSON 設定を適用するとデバイスが再起動します。", + "terminal_cfg_raw_config": "生の FlatBuffer 設定(base64)", + "terminal_cfg_invalid_base64": "有効な base64 文字列である必要があります", + "terminal_cfg_read_raw": "現在の設定を base64 で読み取る", + "terminal_cfg_factory_reset": "初期化", + "terminal_cfg_factory_reset_desc": "デバイスの設定をすべて消去します。", + "terminal_cfg_factory_reset_title": "デバイスを初期化しますか?", + "terminal_cfg_factory_reset_action": "設定を消去", + "terminal_cfg_factory_reset_confirm": "WiFi ネットワーク、バックエンドの認証情報、ピンなど、デバイス上のすべての設定が消去されます。デバイスはデフォルトにリセットされます。", + "terminal_cfg_read_failed_json_title": "JSON 設定を読み取れませんでした", + "terminal_cfg_read_failed_raw_title": "生の設定を読み取れませんでした", + "terminal_cfg_read_failed_desc": "{attempts} 回試行しましたが、デバイスが応答しませんでした。", + "terminal_cfg_common_causes": "主な原因:", + "terminal_cfg_cause_busy": "デバイスが別のコマンドを処理中です。", + "terminal_cfg_cause_disconnected": "デバイスが切断されたか、再起動しました。", + "terminal_cfg_cause_unsupported": "このファームウェアバージョンはこのコマンドに対応していません。", + + "common_status": "状態", + "common_version": "バージョン", + "common_created": "作成日", + "common_create": "作成", + "common_done": "完了", + "common_enable": "有効化", + "common_disable": "無効化", + "common_are_you_sure": "よろしいですか?", + "common_generating": "生成しています...", + "hubs_title": "ハブ", + "hubs_subtitle": "アカウントに登録されているすべてのハブです。", + "hubs_add": "ハブを追加", + "hubs_load_failed": "ハブを読み込めませんでした。", + "hubs_empty_title": "ハブはまだありません", + "hubs_empty_desc": "ハブは、ショッカーにコマンドを中継するデバイスです。追加して始めましょう。", + "hubs_create_title": "ハブを作成", + "hubs_name_label": "ハブ名", + "hubs_name_placeholder": "マイハブ", + "hub_toast_not_connected": "サーバーに接続されていません", + "hub_toast_try_later": "しばらくしてからもう一度お試しください。", + "hub_reboot_title": "{name} を再起動しますか?", + "hub_reboot_desc": "ハブは切断されて再起動します。オンラインに戻るまで、ペアリングされたショッカーは応答しなくなります。", + "hub_reboot": "再起動", + "hub_hotspot_enable_title": "{name} の Wi-Fi ホットスポットを有効にしますか?", + "hub_hotspot_disable_title": "{name} の Wi-Fi ホットスポットを無効にしますか?", + "hub_hotspot_enable_desc": "ハブが独自のセットアップ用ネットワークを発信します。Wi-Fi 経由での接続は維持されますが、オフにするまでホットスポットは範囲内の誰でも利用できます。", + "hub_hotspot_disable_desc": "セットアップ用ホットスポットが停止します。ハブがまだ Wi-Fi に接続されていない場合、再設定には実機の操作が必要になります。", + "hub_delete_desc": "ハブ {#strong}{name}{/strong} を削除しようとしています。", + "hub_delete_shockers": "次のショッカーも削除されます:", + "hub_edit_title": "ハブを編集", + "hub_edit_apply": "適用", + "hub_pair_title_generate": "ペアコードを生成しますか?", + "hub_pair_title_generated": "ペアコードを生成しました", + "hub_pair_title_paired": "ハブをペアリングしました", + "hub_pair_consumed": "{#strong}{name}{/strong} がこのペアコードを使用し、ペアリングされました。", + "hub_pair_used": "このコードは使用済みのため、無効になりました。", + "hub_pair_generated_for": "{#strong}{name}{/strong} のペアコードを生成しました。", + "hub_copy_now": "以下のコードは後で確認できません。今すぐコピーして、クライアントを更新してください。", + "hub_pair_generate_for": "{#strong}{name}{/strong} のペアコードを生成しようとしています。", + "hub_pair_valid_for": "作成後 15 分間有効です。", + "hub_pair_one_active": "有効なペアコードはハブごとに 1 つだけです。新しく生成すると、古いコードは置き換えられます。", + "hub_pair_complete": "ペアリング完了", + "hub_pair_code_label": "ペアコード:", + "hub_pair_copied_close": "コピーしたので閉じる", + "hub_pair_get": "ペアコードを取得", + "hub_token_generated": "トークンを生成しました", + "hub_token_generated_for": "{#strong}{name}{/strong} の新しいトークンを生成しました。", + "hub_token_regenerate_for": "{#strong}{name}{/strong} のトークンを再生成しようとしています。", + "hub_token_invalidate": "現在のトークンは無効になり、それを使用しているクライアントは切断されます。", + "hub_token_confirm": "実行してもよろしいですか?", + "hub_token_label": "新しいトークン:", + "hub_token_copied_close": "コピーしたので閉じる", + "hub_token_regenerate": "トークンを再生成", + "hub_menu_update": "アップデート", + "hub_menu_label": "ハブ", + "hub_menu_hotspot_enable": "Wi-Fi ホットスポットを有効化", + "hub_menu_hotspot_disable": "Wi-Fi ホットスポットを無効化", + "hub_menu_pair": "ペアリング", + "hub_menu_estop": "緊急停止", + "hub_update_breadcrumb": "アップデート", + "hub_update_unknown_hub": "不明なハブ", + "hub_update_unknown_task": "不明なタスク", + "hub_update_task_metadata": "メタデータを取得中", + "hub_update_task_preparing": "アップデートの準備中", + "hub_update_task_flash_fs": "ファイルシステムを書き込み中", + "hub_update_task_verify_fs": "ファイルシステムを検証中", + "hub_update_task_flash_app": "アプリケーションを書き込み中", + "hub_update_task_bootable": "アプリケーションを起動可能に設定中", + "hub_update_task_rebooting": "再起動中", + "hub_update_status_started": "開始", + "hub_update_status_running": "実行中", + "hub_update_status_finished": "完了", + "hub_update_status_error": "エラー", + "hub_update_status_timeout": "タイムアウト", + "hub_update_confirm_title": "ファームウェアのアップデートの確認", + "hub_update_confirm_desc": "{#strong}{name}{/strong} をバージョン {#strong}{version}{/strong} にアップデートしますか?", + "hub_update_unstable_warning": "このバージョンは安定版チャンネルのものではない可能性があり、不具合を含むおそれがあります。", + "hub_update_title": "{name} のアップデート", + "hub_update_subtitle": "このハブのファームウェアアップデートを管理します。", + "hub_update_status_title": "ハブの状態", + "hub_update_firmware": "ファームウェア: {#mono}{version}{/mono}", + "hub_update_confirm": "アップデート", + "hub_update_success": "アップデートが正常に完了しました", + "hub_update_rolled_back": "デバイスは以前のバージョンにロールバックされました", + "hub_update_back": "ハブに戻る", + "hub_update_flash_again": "再書き込み", + "hub_update_card_title": "ファームウェアのアップデート", + "hub_update_card_desc": "インストールするファームウェアのチャンネルとバージョンを選択してください。", + "hub_update_to": "{version} にアップデート", + "hub_update_must_be_online": "アップデートを開始するには、ハブがオンラインである必要があります。", + "hub_update_updating_to": "{version} にアップデートしています...", + "hub_update_total": "全体", + "hub_update_task": "タスク", + "hub_update_history": "アップデート履歴", + "hub_update_no_history": "このハブのアップデート履歴はありません。", + "hub_update_col_id": "ID", + "hub_update_col_started": "開始", + "hub_update_col_message": "メッセージ", + "hub_update_loading": "ハブの情報を読み込んでいます...", + "hub_update_not_found": "ハブが見つかりません。", + "home_breadcrumb": "ホーム", + "home_welcome": "おかえりなさい", + "home_welcome_name": "おかえりなさい、{name} さん", + "home_subtitle": "OpenShock のセットアップの概要です。", + "home_hubs_online": "{count} 台オンライン", + "home_hub_status": "ハブの状態", + "home_no_hubs": "ハブなし", + "home_all_online": "すべてオンライン", + "home_all_offline": "すべてオフライン", + "home_some_online": "{online}/{total} 台オンライン", + "home_quick_links": "クイックリンク", + "home_my_shockers": "マイショッカー", + "home_my_shockers_desc": "ショッカーを操作", + "home_hubs_desc": "ハブを管理", + "home_shared_desc": "共有されたショッカー", + "home_public_desc": "共有リンクを管理", + "home_get_started": "はじめに", + "home_get_started_desc": "ハブがまだありません。ハブを作成して最初のデバイスを接続し、ショッカーを追加してください。", + "home_set_up_hub": "ハブをセットアップ", + "home_first_shocker": "最初のショッカーを追加", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 台のハブがセットアップ済みです。ショッカーを追加して操作を始めましょう。" + } + } + ], + "home_go_to_shockers": "ショッカーへ移動", + "profile_title": "プロフィール", + "profile_coming_soon": "プロフィールは近日公開予定です", + "profile_coming_soon_desc": "公開プロフィールはまだご利用いただけません。アカウントの詳細は設定にあります。", + + "common_retry": "再試行", + "common_never_used": "未使用", + "common_expires": "有効期限: {time}", + "common_search_placeholder": "検索...", + "common_unknown": "不明", + "settings_breadcrumb_account": "アカウント", + "account_subtitle": "ログイン情報とアカウントの操作です。", + "account_change_username": "ユーザー名を変更", + "account_change_email": "メールアドレスを変更", + "account_change_password": "パスワードを変更", + "account_username_label": "ユーザー名", + "account_email_label": "メールアドレス", + "account_password_label": "パスワード", + "account_new_password_label": "新しいパスワード", + "account_confirm_password_label": "新しいパスワード(確認)", + "account_oauth_only": "OAuth 専用アカウントでは利用できません", + "account_oauth_no_password": "このアカウントは OAuth でログインするため、パスワードがありません。", + "account_diagnostics": "診断", + "account_diagnostics_desc": "クラッシュや遅い API 呼び出しの修正にご協力ください。レポートにはエラーメッセージ、スタックトレース、IP アドレスが含まれます。デフォルトはオフです。", + "account_diagnostics_level": "診断レベル", + "account_telemetry_off": "オフ", + "account_telemetry_off_desc": "何も送信しません。", + "account_telemetry_errors": "エラー", + "account_telemetry_errors_desc": "ブラウザーのエラーレポートのみ送信します。", + "account_telemetry_full": "すべて", + "account_telemetry_full_desc": "エラーレポートと API 呼び出しのトレースを送信します(ページ遷移は含みません)。", + "account_toast_deactivated": "アカウントを無効化しました", + "account_deactivate_title": "アカウントの無効化", + "account_deactivate_desc": "アカウントを無効化してもよろしいですか?", + "account_deactivate": "アカウントを無効化", + "account_email_title": "メールアドレスの変更", + "account_email_desc": "新しいメールアドレスを入力し、現在のパスワードで確認してください。", + "account_email_toast_sent": "{email} に確認メールを送信しました。メール内のリンクをクリックすると変更が適用されます。", + "account_new_email": "新しいメールアドレス", + "account_current_password": "現在のパスワード", + "account_password_title": "パスワードの変更", + "account_password_desc": "現在のパスワードを入力し、新しいパスワードを設定してください。", + "account_password_toast": "パスワードを変更しました", + "account_username_title": "ユーザー名の変更", + "account_username_desc": "新しいユーザー名を入力してください。", + "account_new_username": "新しいユーザー名", + "account_username_toast": "ユーザー名を変更しました", + "tokens_subtitle": "API トークンは OpenShock API での認証に使用されます。", + "tokens_generate": "トークンを生成", + "tokens_toast_refreshed": "トークンを更新しました", + "tokens_empty_title": "API トークンはありません", + "tokens_empty_desc": "OpenShock API で認証するためのトークンを生成してください。", + "tokens_created_on": "作成日: {date}", + "tokens_last_used": "最終使用: {time}", + "tokens_never_expires": "無期限", + "tokens_load_failed": "API トークンを読み込めませんでした。", + "token_toast_edited": "トークンを編集しました", + "token_name_required": "名前は必須です", + "token_name_too_long": "名前が長すぎます", + "token_edit_title": "API トークンの編集", + "token_name_label": "トークン名", + "token_name_placeholder": "トークン名...", + "token_permissions": "権限", + "token_perm_category_shockers": "ショッカー", + "token_perm_category_devices": "ハブ", + "token_perm_category_usershares": "ユーザー共有", + "token_perm_category_publicshares": "公開共有", + "token_perm_use": "使用", + "token_perm_edit": "編集", + "token_perm_pause": "一時停止", + "token_perm_auth": "認証", + "token_shocker_control": "ショッカーの操作", + "token_toast_paused": "トークンを一時停止しました", + "token_toast_resumed": "トークンを再開しました", + "token_delete_title": "API トークンの削除", + "token_delete_desc": "{#strong}{name}{/strong} を削除してもよろしいですか?", + "token_delete_permanent": "この操作は元に戻せません。トークンは完全に削除されます。", + "token_toast_deleted": "トークンを削除しました", + "token_resume": "トークンを再開", + "token_pause": "トークンを一時停止", + "token_mode_clamp_desc": "Clamp: 許可範囲外のリクエストは、最も近い上限(最小または最大)に制限されます。", + "token_mode_lerp_desc": "Lerp: 入力範囲全体を線形に変換し、許可された最小から最大の範囲に収めます。", + "token_paused_desc": "一時停止中のトークンはショッカーの制御メッセージを送信できません。", + "token_intensity_range": "強度の範囲", + "token_duration_range": "時間の範囲", + "token_new_breadcrumb": "新規", + "token_redirect_not_allowed": "指定された redirect_uri は許可されていません。ループバックアドレスまたはカスタムアプリケーションスキームのみ使用できます。", + "token_params_missing": "必要な GET パラメーターがありません。name、redirect_uri、permissions が指定されているか確認してください。", + "token_invalid_permissions": "無効な権限が指定されました: {list}", + "token_toast_created": "トークンを作成しました", + "token_request_title": "API トークンのリクエスト", + "token_access_granted": "アクセスを許可しました", + "token_shared_redirecting": "トークンが作成され、アプリケーションと共有されました。{#b}{uri}{/b} にリダイレクトしています。", + "token_not_redirected": "自動的にリダイレクトされない場合は、下のボタンを使用してください。", + "token_finish": "完了", + "token_generated_title": "API トークンを生成しました", + "token_copy_now": "今すぐ API トークンをコピーしてください。後で再表示することはできません!", + "token_new_title": "新しい API トークン", + "token_external_desc": "外部アプリケーションがアカウントへのアクセスを求めています。許可する前に、以下の権限を確認・調整してください。", + "token_new_desc": "アカウント用の新しい API トークンを設定して生成します。", + "token_external_requesting": "{#b}{name}{/b} が API トークンを求めています。トークンは {#b}{uri}{/b} のアプリケーションと共有されます。", + "token_allow": "許可", + "token_generate": "生成", + "token_deny": "拒否", + "sessions_subtitle": "アカウントで有効なすべてのセッションです。心当たりのないものは取り消してください。", + "sessions_unknown_device": "不明なデバイス", + "sessions_toast_refreshed": "セッションを更新しました", + "sessions_load_failed": "セッションを読み込めませんでした。", + "sessions_empty_title": "有効なセッションはありません", + "sessions_empty_desc": "ブラウザーやアプリからログインすると、ここにセッションが表示されます。", + "sessions_last_seen": "最終アクセス: {time}", + "sessions_signed_in": "ログイン: {time}", + "session_toast_revoked": "セッションを取り消しました", + "session_revoke_title": "セッションの取り消し", + "session_revoke": "取り消し", + "session_revoke_desc": "このセッションを取り消してもよろしいですか?", + "session_revoke_from": "{#strong}{ip}{/strong} から {#strong}{agent}{/strong} でログインしたセッション", + "connections_title": "OAuth 連携", + "connections_subtitle": "外部アカウントを連携または解除して、すばやくログインし、プロフィールを同期できます。", + "connections_toast_linked": "アカウントを連携しました。", + "connections_toast_cancelled": "連携をキャンセルしました。", + "connections_toast_failed": "連携に失敗しました。", + "connections_toast_removed": "連携を解除しました", + "connections_refreshing": "更新しています…", + "connections_link_new": "新しいプロバイダーを連携", + "connections_empty_title": "連携はまだありません", + "connections_empty_desc": "上の「新しいプロバイダーを連携」から、利用可能なプロバイダーを連携してください。", + "connections_unlink": "連携解除", + "connections_load_failed": "OAuth 連携を読み込めませんでした。", + "connections_unlink_title": "{name} の連携を解除しますか?", + "connections_unlink_title_generic": "このアカウントの連携を解除しますか?", + "connections_unlink_desc": "再度連携しない限り、このプロバイダーではログインできなくなります。", + "provider_starting": "{name} を開始しています...", + "provider_link": "{name} を連携", + "audit_subtitle": "アカウントのセキュリティに関わるアクティビティです。心当たりのないものがないか確認してください。", + "audit_col_time": "時刻", + "audit_col_action": "操作", + "audit_col_details": "詳細", + "audit_col_reason": "理由", + "audit_col_ip": "IP アドレス", + "audit_col_device": "デバイス", + "audit_action_login": "ログイン", + "audit_action_logout": "ログアウト", + "audit_action_password_changed": "パスワードの変更", + "audit_action_email_change_requested": "メールアドレス変更のリクエスト", + "audit_action_email_changed": "メールアドレスの変更", + "audit_action_username_changed": "ユーザー名の変更", + "audit_action_api_token_created": "API トークンの作成", + "audit_action_api_token_deleted": "API トークンの削除", + "audit_action_oauth_connected": "連携の追加", + "audit_action_oauth_disconnected": "連携の解除", + "audit_action_account_deactivated": "アカウントの無効化", + "audit_action_account_reactivated": "アカウントの再有効化", + "audit_action_account_deleted": "アカウントの削除", + "audit_action_automation_token_created": "自動化トークンの作成", + "audit_action_automation_token_updated": "自動化トークンの更新", + "audit_action_automation_token_rotated": "自動化トークンのローテーション", + "audit_action_automation_token_deleted": "自動化トークンの削除", + "audit_action_automation_token_used": "自動化トークンの使用", + "audit_meta_session": "セッション {id}", + "audit_meta_changed": "{old} から {new} へ", + "audit_meta_email_requested": "{email} への変更をリクエスト", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{name}({count} 件のアカウントを削除)" + } + } + ], + "audit_meta_scheduled_deletion": "削除予定", + "audit_meta_kept": "再有効化のため保持", + + "common_view": "表示", + "common_save": "保存", + "common_saving": "保存しています...", + "common_back": "戻る", + "common_shared_by": "共有者", + "common_user_avatar": "ユーザーのアバター", + "common_toast_saved": "変更を保存しました", + "pause_reason_shocker": "ショッカー単位で一時停止中", + "pause_reason_shocker_user_share": "ショッカーとユーザー共有の単位で一時停止中", + "pause_reason_shocker_public_share": "ショッカーと公開共有の単位で一時停止中", + "pause_reason_user_share": "ユーザー共有の単位で一時停止中", + "pause_reason_public_share": "公開共有の単位で一時停止中", + "public_shares_subtitle": "アカウント不要で誰でも使えるリンクです。", + "public_shares_new": "新しい共有", + "public_share_never_expires": "無期限", + "public_shares_empty_title": "公開共有はまだありません", + "public_shares_empty_desc": "誰でもショッカーを操作できるリンクを作成します。", + "public_share_expired": "期限切れ", + "public_share_no_expiry": "無期限", + "public_share_label": "公開共有", + "public_share_toast_created": "新しい公開共有を作成しました", + "public_share_create_title": "公開共有を作成", + "public_share_toast_deleted": "公開共有を削除しました", + "public_share_delete_title": "公開共有を削除", + "public_share_delete_desc": "公開共有 {#strong}{name}{/strong} を削除してもよろしいですか?", + "public_share_edit_title": "公開共有: {name}", + "public_share_edit_subtitle": "編集中: 変更は保存時に適用されます。", + "public_share_add_shocker": "ショッカーを追加", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 台のショッカーを共有に追加しました" + } + } + ], + "public_share_empty_shockers_title": "この共有にショッカーはありません", + "public_share_empty_shockers_desc": "ショッカーを追加すると、リンクを持つ誰もが操作できるようになります。", + "public_share_load_failed": "公開共有の詳細を取得できませんでした", + "public_share_paused_here": "この共有で一時停止中", + "public_share_resume_shocker": "ショッカーを再開", + "public_share_pause_shocker": "ショッカーを一時停止", + "public_share_remove": "共有から削除", + "public_share_toast_removed": "ショッカーを共有から削除しました", + "public_share_add_title": "ショッカーを追加", + "public_share_add_desc": "この公開共有にショッカーを追加します。上限は追加後に設定できます。", + "public_share_add_placeholder": "共有するショッカーを選択...", + "public_share_add_no_match": "一致するショッカーはありません", + "public_share_add_submit": "ショッカーを追加", + "public_share_view_loading": "共有の詳細を読み込んでいます...", + "public_share_view_title": "公開共有リンク", + "public_share_view_desc": "ゲストとして入室するか、OpenShock アカウントでログインしてください", + "public_share_view_guest_name": "ゲスト名", + "public_share_view_enter": "入室", + "public_share_view_enter_guest": "ゲストとして入室", + "public_share_login": "ログイン", + "perm_shock_on": "ショック有効", + "perm_shock_off": "ショック無効", + "perm_vibrate_on": "振動有効", + "perm_vibrate_off": "振動無効", + "perm_sound_on": "音有効", + "perm_sound_off": "音無効", + "perm_live_on": "ライブ有効", + "perm_live_off": "ライブ無効", + "perm_live_control": "ライブコントロール", + "user_selector_avatar_of": "{name}のアバター", + "user_selector_placeholder": "ユーザー名を入力", + "user_selector_aria": "検索するユーザー名", + "user_selector_search": "ユーザーを検索", + "user_selector_found": "ユーザーが見つかりました", + + "common_remove": "削除", + "user_shares_subtitle": "他のユーザーとの直接の恒久的な共有です。", + "user_shares_toast_invited": "{name} にショッカーの招待を送信しました", + "user_shares_redeem": "コードを使用", + "user_shares_new": "新しい共有", + "user_shares_tab_shares": "共有", + "user_shares_tab_incoming": "共有されたもの", + "user_shares_tab_invites": "招待", + "share_code_create_title": "新しい共有コード", + "share_code_create_desc": "共有コードまたは招待を作成", + "share_code_shocker_placeholder": "共有するショッカーを選択...", + "share_code_no_match": "一致するショッカーはありません", + "share_code_send_invite": "共有の招待を送信", + "share_code_create": "共有コードを作成", + "share_code_created_title": "共有コードを生成しました", + "share_code_created_desc": "共有コードまたはコードのリンクをコピーしてください!", + "share_code_redeem_title": "共有コードを使用", + "share_code_redeem_desc": "使用する共有コードを入力してください", + "share_code_redeem_placeholder": "共有コードを入力", + "share_code_redeemed": "使用しました!", + "share_code_shared_shockers": "共有されたショッカー", + "share_code_redeeming": "使用しています...", + "share_code_redeem": "使用", + "incoming_shares_empty_title": "共有されたものはありません", + "incoming_shares_empty_desc": "まだ誰もショッカーを共有していません。", + "incoming_share_toast_removed": "{name} の共有を削除しました", + "incoming_share_remove_title": "共有を削除", + "incoming_share_remove_desc": "{#strong}{name}{/strong} の共有を削除してもよろしいですか?", + "incoming_share_toast_removed_shocker": "{name} が共有した {shocker} を削除しました", + "incoming_share_remove_shocker_title": "この共有ショッカーを削除しますか?", + "incoming_share_remove_shocker_desc": "{#strong}{name}{/strong} が共有したショッカー {#strong}{shocker}{/strong} を削除してもよろしいですか?", + "incoming_share_manage_from": "共有の管理元", + "share_remove": "共有を削除", + "invites_empty_title": "招待はまだありません", + "invites_empty_desc": "受信・送信した共有の招待はありません。", + "invites_outgoing": "送信済み", + "invites_outgoing_empty_title": "送信した招待はありません", + "invites_outgoing_empty_desc": "送信した共有の招待はありません。", + "invites_incoming": "受信", + "invites_incoming_empty_title": "受信した招待はありません", + "invites_incoming_empty_desc": "受信した共有の招待はありません。", + "invite_toast_accepted": "{name} からの共有の招待を承認しました", + "invite_toast_declined": "{name} からの共有の招待を辞退しました", + "invite_deny_title": "招待を拒否", + "invite_deny_label": "招待を拒否", + "invite_deny": "拒否", + "invite_deny_desc": "{#strong}{name}{/strong} からの招待を拒否してもよろしいですか?", + "invite_accept": "招待を承認", + "invite_toast_cancelled_for": "{name}({id})への招待を取り消しました", + "invite_toast_cancelled": "招待 {id} を取り消しました", + "invite_cancel_title": "招待を取り消す", + "invite_cancel": "取り消し", + "invite_cancel_for_desc": "{#strong}{name}{/strong} への招待を取り消してもよろしいですか?", + "invite_cancel_code_desc": "コード {#strong}{code}{/strong} の招待を取り消してもよろしいですか?", + "invite_cancel_outstanding": "未処理の招待を取り消す", + "outgoing_shares_empty_title": "共有中のショッカーはありません", + "outgoing_shares_empty_desc": "まだ他のユーザーとショッカーを共有していません。", + "outgoing_share_toast_removed": "ショッカーの共有 {name} を削除しました", + "outgoing_share_remove_title": "このショッカーの共有を停止しますか?", + "outgoing_share_editing_for": "共有を編集中:", + "outgoing_share_limits": "上限と権限", + "outgoing_share_same": "すべてのショッカーに同じ制限", + "outgoing_share_per_desc": "ショッカーごとに制限を調整", + "outgoing_share_all": "すべて", + "outgoing_share_per": "ショッカーごと", + + "outgoing_share_remove_desc": "{#strong}{name}{/strong} との {#strong}{shocker}{/strong} の共有を停止してもよろしいですか?", + + "report_breadcrumb": "API トークンの報告", + "report_toast_clipboard_failed": "クリップボードを読み取れませんでした: {error}", + "report_title": "流出した API トークンの報告", + "report_paste": "クリップボードから貼り付け", + "report_warning": "このフォームは、誤って流出した API トークンの報告専用です。", + "report_abuse_warning": "意図的な悪用には、アカウント停止や厳しいエンドポイント制限が科されます。", + "report_detected": "検出されたトークン", + "report_invalid": "1 つ以上のトークンが無効のようです。形式に問題がないか確認してください。", + "report_acknowledge": "この機能の目的を理解し、責任を負うことを確認します。", + "report_submit": "報告を送信", + "turnstile_disabled": "Turnstile は無効です", + "common_internal_error": "内部エラー", + "resend_toast_sent": "有効化メールを送信しました。受信トレイと迷惑メールフォルダーをご確認ください。", + "resend_toast_throttled": "有効化メールのリクエストが多すぎます。しばらくしてからもう一度お試しください。", + "resend_toast_unavailable": "このブラウザーからは有効化メールを再送信できません。アカウントがまだ有効化されていない場合は、ログインすると新しいリンクが送信されます。", + "resend_button": "メールが届きませんか?再送信", + "expiration_label": "有効期限", + "expiration_never": "なし", + "expiration_custom": "カスタム", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 日" + } + } + ], + "expiration_required": "有効期限は必須です", + "expiration_never_desc": "期限切れになりません", + "expiration_expires_at": "有効期限: {time}({date})", + "date_picker_placeholder": "日付を選択", + "telemetry_toast_title": "OpenShock の改善にご協力いただけますか?", + "telemetry_toast_desc": "診断情報を送信して、クラッシュや遅い API 呼び出しの修正にご協力ください。レポートにはエラーメッセージ、スタックトレース、IP アドレスが含まれます。この設定はアカウント設定でいつでも変更できます。", + "telemetry_toast_no": "送信しない", + "telemetry_toast_errors": "エラーのみ", + "telemetry_toast_full": "すべて", + "table_show_details": "詳細を表示", + "table_hide_details": "詳細を非表示", + "table_no_results": "結果はありません。", + "table_sort_asc": "{name}で昇順に並べ替え", + "table_sort_desc": "{name}で降順に並べ替え", + "table_sort_none": "{name}で並べ替え、未ソート", + "cell_na": "N/A", + "cell_not_applicable": "該当なし", + "cell_invalid": "無効", + "cell_unavailable": "利用不可", + "cell_none": "なし", + "oauth_login_with": "{provider} でログイン", + "oauth_signup_with": "{provider} で登録", + "signalr_connect_failed": "サーバーに接続できませんでした!", + "signalr_disconnect_failed": "サーバーからの切断中にエラーが発生しました!", + "signalr_invalid_update": "サーバーから無効な更新を受信しました!", + "signalr_invalid_log": "サーバーから無効なログデータを受信しました!", + "signalr_invalid_ota": "サーバーから無効なファームウェア更新データを受信しました!", + "ota_toast_failed": "ハブのファームウェアアップデートに失敗しました: {message}", + "ota_toast_succeeded": "ハブのファームウェアアップデートが完了しました!", + "ota_toast_rolled_back": "ハブのファームウェアが以前のバージョンにロールバックされました", + "lcg_connect_failed": "ライブコントロールゲートウェイに接続できませんでした", + "terminal_toast_bootloader_failed": "ブートローダーに入れませんでした: {error}", + "terminal_toast_app_mode_failed": "アプリケーションモードに入れませんでした: {error}", + + "problem_account_account_not_activated_title": "アカウントが有効化されていません", + "problem_account_account_not_activated_desc": "受信トレイで有効化メールをご確認ください。", + "problem_account_activation_not_found_title": "有効化リンクが無効です", + "problem_account_activation_not_found_desc": "リンクの期限が切れているか、すでに使用されている可能性があります。", + "problem_account_activation_resend_too_many_title": "有効化メールのリクエストが多すぎます", + "problem_account_activation_resend_too_many_desc": "しばらく待ってからもう一度お試しください。", + "problem_account_activation_resend_unavailable_title": "有効化メールを再送信できません", + "problem_account_activation_resend_unavailable_desc": "もう一度ログインして、新しい有効化リンクをリクエストしてください。", + "problem_account_deactivate_already_deactivated_title": "アカウントはすでに無効化されています", + "problem_account_deactivate_denied_privileged_title": "特権アカウントは無効化できません", + "problem_account_deactivate_unauthorized_title": "この操作は許可されていません", + "problem_account_deactivated_title": "このアカウントは無効化されています", + "problem_account_email_already_in_use_title": "このメールアドレスはすでに使用されています", + "problem_account_email_invalid_title": "このメールアドレスは無効です", + "problem_account_email_taken_title": "このメールアドレスはすでに使用されています", + "problem_account_email_too_many_requests_title": "メールアドレス変更のリクエストが多すぎます", + "problem_account_email_too_many_requests_desc": "しばらく待ってからもう一度お試しください。", + "problem_account_email_unchanged_title": "すでにこのメールアドレスを使用しています", + "problem_account_email_verify_not_found_title": "認証リンクが無効です", + "problem_account_email_verify_not_found_desc": "リンクの期限が切れているか、すでに使用されている可能性があります。", + "problem_account_o_auth_only_title": "このアカウントにはパスワードがありません", + "problem_account_o_auth_only_desc": "登録時に使用したプロバイダーでログインしてください。", + "problem_account_password_not_set_title": "パスワードが設定されていません", + "problem_account_password_not_set_desc": "このアカウントは外部プロバイダーでログインします。", + "problem_account_password_old_password_invalid_title": "現在のパスワードが正しくありません", + "problem_account_username_invalid_title": "このユーザー名は使用できません", + "problem_account_username_recently_changed_title": "ユーザー名は最近変更されたばかりです", + "problem_account_username_recently_changed_desc": "ユーザー名は 7 日に 1 回変更できます。", + "problem_account_username_taken_title": "このユーザー名はすでに使用されています", + "problem_admin_user_deactivated_title": "このユーザーは無効化されています", + "problem_admin_user_not_activated_title": "このユーザーはまだ有効化されていません", + "problem_api_token_can_only_delete_self_title": "API トークンが削除できるのは自分自身のみです", + "problem_api_token_not_found_title": "API トークンが見つかりません", + "problem_api_token_paused_title": "この API トークンは一時停止中です", + "problem_assign_lcg_bad_schema_version_title": "対応していないハブのプロトコルバージョンです", + "problem_assign_lcg_bad_schema_version_desc": "接続するにはハブのファームウェアを更新してください。", + "problem_assign_lcg_no_lcg_available_title": "利用可能なゲートウェイがありません", + "problem_assign_lcg_no_lcg_available_desc": "現在利用できるライブコントロールのゲートウェイがありません。しばらくしてからもう一度お試しください。", + "problem_authentication_account_deactivated_title": "このアカウントは無効化されています", + "problem_authentication_account_not_activated_title": "このアカウントは有効化されていません", + "problem_authentication_cookie_missing_or_invalid_title": "ログインしていません", + "problem_authentication_cookie_missing_or_invalid_desc": "セッションの期限が切れた可能性があります。もう一度ログインしてください。", + "problem_authentication_header_missing_or_invalid_title": "無効な API トークンです", + "problem_authentication_session_invalid_title": "セッションの期限切れ", + "problem_authentication_session_invalid_desc": "もう一度ログインしてください。", + "problem_authentication_token_invalid_title": "無効な API トークンです", + "problem_authentication_unknown_error_title": "認証に失敗しました", + "problem_authorization_policy_not_met_title": "この操作を行う権限がありません", + "problem_authorization_token_only_title": "この操作には API トークンが必要です", + "problem_authorization_token_permission_missing_title": "この API トークンには必要な権限がありません", + "problem_authorization_unknown_error_title": "認可に失敗しました", + "problem_authorization_user_session_only_title": "この操作にはログイン中のセッションが必要です", + "problem_automation_token_not_allowed_for_account_title": "特権アカウントでは自動化トークンを使用できません", + "problem_configuration_already_exists_title": "同じ名前の設定項目がすでに存在します", + "problem_configuration_invalid_name_format_title": "無効な設定名です", + "problem_configuration_invalid_name_format_desc": "A から Z とアンダースコアのみ使用できます。", + "problem_configuration_invalid_value_format_title": "値が設定の型と一致しません", + "problem_configuration_not_found_title": "設定項目が見つかりません", + "problem_control_stats_invalid_range_title": "開始日は終了日より後にできません", + "problem_control_stats_invalid_time_zone_title": "不明なタイムゾーンです", + "problem_control_stats_missing_capability_title": "このサーバーでは操作統計を利用できません", + "problem_device_not_found_title": "ハブが見つかりません", + "problem_device_not_online_title": "ハブはオフラインです", + "problem_device_too_many_hubs_title": "ハブの最大数に達しました", + "problem_device_too_many_shockers_title": "このハブはショッカーの最大数に達しました", + "problem_endpoint_retired_title": "この機能は利用できなくなりました", + "problem_expression_error_title": "無効なフィルター式です", + "problem_internal_server_error_title": "サーバー側で問題が発生しました", + "problem_login_invalid_credentials_title": "ユーザー名またはパスワードが正しくありません", + "problem_login_invalid_domain_title": "このアドレスからのログインは許可されていません", + "problem_o_auth_connection_already_exists_title": "アカウントはすでにこのプロバイダーと連携しています", + "problem_o_auth_connection_already_linked_title": "この外部アカウントはすでに別のユーザーと連携しています", + "problem_o_auth_flow_anonymous_only_title": "すでにログインしています", + "problem_o_auth_flow_mismatch_title": "ログイン試行が一致しません", + "problem_o_auth_flow_mismatch_desc": "最初からやり直してください。", + "problem_o_auth_flow_missing_data_title": "プロバイダーからアカウント情報が返されませんでした", + "problem_o_auth_flow_missing_data_desc": "もう一度お試しください。", + "problem_o_auth_flow_not_found_title": "ログイン試行の期限が切れました", + "problem_o_auth_flow_not_found_desc": "最初からやり直してください。", + "problem_o_auth_flow_unsupported_title": "サポートされていないログイン方法です", + "problem_o_auth_internal_error_title": "ログイン中に問題が発生しました", + "problem_o_auth_internal_error_desc": "しばらくしてからもう一度お試しください。", + "problem_o_auth_link_authenticated_user_only_title": "外部アカウントを連携するにはログインが必要です", + "problem_o_auth_provider_mismatch_title": "ログイン試行がプロバイダーと一致しません", + "problem_o_auth_provider_mismatch_desc": "最初からやり直してください。", + "problem_o_auth_provider_unsupported_title": "このログインプロバイダーはサポートされていません", + "problem_pair_code_not_found_title": "ペアコードが見つかりません", + "problem_password_reset_not_found_title": "パスワードリセットのリンクが無効です", + "problem_password_reset_not_found_desc": "リンクの期限が切れているか、すでに使用されている可能性があります。", + "problem_session_not_found_title": "セッションが見つかりません", + "problem_share_get_no_shares_title": "このユーザーとの共有はありません", + "problem_share_request_create_cannot_share_with_self_title": "自分自身とは共有できません", + "problem_share_request_create_shocker_not_found_title": "1 台以上のショッカーが見つかりませんでした", + "problem_share_request_create_shocker_not_found_desc": "削除されたか、あなたのものではない可能性があります。", + "problem_share_request_not_found_title": "共有の招待が見つかりません", + "problem_share_user_not_found_title": "共有が見つかりません", + "problem_share_code_already_linked_title": "ショッカーはすでにアカウントに追加されています", + "problem_share_code_cant_link_own_share_code_title": "自分の共有コードは使用できません", + "problem_share_code_not_found_title": "共有コードが見つかりません", + "problem_share_link_expiry_date_in_past_title": "有効期限を過去の日付にはできません", + "problem_share_link_not_found_title": "公開共有が見つかりません", + "problem_share_link_shocker_already_in_share_link_title": "ショッカーはすでにこの公開共有に含まれています", + "problem_share_link_shocker_not_in_share_link_title": "ショッカーはこの公開共有に含まれていません", + "problem_shocker_control_no_permission_title": "このショッカーを操作する権限がありません", + "problem_shocker_control_not_found_title": "ショッカーが見つかりません", + "problem_shocker_control_paused_title": "ショッカーは一時停止中です", + "problem_shocker_not_found_title": "ショッカーが見つかりません", + "problem_signup_registration_disabled_title": "現在、新規登録は無効になっています", + "problem_signup_username_or_email_exists_title": "このユーザー名またはメールアドレスはすでに使用されています", + "problem_turnstile_invalid_title": "認証に失敗しました", + "problem_turnstile_invalid_desc": "もう一度チャレンジを完了してから再試行してください。", + "problem_user_not_found_title": "ユーザーが見つかりません", + "problem_user_privileged_delete_denied_title": "特権ユーザーは削除できません", + "problem_validation_error_title": "一部の項目が無効です", + "problem_webhook_not_found_title": "Webhook が見つかりません", + "problem_webhook_unsupported_title": "Discord の Webhook のみサポートしています", + "problem_webhook_unsupported_desc": "canary や ptb ではなく、discord.com の URL を使用してください。", + + "error_too_many_requests": "リクエストが多すぎます", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=other": "{seconds} 秒後にもう一度お試しください。" + } + } + ], + "error_unexpected_response": "予期しないサーバー応答です", + "error_internal": "内部エラーが発生しました", + "error_network": "ネットワークエラーが発生しました", + + "dev_banner": "これは OpenShock の{#b}開発{/b}環境です。{#u}データは保存されず{/u}、定期的に本番環境のデータで上書きされます。", + "firmware_channel_bugs_warning": "このチャンネルには不具合が含まれる可能性があります。" +} diff --git a/messages/nb.json b/messages/nb.json new file mode 100644 index 00000000..9dc19ab5 --- /dev/null +++ b/messages/nb.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Plattformen for trygg og pålitelig fjernstyring av shockere med svært lav forsinkelse.", + "landing_section_label": "Hjem", + "landing_hubs_online": "Huber på nett nå: ", + "landing_learn_more": "Les mer", + "landing_wiki": "Wiki", + "landing_meta_description": "Velkommen til OpenShock, et gratis økosystem med åpen kildekode for å styre ulike shockere over internett.", + "instance_meta_description": "Velkommen til {siteName}, en uavhengig instans av OpenShock, et gratis økosystem med åpen kildekode for å styre ulike shockere over internett.", + "header_sidebar_toggle": "Vis/skjul sidepanel", + "header_avatar_alt": "Avataren til {name}", + "header_menu_profile": "Profil", + "header_menu_settings": "Innstillinger", + "header_menu_logout": "Logg ut", + "header_login": "Logg inn", + "header_signup": "Registrer konto", + "header_github_title": "OpenShock på GitHub", + "header_discord_title": "Discord-samfunnet", + + "footer_made_with": "Laget med {#heart/} av {#team}OpenShock-teamet{/team}", + "footer_connection_status_label": "Tilkoblingsstatus til serveren", + "footer_signalr_state": "SignalR-status", + "footer_frontend_version": "Frontend-versjon", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backend-versjon", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Språk", + + "sidebar_home_link_label": "OpenShock-startsiden", + "sidebar_group_general": "Generelt", + "sidebar_home": "Hjem", + "sidebar_shockers": "Shockere", + "sidebar_shared_shockers": "Delte shockere", + "sidebar_hubs": "Huber", + "sidebar_user_shares": "Brukerdelinger", + "sidebar_public_shares": "Offentlige delinger", + "sidebar_serial_terminal": "Seriell terminal", + "sidebar_group_admin": "Admin", + "sidebar_admin_monitoring": "Monitorering", + "sidebar_admin_online_hubs": "Tilkoblede huber", + "sidebar_admin_online_gateways": "Tilkoblede gatewayer", + "sidebar_admin_management": "Administrasjon", + "sidebar_admin_users": "Brukere", + "sidebar_admin_blacklists": "Blokkerings Lister", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "E-post", + "sidebar_admin_automation_tokens": "Automasjons Tokens", + "sidebar_admin_configuration": "Konfigurasjon", + "sidebar_group_settings": "Innstillinger", + "sidebar_settings_api_tokens": "API-tokens", + "sidebar_settings_sessions": "Økter", + "sidebar_settings_audit_log": "Aktivitetslogg", + "sidebar_settings_connections": "Tilkoblinger", + "sidebar_settings_account": "Kontoinnstillinger", + + "error_meta_title": "Tjenesten er utilgjengelig", + "error_meta_description": "OpenShock er for øyeblikket utilgjengelig", + "error_meta_logo_alt": "OpenShock-logo", + "error_fallback_message": "Noe gikk galt.", + "error_not_found_message": "Fant ikke siden", + "error_not_found_description": "Siden du leter etter finnes ikke.", + "error_unexpected_description": "Det oppstod en uventet feil.", + "error_go_back": "Gå tilbake", + + "auth_layout_logo_alt": "OpenShock-logo", + "auth_layout_invalid_redirect_removed": "En ugyldig viderekoblings-URL ble fjernet for din sikkerhet.", + + "auth_activate_breadcrumb": "Aktiver konto", + "auth_activate_title": "Aktiver konto", + "auth_activate_activating": "Aktiverer kontoen din...", + "auth_activate_success": "Kontoen din er aktivert", + "auth_activate_failed": "Denne aktiveringslenken er ugyldig eller utløpt", + "auth_activate_missing_token": "Aktiveringstoken mangler", + "auth_activate_continue": "Fortsett til innlogging", + "auth_activate_toast_success": "Kontoen er aktivert", + + "auth_forgot_breadcrumb": "Glemt passord", + "auth_forgot_title": "Glemt passord", + "auth_forgot_description": "Skriv inn e-postadressen din for å tilbakestille passordet", + "auth_forgot_email_label": "E-post", + "auth_forgot_email_placeholder": "E-post", + "auth_forgot_submit": "Tilbakestill passord", + "auth_forgot_signin_prompt": "Husker du passordet? {#signin}Logg inn{/signin}", + "auth_forgot_mail_disabled": "Tilbakestilling av passord er ikke tilgjengelig på denne instansen fordi ingen e-postleverandør er satt opp. Kontakt administratoren din for hjelp til å få tilbake tilgangen til kontoen.", + "auth_forgot_toast_sent": "En forespørsel om å tilbakestille passordet er sendt til den oppgitte e-postadressen", + + "auth_login_breadcrumb": "Logg inn", + "auth_login_title": "Velkommen tilbake", + "auth_login_loading_methods": "Laster inn tilgjengelige innloggingsmetoder", + "auth_login_choose_method": "Logg inn med en av disse metodene", + "auth_login_with_account": "Logg inn med OpenShock-kontoen din", + "auth_login_activation_after_signup": "Kontoen din er opprettet. Vi har sendt en aktiveringslenke til e-postadressen din. Sjekk innboksen og søppel-mappen.", + "auth_login_activation_pending": "Kontoen din er ikke aktivert ennå. Vi har sendt en aktiveringslenke til e-postadressen din. Sjekk innboksen og søppel-mappen. Hvis ingenting kommer, kan du prøve å logge inn igjen senere for å få en ny lenke.", + "auth_login_oauth_only": "Denne kontoen har ikke noe passord. Logg inn med leverandøren du registrerte deg med.", + "auth_login_oauth_only_with_buttons": "Denne kontoen har ikke noe passord. Logg inn med leverandøren du registrerte deg med ved å bruke knappene over.", + "auth_login_or_continue_with": "Eller fortsett med", + "auth_login_username_label": "Brukernavn eller e-post", + "auth_login_password_label": "Passord", + "auth_login_submit": "Logg inn", + "auth_login_signup_prompt": "Har du ikke en konto? {#signup}Registrer deg{/signup}", + "auth_login_legal": "Ved å klikke på «Logg inn» godtar du {#tos}vilkårene for bruk{/tos} og {#privacy}personvernerklæringen{/privacy} vår.", + + "auth_oauth_create_breadcrumb": "Registrer deg med {provider}", + "auth_oauth_create_title": "Registrer deg med {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Fyll ut kontoopplysningene dine", + "auth_oauth_create_username_label": "Brukernavn", + "auth_oauth_create_username_placeholder": "Brukernavn", + "auth_oauth_create_email_label": "E-post", + "auth_oauth_create_email_placeholder": "E-post", + "auth_oauth_create_submit": "Registrer deg", + "auth_oauth_create_legal": "Ved å klikke på «Registrer deg» godtar du {#tos}vilkårene for bruk{/tos} og {#privacy}personvernerklæringen{/privacy} vår.", + + "auth_oauth_error_breadcrumb": "Autentiseringsfeil", + "auth_oauth_error_title": "Autentiseringsfeil", + "auth_oauth_error_back": "Tilbake til innlogging", + + "auth_reset_breadcrumb": "Tilbakestill passord", + "auth_reset_title": "Tilbakestill passord", + "auth_reset_checking": "Kontrollerer lenken...", + "auth_reset_choose_password": "Velg et nytt passord for kontoen din", + "auth_reset_invalid": "Denne lenken for tilbakestilling er ugyldig eller utløpt", + "auth_reset_password_label": "Nytt passord", + "auth_reset_password_placeholder": "Nytt passord", + "auth_reset_confirm_label": "Bekreft nytt passord", + "auth_reset_confirm_placeholder": "Bekreft nytt passord", + "auth_reset_submit": "Tilbakestill passord", + "auth_reset_request_new": "Be om en ny lenke", + "auth_reset_toast_success": "Passordet er tilbakestilt", + + "auth_signup_breadcrumb": "Registrer deg", + "auth_signup_toast_created_mail": "Kontoen er opprettet. Sjekk e-posten din for å bekrefte kontoen.", + "auth_signup_toast_created_no_mail": "Kontoen er opprettet. Du kan logge inn nå.", + "auth_signup_dialog_title": "Velkommen! Takk for at du valgte å registrere deg med oss! ❤️", + "auth_signup_dialog_created_mail": "Kontoen din er opprettet. 🎉 Sjekk e-posten din for å bekrefte kontoen.", + "auth_signup_dialog_verify_then_login": "Når du har bekreftet e-postadressen, kan du logge inn på kontoen din.", + "auth_signup_dialog_created_no_mail": "Kontoen din er opprettet og klar til bruk. 🎉", + "auth_signup_dialog_login_now": "Du kan logge inn på kontoen din nå.", + "auth_signup_title": "Opprett konto", + "auth_signup_loading_methods": "Laster inn tilgjengelige registreringsmetoder", + "auth_signup_using_email": "Registrering med e-post", + "auth_signup_choose_method": "Velg hvordan du vil registrere deg", + "auth_signup_back": "Tilbake", + "auth_signup_username_label": "Brukernavn", + "auth_signup_username_placeholder": "Ole Hansen", + "auth_signup_email_label": "E-post", + "auth_signup_email_placeholder": "ole@eksempel.no", + "auth_signup_password_label": "Passord", + "auth_signup_password_placeholder": "Passord", + "auth_signup_confirm_label": "Bekreft passord", + "auth_signup_confirm_placeholder": "Bekreft passord", + "auth_signup_submit": "Opprett konto", + "auth_signup_signin_prompt": "Har du allerede en konto? {#signin}Logg inn{/signin}", + "auth_signup_or": "Eller", + "auth_signup_with_email": "Registrer deg med e-post", + "auth_signup_legal": "Ved å klikke på «Opprett konto» godtar du {#tos}vilkårene for bruk{/tos} og {#privacy}personvernerklæringen{/privacy} vår.", + + "auth_verify_breadcrumb": "Bekreft e-post", + "auth_verify_title": "Bekreft e-post", + "auth_verify_verifying": "Bekrefter e-postadressen din...", + "auth_verify_success": "E-postadressen din er bekreftet", + "auth_verify_failed": "Denne bekreftelseslenken er ugyldig eller utløpt", + "auth_verify_missing_token": "Bekreftelsestoken mangler", + "auth_verify_continue": "Fortsett til innlogging", + "auth_verify_toast_success": "E-postadressen er bekreftet", + + "common_cancel": "Avbryt", + "common_delete": "Slett", + "common_edit": "Rediger", + "common_share": "Del", + "common_copy_id": "Kopier ID", + "common_id_copied": "ID kopiert til utklippstavlen", + "common_open_menu": "Åpne meny", + "common_refresh": "Oppdater", + "common_settings": "Innstillinger", + "common_clear": "Tøm", + "common_online": "Tilkoblet", + "common_offline": "Frakoblet", + "common_paused": "Satt på pause", + "common_resume": "Fortsett", + "common_resuming": "Fortsetter...", + "common_coming_soon": "(Kommer snart)", + "common_save_changes": "Lagre endringer", + "common_danger_zone": "Faresone", + "common_name": "Navn", + "control_intensity": "Intensitet", + "control_duration": "Varighet", + "control_max_intensity": "Maks. intensitet", + "control_max_duration": "Maks. varighet", + "control_vibration": "Vibrasjon", + "control_value": "Verdi", + "control_live_intensity": "Live-intensitet", + "control_type_stop": "Stopp", + "control_type_shock": "Støt", + "control_type_vibrate": "Vibrer", + "control_type_sound": "Lyd", + "live_tooltip_active": "Live via {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Kobler til...", + "live_tooltip_connect": "Koble til live-kontroll", + "live_tooltip_hub_start": "Ctrl+klikk for å starte hele huben", + "live_tooltip_hub_stop": "Ctrl+klikk for å stoppe hele huben", + "pause_resume_shocker": "Fortsett shockeren", + "pause_pause_shocker": "Sett shockeren på pause", + "pause_resume_all": "Fortsett alle shockere", + "pause_pause_all": "Sett alle shockere på pause", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Velg hub", + "shocker_rf_id": "RF-ID", + "shocker_rf_id_invalid": "RF-ID må være et heltall mellom {min} og {max}.", + "shocker_model": "Modell", + "shocker_select_model": "Velg modell", + "shocker_name_placeholder": "Navn på shocker", + "shocker_menu_view_logs": "Vis logger", + "shocker_delete_title": "Slett shocker", + "shocker_delete_desc": "Er du sikker på at du vil slette «{name}»? Dette kan ikke angres.", + "shocker_toast_deleted": "Shockeren «{name}» er slettet", + "shocker_toast_paused": "Shockeren er satt på pause", + "shocker_toast_resumed": "Shockeren fortsetter", + "shocker_add_desc": "Registrer en ny shocker på en av hubene dine.", + "shocker_add_name_placeholder": "Min shocker", + "shockers_title": "Shockere", + "shockers_subtitle": "Alle shockere som er paret med hubene dine.", + "shockers_loading": "Laster inn shockere...", + "shockers_toast_refreshed": "Shockerne er oppdatert", + "shockers_toast_need_hub": "Du må opprette en hub før du kan legge til shockere.", + "shockers_toast_added": "Shocker lagt til", + "shockers_unknown_module": "Ukjent modultype", + "shockers_add": "Legg til shocker", + "shockers_view_mode": "Visningsmodus", + "shockers_mode_classic": "Klassisk", + "shockers_mode_rich": "Utvidet", + "shockers_mode_simple": "Enkel", + "shockers_mode_map": "Kart", + "shockers_group_by_hub": "Grupper etter hub", + "shockers_global_limits": "Globale grenser", + "shockers_logs_label": "Logger", + "shockers_empty_title": "Ingen shockere ennå", + "shockers_empty_no_hubs": "Opprett en hub først, og legg deretter til shockere.", + "shockers_empty_has_hubs": "Legg til en shocker i en av hubene dine for å komme i gang.", + "shockers_create_hub": "Opprett en hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockere" } + } + ], + "shared_shockers_title": "Delte shockere", + "shared_shockers_subtitle": "Shockere som andre brukere har delt med deg.", + "shared_shockers_empty_title": "Ingen shockere er delt med deg ennå.", + "shared_shockers_empty_desc": "Når noen deler shockerne sine med deg, dukker de opp her.", + "shocker_logs_title": "Shocker-logger", + "shocker_logs_subtitle": "Alle kontrollkommandoer som er sendt til shockerne dine.", + "shocker_logs_live_title": "Nye logger vises i sanntid", + "shocker_logs_paused_title": "Direkteoppdateringer settes på pause når du sorterer eller ser på en annen side enn den første", + "shocker_logs_live": "Direkte", + "shocker_logs_col_time": "Tidspunkt", + "shocker_logs_col_type": "Type", + "shocker_logs_col_by": "Av", + "shocker_logs_filter_label": "Filtrer etter shocker", + "shocker_logs_filter_placeholder": "Søk etter shockere...", + "shocker_logs_filter_all": "Alle shockere", + "shocker_logs_filter_none": "Ingen samsvarende shockere", + "shocker_edit_title": "Rediger shocker", + "shocker_edit_subtitle": "Endre detaljene for denne shockeren, eller fjern den.", + "shocker_edit_back": "Tilbake til shockerne", + "shocker_edit_load_failed": "Kunne ikke laste inn shockeren.", + "shocker_edit_loading": "Laster inn shockeren...", + "shocker_edit_details_title": "Shockerdetaljer", + "shocker_edit_details_desc": "Oppdater navn, RF-ID og modell for denne shockeren.", + "shocker_edit_pause_state": "Pausestatus", + "shocker_edit_is_paused": "Shockeren er satt på pause", + "shocker_edit_is_active": "Shockeren er aktiv", + "shocker_edit_toast_updated": "Shockeren er oppdatert", + "shocker_edit_delete_desc": "Slett denne shockeren permanent. Dette kan ikke angres.", + + "common_close": "Lukk", + "common_continue": "Fortsett", + "common_loading": "Laster inn...", + "common_previous": "Forrige", + "common_next": "Neste", + "common_steps": "Steg", + "common_step_label": "Steg {number}: {title}", + "common_copy": "Kopier", + "common_copied": "Kopiert", + "common_never": "Aldri", + "common_error": "Feil: {message}", + "terminal_title": "Seriell terminal", + "terminal_connecting": "Kobler til...", + "terminal_help_button": "Har du problemer? Få hjelp", + "terminal_back_to_modes": "Tilbake til modusvalg", + "terminal_mode_configure": "Konfigurer enhet", + "terminal_mode_configure_desc": "Konfigurer Wi-Fi, autentisering og mer. Inkluderer en interaktiv seriell konsoll.", + "terminal_mode_flash": "Flash fastvare", + "terminal_mode_flash_desc": "Installer eller oppdater fastvare på en tilkoblet enhet.", + "terminal_mode_raw": "Seriell monitor", + "terminal_mode_raw_desc": "Bare konsollen. Les enhetslogger og send kommandoer.", + "terminal_step_channel": "Velg kanal", + "terminal_step_board": "Velg kort", + "terminal_go_to_step": "Gå til steg {number}: {title}", + "terminal_erase": "Slett før flashing", + "terminal_erase_desc": "Sletter alle data på enheten, inkludert eksisterende konfigurasjoner", + "terminal_unsupported": "Nettleseren din støtter ikke denne funksjonen.", + "terminal_update_browser": "Oppdater nettleseren din til nyeste versjon.", + "terminal_use_browsers": "Bruk en av disse nettleserne:", + "terminal_connect_failed_bootloader": "Kunne ikke gå inn i bootloader-modus", + "terminal_connect_failed": "Tilkobling til enheten mislyktes", + "terminal_connect_failed_desc": "Vi klarte ikke å opprette en seriell tilkobling til enheten.", + "terminal_quick_tries": "Ting du kan prøve:", + "terminal_try_replug": "Koble enheten fra og til igjen.", + "terminal_try_cable": "Prøv en annen USB-kabel eller port.", + "terminal_try_driver": "Sørg for at seriedriveren er installert.", + "terminal_open_troubleshooter": "Åpne feilsøking", + "terminal_log_reset_no_device": "Feil på vertssiden under omstart: ingen enhet!", + "terminal_log_reset_error": "Feil på vertssiden under omstart: {error}", + "terminal_log_send_no_device": "Kunne ikke sende: ingen enhet!", + "terminal_log_send_error": "Kunne ikke sende: {error}", + "terminal_log_firmware_disconnected": "Fastvaren ble koblet fra: {error}", + "terminal_log_erase_failed": "Kunne ikke slette flash: {error}", + "terminal_log_hard_reset_failed": "Maskinvaretilbakestilling mislyktes: {error}", + "terminal_log_flash_complete": "Flashing fullført", + "terminal_log_flash_failed": "Flashing mislyktes: {error}", + "terminal_log_command_failed": "Kunne ikke skrive kommandoen: {error}", + "terminal_help_title": "Feilsøking", + "terminal_help_desc": "Gå gjennom disse stegene i rekkefølge. Hvert steg utelukker en vanlig årsak.", + "terminal_help_step_cable": "USB-kabel", + "terminal_help_step_port": "USB-port", + "terminal_help_step_driver": "Installer driver", + "terminal_help_step_manual": "Manuell driveroppdatering", + "terminal_help_step_discord": "Spør på Discord", + "terminal_help_cable_body": "Mange USB-C- og micro-USB-kabler kan bare lade og overfører ikke data. Bytt til en datakabel du vet fungerer (en du har brukt til å overføre filer eller koble til andre enheter), og koble til huben på nytt.", + "terminal_help_port_body": "Koble enheten direkte til en USB-port på datamaskinen. Unngå USB-huber, dokkingstasjoner og porter på frontpanelet hvis mulig; de er vanlige kilder til strøm- og signalproblemer. Har du en stasjonær maskin, prøv en port på baksiden.", + "terminal_help_driver_download": "Last ned CP210x-driveren:", + "terminal_help_driver_extract": "Pakk ut innholdet i zip-filen til en mappe på datamaskinen.", + "terminal_help_driver_run": "Åpne mappen og kjør {#code}{installer}{/code}. Følg instruksjonene for å installere.", + "terminal_help_driver_reconnect": "Koble til enheten på nytt.", + "terminal_help_manual_intro": "Hvis driverinstallasjonen ble kjørt, men enheten fortsatt ikke vises:", + "terminal_help_manual_open": "Åpne Enhetsbehandling (trykk {#key}Win{/key} + {#key}X{/key} og velg {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Under {#code}Ports (COM & LPT){/code} ser du etter en oppføring som:", + "terminal_help_manual_missing": "Hvis den mangler, oppdager ikke Windows enheten i det hele tatt; gå gjennom stegene for kabel og port igjen.", + "terminal_help_manual_update": "Høyreklikk på enheten og velg {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Velg {#code}Browse my computer for drivers{/code} og velg mappen du pakket ut driver-zip-filen til. Sørg for at {#code}Include subfolders{/code} er krysset av.", + "terminal_help_manual_success": "Hvis det lykkes, skal oppføringen nå hete {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Står du fortsatt fast? Bli med på Discord-serveren vår og spør i kanalen {#code}{channel}{/code}. Ta med:", + "terminal_help_discord_os": "operativsystemet og nettleseren din", + "terminal_help_discord_device": "enheten du bruker (kortmodell, hvor du fikk den)", + "terminal_help_discord_tried": "hva du allerede har prøvd fra de forrige stegene", + "terminal_help_discord_errors": "eventuelle feilmeldinger eller relevant terminalutdata", + "terminal_help_discord_join": "Bli med på Discord-serveren vår", + "terminal_risk_title": "⚠️ USTABIL FASTVARE", + "terminal_risk_intro": "Du er i ferd med å flashe {#strong}eksperimentell fastvare{/strong} som er {#strong}kjent for å være ustabil{/strong}.", + "terminal_risk_brick": "Dette kan ødelegge enheten permanent, kreve manuell gjenoppretting eller gjøre den ubrukelig.", + "terminal_risk_no_support": "Vi gir IKKE støtte for problemer forårsaket av denne fastvaren.", + "terminal_risk_acknowledge": "Jeg forstår at dette er helt og holdent mitt ansvar", + "terminal_risk_abort": "Avbryt", + "terminal_risk_accept": "JEG TAR FULLT ANSVAR", + "firmware_channel_recommended": "Dette er den anbefalte kanalen.", + "firmware_channel_danger": "IKKE BRUK DENNE MED MINDRE DU VET HVA DU GJØR", + "firmware_channel_stable": "Stabil", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Utvikling", + "terminal_board_select": "Velg et kort...", + "terminal_board_search": "Søk etter kort...", + "terminal_board_none": "Fant ingen kort.", + "terminal_flash_button": "Flash", + "terminal_flash_progress": "Fremdrift: {status}", + "terminal_flash_idle": "Venter", + "terminal_flash_no_device": "Ingen enhet er valgt.", + "terminal_flash_resetting": "Tilbakestiller...", + "terminal_flash_downloading": "Laster ned fastvare...", + "terminal_flash_download_failed": "Kunne ikke laste ned fastvaren.", + "terminal_flash_flashing": "Flasher fastvare...", + "terminal_flash_rebooting": "Starter enheten på nytt... (Koble strømmen fra og til manuelt hvis den henger)", + "terminal_flash_done": "Enheten er startet på nytt! Flashing fullført.", + "terminal_port_select": "Velg enhet", + "terminal_port_disconnect": "Koble fra enheten", + "terminal_port_connected": "Enhet tilkoblet: {#strong}{id}{/strong}", + "terminal_console": "Konsoll", + "terminal_connected_device": "Tilkoblet enhet", + "terminal_resize": "Endre størrelse på terminalpanelet", + "terminal_reboot": "Start på nytt", + "terminal_disconnect": "Koble fra", + "terminal_fullscreen_exit_esc": "Avslutt fullskjerm (Esc)", + "terminal_fullscreen_exit": "Avslutt fullskjerm", + "terminal_fullscreen_fill": "Fyll vinduet", + "terminal_command_label": "Seriell kommando", + "terminal_command_placeholder": "Skriv en kommando...", + "terminal_command_send": "Send kommando", + "terminal_colors": "Farger", + "terminal_colors_menu": "Farger...", + "terminal_colors_label": "Konsollfarger", + "terminal_colors_close": "Lukk farger", + "terminal_color_input": "Farge for {name}", + "terminal_colors_reset": "Tilbakestill til standard", + "terminal_color_bg": "Bakgrunn", + "terminal_color_fg": "Tekst", + "terminal_color_ts": "Tidsstempel", + "terminal_color_error": "Feil", + "terminal_color_warning": "Advarsel", + "terminal_color_info": "Info", + "terminal_color_debug": "Feilsøking", + "terminal_color_verbose": "Detaljert", + "terminal_options": "Alternativer", + "terminal_options_label": "Konsollalternativer", + "terminal_hide_system": "Skjul systemmeldinger", + "terminal_stick_bottom": "Hold deg nederst", + "terminal_raw_output": "Rå utdata", + "terminal_timestamps": "Tidsstempler", + "terminal_timestamp_uptime": "Oppetid", + "terminal_timestamp_local": "Lokal", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Av", + "terminal_copy_settings": "Kopier innstillinger", + "terminal_import_settings": "Importer innstillinger", + "terminal_copy_selection": "Kopier markering", + "terminal_copy_all": "Kopier all utdata", + "terminal_toast_selection_copied": "Markeringen er kopiert", + "terminal_toast_output_copied": "Konsollutdata er kopiert", + "terminal_toast_settings_copied": "Konsollinnstillingene er kopiert", + "terminal_toast_clipboard_unreadable": "Kunne ikke lese utklippstavlen", + "terminal_toast_settings_imported": "Konsollinnstillingene er importert", + "terminal_toast_settings_invalid": "Utklippstavlen inneholder ikke konsollinnstillinger", + + "common_try_again": "Prøv igjen", + "terminal_cfg_intro": "Verdier sendes til enheten via UART. Svaret fra enheten vises i konsollen nedenfor. Kommandoer uten argument leser verdien; bruk {#eye/}-knappen ved hvert felt for å lese gjeldende verdi.", + "terminal_cfg_rf_title": "RF-sender", + "terminal_cfg_rf_desc": "Styrer RF-signalet til shockerne.", + "terminal_cfg_tx_pin": "TX GPIO-pinne", + "terminal_cfg_example": "f.eks. {value}", + "terminal_cfg_read_value": "Les gjeldende verdi", + "terminal_cfg_set": "Angi", + "terminal_cfg_read": "Les", + "terminal_cfg_reading": "Leser…", + "terminal_cfg_apply": "Bruk", + "terminal_cfg_keepalive": "Keepalive aktivert", + "terminal_cfg_keepalive_desc": "Pinger parede shockere jevnlig så de holder seg våkne.", + "terminal_cfg_estop_title": "Nødstopp", + "terminal_cfg_estop_desc": "Maskinvareknapp som stopper alle signaler.", + "terminal_cfg_estop_enabled": "Nødstopp aktivert", + "terminal_cfg_estop_pin": "GPIO-pinne for nødstopp", + "terminal_cfg_estop_note": "Merk: {#code}{latching}{/code} og {#code}{active}{/code} har ingen egne kommandoer; angi dem via JSON-konfigurasjonen nedenfor.", + "terminal_cfg_wifi_title": "Wi-Fi", + "terminal_cfg_wifi_desc": "Nettverkspålogging og vertsnavnet til enheten.", + "terminal_cfg_hostname": "Vertsnavn", + "terminal_cfg_networks": "Nettverk (JSON-matrise)", + "terminal_cfg_invalid_json_array": "Må være en gyldig JSON-matrise", + "terminal_cfg_ap_note": "AP-innstillinger ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) har ingen egne kommandoer; bruk JSON-konfigurasjonen.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "OpenShock-server og autentisering.", + "terminal_cfg_domain": "Domene", + "terminal_cfg_domain_restart": "Når du angir domenet, startes enheten på nytt.", + "terminal_cfg_auth_token": "Autentiseringstoken", + "terminal_cfg_auth_token_placeholder": "Lim inn enhetstoken", + "terminal_cfg_hide": "Skjul", + "terminal_cfg_show": "Vis", + "terminal_cfg_serial_title": "Seriell inndata", + "terminal_cfg_echo": "Ekko aktivert", + "terminal_cfg_echo_desc": "Skriv innskrevne tegn tilbake til konsollen.", + "terminal_cfg_advanced_title": "Avansert: hele konfigurasjonen", + "terminal_cfg_advanced_desc": "For felt uten egne kommandoer (captive portal, OTA, LAN osv.) erstatter du hele konfigurasjonen.", + "terminal_cfg_json_config": "JSON-konfigurasjon", + "terminal_cfg_invalid_json": "Må være gyldig JSON", + "terminal_cfg_read_json": "Les gjeldende konfigurasjon som JSON", + "terminal_cfg_json_restart": "Når du bruker en JSON-konfigurasjon, startes enheten på nytt.", + "terminal_cfg_raw_config": "Rå FlatBuffer-konfigurasjon (base64)", + "terminal_cfg_invalid_base64": "Må være en gyldig base64-streng", + "terminal_cfg_read_raw": "Les gjeldende konfigurasjon som base64", + "terminal_cfg_factory_reset": "Tilbakestill til fabrikkinnstillinger", + "terminal_cfg_factory_reset_desc": "Sletter hele enhetskonfigurasjonen.", + "terminal_cfg_factory_reset_title": "Tilbakestille enheten til fabrikkinnstillinger?", + "terminal_cfg_factory_reset_action": "Slett konfigurasjonen", + "terminal_cfg_factory_reset_confirm": "Dette sletter all konfigurasjon på enheten: Wi-Fi-nettverk, påloggingsdata for backend, pinner og alle andre innstillinger. Enheten tilbakestilles til standard.", + "terminal_cfg_read_failed_json_title": "Kunne ikke lese JSON-konfigurasjonen", + "terminal_cfg_read_failed_raw_title": "Kunne ikke lese råkonfigurasjonen", + "terminal_cfg_read_failed_desc": "Enheten svarte ikke etter {attempts} forsøk.", + "terminal_cfg_common_causes": "Vanlige årsaker:", + "terminal_cfg_cause_busy": "Enheten er opptatt med en annen kommando.", + "terminal_cfg_cause_disconnected": "Enheten ble koblet fra eller startet på nytt.", + "terminal_cfg_cause_unsupported": "Fastvareversjonen støtter ikke denne kommandoen.", + + "common_status": "Status", + "common_version": "Versjon", + "common_created": "Opprettet", + "common_create": "Opprett", + "common_done": "Ferdig", + "common_enable": "Aktiver", + "common_disable": "Deaktiver", + "common_are_you_sure": "Er du sikker?", + "common_generating": "Genererer...", + "hubs_title": "Huber", + "hubs_subtitle": "Alle huber som er registrert på kontoen din.", + "hubs_add": "Legg til hub", + "hubs_load_failed": "Kunne ikke laste inn huber.", + "hubs_empty_title": "Ingen huber ennå", + "hubs_empty_desc": "En hub er enheten som videresender kommandoer til shockerne dine. Legg til en for å komme i gang.", + "hubs_create_title": "Opprett hub", + "hubs_name_label": "Navn på hub", + "hubs_name_placeholder": "Min hub", + "hub_toast_not_connected": "Ikke koblet til serveren", + "hub_toast_try_later": "Prøv igjen om litt.", + "hub_reboot_title": "Starte {name} på nytt?", + "hub_reboot_desc": "Huben kobles fra og starter på nytt. Shockere som er paret med den, svarer ikke før den er tilkoblet igjen.", + "hub_reboot": "Start på nytt", + "hub_hotspot_enable_title": "Aktivere Wi-Fi-hotspot på {name}?", + "hub_hotspot_disable_title": "Deaktivere Wi-Fi-hotspot på {name}?", + "hub_hotspot_enable_desc": "Huben sender ut sitt eget oppsettnettverk. Den er fortsatt tilgjengelig på Wi-Fi-en din, men hotspoten er åpen for alle innen rekkevidde til du slår den av.", + "hub_hotspot_disable_desc": "Oppsett-hotspoten slås av. Hvis huben ikke allerede er på Wi-Fi-en din, trenger du fysisk tilgang for å sette den opp igjen.", + "hub_delete_desc": "Du er i ferd med å slette huben {#strong}{name}{/strong}.", + "hub_delete_shockers": "Dette sletter også disse shockerne:", + "hub_edit_title": "Rediger hub", + "hub_edit_apply": "Bruk", + "hub_pair_title_generate": "Generere paringskode?", + "hub_pair_title_generated": "Paringskode generert", + "hub_pair_title_paired": "Hub paret", + "hub_pair_consumed": "{#strong}{name}{/strong} brukte denne paringskoden og er nå paret.", + "hub_pair_used": "Koden er brukt og er ikke lenger gyldig.", + "hub_pair_generated_for": "Paringskode generert for {#strong}{name}{/strong}.", + "hub_copy_now": "Koden nedenfor vil ikke være tilgjengelig senere. Kopier den nå og oppdater klientene dine med den.", + "hub_pair_generate_for": "Du er i ferd med å generere en paringskode for {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Den er gyldig i 15 minutter etter at den er opprettet.", + "hub_pair_one_active": "Det finnes bare én aktiv paringskode per hub; nye koder erstatter den eldre.", + "hub_pair_complete": "Paring fullført", + "hub_pair_code_label": "Paringskode:", + "hub_pair_copied_close": "Koden er kopiert, lukk", + "hub_pair_get": "Hent paringskode", + "hub_token_generated": "Token generert", + "hub_token_generated_for": "Nytt token generert for {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Du er i ferd med å generere et nytt token for {#strong}{name}{/strong}.", + "hub_token_invalidate": "Dette gjør det nåværende tokenet ugyldig og kobler fra klienter som bruker det.", + "hub_token_confirm": "Er du sikker på at du vil gjøre dette?", + "hub_token_label": "Nytt token:", + "hub_token_copied_close": "Tokenet er kopiert, lukk", + "hub_token_regenerate": "Generer nytt token", + "hub_menu_update": "Oppdater", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "Aktiver Wi-Fi-hotspot", + "hub_menu_hotspot_disable": "Deaktiver Wi-Fi-hotspot", + "hub_menu_pair": "Par", + "hub_menu_estop": "Nødstopp", + "hub_update_breadcrumb": "Oppdater", + "hub_update_unknown_hub": "Ukjent hub", + "hub_update_unknown_task": "Ukjent oppgave", + "hub_update_task_metadata": "Henter metadata", + "hub_update_task_preparing": "Forbereder oppdatering", + "hub_update_task_flash_fs": "Flasher filsystem", + "hub_update_task_verify_fs": "Verifiserer filsystem", + "hub_update_task_flash_app": "Flasher applikasjon", + "hub_update_task_bootable": "Merker applikasjonen som oppstartbar", + "hub_update_task_rebooting": "Starter på nytt", + "hub_update_status_started": "Startet", + "hub_update_status_running": "Kjører", + "hub_update_status_finished": "Fullført", + "hub_update_status_error": "Feil", + "hub_update_status_timeout": "Tidsavbrudd", + "hub_update_confirm_title": "Bekreft fastvareoppdatering", + "hub_update_confirm_desc": "Oppdatere {#strong}{name}{/strong} til versjon {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Denne versjonen er kanskje ikke fra den stabile kanalen og kan inneholde feil.", + "hub_update_title": "Oppdater {name}", + "hub_update_subtitle": "Administrer fastvareoppdateringer for denne huben.", + "hub_update_status_title": "Hubstatus", + "hub_update_firmware": "Fastvare: {#mono}{version}{/mono}", + "hub_update_confirm": "Oppdater", + "hub_update_success": "Oppdateringen er fullført", + "hub_update_rolled_back": "Enheten gikk tilbake til forrige versjon", + "hub_update_back": "Tilbake til huber", + "hub_update_flash_again": "Flash på nytt", + "hub_update_card_title": "Fastvareoppdatering", + "hub_update_card_desc": "Velg en fastvarekanal og versjon som skal installeres.", + "hub_update_to": "Oppdater til {version}", + "hub_update_must_be_online": "Huben må være tilkoblet for å starte en oppdatering.", + "hub_update_updating_to": "Oppdaterer til {version}...", + "hub_update_total": "Totalt", + "hub_update_task": "Oppgave", + "hub_update_history": "Oppdateringshistorikk", + "hub_update_no_history": "Fant ingen oppdateringshistorikk for denne huben.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Startet", + "hub_update_col_message": "Melding", + "hub_update_loading": "Laster inn hubinformasjon...", + "hub_update_not_found": "Fant ikke huben.", + "home_breadcrumb": "Hjem", + "home_welcome": "Velkommen tilbake", + "home_welcome_name": "Velkommen tilbake, {name}", + "home_subtitle": "Her er en oversikt over OpenShock-oppsettet ditt.", + "home_hubs_online": "{count} tilkoblet", + "home_hub_status": "Hubstatus", + "home_no_hubs": "Ingen huber", + "home_all_online": "Alle tilkoblet", + "home_all_offline": "Alle frakoblet", + "home_some_online": "{online}/{total} tilkoblet", + "home_quick_links": "Snarveier", + "home_my_shockers": "Mine shockere", + "home_my_shockers_desc": "Styr shockerne dine", + "home_hubs_desc": "Administrer hubene dine", + "home_shared_desc": "Shockere som er delt med deg", + "home_public_desc": "Administrer delingslenker", + "home_get_started": "Kom i gang", + "home_get_started_desc": "Du har ingen huber ennå. Opprett en hub for å koble til den første enheten din, og legg deretter til shockere.", + "home_set_up_hub": "Sett opp en hub", + "home_first_shocker": "Legg til din første shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Du har satt opp {count} hub. Legg til en shocker for å begynne å styre den.", + "countPlural=other": "Du har satt opp {count} huber. Legg til en shocker for å begynne å styre den." + } + } + ], + "home_go_to_shockers": "Gå til shockere", + "profile_title": "Profil", + "profile_coming_soon": "Profilen kommer snart", + "profile_coming_soon_desc": "Den offentlige profilen din er ikke tilgjengelig ennå. Kontodetaljene finner du under Innstillinger.", + + "common_retry": "Prøv igjen", + "common_never_used": "Aldri brukt", + "common_expires": "Utløper {time}", + "common_search_placeholder": "Søk...", + "common_unknown": "Ukjent", + "settings_breadcrumb_account": "Konto", + "account_subtitle": "Innloggingsdetaljene dine og kontohandlinger.", + "account_change_username": "Endre brukernavn", + "account_change_email": "Endre e-post", + "account_change_password": "Endre passord", + "account_username_label": "Brukernavn", + "account_email_label": "E-post", + "account_password_label": "Passord", + "account_new_password_label": "Nytt passord", + "account_confirm_password_label": "Bekreft nytt passord", + "account_oauth_only": "Ikke tilgjengelig for kontoer som bare bruker OAuth", + "account_oauth_no_password": "Denne kontoen logger inn via OAuth og har ikke noe passord.", + "account_diagnostics": "Diagnostikk", + "account_diagnostics_desc": "Hjelp oss med å fikse krasj og trege API-kall. Rapportene inneholder feilmeldingen, stakksporingen og IP-adressen din. Av som standard.", + "account_diagnostics_level": "Diagnostikknivå", + "account_telemetry_off": "Av", + "account_telemetry_off_desc": "Send ingenting.", + "account_telemetry_errors": "Feil", + "account_telemetry_errors_desc": "Send bare feilrapporter fra nettleseren.", + "account_telemetry_full": "Full", + "account_telemetry_full_desc": "Feilrapporter pluss sporing av API-kall (ingen sidenavigering).", + "account_toast_deactivated": "Kontoen er deaktivert", + "account_deactivate_title": "Deaktiver konto", + "account_deactivate_desc": "Er du sikker på at du vil deaktivere kontoen din?", + "account_deactivate": "Deaktiver konto", + "account_email_title": "Endre e-post", + "account_email_desc": "Skriv inn den nye e-postadressen din og bekreft med det nåværende passordet.", + "account_email_toast_sent": "Bekreftelses-e-post sendt til {email}. Klikk på lenken i e-posten for å bruke endringen.", + "account_new_email": "Ny e-post", + "account_current_password": "Nåværende passord", + "account_password_title": "Endre passord", + "account_password_desc": "Skriv inn det nåværende passordet og velg et nytt.", + "account_password_toast": "Passordet er endret", + "account_username_title": "Endre brukernavn", + "account_username_desc": "Skriv inn et nytt brukernavn.", + "account_new_username": "Nytt brukernavn", + "account_username_toast": "Brukernavnet er endret", + "tokens_subtitle": "API-tokens brukes til å autentisere mot OpenShock-API-et.", + "tokens_generate": "Generer token", + "tokens_toast_refreshed": "Tokens oppdatert", + "tokens_empty_title": "Ingen API-tokens", + "tokens_empty_desc": "Generer et token for å autentisere mot OpenShock-API-et.", + "tokens_created_on": "Opprettet {date}", + "tokens_last_used": "Sist brukt {time}", + "tokens_never_expires": "Utløper aldri", + "tokens_load_failed": "Kunne ikke laste inn API-tokens.", + "token_toast_edited": "Tokenet er redigert", + "token_name_required": "Navn er påkrevd", + "token_name_too_long": "Navnet er for langt", + "token_edit_title": "Rediger API-token", + "token_name_label": "Navn på token", + "token_name_placeholder": "Navn på token...", + "token_permissions": "Tillatelser", + "token_perm_category_shockers": "Shockere", + "token_perm_category_devices": "Huber", + "token_perm_category_usershares": "Brukerdelinger", + "token_perm_category_publicshares": "Offentlige delinger", + "token_perm_use": "Bruk", + "token_perm_edit": "Rediger", + "token_perm_pause": "Pause", + "token_perm_auth": "Autentiser", + "token_shocker_control": "Shockerstyring", + "token_toast_paused": "Token satt på pause", + "token_toast_resumed": "Token gjenopptatt", + "token_delete_title": "Slett API-token", + "token_delete_desc": "Er du sikker på at du vil slette {#strong}{name}{/strong}?", + "token_delete_permanent": "Dette kan ikke angres. Tokenet slettes permanent.", + "token_toast_deleted": "Tokenet er slettet", + "token_resume": "Gjenoppta token", + "token_pause": "Sett token på pause", + "token_mode_clamp_desc": "Clamp: forespørsler utenfor det tillatte området begrenses til nærmeste grense (min eller maks).", + "token_mode_lerp_desc": "Lerp: hele inndataområdet skaleres lineært slik at det passer innenfor det tillatte min–maks-området.", + "token_paused_desc": "Et token på pause kan ikke sende kontrollmeldinger til shockere.", + "token_intensity_range": "Intensitetsområde", + "token_duration_range": "Varighetsområde", + "token_new_breadcrumb": "Ny", + "token_redirect_not_allowed": "Den oppgitte redirect_uri er ikke tillatt. Bare loopback-adresser eller egne applikasjonsskjemaer er tillatt.", + "token_params_missing": "Påkrevde GET-parametere mangler. Sørg for at name, redirect_uri og permissions er oppgitt.", + "token_invalid_permissions": "Ugyldige tillatelser oppgitt: {list}", + "token_toast_created": "Tokenet er opprettet", + "token_request_title": "Forespørsel om API-token", + "token_access_granted": "Tilgang gitt", + "token_shared_redirecting": "Tokenet er opprettet og delt med applikasjonen. Sender deg tilbake til {#b}{uri}{/b}.", + "token_not_redirected": "Hvis du ikke sendes videre automatisk, bruker du knappen nedenfor.", + "token_finish": "Fullfør", + "token_generated_title": "API-token generert", + "token_copy_now": "Kopier API-tokenet ditt nå, du får ikke se det igjen senere!", + "token_new_title": "Nytt API-token", + "token_external_desc": "En ekstern applikasjon ber om tilgang til kontoen din. Se over og juster tillatelsene nedenfor før du gir tilgang.", + "token_new_desc": "Konfigurer og generer et nytt API-token for kontoen din.", + "token_external_requesting": "{#b}{name}{/b} ber om et API-token. Tokenet ditt deles med applikasjonen på {#b}{uri}{/b}.", + "token_allow": "Tillat", + "token_generate": "Generer", + "token_deny": "Avslå", + "sessions_subtitle": "Alle aktive økter på kontoen din. Tilbakekall de du ikke kjenner igjen.", + "sessions_unknown_device": "Ukjent enhet", + "sessions_toast_refreshed": "Øktene er oppdatert", + "sessions_load_failed": "Kunne ikke laste inn økter.", + "sessions_empty_title": "Ingen aktive økter", + "sessions_empty_desc": "Økter vises her når du logger inn fra en nettleser eller app.", + "sessions_last_seen": "Sist sett {time}", + "sessions_signed_in": "Logget inn {time}", + "session_toast_revoked": "Økten er tilbakekalt", + "session_revoke_title": "Tilbakekall økt", + "session_revoke": "Tilbakekall", + "session_revoke_desc": "Er du sikker på at du vil tilbakekalle denne økten?", + "session_revoke_from": "Økt logget inn fra {#strong}{ip}{/strong} med {#strong}{agent}{/strong}", + "connections_title": "OAuth-tilkoblinger", + "connections_subtitle": "Koble til eller fra tredjepartskontoer for å logge inn raskere og holde profilen synkronisert.", + "connections_toast_linked": "Kontoen er koblet til.", + "connections_toast_cancelled": "Tilkoblingen ble avbrutt.", + "connections_toast_failed": "Tilkoblingen mislyktes.", + "connections_toast_removed": "Tilkoblingen er fjernet", + "connections_refreshing": "Oppdaterer…", + "connections_link_new": "Koble til ny leverandør", + "connections_empty_title": "Ingen tilkoblinger ennå", + "connections_empty_desc": "Velg «Koble til ny leverandør» ovenfor for å koble til tilgjengelige leverandører.", + "connections_unlink": "Koble fra", + "connections_load_failed": "Kunne ikke laste inn OAuth-tilkoblinger.", + "connections_unlink_title": "Koble fra {name}?", + "connections_unlink_title_generic": "Koble fra denne kontoen?", + "connections_unlink_desc": "Du kan ikke lenger logge inn med denne leverandøren med mindre du kobler den til igjen.", + "provider_starting": "Starter {name}...", + "provider_link": "Koble til {name}", + "audit_subtitle": "Sikkerhetsrelevant aktivitet på kontoen din. Se over alt du ikke kjenner igjen.", + "audit_col_time": "Tid", + "audit_col_action": "Handling", + "audit_col_details": "Detaljer", + "audit_col_reason": "Årsak", + "audit_col_ip": "IP-adresse", + "audit_col_device": "Enhet", + "audit_action_login": "Logget inn", + "audit_action_logout": "Logget ut", + "audit_action_password_changed": "Passord endret", + "audit_action_email_change_requested": "Endring av e-post forespurt", + "audit_action_email_changed": "E-post endret", + "audit_action_username_changed": "Brukernavn endret", + "audit_action_api_token_created": "API-token opprettet", + "audit_action_api_token_deleted": "API-token slettet", + "audit_action_oauth_connected": "Tilkobling lagt til", + "audit_action_oauth_disconnected": "Tilkobling fjernet", + "audit_action_account_deactivated": "Konto deaktivert", + "audit_action_account_reactivated": "Konto reaktivert", + "audit_action_account_deleted": "Konto slettet", + "audit_action_automation_token_created": "Automatiseringstoken opprettet", + "audit_action_automation_token_updated": "Automatiseringstoken oppdatert", + "audit_action_automation_token_rotated": "Automatiseringstoken rotert", + "audit_action_automation_token_deleted": "Automatiseringstoken slettet", + "audit_action_automation_token_used": "Automatiseringstoken brukt", + "audit_meta_session": "Økt {id}", + "audit_meta_changed": "{old} til {new}", + "audit_meta_email_requested": "Ba om endring til {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} konto fjernet)", + "countPlural=other": "{name} ({count} kontoer fjernet)" + } + } + ], + "audit_meta_scheduled_deletion": "Planlagt for sletting", + "audit_meta_kept": "Beholdt for reaktivering", + + "common_view": "Vis", + "common_save": "Lagre", + "common_saving": "Lagrer...", + "common_back": "Tilbake", + "common_shared_by": "Delt av", + "common_user_avatar": "Profilbilde", + "common_toast_saved": "Endringene er lagret", + "pause_reason_shocker": "Satt på pause på shockernivå", + "pause_reason_shocker_user_share": "Satt på pause på shocker- og brukerdelingsnivå", + "pause_reason_shocker_public_share": "Satt på pause på shocker- og offentlig delingsnivå", + "pause_reason_user_share": "Satt på pause på brukerdelingsnivå", + "pause_reason_public_share": "Satt på pause på offentlig delingsnivå", + "public_shares_subtitle": "En lenke alle kan bruke, uten konto.", + "public_shares_new": "Ny deling", + "public_share_never_expires": "Utløper aldri", + "public_shares_empty_title": "Ingen offentlige delinger ennå", + "public_shares_empty_desc": "Lag en lenke som alle kan bruke til å styre shockerne dine.", + "public_share_expired": "Utløpt", + "public_share_no_expiry": "Ingen utløp", + "public_share_label": "Offentlig deling", + "public_share_toast_created": "Ny offentlig deling opprettet", + "public_share_create_title": "Opprett offentlig deling", + "public_share_toast_deleted": "Offentlig deling slettet", + "public_share_delete_title": "Slett offentlig deling", + "public_share_delete_desc": "Er du sikker på at du vil slette den offentlige delingen {#strong}{name}{/strong}?", + "public_share_edit_title": "Offentlig deling: {name}", + "public_share_edit_subtitle": "Redigering: endringene trer i kraft når du lagrer.", + "public_share_add_shocker": "Legg til shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "La til {count} shocker i delingen", + "countPlural=other": "La til {count} shockere i delingen" + } + } + ], + "public_share_empty_shockers_title": "Ingen shockere i denne delingen", + "public_share_empty_shockers_desc": "Legg til en shocker, så kan alle med lenken styre den.", + "public_share_load_failed": "Feil ved henting av delingsdetaljer", + "public_share_paused_here": "Satt på pause for denne delingen", + "public_share_resume_shocker": "Gjenoppta shocker", + "public_share_pause_shocker": "Sett shocker på pause", + "public_share_remove": "Fjern fra deling", + "public_share_toast_removed": "Shockeren er fjernet fra delingen", + "public_share_add_title": "Legg til shockere", + "public_share_add_desc": "Legg til shockere i denne offentlige delingen. Du kan angi grensene når de er lagt til.", + "public_share_add_placeholder": "Velg shockere å dele...", + "public_share_add_no_match": "Ingen samsvarende shockere", + "public_share_add_submit": "Legg til shockere", + "public_share_view_loading": "Laster inn delingsdetaljer...", + "public_share_view_title": "Offentlig delingslenke", + "public_share_view_desc": "Gå inn som gjest eller logg inn med OpenShock-kontoen din", + "public_share_view_guest_name": "Gjestenavn", + "public_share_view_enter": "Gå inn", + "public_share_view_enter_guest": "Gå inn som gjest", + "public_share_login": "Logg inn", + "perm_shock_on": "Støt aktivert", + "perm_shock_off": "Støt deaktivert", + "perm_vibrate_on": "Vibrasjon aktivert", + "perm_vibrate_off": "Vibrasjon deaktivert", + "perm_sound_on": "Lyd aktivert", + "perm_sound_off": "Lyd deaktivert", + "perm_live_on": "Live aktivert", + "perm_live_off": "Live deaktivert", + "perm_live_control": "Livestyring", + "user_selector_avatar_of": "Profilbildet til {name}", + "user_selector_placeholder": "Skriv inn brukernavn", + "user_selector_aria": "Brukernavn å søke etter", + "user_selector_search": "Søk etter bruker", + "user_selector_found": "Bruker funnet", + + "common_remove": "Fjern", + "user_shares_subtitle": "Direkte, permanente delinger med andre brukere.", + "user_shares_toast_invited": "Sendte en shocker-invitasjon til {name}", + "user_shares_redeem": "Løs inn kode", + "user_shares_new": "Ny deling", + "user_shares_tab_shares": "Delinger", + "user_shares_tab_incoming": "Delt med meg", + "user_shares_tab_invites": "Invitasjoner", + "share_code_create_title": "Ny delingskode", + "share_code_create_desc": "Lag en delingskode eller invitasjon", + "share_code_shocker_placeholder": "Velg shockere å dele...", + "share_code_no_match": "Ingen samsvarende shockere", + "share_code_send_invite": "Send invitasjon", + "share_code_create": "Lag delingskode", + "share_code_created_title": "Delingskode generert", + "share_code_created_desc": "Kopier delingskoden eller lenken!", + "share_code_redeem_title": "Løs inn delingskode", + "share_code_redeem_desc": "Skriv inn delingskoden du vil løse inn", + "share_code_redeem_placeholder": "Skriv inn delingskode", + "share_code_redeemed": "Løst inn!", + "share_code_shared_shockers": "Delte shockere", + "share_code_redeeming": "Løser inn...", + "share_code_redeem": "Løs inn", + "incoming_shares_empty_title": "Ingenting er delt med deg", + "incoming_shares_empty_desc": "Ingen har delt en shocker med deg ennå.", + "incoming_share_toast_removed": "Fjernet delingen fra {name}", + "incoming_share_remove_title": "Fjern deling", + "incoming_share_remove_desc": "Er du sikker på at du vil fjerne delingen fra {#strong}{name}{/strong}?", + "incoming_share_toast_removed_shocker": "Fjernet {shocker} delt av {name}", + "incoming_share_remove_shocker_title": "Fjerne denne delte shockeren?", + "incoming_share_remove_shocker_desc": "Er du sikker på at du vil fjerne den delte shockeren {#strong}{shocker}{/strong} fra {#strong}{name}{/strong}?", + "incoming_share_manage_from": "Administrer delinger fra", + "share_remove": "Fjern deling", + "invites_empty_title": "Ingen invitasjoner ennå", + "invites_empty_desc": "Du har ingen innkommende eller utgående invitasjoner.", + "invites_outgoing": "Utgående", + "invites_outgoing_empty_title": "Ingen utgående invitasjoner", + "invites_outgoing_empty_desc": "Du har ingen utgående invitasjoner.", + "invites_incoming": "Innkommende", + "invites_incoming_empty_title": "Ingen innkommende invitasjoner", + "invites_incoming_empty_desc": "Du har ingen innkommende invitasjoner.", + "invite_toast_accepted": "Godtok invitasjonen fra {name}", + "invite_toast_declined": "Avslo invitasjonen fra {name}", + "invite_deny_title": "Avslå invitasjon", + "invite_deny_label": "Avslå invitasjon", + "invite_deny": "Avslå", + "invite_deny_desc": "Er du sikker på at du vil avslå invitasjonen fra {#strong}{name}{/strong}?", + "invite_accept": "Godta invitasjon", + "invite_toast_cancelled_for": "Trakk tilbake invitasjonen til {name} ({id})", + "invite_toast_cancelled": "Trakk tilbake invitasjon {id}", + "invite_cancel_title": "Trekk tilbake invitasjon", + "invite_cancel": "Trekk tilbake", + "invite_cancel_for_desc": "Er du sikker på at du vil trekke tilbake invitasjonen til {#strong}{name}{/strong}?", + "invite_cancel_code_desc": "Er du sikker på at du vil trekke tilbake invitasjonen med koden {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Trekk tilbake ventende invitasjon", + "outgoing_shares_empty_title": "Ingen delte shockere", + "outgoing_shares_empty_desc": "Du har ikke delt noen shockere med andre brukere ennå.", + "outgoing_share_toast_removed": "Fjernet den delte shockeren {name}", + "outgoing_share_remove_title": "Slutte å dele denne shockeren?", + "outgoing_share_editing_for": "Redigerer delinger for", + "outgoing_share_limits": "Grenser og tillatelser", + "outgoing_share_same": "Samme begrensninger på alle shockere", + "outgoing_share_per_desc": "Juster begrensninger per shocker", + "outgoing_share_all": "Alle", + "outgoing_share_per": "Per shocker", + + "outgoing_share_remove_desc": "Er du sikker på at du vil slutte å dele {#strong}{shocker}{/strong} med {#strong}{name}{/strong}?", + + "report_breadcrumb": "Rapporter API-tokens", + "report_toast_clipboard_failed": "Kunne ikke lese utklippstavlen: {error}", + "report_title": "Rapporter lekkede API-tokens", + "report_paste": "Lim inn fra utklippstavlen", + "report_warning": "Dette skjemaet er bare for å rapportere API-tokens som er lekket ved et uhell.", + "report_abuse_warning": "Bevisst misbruk fører til utestengelse eller strenge begrensninger.", + "report_detected": "Oppdagede tokens", + "report_invalid": "Ett eller flere tokens ser ut til å være ugyldige. Sjekk formateringen.", + "report_acknowledge": "Jeg bekrefter at jeg forstår hva denne funksjonen er til, og tar ansvar.", + "report_submit": "Send rapport", + "turnstile_disabled": "Turnstile er deaktivert", + "common_internal_error": "Intern feil", + "resend_toast_sent": "Aktiveringse-post sendt. Sjekk innboksen og søppelpostmappen.", + "resend_toast_throttled": "Det er bedt om for mange aktiveringse-poster. Prøv igjen senere.", + "resend_toast_unavailable": "Ingen aktiveringse-post kan sendes på nytt fra denne nettleseren. Hvis kontoen ikke er aktivert ennå, sender innlogging en ny lenke.", + "resend_button": "Fikk du ikke e-posten? Send på nytt", + "expiration_label": "Utløp", + "expiration_never": "Aldri", + "expiration_custom": "Egendefinert", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} dag", "countPlural=other": "{count} dager" } + } + ], + "expiration_required": "Utløpsdato er påkrevd", + "expiration_never_desc": "Dette utløper aldri", + "expiration_expires_at": "Utløper {time} ({date})", + "date_picker_placeholder": "Velg en dato", + "telemetry_toast_title": "Vil du hjelpe med å forbedre OpenShock?", + "telemetry_toast_desc": "Send diagnostikk for å hjelpe oss med å fikse krasj og trege API-kall. Rapportene inneholder feilmeldingen, stakksporingen og IP-adressen din. Du kan endre dette når som helst i kontoinnstillingene.", + "telemetry_toast_no": "Nei takk", + "telemetry_toast_errors": "Bare feil", + "telemetry_toast_full": "Full", + "table_show_details": "Vis detaljer", + "table_hide_details": "Skjul detaljer", + "table_no_results": "Ingen resultater.", + "table_sort_asc": "Sorter etter {name}, stigende", + "table_sort_desc": "Sorter etter {name}, synkende", + "table_sort_none": "Sorter etter {name}, usortert", + "cell_na": "I/T", + "cell_not_applicable": "Ikke aktuelt", + "cell_invalid": "Ugyldig", + "cell_unavailable": "Utilgjengelig", + "cell_none": "Ingen", + "oauth_login_with": "Logg inn med {provider}", + "oauth_signup_with": "Registrer deg med {provider}", + "signalr_connect_failed": "Kunne ikke koble til serveren!", + "signalr_disconnect_failed": "Det oppsto en feil under frakobling fra serveren!", + "signalr_invalid_update": "Mottok en ugyldig oppdatering fra serveren!", + "signalr_invalid_log": "Mottok ugyldige loggdata fra serveren!", + "signalr_invalid_ota": "Mottok ugyldige data om fastvareoppdatering fra serveren!", + "ota_toast_failed": "Fastvareoppdateringen av huben mislyktes: {message}", + "ota_toast_succeeded": "Fastvareoppdateringen av huben er fullført!", + "ota_toast_rolled_back": "Hubens fastvare gikk tilbake til forrige versjon", + "lcg_connect_failed": "Kunne ikke koble til live-kontroll-gatewayen", + "terminal_toast_bootloader_failed": "Kunne ikke gå inn i oppstartslasteren: {error}", + "terminal_toast_app_mode_failed": "Kunne ikke gå inn i applikasjonsmodus: {error}", + + "problem_account_account_not_activated_title": "Kontoen er ikke aktivert", + "problem_account_account_not_activated_desc": "Se etter aktiveringse-posten i innboksen din.", + "problem_account_activation_not_found_title": "Aktiveringslenken er ugyldig", + "problem_account_activation_not_found_desc": "Lenken kan ha utløpt eller allerede blitt brukt.", + "problem_account_activation_resend_too_many_title": "For mange aktiveringse-poster er forespurt", + "problem_account_activation_resend_too_many_desc": "Vent en stund før du prøver igjen.", + "problem_account_activation_resend_unavailable_title": "Kan ikke sende aktiveringse-posten på nytt", + "problem_account_activation_resend_unavailable_desc": "Logg inn på nytt for å be om en ny aktiveringslenke.", + "problem_account_deactivate_already_deactivated_title": "Kontoen er allerede deaktivert", + "problem_account_deactivate_denied_privileged_title": "Privilegerte kontoer kan ikke deaktiveres", + "problem_account_deactivate_unauthorized_title": "Du har ikke lov til å gjøre dette", + "problem_account_deactivated_title": "Denne kontoen er deaktivert", + "problem_account_email_already_in_use_title": "Den e-postadressen er allerede i bruk", + "problem_account_email_invalid_title": "Den e-postadressen er ugyldig", + "problem_account_email_taken_title": "Den e-postadressen er allerede i bruk", + "problem_account_email_too_many_requests_title": "For mange forespørsler om endring av e-post", + "problem_account_email_too_many_requests_desc": "Vent en stund før du prøver igjen.", + "problem_account_email_unchanged_title": "Det er allerede e-postadressen din", + "problem_account_email_verify_not_found_title": "Bekreftelseslenken er ugyldig", + "problem_account_email_verify_not_found_desc": "Lenken kan ha utløpt eller allerede blitt brukt.", + "problem_account_o_auth_only_title": "Denne kontoen har ikke noe passord", + "problem_account_o_auth_only_desc": "Logg inn med leverandøren du registrerte deg med.", + "problem_account_password_not_set_title": "Ingen passord er satt", + "problem_account_password_not_set_desc": "Denne kontoen logger inn via en ekstern leverandør.", + "problem_account_password_old_password_invalid_title": "Det nåværende passordet er feil", + "problem_account_username_invalid_title": "Det brukernavnet er ikke tillatt", + "problem_account_username_recently_changed_title": "Brukernavnet ble endret for nylig", + "problem_account_username_recently_changed_desc": "Du kan endre brukernavnet én gang hver 7. dag.", + "problem_account_username_taken_title": "Det brukernavnet er allerede tatt", + "problem_admin_user_deactivated_title": "Denne brukeren er deaktivert", + "problem_admin_user_not_activated_title": "Denne brukeren er ikke aktivert ennå", + "problem_api_token_can_only_delete_self_title": "Et API-token kan bare slette seg selv", + "problem_api_token_not_found_title": "Fant ikke API-tokenet", + "problem_api_token_paused_title": "Dette API-tokenet er satt på pause", + "problem_assign_lcg_bad_schema_version_title": "Hub-protokollversjonen støttes ikke", + "problem_assign_lcg_bad_schema_version_desc": "Oppdater hub-fastvaren for å koble til.", + "problem_assign_lcg_no_lcg_available_title": "Ingen gateway tilgjengelig", + "problem_assign_lcg_no_lcg_available_desc": "Ingen live control-gateway er tilgjengelig akkurat nå. Prøv igjen senere.", + "problem_authentication_account_deactivated_title": "Denne kontoen er deaktivert", + "problem_authentication_account_not_activated_title": "Denne kontoen er ikke aktivert", + "problem_authentication_cookie_missing_or_invalid_title": "Du er ikke logget inn", + "problem_authentication_cookie_missing_or_invalid_desc": "Økten din kan ha utløpt. Logg inn på nytt.", + "problem_authentication_header_missing_or_invalid_title": "Ugyldig API-token", + "problem_authentication_session_invalid_title": "Økten er utløpt", + "problem_authentication_session_invalid_desc": "Logg inn på nytt.", + "problem_authentication_token_invalid_title": "Ugyldig API-token", + "problem_authentication_unknown_error_title": "Autentisering mislyktes", + "problem_authorization_policy_not_met_title": "Du har ikke tillatelse til å gjøre dette", + "problem_authorization_token_only_title": "Denne handlingen krever et API-token", + "problem_authorization_token_permission_missing_title": "Dette API-tokenet mangler en påkrevd tillatelse", + "problem_authorization_unknown_error_title": "Autorisering mislyktes", + "problem_authorization_user_session_only_title": "Denne handlingen krever en innlogget økt", + "problem_automation_token_not_allowed_for_account_title": "Automatiseringstokens kan ikke brukes med privilegerte kontoer", + "problem_configuration_already_exists_title": "Det finnes allerede en konfigurasjonsoppføring med det navnet", + "problem_configuration_invalid_name_format_title": "Ugyldig konfigurasjonsnavn", + "problem_configuration_invalid_name_format_desc": "Bare A til Z og understreker er tillatt.", + "problem_configuration_invalid_value_format_title": "Verdien samsvarer ikke med konfigurasjonstypen", + "problem_configuration_not_found_title": "Fant ikke konfigurasjonsoppføringen", + "problem_control_stats_invalid_range_title": "Fra-datoen kan ikke være etter til-datoen", + "problem_control_stats_invalid_time_zone_title": "Ukjent tidssone", + "problem_control_stats_missing_capability_title": "Kontrollstatistikk er ikke tilgjengelig på denne serveren", + "problem_device_not_found_title": "Fant ikke huben", + "problem_device_not_online_title": "Huben er frakoblet", + "problem_device_too_many_hubs_title": "Du har nådd maksimalt antall huber", + "problem_device_too_many_shockers_title": "Denne huben har nådd maksimalt antall shockere", + "problem_endpoint_retired_title": "Denne funksjonen er ikke lenger tilgjengelig", + "problem_expression_error_title": "Ugyldig filteruttrykk", + "problem_internal_server_error_title": "Noe gikk galt hos oss", + "problem_login_invalid_credentials_title": "Ugyldig brukernavn eller passord", + "problem_login_invalid_domain_title": "Innlogging fra denne adressen er ikke tillatt", + "problem_o_auth_connection_already_exists_title": "Kontoen din er allerede koblet til denne leverandøren", + "problem_o_auth_connection_already_linked_title": "Denne eksterne kontoen er allerede koblet til en annen bruker", + "problem_o_auth_flow_anonymous_only_title": "Du er allerede logget inn", + "problem_o_auth_flow_mismatch_title": "Innloggingsforsøket stemmer ikke", + "problem_o_auth_flow_mismatch_desc": "Start på nytt.", + "problem_o_auth_flow_missing_data_title": "Leverandøren sendte ikke kontodetaljene dine", + "problem_o_auth_flow_missing_data_desc": "Prøv igjen.", + "problem_o_auth_flow_not_found_title": "Innloggingsforsøket er utløpt", + "problem_o_auth_flow_not_found_desc": "Start på nytt.", + "problem_o_auth_flow_unsupported_title": "Innloggingsflyten støttes ikke", + "problem_o_auth_internal_error_title": "Noe gikk galt under innloggingen", + "problem_o_auth_internal_error_desc": "Prøv igjen om litt.", + "problem_o_auth_link_authenticated_user_only_title": "Du må være logget inn for å koble til en ekstern konto", + "problem_o_auth_provider_mismatch_title": "Innloggingsforsøket stemmer ikke med leverandøren", + "problem_o_auth_provider_mismatch_desc": "Start på nytt.", + "problem_o_auth_provider_unsupported_title": "Denne innloggingsleverandøren støttes ikke", + "problem_pair_code_not_found_title": "Fant ikke paringskoden", + "problem_password_reset_not_found_title": "Lenken for tilbakestilling av passord er ugyldig", + "problem_password_reset_not_found_desc": "Lenken kan ha utløpt eller allerede blitt brukt.", + "problem_session_not_found_title": "Fant ikke økten", + "problem_share_get_no_shares_title": "Du har ingen delinger med denne brukeren", + "problem_share_request_create_cannot_share_with_self_title": "Du kan ikke dele med deg selv", + "problem_share_request_create_shocker_not_found_title": "Fant ikke én eller flere shockere", + "problem_share_request_create_shocker_not_found_desc": "De kan ha blitt fjernet eller tilhører ikke deg.", + "problem_share_request_not_found_title": "Fant ikke invitasjonen", + "problem_share_user_not_found_title": "Fant ikke delingen", + "problem_share_code_already_linked_title": "Shockeren er allerede koblet til kontoen din", + "problem_share_code_cant_link_own_share_code_title": "Du kan ikke løse inn din egen delingskode", + "problem_share_code_not_found_title": "Fant ikke delingskoden", + "problem_share_link_expiry_date_in_past_title": "Utløpsdatoen kan ikke være i fortiden", + "problem_share_link_not_found_title": "Fant ikke den offentlige delingen", + "problem_share_link_shocker_already_in_share_link_title": "Shockeren er allerede i denne offentlige delingen", + "problem_share_link_shocker_not_in_share_link_title": "Shockeren er ikke i denne offentlige delingen", + "problem_shocker_control_no_permission_title": "Du har ikke tillatelse til å styre denne shockeren", + "problem_shocker_control_not_found_title": "Fant ikke shockeren", + "problem_shocker_control_paused_title": "Shockeren er satt på pause", + "problem_shocker_not_found_title": "Fant ikke shockeren", + "problem_signup_registration_disabled_title": "Registrering er deaktivert for øyeblikket", + "problem_signup_username_or_email_exists_title": "Det brukernavnet eller den e-postadressen er allerede i bruk", + "problem_turnstile_invalid_title": "Verifiseringen mislyktes", + "problem_turnstile_invalid_desc": "Fullfør utfordringen på nytt og prøv igjen.", + "problem_user_not_found_title": "Fant ikke brukeren", + "problem_user_privileged_delete_denied_title": "Privilegerte brukere kan ikke slettes", + "problem_validation_error_title": "Noen felt er ugyldige", + "problem_webhook_not_found_title": "Fant ikke webhooken", + "problem_webhook_unsupported_title": "Bare Discord-webhooks støttes", + "problem_webhook_unsupported_desc": "Bruk en discord.com-URL, ikke canary eller ptb.", + + "error_too_many_requests": "For mange forespørsler", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Prøv igjen om {seconds} sekund.", + "secondsPlural=other": "Prøv igjen om {seconds} sekunder." + } + } + ], + "error_unexpected_response": "Uventet svar fra serveren", + "error_internal": "Det oppsto en intern feil", + "error_network": "Det oppsto en nettverksfeil", + + "dev_banner": "Dette er {#b}UTVIKLINGSMILJØET{/b} til OpenShock. {#u}Ingen data lagres{/u}, og det overskrives jevnlig med produksjonsdata.", + "firmware_channel_bugs_warning": "Denne kanalen kan inneholde feil." +} diff --git a/messages/nl.json b/messages/nl.json new file mode 100644 index 00000000..1e62d7db --- /dev/null +++ b/messages/nl.json @@ -0,0 +1,1129 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Het platform voor veilige, betrouwbare afstandsbediening van shockers met echt weinig vertraging.", + "landing_section_label": "Start", + "landing_hubs_online": "Hubs nu online: ", + "landing_learn_more": "Meer informatie", + "landing_wiki": "Wiki", + "landing_meta_description": "Welkom bij OpenShock, een gratis open-source-ecosysteem om verschillende shockers via internet te bedienen.", + "instance_meta_description": "Welkom bij {siteName}, een onafhankelijke instantie van OpenShock, een gratis open-source-ecosysteem om verschillende shockers via internet te bedienen.", + "header_sidebar_toggle": "Zijbalk tonen/verbergen", + "header_avatar_alt": "Avatar van {name}", + "header_menu_profile": "Profiel", + "header_menu_settings": "Instellingen", + "header_menu_logout": "Uitloggen", + "header_login": "Inloggen", + "header_signup": "Registreren", + "header_github_title": "OpenShock op GitHub", + "header_discord_title": "Community-Discord", + + "footer_made_with": "Gemaakt met {#heart/} door het {#team}OpenShock-team{/team}", + "footer_connection_status_label": "Status serververbinding", + "footer_signalr_state": "SignalR-status", + "footer_frontend_version": "Frontendversie", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backendversie", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Taal", + + "sidebar_home_link_label": "OpenShock-startpagina", + "sidebar_group_general": "Algemeen", + "sidebar_home": "Start", + "sidebar_shockers": "Shockers", + "sidebar_shared_shockers": "Gedeelde shockers", + "sidebar_hubs": "Hubs", + "sidebar_user_shares": "Gebruikersdelingen", + "sidebar_public_shares": "Openbare delingen", + "sidebar_serial_terminal": "Seriële terminal", + "sidebar_group_admin": "Beheer", + "sidebar_admin_monitoring": "Monitoring", + "sidebar_admin_online_hubs": "Online hubs", + "sidebar_admin_online_gateways": "Online gateways", + "sidebar_admin_management": "Beheer", + "sidebar_admin_users": "Gebruikers", + "sidebar_admin_blacklists": "Blokkeerlijsten", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "E-mail", + "sidebar_admin_automation_tokens": "Automatiseringstokens", + "sidebar_admin_configuration": "Configuratie", + "sidebar_group_settings": "Instellingen", + "sidebar_settings_api_tokens": "API-tokens", + "sidebar_settings_sessions": "Sessies", + "sidebar_settings_audit_log": "Activiteitenlog", + "sidebar_settings_connections": "Koppelingen", + "sidebar_settings_account": "Accountinstellingen", + + "error_meta_title": "Dienst niet beschikbaar", + "error_meta_description": "OpenShock is momenteel niet beschikbaar", + "error_meta_logo_alt": "OpenShock-logo", + "error_fallback_message": "Er is iets misgegaan.", + "error_not_found_message": "Pagina niet gevonden", + "error_not_found_description": "De pagina die je zoekt bestaat niet.", + "error_unexpected_description": "Er is een onverwachte fout opgetreden.", + "error_go_back": "Terug", + + "auth_layout_logo_alt": "OpenShock-logo", + "auth_layout_invalid_redirect_removed": "Een ongeldige doorverwijzings-URL is voor je veiligheid verwijderd.", + + "auth_activate_breadcrumb": "Account activeren", + "auth_activate_title": "Account activeren", + "auth_activate_activating": "Je account wordt geactiveerd...", + "auth_activate_success": "Je account is geactiveerd", + "auth_activate_failed": "Deze activatielink is ongeldig of verlopen", + "auth_activate_missing_token": "Activatietoken ontbreekt", + "auth_activate_continue": "Door naar inloggen", + "auth_activate_toast_success": "Account geactiveerd", + + "auth_forgot_breadcrumb": "Wachtwoord vergeten", + "auth_forgot_title": "Wachtwoord vergeten", + "auth_forgot_description": "Voer je e-mailadres in om je wachtwoord opnieuw in te stellen", + "auth_forgot_email_label": "E-mail", + "auth_forgot_email_placeholder": "E-mail", + "auth_forgot_submit": "Wachtwoord resetten", + "auth_forgot_signin_prompt": "Weet je je wachtwoord weer? {#signin}Inloggen{/signin}", + "auth_forgot_mail_disabled": "Wachtwoorden resetten is niet mogelijk op deze instantie, omdat er geen e-mailprovider is ingesteld. Neem contact op met je beheerder om weer toegang tot je account te krijgen.", + "auth_forgot_toast_sent": "Het verzoek om je wachtwoord te resetten is naar het opgegeven e-mailadres verzonden", + + "auth_login_breadcrumb": "Inloggen", + "auth_login_title": "Welkom terug", + "auth_login_loading_methods": "Beschikbare inlogmethoden laden", + "auth_login_choose_method": "Log in met een van deze methoden", + "auth_login_with_account": "Log in met je OpenShock-account", + "auth_login_activation_after_signup": "Je account is aangemaakt. We hebben een activatielink naar je e-mailadres gestuurd. Kijk in je inbox en spammap.", + "auth_login_activation_pending": "Je account is nog niet geactiveerd. We hebben een activatielink naar je e-mailadres gestuurd. Kijk in je inbox en spammap. Komt er niets aan, log dan later opnieuw in om een nieuwe link te krijgen.", + "auth_login_oauth_only": "Dit account heeft geen wachtwoord. Log in met de provider waarmee je je hebt geregistreerd.", + "auth_login_oauth_only_with_buttons": "Dit account heeft geen wachtwoord. Log via de knoppen hierboven in met de provider waarmee je je hebt geregistreerd.", + "auth_login_or_continue_with": "Of ga verder met", + "auth_login_username_label": "Gebruikersnaam of e-mail", + "auth_login_password_label": "Wachtwoord", + "auth_login_submit": "Inloggen", + "auth_login_signup_prompt": "Nog geen account? {#signup}Registreren{/signup}", + "auth_login_legal": "Door op Inloggen te klikken, ga je akkoord met onze {#tos}Servicevoorwaarden{/tos} en ons {#privacy}Privacybeleid{/privacy}.", + + "auth_oauth_create_breadcrumb": "Registreren met {provider}", + "auth_oauth_create_title": "Registreren met {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Vul je accountgegevens aan", + "auth_oauth_create_username_label": "Gebruikersnaam", + "auth_oauth_create_username_placeholder": "Gebruikersnaam", + "auth_oauth_create_email_label": "E-mail", + "auth_oauth_create_email_placeholder": "E-mail", + "auth_oauth_create_submit": "Registreren", + "auth_oauth_create_legal": "Door op Registreren te klikken, ga je akkoord met onze {#tos}Servicevoorwaarden{/tos} en ons {#privacy}Privacybeleid{/privacy}.", + + "auth_oauth_error_breadcrumb": "Authenticatiefout", + "auth_oauth_error_title": "Authenticatiefout", + "auth_oauth_error_back": "Terug naar inloggen", + + "auth_reset_breadcrumb": "Wachtwoord resetten", + "auth_reset_title": "Wachtwoord resetten", + "auth_reset_checking": "Resetlink controleren...", + "auth_reset_choose_password": "Kies een nieuw wachtwoord voor je account", + "auth_reset_invalid": "Deze resetlink is ongeldig of verlopen", + "auth_reset_password_label": "Nieuw wachtwoord", + "auth_reset_password_placeholder": "Nieuw wachtwoord", + "auth_reset_confirm_label": "Nieuw wachtwoord bevestigen", + "auth_reset_confirm_placeholder": "Nieuw wachtwoord bevestigen", + "auth_reset_submit": "Wachtwoord resetten", + "auth_reset_request_new": "Nieuwe resetlink aanvragen", + "auth_reset_toast_success": "Wachtwoord is gereset", + + "auth_signup_breadcrumb": "Registreren", + "auth_signup_toast_created_mail": "Account aangemaakt. Controleer je e-mail om je account te verifiëren.", + "auth_signup_toast_created_no_mail": "Account aangemaakt. Je kunt nu inloggen.", + "auth_signup_dialog_title": "Welkom! Bedankt voor je registratie! ❤️", + "auth_signup_dialog_created_mail": "Je account is aangemaakt. 🎉 Controleer je e-mail om je account te verifiëren.", + "auth_signup_dialog_verify_then_login": "Nadat je je e-mailadres hebt geverifieerd, kun je inloggen.", + "auth_signup_dialog_created_no_mail": "Je account is aangemaakt en klaar voor gebruik. 🎉", + "auth_signup_dialog_login_now": "Je kunt nu inloggen.", + "auth_signup_title": "Account aanmaken", + "auth_signup_loading_methods": "Beschikbare registratiemethoden laden", + "auth_signup_using_email": "Registreren met e-mail", + "auth_signup_choose_method": "Kies hoe je je wilt registreren", + "auth_signup_back": "Terug", + "auth_signup_username_label": "Gebruikersnaam", + "auth_signup_username_placeholder": "Jan OpenShock", + "auth_signup_email_label": "E-mail", + "auth_signup_email_placeholder": "jan@example.com", + "auth_signup_password_label": "Wachtwoord", + "auth_signup_password_placeholder": "Wachtwoord", + "auth_signup_confirm_label": "Wachtwoord bevestigen", + "auth_signup_confirm_placeholder": "Wachtwoord bevestigen", + "auth_signup_submit": "Account aanmaken", + "auth_signup_signin_prompt": "Heb je al een account? {#signin}Inloggen{/signin}", + "auth_signup_or": "Of", + "auth_signup_with_email": "Registreren met e-mail", + "auth_signup_legal": "Door op Account aanmaken te klikken, ga je akkoord met onze {#tos}Servicevoorwaarden{/tos} en ons {#privacy}Privacybeleid{/privacy}.", + + "auth_verify_breadcrumb": "E-mail verifiëren", + "auth_verify_title": "E-mail verifiëren", + "auth_verify_verifying": "Je e-mailadres wordt geverifieerd...", + "auth_verify_success": "Je e-mailadres is geverifieerd", + "auth_verify_failed": "Deze verificatielink is ongeldig of verlopen", + "auth_verify_missing_token": "Verificatietoken ontbreekt", + "auth_verify_continue": "Door naar inloggen", + "auth_verify_toast_success": "E-mailadres geverifieerd", + + "common_cancel": "Annuleren", + "common_delete": "Verwijderen", + "common_edit": "Bewerken", + "common_share": "Delen", + "common_copy_id": "ID kopiëren", + "common_id_copied": "ID naar klembord gekopieerd", + "common_open_menu": "Menu openen", + "common_refresh": "Vernieuwen", + "common_settings": "Instellingen", + "common_clear": "Wissen", + "common_online": "Online", + "common_offline": "Offline", + "common_paused": "Gepauzeerd", + "common_resume": "Hervatten", + "common_resuming": "Hervatten...", + "common_coming_soon": "(Binnenkort)", + "common_save_changes": "Wijzigingen opslaan", + "common_danger_zone": "Gevarenzone", + "common_name": "Naam", + "control_intensity": "Intensiteit", + "control_duration": "Duur", + "control_max_intensity": "Max. intensiteit", + "control_max_duration": "Max. duur", + "control_vibration": "Trilling", + "control_value": "Waarde", + "control_live_intensity": "Live-intensiteit", + "control_type_stop": "Stop", + "control_type_shock": "Schok", + "control_type_vibrate": "Trillen", + "control_type_sound": "Geluid", + "live_tooltip_active": "Live via {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Verbinden...", + "live_tooltip_connect": "Verbinden met Live Control", + "live_tooltip_hub_start": "Ctrl+klik om de hele hub te starten", + "live_tooltip_hub_stop": "Ctrl+klik om de hele hub te stoppen", + "pause_resume_shocker": "Shocker hervatten", + "pause_pause_shocker": "Shocker pauzeren", + "pause_resume_all": "Alle shockers hervatten", + "pause_pause_all": "Alle shockers pauzeren", + "shocker_label": "Shocker", + "shocker_hub": "Hub", + "shocker_select_hub": "Hub kiezen", + "shocker_rf_id": "RF-ID", + "shocker_rf_id_invalid": "De RF-ID moet een geheel getal tussen {min} en {max} zijn.", + "shocker_model": "Model", + "shocker_select_model": "Model kiezen", + "shocker_name_placeholder": "Naam shocker", + "shocker_menu_view_logs": "Logs bekijken", + "shocker_delete_title": "Shocker verwijderen", + "shocker_delete_desc": "Weet je zeker dat je \"{name}\" wilt verwijderen? Dit kan niet ongedaan worden gemaakt.", + "shocker_toast_deleted": "Shocker \"{name}\" verwijderd", + "shocker_toast_paused": "Shocker gepauzeerd", + "shocker_toast_resumed": "Shocker hervat", + "shocker_add_desc": "Registreer een nieuwe shocker bij een van je hubs.", + "shocker_add_name_placeholder": "Mijn shocker", + "shockers_title": "Shockers", + "shockers_subtitle": "Alle shockers die aan je hubs zijn gekoppeld.", + "shockers_loading": "Shockers laden...", + "shockers_toast_refreshed": "Shockers vernieuwd", + "shockers_toast_need_hub": "Je moet eerst een hub aanmaken voordat je shockers kunt toevoegen.", + "shockers_toast_added": "Shocker toegevoegd", + "shockers_unknown_module": "Onbekend moduletype", + "shockers_add": "Shocker toevoegen", + "shockers_view_mode": "Weergave", + "shockers_mode_classic": "Klassiek", + "shockers_mode_rich": "Uitgebreid", + "shockers_mode_simple": "Eenvoudig", + "shockers_mode_map": "Kaart", + "shockers_group_by_hub": "Groeperen op hub", + "shockers_global_limits": "Globale limieten", + "shockers_logs_label": "Logs", + "shockers_empty_title": "Nog geen shockers", + "shockers_empty_no_hubs": "Maak eerst een hub aan en voeg er dan shockers aan toe.", + "shockers_empty_has_hubs": "Voeg een shocker toe aan een van je hubs om te beginnen.", + "shockers_create_hub": "Hub aanmaken", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} shocker", + "countPlural=other": "{count} shockers" + } + } + ], + "shared_shockers_title": "Gedeelde shockers", + "shared_shockers_subtitle": "Shockers die andere gebruikers met je hebben gedeeld.", + "shared_shockers_empty_title": "Er zijn nog geen shockers met je gedeeld.", + "shared_shockers_empty_desc": "Als iemand shockers met je deelt, verschijnen ze hier.", + "shocker_logs_title": "Shockerlogs", + "shocker_logs_subtitle": "Alle besturingsopdrachten die naar je shockers zijn gestuurd.", + "shocker_logs_live_title": "Nieuwe logs verschijnen in realtime", + "shocker_logs_paused_title": "Live-updates pauzeren tijdens sorteren of op een andere pagina dan de eerste", + "shocker_logs_live": "Live", + "shocker_logs_col_time": "Tijd", + "shocker_logs_col_type": "Type", + "shocker_logs_col_by": "Door", + "shocker_logs_filter_label": "Filteren op shocker", + "shocker_logs_filter_placeholder": "Shockers zoeken...", + "shocker_logs_filter_all": "Alle shockers", + "shocker_logs_filter_none": "Geen overeenkomende shockers", + "shocker_edit_title": "Shocker bewerken", + "shocker_edit_subtitle": "Wijzig de gegevens van deze shocker of verwijder hem.", + "shocker_edit_back": "Terug naar shockers", + "shocker_edit_load_failed": "Kan shocker niet laden.", + "shocker_edit_loading": "Shocker laden...", + "shocker_edit_details_title": "Shockergegevens", + "shocker_edit_details_desc": "Werk de naam, RF-ID en het model van deze shocker bij.", + "shocker_edit_pause_state": "Pauzestatus", + "shocker_edit_is_paused": "Shocker is gepauzeerd", + "shocker_edit_is_active": "Shocker is actief", + "shocker_edit_toast_updated": "Shocker bijgewerkt", + "shocker_edit_delete_desc": "Verwijder deze shocker definitief. Dit kan niet ongedaan worden gemaakt.", + + "common_close": "Sluiten", + "common_continue": "Doorgaan", + "common_loading": "Laden...", + "common_previous": "Vorige", + "common_next": "Volgende", + "common_steps": "Stappen", + "common_step_label": "Stap {number}: {title}", + "common_copy": "Kopiëren", + "common_copied": "Gekopieerd", + "common_never": "Nooit", + "common_error": "Fout: {message}", + "terminal_title": "Seriële terminal", + "terminal_connecting": "Verbinden...", + "terminal_help_button": "Problemen? Hulp", + "terminal_back_to_modes": "Terug naar moduskeuze", + "terminal_mode_configure": "Apparaat configureren", + "terminal_mode_configure_desc": "Configureer wifi, authenticatie en meer. Met een interactieve seriële console.", + "terminal_mode_flash": "Firmware flashen", + "terminal_mode_flash_desc": "Installeer of update firmware op een verbonden apparaat.", + "terminal_mode_raw": "Seriële monitor", + "terminal_mode_raw_desc": "Alleen de console. Lees apparaatlogs en verstuur opdrachten.", + "terminal_step_channel": "Kanaal kiezen", + "terminal_step_board": "Board kiezen", + "terminal_go_to_step": "Ga naar stap {number}: {title}", + "terminal_erase": "Wissen voor flashen", + "terminal_erase_desc": "Wist alle gegevens op het apparaat, inclusief bestaande configuraties", + "terminal_unsupported": "Je browser ondersteunt deze functie niet.", + "terminal_update_browser": "Update je browser naar de nieuwste versie.", + "terminal_use_browsers": "Gebruik een van de volgende browsers:", + "terminal_connect_failed_bootloader": "Kan bootloadermodus niet starten", + "terminal_connect_failed": "Verbinding met apparaat mislukt", + "terminal_connect_failed_desc": "We konden geen seriële verbinding met het apparaat maken.", + "terminal_quick_tries": "Snel te proberen:", + "terminal_try_replug": "Koppel het apparaat los en sluit het opnieuw aan.", + "terminal_try_cable": "Probeer een andere USB-kabel of poort.", + "terminal_try_driver": "Zorg dat de seriële driver is geïnstalleerd.", + "terminal_open_troubleshooter": "Probleemoplosser openen", + "terminal_log_reset_no_device": "Fout aan hostzijde bij reset: geen apparaat!", + "terminal_log_reset_error": "Fout aan hostzijde bij reset: {error}", + "terminal_log_send_no_device": "Kan niet verzenden: geen apparaat!", + "terminal_log_send_error": "Kan niet verzenden: {error}", + "terminal_log_firmware_disconnected": "Firmware losgekoppeld: {error}", + "terminal_log_erase_failed": "Flash wissen mislukt: {error}", + "terminal_log_hard_reset_failed": "Hard reset mislukt: {error}", + "terminal_log_flash_complete": "Flashen voltooid", + "terminal_log_flash_failed": "Flashen mislukt: {error}", + "terminal_log_command_failed": "Kan opdracht niet versturen: {error}", + "terminal_help_title": "Probleemoplosser", + "terminal_help_desc": "Doorloop deze stappen op volgorde. Elke stap sluit een veelvoorkomende oorzaak uit.", + "terminal_help_step_cable": "USB-kabel", + "terminal_help_step_port": "USB-poort", + "terminal_help_step_driver": "Driver installeren", + "terminal_help_step_manual": "Driver handmatig updaten", + "terminal_help_step_discord": "Vragen op Discord", + "terminal_help_cable_body": "Veel USB-C- en micro-USB-kabels kunnen alleen opladen en geen data overdragen. Gebruik een datakabel waarvan je weet dat die werkt (een kabel waarmee je al bestanden hebt overgezet of andere apparaten hebt verbonden) en sluit de hub opnieuw aan.", + "terminal_help_port_body": "Sluit het apparaat rechtstreeks aan op een USB-poort van je computer. Vermijd indien mogelijk USB-hubs, dockingstations en poorten aan de voorkant; die veroorzaken vaak stroom- en signaalproblemen. Gebruik je een desktop, probeer dan een poort aan de achterkant.", + "terminal_help_driver_download": "Download de CP210x-driver:", + "terminal_help_driver_extract": "Pak het zipbestand uit in een map op je computer.", + "terminal_help_driver_run": "Open de map en voer {#code}{installer}{/code} uit. Volg de instructies om te installeren.", + "terminal_help_driver_reconnect": "Sluit het apparaat opnieuw aan.", + "terminal_help_manual_intro": "Als de driver is geïnstalleerd maar het apparaat nog steeds niet verschijnt:", + "terminal_help_manual_open": "Open Apparaatbeheer (druk op {#key}Win{/key} + {#key}X{/key} en kies {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Zoek onder {#code}Ports (COM & LPT){/code} naar een item zoals:", + "terminal_help_manual_missing": "Ontbreekt het, dan herkent Windows het apparaat helemaal niet; bekijk de stappen voor kabel en poort opnieuw.", + "terminal_help_manual_update": "Klik met rechts op het apparaat en kies {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Kies {#code}Browse my computer for drivers{/code} en selecteer de map waarin je de driver-zip hebt uitgepakt. Zorg dat {#code}Include subfolders{/code} is aangevinkt.", + "terminal_help_manual_success": "Als het gelukt is, staat er nu {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Kom je er na dit alles nog steeds niet uit? Kom naar onze Discord-server en vraag het in het kanaal {#code}{channel}{/code}. Vermeld daarbij:", + "terminal_help_discord_os": "je besturingssysteem en browser", + "terminal_help_discord_device": "het apparaat dat je gebruikt (boardmodel, waar je het vandaan hebt)", + "terminal_help_discord_tried": "wat je van de vorige stappen al hebt geprobeerd", + "terminal_help_discord_errors": "eventuele foutmeldingen of relevante terminaluitvoer", + "terminal_help_discord_join": "Word lid van onze Discord-server", + "terminal_risk_title": "⚠️ INSTABIELE FIRMWARE", + "terminal_risk_intro": "Je staat op het punt {#strong}experimentele firmware{/strong} te flashen die {#strong}bekend instabiel{/strong} is.", + "terminal_risk_brick": "Dit kan je apparaat permanent onbruikbaar maken of handmatig herstel vereisen.", + "terminal_risk_no_support": "We bieden GEEN ondersteuning bij problemen die door deze firmware ontstaan.", + "terminal_risk_acknowledge": "Ik begrijp dat dit volledig mijn eigen verantwoordelijkheid is", + "terminal_risk_abort": "Afbreken", + "terminal_risk_accept": "IK AANVAARD VOLLEDIGE VERANTWOORDELIJKHEID", + "firmware_channel_recommended": "Dit is het aanbevolen kanaal.", + "firmware_channel_danger": "GEBRUIK DIT ALLEEN ALS JE WEET WAT JE DOET", + "firmware_channel_stable": "Stabiel", + "firmware_channel_beta": "Bèta", + "firmware_channel_develop": "Ontwikkeling", + "terminal_board_select": "Kies een board...", + "terminal_board_search": "Boards zoeken...", + "terminal_board_none": "Geen board gevonden.", + "terminal_flash_button": "Flashen", + "terminal_flash_progress": "Voortgang: {status}", + "terminal_flash_idle": "Gereed", + "terminal_flash_no_device": "Geen apparaat geselecteerd.", + "terminal_flash_resetting": "Resetten...", + "terminal_flash_downloading": "Firmware downloaden...", + "terminal_flash_download_failed": "Firmware downloaden mislukt.", + "terminal_flash_flashing": "Firmware flashen...", + "terminal_flash_rebooting": "Apparaat herstarten... (Haal de stroom er handmatig af en weer op als het blijft hangen)", + "terminal_flash_done": "Apparaat herstart! Flashen voltooid.", + "terminal_port_select": "Apparaat kiezen", + "terminal_port_disconnect": "Apparaat loskoppelen", + "terminal_port_connected": "Apparaat verbonden: {#strong}{id}{/strong}", + "terminal_console": "Console", + "terminal_connected_device": "Verbonden apparaat", + "terminal_resize": "Grootte terminalpaneel wijzigen", + "terminal_reboot": "Herstarten", + "terminal_disconnect": "Loskoppelen", + "terminal_fullscreen_exit_esc": "Volledig scherm sluiten (Esc)", + "terminal_fullscreen_exit": "Volledig scherm sluiten", + "terminal_fullscreen_fill": "Venster vullen", + "terminal_command_label": "Seriële opdracht", + "terminal_command_placeholder": "Typ een opdracht...", + "terminal_command_send": "Opdracht versturen", + "terminal_colors": "Kleuren", + "terminal_colors_menu": "Kleuren...", + "terminal_colors_label": "Consolekleuren", + "terminal_colors_close": "Kleuren sluiten", + "terminal_color_input": "Kleur voor {name}", + "terminal_colors_reset": "Standaard herstellen", + "terminal_color_bg": "Achtergrond", + "terminal_color_fg": "Tekst", + "terminal_color_ts": "Tijdstempel", + "terminal_color_error": "Fout", + "terminal_color_warning": "Waarschuwing", + "terminal_color_info": "Info", + "terminal_color_debug": "Debug", + "terminal_color_verbose": "Uitgebreid", + "terminal_options": "Opties", + "terminal_options_label": "Console-opties", + "terminal_hide_system": "Systeemberichten verbergen", + "terminal_stick_bottom": "Onderaan blijven", + "terminal_raw_output": "Ruwe uitvoer", + "terminal_timestamps": "Tijdstempels", + "terminal_timestamp_uptime": "Uptime", + "terminal_timestamp_local": "Lokaal", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Uit", + "terminal_copy_settings": "Instellingen kopiëren", + "terminal_import_settings": "Instellingen importeren", + "terminal_copy_selection": "Selectie kopiëren", + "terminal_copy_all": "Alle uitvoer kopiëren", + "terminal_toast_selection_copied": "Selectie gekopieerd", + "terminal_toast_output_copied": "Console-uitvoer gekopieerd", + "terminal_toast_settings_copied": "Console-instellingen gekopieerd", + "terminal_toast_clipboard_unreadable": "Kan het klembord niet lezen", + "terminal_toast_settings_imported": "Console-instellingen geïmporteerd", + "terminal_toast_settings_invalid": "Het klembord bevat geen console-instellingen", + + "common_try_again": "Opnieuw proberen", + "terminal_cfg_intro": "Waarden worden via UART naar het apparaat gestuurd. Het antwoord van het apparaat zie je in de console hieronder. Opdrachten zonder argument lezen de waarde uit; gebruik de {#eye/}-knop naast elk veld om de huidige waarde te lezen.", + "terminal_cfg_rf_title": "RF-zender", + "terminal_cfg_rf_desc": "Regelt de RF-uitvoer naar de shockers.", + "terminal_cfg_tx_pin": "TX-GPIO-pin", + "terminal_cfg_example": "bijv. {value}", + "terminal_cfg_read_value": "Huidige waarde lezen", + "terminal_cfg_set": "Instellen", + "terminal_cfg_read": "Lezen", + "terminal_cfg_reading": "Lezen…", + "terminal_cfg_apply": "Toepassen", + "terminal_cfg_keepalive": "Keepalive aan", + "terminal_cfg_keepalive_desc": "Pingt gekoppelde shockers regelmatig zodat ze wakker blijven.", + "terminal_cfg_estop_title": "Noodstop", + "terminal_cfg_estop_desc": "Hardwareknop die alle uitvoer stopt.", + "terminal_cfg_estop_enabled": "Noodstop aan", + "terminal_cfg_estop_pin": "Noodstop-GPIO-pin", + "terminal_cfg_estop_note": "Let op: {#code}{latching}{/code} en {#code}{active}{/code} hebben geen eigen opdrachten; stel ze in via de JSON-configuratie hieronder.", + "terminal_cfg_wifi_title": "Wifi", + "terminal_cfg_wifi_desc": "Netwerkgegevens en hostnaam van het apparaat.", + "terminal_cfg_hostname": "Hostnaam", + "terminal_cfg_networks": "Netwerken (JSON-array)", + "terminal_cfg_invalid_json_array": "Moet een geldige JSON-array zijn", + "terminal_cfg_ap_note": "AP-instellingen ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) hebben geen eigen opdrachten; gebruik de JSON-configuratie.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "OpenShock-server en authenticatie.", + "terminal_cfg_domain": "Domein", + "terminal_cfg_domain_restart": "Het instellen van het domein herstart het apparaat.", + "terminal_cfg_auth_token": "Auth-token", + "terminal_cfg_auth_token_placeholder": "Plak apparaattoken", + "terminal_cfg_hide": "Verbergen", + "terminal_cfg_show": "Tonen", + "terminal_cfg_serial_title": "Seriële invoer", + "terminal_cfg_echo": "Echo aan", + "terminal_cfg_echo_desc": "Getypte tekens terugtonen in de console.", + "terminal_cfg_advanced_title": "Geavanceerd: volledige configuratie", + "terminal_cfg_advanced_desc": "Voor velden zonder eigen opdrachten (captive portal, OTA, LAN, enz.) vervang je de hele configuratie.", + "terminal_cfg_json_config": "JSON-configuratie", + "terminal_cfg_invalid_json": "Moet geldige JSON zijn", + "terminal_cfg_read_json": "Huidige configuratie als JSON lezen", + "terminal_cfg_json_restart": "Het toepassen van een JSON-configuratie herstart het apparaat.", + "terminal_cfg_raw_config": "Ruwe FlatBuffer-configuratie (base64)", + "terminal_cfg_invalid_base64": "Moet een geldige base64-string zijn", + "terminal_cfg_read_raw": "Huidige configuratie als base64 lezen", + "terminal_cfg_factory_reset": "Fabrieksreset", + "terminal_cfg_factory_reset_desc": "Wist de volledige apparaatconfiguratie.", + "terminal_cfg_factory_reset_title": "Apparaat terugzetten naar fabrieksinstellingen?", + "terminal_cfg_factory_reset_action": "Configuratie wissen", + "terminal_cfg_factory_reset_confirm": "Hiermee wordt alle configuratie op het apparaat gewist: wifinetwerken, backendgegevens, pins en alle andere instellingen. Het apparaat wordt teruggezet naar de standaardwaarden.", + "terminal_cfg_read_failed_json_title": "Kon de JSON-configuratie niet lezen", + "terminal_cfg_read_failed_raw_title": "Kon de ruwe configuratie niet lezen", + "terminal_cfg_read_failed_desc": "Het apparaat reageerde niet na {attempts} pogingen.", + "terminal_cfg_common_causes": "Veelvoorkomende oorzaken:", + "terminal_cfg_cause_busy": "Het apparaat is bezig met een andere opdracht.", + "terminal_cfg_cause_disconnected": "Het apparaat is losgekoppeld of herstart.", + "terminal_cfg_cause_unsupported": "Deze firmwareversie ondersteunt deze opdracht niet.", + + "common_status": "Status", + "common_version": "Versie", + "common_created": "Aangemaakt", + "common_create": "Aanmaken", + "common_done": "Klaar", + "common_enable": "Inschakelen", + "common_disable": "Uitschakelen", + "common_are_you_sure": "Weet je het zeker?", + "common_generating": "Genereren...", + "hubs_title": "Hubs", + "hubs_subtitle": "Alle hubs die aan je account zijn gekoppeld.", + "hubs_add": "Hub toevoegen", + "hubs_load_failed": "Kan hubs niet laden.", + "hubs_empty_title": "Nog geen hubs", + "hubs_empty_desc": "Een hub is het apparaat dat opdrachten doorstuurt naar je shockers. Voeg er een toe om te beginnen.", + "hubs_create_title": "Hub aanmaken", + "hubs_name_label": "Hubnaam", + "hubs_name_placeholder": "Mijn hub", + "hub_toast_not_connected": "Niet verbonden met de server", + "hub_toast_try_later": "Probeer het zo opnieuw.", + "hub_reboot_title": "{name} herstarten?", + "hub_reboot_desc": "De hub verbreekt de verbinding en herstart. Gekoppelde shockers reageren pas weer als hij online is.", + "hub_reboot": "Herstarten", + "hub_hotspot_enable_title": "Wifi-hotspot op {name} inschakelen?", + "hub_hotspot_disable_title": "Wifi-hotspot op {name} uitschakelen?", + "hub_hotspot_enable_desc": "De hub zendt een eigen installatienetwerk uit. Hij blijft bereikbaar via je wifi, maar de hotspot is open voor iedereen binnen bereik totdat je hem uitzet.", + "hub_hotspot_disable_desc": "De installatiehotspot wordt uitgeschakeld. Als de hub nog niet op je wifi zit, heb je fysieke toegang nodig om hem opnieuw in te stellen.", + "hub_delete_desc": "Je staat op het punt hub {#strong}{name}{/strong} te verwijderen.", + "hub_delete_shockers": "Hiermee worden ook de volgende shockers verwijderd:", + "hub_edit_title": "Hub bewerken", + "hub_edit_apply": "Toepassen", + "hub_pair_title_generate": "Koppelcode genereren?", + "hub_pair_title_generated": "Koppelcode gegenereerd", + "hub_pair_title_paired": "Hub gekoppeld", + "hub_pair_consumed": "{#strong}{name}{/strong} heeft deze koppelcode gebruikt en is nu gekoppeld.", + "hub_pair_used": "De code is gebruikt en niet meer geldig.", + "hub_pair_generated_for": "Koppelcode gegenereerd voor {#strong}{name}{/strong}.", + "hub_copy_now": "De code hieronder is later niet meer op te vragen. Kopieer hem nu en werk je clients ermee bij.", + "hub_pair_generate_for": "Je staat op het punt een koppelcode te genereren voor {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Hij is 15 minuten geldig na het aanmaken.", + "hub_pair_one_active": "Er is maar één actieve koppelcode per hub; een nieuwe code vervangt de oudere.", + "hub_pair_complete": "Koppelen voltooid", + "hub_pair_code_label": "Koppelcode:", + "hub_pair_copied_close": "Code gekopieerd, sluiten", + "hub_pair_get": "Koppelcode ophalen", + "hub_token_generated": "Token gegenereerd", + "hub_token_generated_for": "Nieuw token gegenereerd voor {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Je staat op het punt het token voor {#strong}{name}{/strong} opnieuw te genereren.", + "hub_token_invalidate": "Hierdoor wordt het huidige token ongeldig en worden clients die het gebruiken losgekoppeld.", + "hub_token_confirm": "Weet je zeker dat je dit wilt doen?", + "hub_token_label": "Nieuw token:", + "hub_token_copied_close": "Token gekopieerd, sluiten", + "hub_token_regenerate": "Token vernieuwen", + "hub_menu_update": "Updaten", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "Wifi-hotspot inschakelen", + "hub_menu_hotspot_disable": "Wifi-hotspot uitschakelen", + "hub_menu_pair": "Koppelen", + "hub_menu_estop": "Noodstop", + "hub_update_breadcrumb": "Update", + "hub_update_unknown_hub": "Onbekende hub", + "hub_update_unknown_task": "Onbekende taak", + "hub_update_task_metadata": "Metadata ophalen", + "hub_update_task_preparing": "Update voorbereiden", + "hub_update_task_flash_fs": "Bestandssysteem flashen", + "hub_update_task_verify_fs": "Bestandssysteem controleren", + "hub_update_task_flash_app": "Applicatie flashen", + "hub_update_task_bootable": "Applicatie opstartbaar maken", + "hub_update_task_rebooting": "Opnieuw opstarten", + "hub_update_status_started": "Gestart", + "hub_update_status_running": "Bezig", + "hub_update_status_finished": "Voltooid", + "hub_update_status_error": "Fout", + "hub_update_status_timeout": "Time-out", + "hub_update_confirm_title": "Firmware-update bevestigen", + "hub_update_confirm_desc": "{#strong}{name}{/strong} bijwerken naar versie {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Deze versie komt mogelijk niet uit het stabiele kanaal en kan bugs bevatten.", + "hub_update_title": "{name} bijwerken", + "hub_update_subtitle": "Beheer firmware-updates voor deze hub.", + "hub_update_status_title": "Hubstatus", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Updaten", + "hub_update_success": "Update voltooid", + "hub_update_rolled_back": "Apparaat teruggezet naar vorige versie", + "hub_update_back": "Terug naar hubs", + "hub_update_flash_again": "Opnieuw flashen", + "hub_update_card_title": "Firmware-update", + "hub_update_card_desc": "Kies een firmwarekanaal en een versie om te installeren.", + "hub_update_to": "Bijwerken naar {version}", + "hub_update_must_be_online": "De hub moet online zijn om een update te starten.", + "hub_update_updating_to": "Bijwerken naar {version}...", + "hub_update_total": "Totaal", + "hub_update_task": "Taak", + "hub_update_history": "Updategeschiedenis", + "hub_update_no_history": "Geen updategeschiedenis gevonden voor deze hub.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Gestart", + "hub_update_col_message": "Bericht", + "hub_update_loading": "Hubgegevens laden...", + "hub_update_not_found": "Hub niet gevonden.", + "home_breadcrumb": "Start", + "home_welcome": "Welkom terug", + "home_welcome_name": "Welkom terug, {name}", + "home_subtitle": "Hier is een overzicht van je OpenShock-setup.", + "home_hubs_online": "{count} online", + "home_hub_status": "Hubstatus", + "home_no_hubs": "Geen hubs", + "home_all_online": "Alles online", + "home_all_offline": "Alles offline", + "home_some_online": "{online}/{total} online", + "home_quick_links": "Snelkoppelingen", + "home_my_shockers": "Mijn shockers", + "home_my_shockers_desc": "Bedien je shockers", + "home_hubs_desc": "Beheer je hubs", + "home_shared_desc": "Shockers gedeeld met jou", + "home_public_desc": "Deellinks beheren", + "home_get_started": "Aan de slag", + "home_get_started_desc": "Je hebt nog geen hubs. Maak een hub om je eerste apparaat te verbinden en voeg er daarna shockers aan toe.", + "home_set_up_hub": "Hub instellen", + "home_first_shocker": "Voeg je eerste shocker toe", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Je hebt {count} hub ingesteld. Voeg een shocker toe om die te bedienen.", + "countPlural=other": "Je hebt {count} hubs ingesteld. Voeg een shocker toe om die te bedienen." + } + } + ], + "home_go_to_shockers": "Naar shockers", + "profile_title": "Profiel", + "profile_coming_soon": "Profiel komt binnenkort", + "profile_coming_soon_desc": "Je openbare profiel is nog niet beschikbaar. Accountgegevens vind je onder Instellingen.", + + "common_retry": "Opnieuw", + "common_never_used": "Nooit gebruikt", + "common_expires": "Verloopt {time}", + "common_search_placeholder": "Zoeken...", + "common_unknown": "Onbekend", + "settings_breadcrumb_account": "Account", + "account_subtitle": "Je inloggegevens en accountacties.", + "account_change_username": "Gebruikersnaam wijzigen", + "account_change_email": "E-mail wijzigen", + "account_change_password": "Wachtwoord wijzigen", + "account_username_label": "Gebruikersnaam", + "account_email_label": "E-mail", + "account_password_label": "Wachtwoord", + "account_new_password_label": "Nieuw wachtwoord", + "account_confirm_password_label": "Nieuw wachtwoord bevestigen", + "account_oauth_only": "Niet beschikbaar voor accounts met alleen OAuth", + "account_oauth_no_password": "Dit account logt in via OAuth en heeft geen wachtwoord.", + "account_diagnostics": "Diagnostiek", + "account_diagnostics_desc": "Help ons crashes en trage API-aanroepen op te lossen. Rapporten bevatten de foutmelding, stacktrace en je IP. Standaard uit.", + "account_diagnostics_level": "Diagnostiekniveau", + "account_telemetry_off": "Uit", + "account_telemetry_off_desc": "Niets verzenden.", + "account_telemetry_errors": "Fouten", + "account_telemetry_errors_desc": "Alleen foutrapporten van de browser verzenden.", + "account_telemetry_full": "Volledig", + "account_telemetry_full_desc": "Foutrapporten plus traces van API-aanroepen (geen paginanavigatie).", + "account_toast_deactivated": "Account gedeactiveerd", + "account_deactivate_title": "Account deactiveren", + "account_deactivate_desc": "Weet je zeker dat je je account wilt deactiveren?", + "account_deactivate": "Account deactiveren", + "account_email_title": "E-mail wijzigen", + "account_email_desc": "Voer je nieuwe e-mailadres in en bevestig met je huidige wachtwoord.", + "account_email_toast_sent": "Verificatie-e-mail verzonden naar {email}. Klik op de link in die e-mail om de wijziging door te voeren.", + "account_new_email": "Nieuw e-mailadres", + "account_current_password": "Huidig wachtwoord", + "account_password_title": "Wachtwoord wijzigen", + "account_password_desc": "Voer je huidige wachtwoord in en kies een nieuw wachtwoord.", + "account_password_toast": "Wachtwoord is gewijzigd", + "account_username_title": "Gebruikersnaam wijzigen", + "account_username_desc": "Voer een nieuwe gebruikersnaam in.", + "account_new_username": "Nieuwe gebruikersnaam", + "account_username_toast": "Gebruikersnaam gewijzigd", + "tokens_subtitle": "API tokens worden gebruikt om je te authenticeren bij de OpenShock API.", + "tokens_generate": "Token maken", + "tokens_toast_refreshed": "Tokens vernieuwd", + "tokens_empty_title": "Geen API tokens", + "tokens_empty_desc": "Maak een token om je te authenticeren bij de OpenShock API.", + "tokens_created_on": "Gemaakt op {date}", + "tokens_last_used": "Laatst gebruikt {time}", + "tokens_never_expires": "Verloopt nooit", + "tokens_load_failed": "Kan API tokens niet laden.", + "token_toast_edited": "Token bewerkt", + "token_name_required": "Naam is verplicht", + "token_name_too_long": "Naam is te lang", + "token_edit_title": "API token bewerken", + "token_name_label": "Tokennaam", + "token_name_placeholder": "Tokennaam...", + "token_permissions": "Rechten", + "token_perm_category_shockers": "Shockers", + "token_perm_category_devices": "Hubs", + "token_perm_category_usershares": "Gebruikersdelingen", + "token_perm_category_publicshares": "Openbare delingen", + "token_perm_use": "Gebruiken", + "token_perm_edit": "Bewerken", + "token_perm_pause": "Pauzeren", + "token_perm_auth": "Authenticeren", + "token_shocker_control": "Shockerbediening", + "token_toast_paused": "Token gepauzeerd", + "token_toast_resumed": "Token hervat", + "token_delete_title": "API token verwijderen", + "token_delete_desc": "Weet je zeker dat je {#strong}{name}{/strong} wilt verwijderen?", + "token_delete_permanent": "Dit kan niet ongedaan worden gemaakt. Het token wordt permanent verwijderd.", + "token_toast_deleted": "Token verwijderd", + "token_resume": "Token hervatten", + "token_pause": "Token pauzeren", + "token_mode_clamp_desc": "Clamp: verzoeken buiten het toegestane bereik worden afgekapt op de dichtstbijzijnde grens (het minimum of maximum).", + "token_mode_lerp_desc": "Lerp: het volledige invoerbereik wordt lineair geschaald zodat het binnen je toegestane min-max-bereik valt.", + "token_paused_desc": "Een gepauzeerd token mag geen shockerbedieningsberichten verzenden.", + "token_intensity_range": "Intensiteitsbereik", + "token_duration_range": "Duurbereik", + "token_new_breadcrumb": "Nieuw", + "token_redirect_not_allowed": "De opgegeven redirect_uri is niet toegestaan. Alleen loopback-adressen of eigen applicatieschema's zijn toegestaan.", + "token_params_missing": "Verplichte GET-parameters ontbreken. Zorg dat name, redirect_uri en permissions zijn opgegeven.", + "token_invalid_permissions": "Ongeldige rechten opgegeven: {list}", + "token_toast_created": "Token gemaakt", + "token_request_title": "API token-aanvraag", + "token_access_granted": "Toegang verleend", + "token_shared_redirecting": "Het token is gemaakt en gedeeld met de applicatie. Je wordt teruggestuurd naar {#b}{uri}{/b}.", + "token_not_redirected": "Word je niet automatisch doorgestuurd, gebruik dan de knop hieronder.", + "token_finish": "Voltooien", + "token_generated_title": "API token gemaakt", + "token_copy_now": "Kopieer je API token nu, je kunt het later niet meer bekijken!", + "token_new_title": "Nieuw API token", + "token_external_desc": "Een externe applicatie vraagt toegang tot je account. Controleer en pas de rechten hieronder aan voordat je toegang geeft.", + "token_new_desc": "Stel een nieuw API token voor je account in en maak het aan.", + "token_external_requesting": "{#b}{name}{/b} vraagt een API token aan. Je token wordt gedeeld met de applicatie op {#b}{uri}{/b}.", + "token_allow": "Toestaan", + "token_generate": "Maken", + "token_deny": "Weigeren", + "sessions_subtitle": "Alle actieve sessies van je account. Trek sessies in die je niet herkent.", + "sessions_unknown_device": "Onbekend apparaat", + "sessions_toast_refreshed": "Sessies vernieuwd", + "sessions_load_failed": "Kan sessies niet laden.", + "sessions_empty_title": "Geen actieve sessies", + "sessions_empty_desc": "Sessies verschijnen hier zodra je inlogt via een browser of app.", + "sessions_last_seen": "Laatst gezien {time}", + "sessions_signed_in": "Ingelogd {time}", + "session_toast_revoked": "Sessie ingetrokken", + "session_revoke_title": "Sessie intrekken", + "session_revoke": "Intrekken", + "session_revoke_desc": "Weet je zeker dat je deze sessie wilt intrekken?", + "session_revoke_from": "Sessie ingelogd vanaf {#strong}{ip}{/strong} met {#strong}{agent}{/strong}", + "connections_title": "OAuth-koppelingen", + "connections_subtitle": "Koppel accounts van derden of ontkoppel ze om sneller in te loggen en je profiel gesynchroniseerd te houden.", + "connections_toast_linked": "Account gekoppeld.", + "connections_toast_cancelled": "Koppelen geannuleerd.", + "connections_toast_failed": "Koppelen mislukt.", + "connections_toast_removed": "Koppeling verwijderd", + "connections_refreshing": "Vernieuwen…", + "connections_link_new": "Nieuwe provider koppelen", + "connections_empty_title": "Nog geen koppelingen", + "connections_empty_desc": "Kies hierboven “Nieuwe provider koppelen” om beschikbare providers te verbinden.", + "connections_unlink": "Ontkoppelen", + "connections_load_failed": "Kan OAuth-koppelingen niet laden.", + "connections_unlink_title": "{name} ontkoppelen?", + "connections_unlink_title_generic": "Dit account ontkoppelen?", + "connections_unlink_desc": "Je kunt dan niet meer inloggen met deze provider, tenzij je hem opnieuw koppelt.", + "provider_starting": "{name} starten...", + "provider_link": "{name} koppelen", + "audit_subtitle": "Beveiligingsrelevante activiteit op je account. Controleer alles wat je niet herkent.", + "audit_col_time": "Tijd", + "audit_col_action": "Actie", + "audit_col_details": "Details", + "audit_col_reason": "Reden", + "audit_col_ip": "IP-adres", + "audit_col_device": "Apparaat", + "audit_action_login": "Ingelogd", + "audit_action_logout": "Uitgelogd", + "audit_action_password_changed": "Wachtwoord gewijzigd", + "audit_action_email_change_requested": "E-mailwijziging aangevraagd", + "audit_action_email_changed": "E-mail gewijzigd", + "audit_action_username_changed": "Gebruikersnaam gewijzigd", + "audit_action_api_token_created": "API token gemaakt", + "audit_action_api_token_deleted": "API token verwijderd", + "audit_action_oauth_connected": "Koppeling toegevoegd", + "audit_action_oauth_disconnected": "Koppeling verwijderd", + "audit_action_account_deactivated": "Account gedeactiveerd", + "audit_action_account_reactivated": "Account opnieuw geactiveerd", + "audit_action_account_deleted": "Account verwijderd", + "audit_action_automation_token_created": "Automatiseringstoken gemaakt", + "audit_action_automation_token_updated": "Automatiseringstoken bijgewerkt", + "audit_action_automation_token_rotated": "Automatiseringstoken vernieuwd", + "audit_action_automation_token_deleted": "Automatiseringstoken verwijderd", + "audit_action_automation_token_used": "Automatiseringstoken gebruikt", + "audit_meta_session": "Sessie {id}", + "audit_meta_changed": "{old} naar {new}", + "audit_meta_email_requested": "Wijziging naar {email} aangevraagd", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} account verwijderd)", + "countPlural=other": "{name} ({count} accounts verwijderd)" + } + } + ], + "audit_meta_scheduled_deletion": "Gepland voor verwijdering", + "audit_meta_kept": "Bewaard voor heractivering", + + "common_view": "Bekijken", + "common_save": "Opslaan", + "common_saving": "Opslaan...", + "common_back": "Terug", + "common_shared_by": "Gedeeld door", + "common_user_avatar": "Profielfoto", + "common_toast_saved": "Wijzigingen opgeslagen", + "pause_reason_shocker": "Gepauzeerd op shockerniveau", + "pause_reason_shocker_user_share": "Gepauzeerd op shocker- en gebruikersdeelniveau", + "pause_reason_shocker_public_share": "Gepauzeerd op shocker- en openbaar deelniveau", + "pause_reason_user_share": "Gepauzeerd op gebruikersdeelniveau", + "pause_reason_public_share": "Gepauzeerd op openbaar deelniveau", + "public_shares_subtitle": "Een link die iedereen kan gebruiken, geen account nodig.", + "public_shares_new": "Nieuwe deling", + "public_share_never_expires": "Verloopt nooit", + "public_shares_empty_title": "Nog geen openbare delingen", + "public_shares_empty_desc": "Maak een link waarmee iedereen je shockers kan bedienen.", + "public_share_expired": "Verlopen", + "public_share_no_expiry": "Verloopt niet", + "public_share_label": "Openbare deling", + "public_share_toast_created": "Nieuwe openbare deling gemaakt", + "public_share_create_title": "Openbare deling maken", + "public_share_toast_deleted": "Openbare deling verwijderd", + "public_share_delete_title": "Openbare deling verwijderen", + "public_share_delete_desc": "Weet je zeker dat je openbare deling {#strong}{name}{/strong} wilt verwijderen?", + "public_share_edit_title": "Openbare deling: {name}", + "public_share_edit_subtitle": "Bewerken: wijzigingen gelden zodra je opslaat.", + "public_share_add_shocker": "Shocker toevoegen", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} shocker aan deling toegevoegd", + "countPlural=other": "{count} shockers aan deling toegevoegd" + } + } + ], + "public_share_empty_shockers_title": "Geen shockers in deze deling", + "public_share_empty_shockers_desc": "Voeg een shocker toe en iedereen met de link kan hem bedienen.", + "public_share_load_failed": "Fout bij ophalen van delinggegevens", + "public_share_paused_here": "Gepauzeerd voor deze deling", + "public_share_resume_shocker": "Shocker hervatten", + "public_share_pause_shocker": "Shocker pauzeren", + "public_share_remove": "Uit deling verwijderen", + "public_share_toast_removed": "Shocker uit deling verwijderd", + "public_share_add_title": "Shockers toevoegen", + "public_share_add_desc": "Voeg shockers toe aan deze openbare deling. Je kunt hun limieten instellen nadat ze zijn toegevoegd.", + "public_share_add_placeholder": "Kies shockers om te delen...", + "public_share_add_no_match": "Geen overeenkomende shockers", + "public_share_add_submit": "Shockers toevoegen", + "public_share_view_loading": "Delinggegevens laden...", + "public_share_view_title": "Openbare deellink", + "public_share_view_desc": "Ga verder als gast of log in met je OpenShock-account", + "public_share_view_guest_name": "Gastnaam", + "public_share_view_enter": "Doorgaan", + "public_share_view_enter_guest": "Doorgaan als gast", + "public_share_login": "Inloggen", + "perm_shock_on": "Schok ingeschakeld", + "perm_shock_off": "Schok uitgeschakeld", + "perm_vibrate_on": "Trillen ingeschakeld", + "perm_vibrate_off": "Trillen uitgeschakeld", + "perm_sound_on": "Geluid ingeschakeld", + "perm_sound_off": "Geluid uitgeschakeld", + "perm_live_on": "Live ingeschakeld", + "perm_live_off": "Live uitgeschakeld", + "perm_live_control": "Live-bediening", + "user_selector_avatar_of": "Avatar van {name}", + "user_selector_placeholder": "Gebruikersnaam invoeren", + "user_selector_aria": "Te zoeken gebruikersnaam", + "user_selector_search": "Gebruiker zoeken", + "user_selector_found": "Gebruiker gevonden", + + "common_remove": "Verwijderen", + "user_shares_subtitle": "Directe, permanente delingen met andere gebruikers.", + "user_shares_toast_invited": "Shocker-uitnodiging naar {name} verstuurd", + "user_shares_redeem": "Code inwisselen", + "user_shares_new": "Nieuwe deling", + "user_shares_tab_shares": "Delingen", + "user_shares_tab_incoming": "Met mij gedeeld", + "user_shares_tab_invites": "Uitnodigingen", + "share_code_create_title": "Nieuwe deelcode", + "share_code_create_desc": "Maak een deelcode of uitnodiging", + "share_code_shocker_placeholder": "Kies shockers om te delen...", + "share_code_no_match": "Geen overeenkomende shockers", + "share_code_send_invite": "Uitnodiging sturen", + "share_code_create": "Deelcode maken", + "share_code_created_title": "Deelcode gemaakt", + "share_code_created_desc": "Kopieer de deelcode of de link!", + "share_code_redeem_title": "Deelcode inwisselen", + "share_code_redeem_desc": "Voer de deelcode in om in te wisselen", + "share_code_redeem_placeholder": "Deelcode invoeren", + "share_code_redeemed": "Ingewisseld!", + "share_code_shared_shockers": "Gedeelde shockers", + "share_code_redeeming": "Inwisselen...", + "share_code_redeem": "Inwisselen", + "incoming_shares_empty_title": "Niets met je gedeeld", + "incoming_shares_empty_desc": "Nog niemand heeft een shocker met je gedeeld.", + "incoming_share_toast_removed": "Deling van {name} verwijderd", + "incoming_share_remove_title": "Deling verwijderen", + "incoming_share_remove_desc": "Weet je zeker dat je de deling van {#strong}{name}{/strong} wilt verwijderen?", + "incoming_share_toast_removed_shocker": "{shocker} van {name} verwijderd", + "incoming_share_remove_shocker_title": "Deze gedeelde shocker verwijderen?", + "incoming_share_remove_shocker_desc": "Weet je zeker dat je de gedeelde shocker {#strong}{shocker}{/strong} van {#strong}{name}{/strong} wilt verwijderen?", + "incoming_share_manage_from": "Delingen beheren van", + "share_remove": "Deling verwijderen", + "invites_empty_title": "Nog geen uitnodigingen", + "invites_empty_desc": "Je hebt geen inkomende of uitgaande uitnodigingen.", + "invites_outgoing": "Uitgaand", + "invites_outgoing_empty_title": "Geen uitgaande uitnodigingen", + "invites_outgoing_empty_desc": "Je hebt geen uitgaande uitnodigingen.", + "invites_incoming": "Inkomend", + "invites_incoming_empty_title": "Geen inkomende uitnodigingen", + "invites_incoming_empty_desc": "Je hebt geen inkomende uitnodigingen.", + "invite_toast_accepted": "Uitnodiging van {name} geaccepteerd", + "invite_toast_declined": "Uitnodiging van {name} geweigerd", + "invite_deny_title": "Uitnodiging weigeren", + "invite_deny_label": "Uitnodiging weigeren", + "invite_deny": "Weigeren", + "invite_deny_desc": "Weet je zeker dat je de uitnodiging van {#strong}{name}{/strong} wilt weigeren?", + "invite_accept": "Accepteren", + "invite_toast_cancelled_for": "Uitnodiging voor {name} ingetrokken ({id})", + "invite_toast_cancelled": "Uitnodiging {id} ingetrokken", + "invite_cancel_title": "Uitnodiging intrekken", + "invite_cancel": "Intrekken", + "invite_cancel_for_desc": "Weet je zeker dat je de uitnodiging voor {#strong}{name}{/strong} wilt intrekken?", + "invite_cancel_code_desc": "Weet je zeker dat je de uitnodiging met code {#strong}{code}{/strong} wilt intrekken?", + "invite_cancel_outstanding": "Openstaande uitnodiging intrekken", + "outgoing_shares_empty_title": "Geen gedeelde shockers", + "outgoing_shares_empty_desc": "Je hebt nog geen shockers met andere gebruikers gedeeld.", + "outgoing_share_toast_removed": "Gedeelde shocker {name} verwijderd", + "outgoing_share_remove_title": "Stoppen met delen van deze shocker?", + "outgoing_share_editing_for": "Delingen bewerken voor", + "outgoing_share_limits": "Limieten en rechten", + "outgoing_share_same": "Dezelfde beperkingen voor elke shocker", + "outgoing_share_per_desc": "Beperkingen per shocker instellen", + "outgoing_share_all": "Alle", + "outgoing_share_per": "Per shocker", + + "outgoing_share_remove_desc": "Weet je zeker dat je {#strong}{shocker}{/strong} niet meer wilt delen met {#strong}{name}{/strong}?", + + "report_breadcrumb": "API-tokens melden", + "report_toast_clipboard_failed": "Klembord lezen mislukt: {error}", + "report_title": "Gelekte API-tokens melden", + "report_paste": "Plakken van klembord", + "report_warning": "Dit formulier is alleen bedoeld voor het melden van per ongeluk gelekte API-tokens.", + "report_abuse_warning": "Opzettelijk misbruik leidt tot bans of zware beperkingen.", + "report_detected": "Gevonden tokens", + "report_invalid": "Een of meer tokens lijken ongeldig. Controleer de opmaak.", + "report_acknowledge": "Ik bevestig dat ik begrijp waarvoor deze functie is en neem de verantwoordelijkheid.", + "report_submit": "Melding versturen", + "turnstile_disabled": "Turnstile uitgeschakeld", + "common_internal_error": "Interne fout", + "resend_toast_sent": "Activatiemail verstuurd. Kijk in je inbox en spammap.", + "resend_toast_throttled": "Er zijn te veel activatiemails aangevraagd. Probeer het later opnieuw.", + "resend_toast_unavailable": "Vanuit deze browser kan geen activatiemail opnieuw worden verstuurd. Is je account nog niet geactiveerd, dan stuurt inloggen een nieuwe link.", + "resend_button": "Geen e-mail ontvangen? Opnieuw sturen", + "expiration_label": "Vervaldatum", + "expiration_never": "Nooit", + "expiration_custom": "Aangepast", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} dag", + "countPlural=other": "{count} dagen" + } + } + ], + "expiration_required": "Vervaldatum is verplicht", + "expiration_never_desc": "Verloopt nooit", + "expiration_expires_at": "Verloopt {time} ({date})", + "date_picker_placeholder": "Kies een datum", + "telemetry_toast_title": "Help je OpenShock verbeteren?", + "telemetry_toast_desc": "Stuur diagnosegegevens zodat we crashes en trage API-aanroepen kunnen oplossen. Rapporten bevatten de foutmelding, stacktrace en je IP-adres. Je kunt dit altijd wijzigen in de accountinstellingen.", + "telemetry_toast_no": "Nee, bedankt", + "telemetry_toast_errors": "Alleen fouten", + "telemetry_toast_full": "Volledig", + "table_show_details": "Details tonen", + "table_hide_details": "Details verbergen", + "table_no_results": "Geen resultaten.", + "table_sort_asc": "Sorteren op {name}, oplopend", + "table_sort_desc": "Sorteren op {name}, aflopend", + "table_sort_none": "Sorteren op {name}, ongesorteerd", + "cell_na": "n.v.t.", + "cell_not_applicable": "Niet van toepassing", + "cell_invalid": "Ongeldig", + "cell_unavailable": "Niet beschikbaar", + "cell_none": "Geen", + "oauth_login_with": "Inloggen met {provider}", + "oauth_signup_with": "Registreren met {provider}", + "signalr_connect_failed": "Verbinden met server mislukt!", + "signalr_disconnect_failed": "Fout bij het verbreken van de verbinding met de server!", + "signalr_invalid_update": "Ongeldige update van server ontvangen!", + "signalr_invalid_log": "Ongeldige loggegevens van server ontvangen!", + "signalr_invalid_ota": "Ongeldige firmware-updategegevens van server ontvangen!", + "ota_toast_failed": "Firmware-update van hub mislukt: {message}", + "ota_toast_succeeded": "Firmware-update van hub voltooid!", + "ota_toast_rolled_back": "Hub-firmware teruggezet naar vorige versie", + "lcg_connect_failed": "Verbinden met live control gateway mislukt", + "terminal_toast_bootloader_failed": "Bootloader starten mislukt: {error}", + "terminal_toast_app_mode_failed": "Applicatiemodus starten mislukt: {error}", + + "problem_account_account_not_activated_title": "Account niet geactiveerd", + "problem_account_account_not_activated_desc": "Kijk in je inbox voor de activatiemail.", + "problem_account_activation_not_found_title": "Activatielink is ongeldig", + "problem_account_activation_not_found_desc": "De link is mogelijk verlopen of al gebruikt.", + "problem_account_activation_resend_too_many_title": "Te veel activatiemails aangevraagd", + "problem_account_activation_resend_too_many_desc": "Wacht even voordat je het opnieuw probeert.", + "problem_account_activation_resend_unavailable_title": "Activatiemail kan niet opnieuw worden verstuurd", + "problem_account_activation_resend_unavailable_desc": "Log opnieuw in om een nieuwe activatielink aan te vragen.", + "problem_account_deactivate_already_deactivated_title": "Account is al gedeactiveerd", + "problem_account_deactivate_denied_privileged_title": "Bevoorrechte accounts kunnen niet worden gedeactiveerd", + "problem_account_deactivate_unauthorized_title": "Je mag dit niet doen", + "problem_account_deactivated_title": "Dit account is gedeactiveerd", + "problem_account_email_already_in_use_title": "Dat e-mailadres is al in gebruik", + "problem_account_email_invalid_title": "Dat e-mailadres is ongeldig", + "problem_account_email_taken_title": "Dat e-mailadres is al in gebruik", + "problem_account_email_too_many_requests_title": "Te veel verzoeken om je e-mailadres te wijzigen", + "problem_account_email_too_many_requests_desc": "Wacht even voordat je het opnieuw probeert.", + "problem_account_email_unchanged_title": "Dat is al je e-mailadres", + "problem_account_email_verify_not_found_title": "Verificatielink is ongeldig", + "problem_account_email_verify_not_found_desc": "De link is mogelijk verlopen of al gebruikt.", + "problem_account_o_auth_only_title": "Dit account heeft geen wachtwoord", + "problem_account_o_auth_only_desc": "Log in met de provider waarmee je je hebt geregistreerd.", + "problem_account_password_not_set_title": "Geen wachtwoord ingesteld", + "problem_account_password_not_set_desc": "Dit account logt in via een externe provider.", + "problem_account_password_old_password_invalid_title": "Huidig wachtwoord is onjuist", + "problem_account_username_invalid_title": "Die gebruikersnaam is niet toegestaan", + "problem_account_username_recently_changed_title": "Gebruikersnaam is te recent gewijzigd", + "problem_account_username_recently_changed_desc": "Je kunt je gebruikersnaam eens per 7 dagen wijzigen.", + "problem_account_username_taken_title": "Die gebruikersnaam is al bezet", + "problem_admin_user_deactivated_title": "Deze gebruiker is gedeactiveerd", + "problem_admin_user_not_activated_title": "Deze gebruiker is nog niet geactiveerd", + "problem_api_token_can_only_delete_self_title": "Een API token kan alleen zichzelf verwijderen", + "problem_api_token_not_found_title": "API token niet gevonden", + "problem_api_token_paused_title": "Dit API token is gepauzeerd", + "problem_assign_lcg_bad_schema_version_title": "Niet-ondersteunde hub-protocolversie", + "problem_assign_lcg_bad_schema_version_desc": "Werk de hub-firmware bij om te verbinden.", + "problem_assign_lcg_no_lcg_available_title": "Geen gateway beschikbaar", + "problem_assign_lcg_no_lcg_available_desc": "Er is momenteel geen live control-gateway beschikbaar. Probeer het later opnieuw.", + "problem_authentication_account_deactivated_title": "Dit account is gedeactiveerd", + "problem_authentication_account_not_activated_title": "Dit account is niet geactiveerd", + "problem_authentication_cookie_missing_or_invalid_title": "Je bent niet ingelogd", + "problem_authentication_cookie_missing_or_invalid_desc": "Je sessie is mogelijk verlopen. Log opnieuw in.", + "problem_authentication_header_missing_or_invalid_title": "Ongeldig API token", + "problem_authentication_session_invalid_title": "Sessie verlopen", + "problem_authentication_session_invalid_desc": "Log opnieuw in.", + "problem_authentication_token_invalid_title": "Ongeldig API token", + "problem_authentication_unknown_error_title": "Authenticatie mislukt", + "problem_authorization_policy_not_met_title": "Je hebt geen toestemming om dit te doen", + "problem_authorization_token_only_title": "Voor deze actie is een API token nodig", + "problem_authorization_token_permission_missing_title": "Dit API token mist een vereiste machtiging", + "problem_authorization_unknown_error_title": "Autorisatie mislukt", + "problem_authorization_user_session_only_title": "Voor deze actie moet je ingelogd zijn", + "problem_automation_token_not_allowed_for_account_title": "Automatiseringstokens kunnen niet worden gebruikt met bevoorrechte accounts", + "problem_configuration_already_exists_title": "Er bestaat al een configuratie-item met die naam", + "problem_configuration_invalid_name_format_title": "Ongeldige configuratienaam", + "problem_configuration_invalid_name_format_desc": "Alleen A tot Z en underscores zijn toegestaan.", + "problem_configuration_invalid_value_format_title": "Waarde past niet bij het configuratietype", + "problem_configuration_not_found_title": "Configuratie-item niet gevonden", + "problem_control_stats_invalid_range_title": "De begindatum mag niet na de einddatum liggen", + "problem_control_stats_invalid_time_zone_title": "Onbekende tijdzone", + "problem_control_stats_missing_capability_title": "Besturingsstatistieken zijn niet beschikbaar op deze server", + "problem_device_not_found_title": "Hub niet gevonden", + "problem_device_not_online_title": "De hub is offline", + "problem_device_too_many_hubs_title": "Je hebt het maximale aantal hubs bereikt", + "problem_device_too_many_shockers_title": "Deze hub heeft het maximale aantal shockers bereikt", + "problem_endpoint_retired_title": "Deze functie is niet meer beschikbaar", + "problem_expression_error_title": "Ongeldige filterexpressie", + "problem_internal_server_error_title": "Er ging bij ons iets mis", + "problem_login_invalid_credentials_title": "Ongeldige gebruikersnaam of wachtwoord", + "problem_login_invalid_domain_title": "Inloggen vanaf dit adres is niet toegestaan", + "problem_o_auth_connection_already_exists_title": "Je account is al gekoppeld aan deze provider", + "problem_o_auth_connection_already_linked_title": "Dit externe account is al gekoppeld aan een andere gebruiker", + "problem_o_auth_flow_anonymous_only_title": "Je bent al ingelogd", + "problem_o_auth_flow_mismatch_title": "Inlogpoging komt niet overeen", + "problem_o_auth_flow_mismatch_desc": "Begin opnieuw.", + "problem_o_auth_flow_missing_data_title": "De provider heeft je accountgegevens niet doorgegeven", + "problem_o_auth_flow_missing_data_desc": "Probeer het opnieuw.", + "problem_o_auth_flow_not_found_title": "Inlogpoging verlopen", + "problem_o_auth_flow_not_found_desc": "Begin opnieuw.", + "problem_o_auth_flow_unsupported_title": "Niet-ondersteunde inlogmethode", + "problem_o_auth_internal_error_title": "Er ging iets mis tijdens het inloggen", + "problem_o_auth_internal_error_desc": "Probeer het zo opnieuw.", + "problem_o_auth_link_authenticated_user_only_title": "Je moet ingelogd zijn om een extern account te koppelen", + "problem_o_auth_provider_mismatch_title": "Inlogpoging komt niet overeen met de provider", + "problem_o_auth_provider_mismatch_desc": "Begin opnieuw.", + "problem_o_auth_provider_unsupported_title": "Deze inlogprovider wordt niet ondersteund", + "problem_pair_code_not_found_title": "Koppelcode niet gevonden", + "problem_password_reset_not_found_title": "Link voor wachtwoordherstel is ongeldig", + "problem_password_reset_not_found_desc": "De link is mogelijk verlopen of al gebruikt.", + "problem_session_not_found_title": "Sessie niet gevonden", + "problem_share_get_no_shares_title": "Je hebt geen delingen met deze gebruiker", + "problem_share_request_create_cannot_share_with_self_title": "Je kunt niet met jezelf delen", + "problem_share_request_create_shocker_not_found_title": "Een of meer shockers zijn niet gevonden", + "problem_share_request_create_shocker_not_found_desc": "Ze zijn mogelijk verwijderd of zijn niet van jou.", + "problem_share_request_not_found_title": "Uitnodiging niet gevonden", + "problem_share_user_not_found_title": "Deling niet gevonden", + "problem_share_code_already_linked_title": "Shocker is al gekoppeld aan je account", + "problem_share_code_cant_link_own_share_code_title": "Je kunt je eigen deelcode niet inwisselen", + "problem_share_code_not_found_title": "Deelcode niet gevonden", + "problem_share_link_expiry_date_in_past_title": "Vervaldatum mag niet in het verleden liggen", + "problem_share_link_not_found_title": "Openbare deling niet gevonden", + "problem_share_link_shocker_already_in_share_link_title": "Shocker zit al in deze openbare deling", + "problem_share_link_shocker_not_in_share_link_title": "Shocker zit niet in deze openbare deling", + "problem_shocker_control_no_permission_title": "Je hebt geen toestemming om deze shocker te bedienen", + "problem_shocker_control_not_found_title": "Shocker niet gevonden", + "problem_shocker_control_paused_title": "Shocker is gepauzeerd", + "problem_shocker_not_found_title": "Shocker niet gevonden", + "problem_signup_registration_disabled_title": "Registratie is momenteel uitgeschakeld", + "problem_signup_username_or_email_exists_title": "Die gebruikersnaam of dat e-mailadres is al in gebruik", + "problem_turnstile_invalid_title": "Verificatie mislukt", + "problem_turnstile_invalid_desc": "Voltooi de controle opnieuw en probeer het nog eens.", + "problem_user_not_found_title": "Gebruiker niet gevonden", + "problem_user_privileged_delete_denied_title": "Bevoorrechte gebruikers kunnen niet worden verwijderd", + "problem_validation_error_title": "Sommige velden zijn ongeldig", + "problem_webhook_not_found_title": "Webhook niet gevonden", + "problem_webhook_unsupported_title": "Alleen Discord-webhooks worden ondersteund", + "problem_webhook_unsupported_desc": "Gebruik een discord.com-URL, geen canary of ptb.", + + "error_too_many_requests": "Te veel verzoeken", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Probeer het over {seconds} seconde opnieuw.", + "secondsPlural=other": "Probeer het over {seconds} seconden opnieuw." + } + } + ], + "error_unexpected_response": "Onverwacht antwoord van server", + "error_internal": "Er is een interne fout opgetreden", + "error_network": "Er is een netwerkfout opgetreden", + + "dev_banner": "Dit is de {#b}ONTWIKKEL{/b}omgeving van OpenShock. {#u}Er worden geen gegevens opgeslagen{/u} en ze wordt regelmatig overschreven met productiegegevens.", + "firmware_channel_bugs_warning": "Dit kanaal kan bugs bevatten." +} diff --git a/messages/sv.json b/messages/sv.json new file mode 100644 index 00000000..172b6ed8 --- /dev/null +++ b/messages/sv.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Plattformen för säker och pålitlig fjärrstyrning av shockers med riktigt låg fördröjning.", + "landing_section_label": "Hem", + "landing_hubs_online": "Hubbar online just nu: ", + "landing_learn_more": "Läs mer", + "landing_wiki": "Wiki", + "landing_meta_description": "Välkommen till OpenShock, ett fritt ekosystem med öppen källkod för att styra olika shockers över internet.", + "instance_meta_description": "Välkommen till {siteName}, en oberoende instans av OpenShock, ett fritt ekosystem med öppen källkod för att styra olika shockers över internet.", + "header_sidebar_toggle": "Visa/dölj sidopanelen", + "header_avatar_alt": "{name}s avatar", + "header_menu_profile": "Profil", + "header_menu_settings": "Inställningar", + "header_menu_logout": "Logga ut", + "header_login": "Logga in", + "header_signup": "Registrera dig", + "header_github_title": "OpenShock på GitHub", + "header_discord_title": "Communityns Discord", + + "footer_made_with": "Gjort med {#heart/} av {#team}OpenShock-teamet{/team}", + "footer_connection_status_label": "Anslutningsstatus till servern", + "footer_signalr_state": "SignalR-status", + "footer_frontend_version": "Frontend-version", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "Backend-version", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "Språk", + + "sidebar_home_link_label": "OpenShocks startsida", + "sidebar_group_general": "Allmänt", + "sidebar_home": "Hem", + "sidebar_shockers": "Shockers", + "sidebar_shared_shockers": "Delade shockers", + "sidebar_hubs": "Hubbar", + "sidebar_user_shares": "Användardelningar", + "sidebar_public_shares": "Offentliga delningar", + "sidebar_serial_terminal": "Seriell terminal", + "sidebar_group_admin": "Admin", + "sidebar_admin_monitoring": "Övervakning", + "sidebar_admin_online_hubs": "Anslutna hubbar", + "sidebar_admin_online_gateways": "Anslutna gateways", + "sidebar_admin_management": "Administration", + "sidebar_admin_users": "Användare", + "sidebar_admin_blacklists": "Blocklistor", + "sidebar_admin_webhooks": "Webhooks", + "sidebar_admin_mail": "E-post", + "sidebar_admin_automation_tokens": "Automatiseringstokens", + "sidebar_admin_configuration": "Konfiguration", + "sidebar_group_settings": "Inställningar", + "sidebar_settings_api_tokens": "API-tokens", + "sidebar_settings_sessions": "Sessioner", + "sidebar_settings_audit_log": "Aktivitetslogg", + "sidebar_settings_connections": "Kopplingar", + "sidebar_settings_account": "Kontoinställningar", + + "error_meta_title": "Tjänsten är inte tillgänglig", + "error_meta_description": "OpenShock är inte tillgängligt just nu", + "error_meta_logo_alt": "OpenShocks logotyp", + "error_fallback_message": "Något gick fel.", + "error_not_found_message": "Sidan hittades inte", + "error_not_found_description": "Sidan du letar efter finns inte.", + "error_unexpected_description": "Ett oväntat fel inträffade.", + "error_go_back": "Gå tillbaka", + + "auth_layout_logo_alt": "OpenShocks logotyp", + "auth_layout_invalid_redirect_removed": "En ogiltig omdirigerings-URL togs bort för din säkerhet.", + + "auth_activate_breadcrumb": "Aktivera konto", + "auth_activate_title": "Aktivera konto", + "auth_activate_activating": "Aktiverar ditt konto...", + "auth_activate_success": "Ditt konto har aktiverats", + "auth_activate_failed": "Den här aktiveringslänken är ogiltig eller har gått ut", + "auth_activate_missing_token": "Aktiveringstoken saknas", + "auth_activate_continue": "Fortsätt till inloggningen", + "auth_activate_toast_success": "Kontot har aktiverats", + + "auth_forgot_breadcrumb": "Glömt lösenord", + "auth_forgot_title": "Glömt lösenord", + "auth_forgot_description": "Ange din e-postadress för att återställa ditt lösenord", + "auth_forgot_email_label": "E-post", + "auth_forgot_email_placeholder": "E-post", + "auth_forgot_submit": "Återställ lösenord", + "auth_forgot_signin_prompt": "Kommer du ihåg ditt lösenord? {#signin}Logga in{/signin}", + "auth_forgot_mail_disabled": "Det går inte att återställa lösenord på den här instansen eftersom ingen e-postleverantör är konfigurerad. Kontakta din administratör för att få hjälp att återfå åtkomst till ditt konto.", + "auth_forgot_toast_sent": "En begäran om att återställa lösenordet har skickats till den angivna e-postadressen", + + "auth_login_breadcrumb": "Logga in", + "auth_login_title": "Välkommen tillbaka", + "auth_login_loading_methods": "Läser in tillgängliga inloggningsmetoder", + "auth_login_choose_method": "Logga in med någon av dessa metoder", + "auth_login_with_account": "Logga in med ditt OpenShock-konto", + "auth_login_activation_after_signup": "Ditt konto har skapats. Vi har skickat en aktiveringslänk till din e-postadress. Kontrollera inkorgen och skräpposten.", + "auth_login_activation_pending": "Ditt konto är inte aktiverat än. Vi har skickat en aktiveringslänk till din e-postadress. Kontrollera inkorgen och skräpposten. Om inget kommer fram kan du försöka logga in igen senare för att få en ny länk.", + "auth_login_oauth_only": "Det här kontot har inget lösenord. Logga in med leverantören du registrerade dig med.", + "auth_login_oauth_only_with_buttons": "Det här kontot har inget lösenord. Logga in med leverantören du registrerade dig med via knapparna ovan.", + "auth_login_or_continue_with": "Eller fortsätt med", + "auth_login_username_label": "Användarnamn eller e-post", + "auth_login_password_label": "Lösenord", + "auth_login_submit": "Logga in", + "auth_login_signup_prompt": "Har du inget konto? {#signup}Registrera dig{/signup}", + "auth_login_legal": "Genom att klicka på ”Logga in” godkänner du våra {#tos}användarvillkor{/tos} och vår {#privacy}integritetspolicy{/privacy}.", + + "auth_oauth_create_breadcrumb": "Registrera dig med {provider}", + "auth_oauth_create_title": "Registrera dig med {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Fyll i dina kontouppgifter", + "auth_oauth_create_username_label": "Användarnamn", + "auth_oauth_create_username_placeholder": "Användarnamn", + "auth_oauth_create_email_label": "E-post", + "auth_oauth_create_email_placeholder": "E-post", + "auth_oauth_create_submit": "Registrera dig", + "auth_oauth_create_legal": "Genom att klicka på ”Registrera dig” godkänner du våra {#tos}användarvillkor{/tos} och vår {#privacy}integritetspolicy{/privacy}.", + + "auth_oauth_error_breadcrumb": "Autentiseringsfel", + "auth_oauth_error_title": "Autentiseringsfel", + "auth_oauth_error_back": "Tillbaka till inloggningen", + + "auth_reset_breadcrumb": "Återställ lösenord", + "auth_reset_title": "Återställ lösenord", + "auth_reset_checking": "Kontrollerar återställningslänken...", + "auth_reset_choose_password": "Välj ett nytt lösenord för ditt konto", + "auth_reset_invalid": "Den här återställningslänken är ogiltig eller har gått ut", + "auth_reset_password_label": "Nytt lösenord", + "auth_reset_password_placeholder": "Nytt lösenord", + "auth_reset_confirm_label": "Bekräfta nytt lösenord", + "auth_reset_confirm_placeholder": "Bekräfta nytt lösenord", + "auth_reset_submit": "Återställ lösenord", + "auth_reset_request_new": "Begär en ny länk", + "auth_reset_toast_success": "Lösenordet har återställts", + + "auth_signup_breadcrumb": "Registrera dig", + "auth_signup_toast_created_mail": "Kontot har skapats. Kontrollera din e-post för att verifiera kontot.", + "auth_signup_toast_created_no_mail": "Kontot har skapats. Du kan logga in nu.", + "auth_signup_dialog_title": "Välkommen! Tack för att du registrerade dig! ❤️", + "auth_signup_dialog_created_mail": "Ditt konto har skapats. 🎉 Kontrollera din e-post för att verifiera kontot.", + "auth_signup_dialog_verify_then_login": "När du har verifierat din e-postadress kan du logga in på ditt konto.", + "auth_signup_dialog_created_no_mail": "Ditt konto har skapats och är redo att användas. 🎉", + "auth_signup_dialog_login_now": "Du kan logga in på ditt konto nu.", + "auth_signup_title": "Skapa ditt konto", + "auth_signup_loading_methods": "Läser in tillgängliga registreringsmetoder", + "auth_signup_using_email": "Registrering med e-post", + "auth_signup_choose_method": "Välj hur du vill registrera dig", + "auth_signup_back": "Tillbaka", + "auth_signup_username_label": "Användarnamn", + "auth_signup_username_placeholder": "Sven OpenShock", + "auth_signup_email_label": "E-post", + "auth_signup_email_placeholder": "sven@example.com", + "auth_signup_password_label": "Lösenord", + "auth_signup_password_placeholder": "Lösenord", + "auth_signup_confirm_label": "Bekräfta lösenord", + "auth_signup_confirm_placeholder": "Bekräfta lösenord", + "auth_signup_submit": "Skapa konto", + "auth_signup_signin_prompt": "Har du redan ett konto? {#signin}Logga in{/signin}", + "auth_signup_or": "Eller", + "auth_signup_with_email": "Registrera dig med e-post", + "auth_signup_legal": "Genom att klicka på ”Skapa konto” godkänner du våra {#tos}användarvillkor{/tos} och vår {#privacy}integritetspolicy{/privacy}.", + + "auth_verify_breadcrumb": "Verifiera e-post", + "auth_verify_title": "Verifiera e-post", + "auth_verify_verifying": "Verifierar din e-postadress...", + "auth_verify_success": "Din e-postadress har verifierats", + "auth_verify_failed": "Den här verifieringslänken är ogiltig eller har gått ut", + "auth_verify_missing_token": "Verifieringstoken saknas", + "auth_verify_continue": "Fortsätt till inloggningen", + "auth_verify_toast_success": "E-postadressen har verifierats", + + "common_cancel": "Avbryt", + "common_delete": "Ta bort", + "common_edit": "Redigera", + "common_share": "Dela", + "common_copy_id": "Kopiera ID", + "common_id_copied": "ID kopierat till urklipp", + "common_open_menu": "Öppna meny", + "common_refresh": "Uppdatera", + "common_settings": "Inställningar", + "common_clear": "Rensa", + "common_online": "Ansluten", + "common_offline": "Frånkopplad", + "common_paused": "Pausad", + "common_resume": "Återuppta", + "common_resuming": "Återupptar...", + "common_coming_soon": "(Kommer snart)", + "common_save_changes": "Spara ändringar", + "common_danger_zone": "Farozon", + "common_name": "Namn", + "control_intensity": "Intensitet", + "control_duration": "Tid", + "control_max_intensity": "Max. intensitet", + "control_max_duration": "Max. varaktighet", + "control_vibration": "Vibration", + "control_value": "Värde", + "control_live_intensity": "Live-intensitet", + "control_type_stop": "Stopp", + "control_type_shock": "Stöt", + "control_type_vibrate": "Vibrera", + "control_type_sound": "Ljud", + "live_tooltip_active": "Live via {gateway} ({country}), {latency} ms", + "live_tooltip_connecting": "Ansluter...", + "live_tooltip_connect": "Anslut till livestyrning", + "live_tooltip_hub_start": "Ctrl+klicka för att starta hela hubben", + "live_tooltip_hub_stop": "Ctrl+klicka för att stoppa hela hubben", + "pause_resume_shocker": "Återuppta shockern", + "pause_pause_shocker": "Pausa shockern", + "pause_resume_all": "Återuppta alla shockers", + "pause_pause_all": "Pausa alla shockers", + "shocker_label": "Shocker", + "shocker_hub": "Hubb", + "shocker_select_hub": "Välj hubb", + "shocker_rf_id": "RF-ID", + "shocker_rf_id_invalid": "RF-ID måste vara ett heltal mellan {min} och {max}.", + "shocker_model": "Modell", + "shocker_select_model": "Välj modell", + "shocker_name_placeholder": "Shockerns namn", + "shocker_menu_view_logs": "Visa loggar", + "shocker_delete_title": "Ta bort shocker", + "shocker_delete_desc": "Vill du verkligen ta bort ”{name}”? Det går inte att ångra.", + "shocker_toast_deleted": "Shockern ”{name}” har tagits bort", + "shocker_toast_paused": "Shockern har pausats", + "shocker_toast_resumed": "Shockern har återupptagits", + "shocker_add_desc": "Registrera en ny shocker på en av dina hubbar.", + "shocker_add_name_placeholder": "Min shocker", + "shockers_title": "Shockers", + "shockers_subtitle": "Alla shockers som är parkopplade med dina hubbar.", + "shockers_loading": "Läser in shockers...", + "shockers_toast_refreshed": "Shockers har uppdaterats", + "shockers_toast_need_hub": "Du måste skapa en hubb innan du kan lägga till shockers.", + "shockers_toast_added": "Shockern har lagts till", + "shockers_unknown_module": "Okänd modultyp", + "shockers_add": "Lägg till shocker", + "shockers_view_mode": "Visningsläge", + "shockers_mode_classic": "Klassisk", + "shockers_mode_rich": "Utökad", + "shockers_mode_simple": "Enkel", + "shockers_mode_map": "Karta", + "shockers_group_by_hub": "Gruppera efter hubb", + "shockers_global_limits": "Globala gränser", + "shockers_logs_label": "Loggar", + "shockers_empty_title": "Inga shockers än", + "shockers_empty_no_hubs": "Skapa en hubb först och lägg sedan till shockers.", + "shockers_empty_has_hubs": "Lägg till en shocker i en av dina hubbar för att komma igång.", + "shockers_create_hub": "Skapa en hubb", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} shocker", "countPlural=other": "{count} shockers" } + } + ], + "shared_shockers_title": "Delade shockers", + "shared_shockers_subtitle": "Shockers som andra användare har delat med dig.", + "shared_shockers_empty_title": "Inga shockers har delats med dig än.", + "shared_shockers_empty_desc": "När någon delar sina shockers med dig visas de här.", + "shocker_logs_title": "Shocker-loggar", + "shocker_logs_subtitle": "Alla styrkommandon som har skickats till dina shockers.", + "shocker_logs_live_title": "Nya loggar visas i realtid", + "shocker_logs_paused_title": "Liveuppdateringar pausas när du sorterar eller visar en annan sida än den första", + "shocker_logs_live": "Live", + "shocker_logs_col_time": "Tid", + "shocker_logs_col_type": "Typ", + "shocker_logs_col_by": "Av", + "shocker_logs_filter_label": "Filtrera efter shocker", + "shocker_logs_filter_placeholder": "Sök shockers...", + "shocker_logs_filter_all": "Alla shockers", + "shocker_logs_filter_none": "Inga matchande shockers", + "shocker_edit_title": "Redigera shocker", + "shocker_edit_subtitle": "Ändra uppgifterna för den här shockern eller ta bort den.", + "shocker_edit_back": "Tillbaka till shockers", + "shocker_edit_load_failed": "Det gick inte att läsa in shockern.", + "shocker_edit_loading": "Läser in shockern...", + "shocker_edit_details_title": "Shockeruppgifter", + "shocker_edit_details_desc": "Uppdatera namn, RF-ID och modell för den här shockern.", + "shocker_edit_pause_state": "Pausläge", + "shocker_edit_is_paused": "Shockern är pausad", + "shocker_edit_is_active": "Shockern är aktiv", + "shocker_edit_toast_updated": "Shockern har uppdaterats", + "shocker_edit_delete_desc": "Ta bort den här shockern permanent. Det går inte att ångra.", + + "common_close": "Stäng", + "common_continue": "Fortsätt", + "common_loading": "Läser in...", + "common_previous": "Föregående", + "common_next": "Nästa", + "common_steps": "Steg", + "common_step_label": "Steg {number}: {title}", + "common_copy": "Kopiera", + "common_copied": "Kopierat", + "common_never": "Aldrig", + "common_error": "Fel: {message}", + "terminal_title": "Seriell terminal", + "terminal_connecting": "Ansluter...", + "terminal_help_button": "Har du problem? Få hjälp", + "terminal_back_to_modes": "Tillbaka till lägesval", + "terminal_mode_configure": "Konfigurera enhet", + "terminal_mode_configure_desc": "Konfigurera wifi, autentisering och mer. Innehåller en interaktiv seriell konsol.", + "terminal_mode_flash": "Flasha firmware", + "terminal_mode_flash_desc": "Installera eller uppdatera firmware på en ansluten enhet.", + "terminal_mode_raw": "Seriell monitor", + "terminal_mode_raw_desc": "Bara konsolen. Läs enhetsloggar och skicka kommandon.", + "terminal_step_channel": "Välj kanal", + "terminal_step_board": "Välj kort", + "terminal_go_to_step": "Gå till steg {number}: {title}", + "terminal_erase": "Radera före flashning", + "terminal_erase_desc": "Raderar all data på enheten, inklusive befintliga konfigurationer", + "terminal_unsupported": "Din webbläsare stöder inte den här funktionen.", + "terminal_update_browser": "Uppdatera din webbläsare till den senaste versionen.", + "terminal_use_browsers": "Använd en av följande webbläsare:", + "terminal_connect_failed_bootloader": "Det gick inte att gå in i bootloader-läge", + "terminal_connect_failed": "Anslutningen till enheten misslyckades", + "terminal_connect_failed_desc": "Vi kunde inte upprätta en seriell anslutning till enheten.", + "terminal_quick_tries": "Saker att prova:", + "terminal_try_replug": "Koppla från enheten och anslut den igen.", + "terminal_try_cable": "Prova en annan USB-kabel eller port.", + "terminal_try_driver": "Kontrollera att den seriella drivrutinen är installerad.", + "terminal_open_troubleshooter": "Öppna felsökning", + "terminal_log_reset_no_device": "Fel på värdsidan vid omstart: ingen enhet!", + "terminal_log_reset_error": "Fel på värdsidan vid omstart: {error}", + "terminal_log_send_no_device": "Kunde inte skicka: ingen enhet!", + "terminal_log_send_error": "Kunde inte skicka: {error}", + "terminal_log_firmware_disconnected": "Firmware frånkopplad: {error}", + "terminal_log_erase_failed": "Det gick inte att radera flash: {error}", + "terminal_log_hard_reset_failed": "Hårdvaruåterställning misslyckades: {error}", + "terminal_log_flash_complete": "Flashningen är klar", + "terminal_log_flash_failed": "Flashningen misslyckades: {error}", + "terminal_log_command_failed": "Det gick inte att skriva kommandot: {error}", + "terminal_help_title": "Felsökning", + "terminal_help_desc": "Gå igenom stegen i ordning. Varje steg utesluter en vanlig orsak.", + "terminal_help_step_cable": "USB-kabel", + "terminal_help_step_port": "USB-port", + "terminal_help_step_driver": "Installera drivrutin", + "terminal_help_step_manual": "Manuell uppdatering av drivrutin", + "terminal_help_step_discord": "Fråga på Discord", + "terminal_help_cable_body": "Många USB-C- och micro-USB-kablar kan bara ladda och överför ingen data. Byt till en datakabel du vet fungerar (en som du har använt för att överföra filer eller ansluta andra enheter) och anslut hubben igen.", + "terminal_help_port_body": "Anslut enheten direkt till en USB-port på datorn. Undvik om möjligt USB-hubbar, dockningsstationer och portar på frontpanelen; de är vanliga orsaker till ström- och signalproblem. Har du en stationär dator kan du prova en port på baksidan.", + "terminal_help_driver_download": "Ladda ned CP210x-drivrutinen:", + "terminal_help_driver_extract": "Packa upp innehållet i zip-filen till en mapp på datorn.", + "terminal_help_driver_run": "Öppna mappen och kör {#code}{installer}{/code}. Följ anvisningarna för att installera.", + "terminal_help_driver_reconnect": "Anslut enheten igen.", + "terminal_help_manual_intro": "Om drivrutinen installerades men enheten fortfarande inte visas:", + "terminal_help_manual_open": "Öppna Enhetshanteraren (tryck på {#key}Win{/key} + {#key}X{/key} och välj {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Leta under {#code}Ports (COM & LPT){/code} efter en post som:", + "terminal_help_manual_missing": "Om den saknas upptäcker Windows inte enheten alls; gå igenom stegen om kabel och port igen.", + "terminal_help_manual_update": "Högerklicka på enheten och välj {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Välj {#code}Browse my computer for drivers{/code} och välj mappen där du packade upp drivrutinens zip-fil. Se till att {#code}Include subfolders{/code} är markerat.", + "terminal_help_manual_success": "Om det lyckas ska posten nu heta {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Sitter du fortfarande fast? Gå med i vår Discord-server och fråga i kanalen {#code}{channel}{/code}. Ange:", + "terminal_help_discord_os": "ditt operativsystem och din webbläsare", + "terminal_help_discord_device": "enheten du använder (kortmodell, var du fick tag på den)", + "terminal_help_discord_tried": "vad du redan har provat av stegen ovan", + "terminal_help_discord_errors": "eventuella felmeddelanden eller relevant terminalutdata", + "terminal_help_discord_join": "Gå med i vår Discord-server", + "terminal_risk_title": "⚠️ INSTABIL FIRMWARE", + "terminal_risk_intro": "Du håller på att flasha {#strong}experimentell firmware{/strong} som är {#strong}känd för att vara instabil{/strong}.", + "terminal_risk_brick": "Detta kan göra enheten permanent obrukbar eller kräva manuell återställning.", + "terminal_risk_no_support": "Vi ger INTE support för problem som orsakas av den här firmwaren.", + "terminal_risk_acknowledge": "Jag förstår att detta är helt mitt eget ansvar", + "terminal_risk_abort": "Avbryt", + "terminal_risk_accept": "JAG TAR FULLT ANSVAR", + "firmware_channel_recommended": "Det här är den rekommenderade kanalen.", + "firmware_channel_danger": "ANVÄND INTE DETTA OM DU INTE VET VAD DU GÖR", + "firmware_channel_stable": "Stabil", + "firmware_channel_beta": "Beta", + "firmware_channel_develop": "Utveckling", + "terminal_board_select": "Välj ett kort...", + "terminal_board_search": "Sök kort...", + "terminal_board_none": "Inget kort hittades.", + "terminal_flash_button": "Flasha", + "terminal_flash_progress": "Förlopp: {status}", + "terminal_flash_idle": "Väntar", + "terminal_flash_no_device": "Ingen enhet är vald.", + "terminal_flash_resetting": "Återställer...", + "terminal_flash_downloading": "Laddar ned firmware...", + "terminal_flash_download_failed": "Det gick inte att ladda ned firmware.", + "terminal_flash_flashing": "Flashar firmware...", + "terminal_flash_rebooting": "Startar om enheten... (Koppla ur och in strömmen manuellt om den fastnar)", + "terminal_flash_done": "Enheten har startats om! Flashningen är klar.", + "terminal_port_select": "Välj enhet", + "terminal_port_disconnect": "Koppla från enheten", + "terminal_port_connected": "Enhet ansluten: {#strong}{id}{/strong}", + "terminal_console": "Konsol", + "terminal_connected_device": "Ansluten enhet", + "terminal_resize": "Ändra storlek på terminalpanelen", + "terminal_reboot": "Starta om", + "terminal_disconnect": "Koppla från", + "terminal_fullscreen_exit_esc": "Avsluta helskärm (Esc)", + "terminal_fullscreen_exit": "Avsluta helskärm", + "terminal_fullscreen_fill": "Fyll fönstret", + "terminal_command_label": "Seriellt kommando", + "terminal_command_placeholder": "Skriv ett kommando...", + "terminal_command_send": "Skicka kommando", + "terminal_colors": "Färger", + "terminal_colors_menu": "Färger...", + "terminal_colors_label": "Konsolfärger", + "terminal_colors_close": "Stäng färger", + "terminal_color_input": "Färg för {name}", + "terminal_colors_reset": "Återställ till standard", + "terminal_color_bg": "Bakgrund", + "terminal_color_fg": "Text", + "terminal_color_ts": "Tidsstämpel", + "terminal_color_error": "Fel", + "terminal_color_warning": "Varning", + "terminal_color_info": "Info", + "terminal_color_debug": "Felsökning", + "terminal_color_verbose": "Utförlig", + "terminal_options": "Alternativ", + "terminal_options_label": "Konsolalternativ", + "terminal_hide_system": "Dölj systemmeddelanden", + "terminal_stick_bottom": "Stanna längst ned", + "terminal_raw_output": "Rå utdata", + "terminal_timestamps": "Tidsstämplar", + "terminal_timestamp_uptime": "Drifttid", + "terminal_timestamp_local": "Lokal", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Av", + "terminal_copy_settings": "Kopiera inställningar", + "terminal_import_settings": "Importera inställningar", + "terminal_copy_selection": "Kopiera markering", + "terminal_copy_all": "Kopiera all utdata", + "terminal_toast_selection_copied": "Markeringen har kopierats", + "terminal_toast_output_copied": "Konsolutdata har kopierats", + "terminal_toast_settings_copied": "Konsolinställningarna har kopierats", + "terminal_toast_clipboard_unreadable": "Det gick inte att läsa urklipp", + "terminal_toast_settings_imported": "Konsolinställningarna har importerats", + "terminal_toast_settings_invalid": "Urklipp innehåller inga konsolinställningar", + + "common_try_again": "Försök igen", + "terminal_cfg_intro": "Värden skickas till enheten via UART. Enhetens svar visas i konsolen nedan. Kommandon utan argument läser värdet; använd {#eye/}-knappen vid varje fält för att läsa det aktuella värdet.", + "terminal_cfg_rf_title": "RF-sändare", + "terminal_cfg_rf_desc": "Styr RF-signalen till shockers.", + "terminal_cfg_tx_pin": "TX GPIO-stift", + "terminal_cfg_example": "t.ex. {value}", + "terminal_cfg_read_value": "Läs aktuellt värde", + "terminal_cfg_set": "Ange", + "terminal_cfg_read": "Läs", + "terminal_cfg_reading": "Läser…", + "terminal_cfg_apply": "Tillämpa", + "terminal_cfg_keepalive": "Keepalive aktiverat", + "terminal_cfg_keepalive_desc": "Pingar parkopplade shockers regelbundet så att de håller sig vakna.", + "terminal_cfg_estop_title": "Nödstopp", + "terminal_cfg_estop_desc": "Hårdvaruknapp som stoppar alla signaler.", + "terminal_cfg_estop_enabled": "Nödstopp aktiverat", + "terminal_cfg_estop_pin": "GPIO-stift för nödstopp", + "terminal_cfg_estop_note": "Obs: {#code}{latching}{/code} och {#code}{active}{/code} har inga egna kommandon; ange dem via JSON-konfigurationen nedan.", + "terminal_cfg_wifi_title": "Wifi", + "terminal_cfg_wifi_desc": "Inloggningsuppgifter för nätverk och enhetens värdnamn.", + "terminal_cfg_hostname": "Värdnamn", + "terminal_cfg_networks": "Nätverk (JSON-array)", + "terminal_cfg_invalid_json_array": "Måste vara en giltig JSON-array", + "terminal_cfg_ap_note": "AP-inställningar ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) har inga egna kommandon; använd JSON-konfigurationen.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "OpenShock-server och autentisering.", + "terminal_cfg_domain": "Domän", + "terminal_cfg_domain_restart": "Om du anger domänen startas enheten om.", + "terminal_cfg_auth_token": "Autentiseringstoken", + "terminal_cfg_auth_token_placeholder": "Klistra in enhetstoken", + "terminal_cfg_hide": "Dölj", + "terminal_cfg_show": "Visa", + "terminal_cfg_serial_title": "Seriell inmatning", + "terminal_cfg_echo": "Eko aktiverat", + "terminal_cfg_echo_desc": "Skriv ut inskrivna tecken i konsolen.", + "terminal_cfg_advanced_title": "Avancerat: hela konfigurationen", + "terminal_cfg_advanced_desc": "För fält utan egna kommandon (captive portal, OTA, LAN m.m.) ersätter du hela konfigurationen.", + "terminal_cfg_json_config": "JSON-konfiguration", + "terminal_cfg_invalid_json": "Måste vara giltig JSON", + "terminal_cfg_read_json": "Läs aktuell konfiguration som JSON", + "terminal_cfg_json_restart": "Om du tillämpar en JSON-konfiguration startas enheten om.", + "terminal_cfg_raw_config": "Rå FlatBuffer-konfiguration (base64)", + "terminal_cfg_invalid_base64": "Måste vara en giltig base64-sträng", + "terminal_cfg_read_raw": "Läs aktuell konfiguration som base64", + "terminal_cfg_factory_reset": "Fabriksåterställning", + "terminal_cfg_factory_reset_desc": "Raderar hela enhetens konfiguration.", + "terminal_cfg_factory_reset_title": "Fabriksåterställa enheten?", + "terminal_cfg_factory_reset_action": "Radera konfigurationen", + "terminal_cfg_factory_reset_confirm": "Detta raderar all konfiguration på enheten: wifi-nätverk, inloggningsuppgifter för backend, stift och alla andra inställningar. Enheten återställs till standard.", + "terminal_cfg_read_failed_json_title": "Kunde inte läsa JSON-konfigurationen", + "terminal_cfg_read_failed_raw_title": "Kunde inte läsa råkonfigurationen", + "terminal_cfg_read_failed_desc": "Enheten svarade inte efter {attempts} försök.", + "terminal_cfg_common_causes": "Vanliga orsaker:", + "terminal_cfg_cause_busy": "Enheten är upptagen med ett annat kommando.", + "terminal_cfg_cause_disconnected": "Enheten kopplades från eller startades om.", + "terminal_cfg_cause_unsupported": "Firmwareversionen stöder inte det här kommandot.", + + "common_status": "Status", + "common_version": "Version", + "common_created": "Skapad", + "common_create": "Skapa", + "common_done": "Klar", + "common_enable": "Aktivera", + "common_disable": "Inaktivera", + "common_are_you_sure": "Är du säker?", + "common_generating": "Genererar...", + "hubs_title": "Hubbar", + "hubs_subtitle": "Alla hubbar som är registrerade på ditt konto.", + "hubs_add": "Lägg till hubb", + "hubs_load_failed": "Det gick inte att läsa in hubbar.", + "hubs_empty_title": "Inga hubbar än", + "hubs_empty_desc": "En hubb är enheten som vidarebefordrar kommandon till dina shockers. Lägg till en för att komma igång.", + "hubs_create_title": "Skapa hubb", + "hubs_name_label": "Hubbens namn", + "hubs_name_placeholder": "Min hubb", + "hub_toast_not_connected": "Inte ansluten till servern", + "hub_toast_try_later": "Försök igen om en stund.", + "hub_reboot_title": "Starta om {name}?", + "hub_reboot_desc": "Hubben kopplas från och startar om. Shockers som är parkopplade med den svarar inte förrän den är ansluten igen.", + "hub_reboot": "Starta om", + "hub_hotspot_enable_title": "Aktivera wifi-surfzon på {name}?", + "hub_hotspot_disable_title": "Inaktivera wifi-surfzon på {name}?", + "hub_hotspot_enable_desc": "Hubben sänder ut ett eget installationsnätverk. Den går fortfarande att nå via ditt wifi, men surfzonen är öppen för alla inom räckhåll tills du stänger av den.", + "hub_hotspot_disable_desc": "Installationssurfzonen stängs av. Om hubben inte redan är ansluten till ditt wifi behöver du fysisk åtkomst för att konfigurera den igen.", + "hub_delete_desc": "Du håller på att ta bort hubben {#strong}{name}{/strong}.", + "hub_delete_shockers": "Detta tar även bort följande shockers:", + "hub_edit_title": "Redigera hubb", + "hub_edit_apply": "Tillämpa", + "hub_pair_title_generate": "Generera parkopplingskod?", + "hub_pair_title_generated": "Parkopplingskod genererad", + "hub_pair_title_paired": "Hubb parkopplad", + "hub_pair_consumed": "{#strong}{name}{/strong} använde den här parkopplingskoden och är nu parkopplad.", + "hub_pair_used": "Koden har använts och är inte längre giltig.", + "hub_pair_generated_for": "Parkopplingskod genererad för {#strong}{name}{/strong}.", + "hub_copy_now": "Koden nedan går inte att visa senare. Kopiera den nu och uppdatera dina klienter med den.", + "hub_pair_generate_for": "Du håller på att generera en parkopplingskod för {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Den är giltig i 15 minuter efter att den har skapats.", + "hub_pair_one_active": "Det finns bara en aktiv parkopplingskod per hubb; nya koder ersätter den äldre.", + "hub_pair_complete": "Parkopplingen är klar", + "hub_pair_code_label": "Parkopplingskod:", + "hub_pair_copied_close": "Koden är kopierad, stäng", + "hub_pair_get": "Hämta parkopplingskod", + "hub_token_generated": "Token genererad", + "hub_token_generated_for": "Ny token genererad för {#strong}{name}{/strong}.", + "hub_token_regenerate_for": "Du håller på att generera en ny token för {#strong}{name}{/strong}.", + "hub_token_invalidate": "Detta gör den nuvarande token ogiltig och kopplar från klienter som använder den.", + "hub_token_confirm": "Är du säker på att du vill göra detta?", + "hub_token_label": "Ny token:", + "hub_token_copied_close": "Token kopierad, stäng", + "hub_token_regenerate": "Generera ny token", + "hub_menu_update": "Uppdatera", + "hub_menu_label": "Hubb", + "hub_menu_hotspot_enable": "Aktivera wifi-surfzon", + "hub_menu_hotspot_disable": "Inaktivera wifi-surfzon", + "hub_menu_pair": "Parkoppla", + "hub_menu_estop": "Nödstopp", + "hub_update_breadcrumb": "Uppdatera", + "hub_update_unknown_hub": "Okänd hubb", + "hub_update_unknown_task": "Okänd uppgift", + "hub_update_task_metadata": "Hämtar metadata", + "hub_update_task_preparing": "Förbereder uppdatering", + "hub_update_task_flash_fs": "Flashar filsystem", + "hub_update_task_verify_fs": "Verifierar filsystem", + "hub_update_task_flash_app": "Flashar applikation", + "hub_update_task_bootable": "Markerar applikationen som startbar", + "hub_update_task_rebooting": "Startar om", + "hub_update_status_started": "Startad", + "hub_update_status_running": "Pågår", + "hub_update_status_finished": "Klar", + "hub_update_status_error": "Fel", + "hub_update_status_timeout": "Tidsgräns", + "hub_update_confirm_title": "Bekräfta firmwareuppdatering", + "hub_update_confirm_desc": "Uppdatera {#strong}{name}{/strong} till version {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Den här versionen kanske inte kommer från den stabila kanalen och kan innehålla buggar.", + "hub_update_title": "Uppdatera {name}", + "hub_update_subtitle": "Hantera firmwareuppdateringar för den här hubben.", + "hub_update_status_title": "Hubbstatus", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Uppdatera", + "hub_update_success": "Uppdateringen är klar", + "hub_update_rolled_back": "Enheten återgick till föregående version", + "hub_update_back": "Tillbaka till hubbar", + "hub_update_flash_again": "Flasha igen", + "hub_update_card_title": "Firmwareuppdatering", + "hub_update_card_desc": "Välj en firmwarekanal och version att installera.", + "hub_update_to": "Uppdatera till {version}", + "hub_update_must_be_online": "Hubben måste vara ansluten för att starta en uppdatering.", + "hub_update_updating_to": "Uppdaterar till {version}...", + "hub_update_total": "Totalt", + "hub_update_task": "Uppgift", + "hub_update_history": "Uppdateringshistorik", + "hub_update_no_history": "Ingen uppdateringshistorik hittades för den här hubben.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Startad", + "hub_update_col_message": "Meddelande", + "hub_update_loading": "Läser in hubbinformation...", + "hub_update_not_found": "Hubben hittades inte.", + "home_breadcrumb": "Hem", + "home_welcome": "Välkommen tillbaka", + "home_welcome_name": "Välkommen tillbaka, {name}", + "home_subtitle": "Här är en översikt över din OpenShock-konfiguration.", + "home_hubs_online": "{count} anslutna", + "home_hub_status": "Hubbstatus", + "home_no_hubs": "Inga hubbar", + "home_all_online": "Alla anslutna", + "home_all_offline": "Alla frånkopplade", + "home_some_online": "{online}/{total} anslutna", + "home_quick_links": "Snabblänkar", + "home_my_shockers": "Mina shockers", + "home_my_shockers_desc": "Styr dina shockers", + "home_hubs_desc": "Hantera dina hubbar", + "home_shared_desc": "Shockers som delats med dig", + "home_public_desc": "Hantera delningslänkar", + "home_get_started": "Kom igång", + "home_get_started_desc": "Du har inga hubbar än. Skapa en hubb för att ansluta din första enhet och lägg sedan till shockers.", + "home_set_up_hub": "Konfigurera en hubb", + "home_first_shocker": "Lägg till din första shocker", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Du har konfigurerat {count} hubb. Lägg till en shocker för att börja styra den.", + "countPlural=other": "Du har konfigurerat {count} hubbar. Lägg till en shocker för att börja styra den." + } + } + ], + "home_go_to_shockers": "Gå till shockers", + "profile_title": "Profil", + "profile_coming_soon": "Profilen kommer snart", + "profile_coming_soon_desc": "Din offentliga profil är inte tillgänglig än. Kontouppgifterna finns under Inställningar.", + + "common_retry": "Försök igen", + "common_never_used": "Aldrig använd", + "common_expires": "Går ut {time}", + "common_search_placeholder": "Sök...", + "common_unknown": "Okänd", + "settings_breadcrumb_account": "Konto", + "account_subtitle": "Dina inloggningsuppgifter och kontoåtgärder.", + "account_change_username": "Ändra användarnamn", + "account_change_email": "Ändra e-post", + "account_change_password": "Ändra lösenord", + "account_username_label": "Användarnamn", + "account_email_label": "E-post", + "account_password_label": "Lösenord", + "account_new_password_label": "Nytt lösenord", + "account_confirm_password_label": "Bekräfta nytt lösenord", + "account_oauth_only": "Inte tillgängligt för konton som bara använder OAuth", + "account_oauth_no_password": "Det här kontot loggar in via OAuth och har inget lösenord.", + "account_diagnostics": "Diagnostik", + "account_diagnostics_desc": "Hjälp oss att åtgärda krascher och långsamma API-anrop. Rapporterna innehåller felmeddelandet, stackspårningen och din IP-adress. Av som standard.", + "account_diagnostics_level": "Diagnostiknivå", + "account_telemetry_off": "Av", + "account_telemetry_off_desc": "Skicka ingenting.", + "account_telemetry_errors": "Fel", + "account_telemetry_errors_desc": "Skicka bara felrapporter från webbläsaren.", + "account_telemetry_full": "Full", + "account_telemetry_full_desc": "Felrapporter plus spårning av API-anrop (ingen sidnavigering).", + "account_toast_deactivated": "Kontot har inaktiverats", + "account_deactivate_title": "Inaktivera konto", + "account_deactivate_desc": "Är du säker på att du vill inaktivera ditt konto?", + "account_deactivate": "Inaktivera konto", + "account_email_title": "Ändra e-post", + "account_email_desc": "Ange din nya e-postadress och bekräfta med ditt nuvarande lösenord.", + "account_email_toast_sent": "Verifieringsmejl skickat till {email}. Klicka på länken i mejlet för att genomföra ändringen.", + "account_new_email": "Ny e-post", + "account_current_password": "Nuvarande lösenord", + "account_password_title": "Ändra lösenord", + "account_password_desc": "Ange ditt nuvarande lösenord och välj ett nytt.", + "account_password_toast": "Lösenordet har ändrats", + "account_username_title": "Ändra användarnamn", + "account_username_desc": "Ange ett nytt användarnamn.", + "account_new_username": "Nytt användarnamn", + "account_username_toast": "Användarnamnet har ändrats", + "tokens_subtitle": "API-tokens används för att autentisera mot OpenShock-API:et.", + "tokens_generate": "Generera token", + "tokens_toast_refreshed": "Tokens uppdaterade", + "tokens_empty_title": "Inga API-tokens", + "tokens_empty_desc": "Generera en token för att autentisera mot OpenShock-API:et.", + "tokens_created_on": "Skapad {date}", + "tokens_last_used": "Senast använd {time}", + "tokens_never_expires": "Går aldrig ut", + "tokens_load_failed": "Det gick inte att läsa in API-tokens.", + "token_toast_edited": "Token redigerad", + "token_name_required": "Namn krävs", + "token_name_too_long": "Namnet är för långt", + "token_edit_title": "Redigera API-token", + "token_name_label": "Tokennamn", + "token_name_placeholder": "Tokennamn...", + "token_permissions": "Behörigheter", + "token_perm_category_shockers": "Shockers", + "token_perm_category_devices": "Hubbar", + "token_perm_category_usershares": "Användardelningar", + "token_perm_category_publicshares": "Offentliga delningar", + "token_perm_use": "Använd", + "token_perm_edit": "Redigera", + "token_perm_pause": "Pausa", + "token_perm_auth": "Autentisera", + "token_shocker_control": "Shockerstyrning", + "token_toast_paused": "Token pausad", + "token_toast_resumed": "Token återupptagen", + "token_delete_title": "Ta bort API-token", + "token_delete_desc": "Är du säker på att du vill ta bort {#strong}{name}{/strong}?", + "token_delete_permanent": "Detta går inte att ångra. Token tas bort permanent.", + "token_toast_deleted": "Token borttagen", + "token_resume": "Återuppta token", + "token_pause": "Pausa token", + "token_mode_clamp_desc": "Clamp: förfrågningar utanför det tillåtna intervallet begränsas till närmaste gräns (min eller max).", + "token_mode_lerp_desc": "Lerp: hela indataintervallet skalas om linjärt så att det ryms inom ditt tillåtna min–max-intervall.", + "token_paused_desc": "En pausad token får inte skicka styrmeddelanden till shockers.", + "token_intensity_range": "Intensitetsintervall", + "token_duration_range": "Tidsintervall", + "token_new_breadcrumb": "Ny", + "token_redirect_not_allowed": "Angiven redirect_uri är inte tillåten. Endast loopback-adresser eller egna applikationsscheman tillåts.", + "token_params_missing": "Obligatoriska GET-parametrar saknas. Se till att name, redirect_uri och permissions anges.", + "token_invalid_permissions": "Ogiltiga behörigheter angavs: {list}", + "token_toast_created": "Token skapad", + "token_request_title": "Begäran om API-token", + "token_access_granted": "Åtkomst beviljad", + "token_shared_redirecting": "Token har skapats och delats med applikationen. Du skickas tillbaka till {#b}{uri}{/b}.", + "token_not_redirected": "Om du inte skickas vidare automatiskt kan du använda knappen nedan.", + "token_finish": "Slutför", + "token_generated_title": "API-token genererad", + "token_copy_now": "Kopiera din API-token nu, du kan inte visa den igen senare!", + "token_new_title": "Ny API-token", + "token_external_desc": "En extern applikation begär åtkomst till ditt konto. Granska och justera behörigheterna nedan innan du tillåter åtkomst.", + "token_new_desc": "Konfigurera och generera en ny API-token för ditt konto.", + "token_external_requesting": "{#b}{name}{/b} begär en API-token. Din token delas med applikationen på {#b}{uri}{/b}.", + "token_allow": "Tillåt", + "token_generate": "Generera", + "token_deny": "Neka", + "sessions_subtitle": "Alla aktiva sessioner på ditt konto. Återkalla dem du inte känner igen.", + "sessions_unknown_device": "Okänd enhet", + "sessions_toast_refreshed": "Sessionerna uppdaterades", + "sessions_load_failed": "Det gick inte att läsa in sessioner.", + "sessions_empty_title": "Inga aktiva sessioner", + "sessions_empty_desc": "Sessioner visas här när du loggar in från en webbläsare eller app.", + "sessions_last_seen": "Senast sedd {time}", + "sessions_signed_in": "Inloggad {time}", + "session_toast_revoked": "Sessionen har återkallats", + "session_revoke_title": "Återkalla session", + "session_revoke": "Återkalla", + "session_revoke_desc": "Är du säker på att du vill återkalla den här sessionen?", + "session_revoke_from": "Session inloggad från {#strong}{ip}{/strong} med {#strong}{agent}{/strong}", + "connections_title": "OAuth-anslutningar", + "connections_subtitle": "Länka eller ta bort länkar till tredjepartskonton för att logga in snabbare och hålla din profil synkad.", + "connections_toast_linked": "Kontot har länkats.", + "connections_toast_cancelled": "Länkningen avbröts.", + "connections_toast_failed": "Länkningen misslyckades.", + "connections_toast_removed": "Anslutningen har tagits bort", + "connections_refreshing": "Uppdaterar…", + "connections_link_new": "Länka ny leverantör", + "connections_empty_title": "Inga anslutningar än", + "connections_empty_desc": "Välj ”Länka ny leverantör” ovan för att ansluta tillgängliga leverantörer.", + "connections_unlink": "Ta bort länk", + "connections_load_failed": "Det gick inte att läsa in OAuth-anslutningar.", + "connections_unlink_title": "Ta bort länken till {name}?", + "connections_unlink_title_generic": "Ta bort länken till det här kontot?", + "connections_unlink_desc": "Du kan inte längre logga in med den här leverantören om du inte länkar den igen.", + "provider_starting": "Startar {name}...", + "provider_link": "Länka {name}", + "audit_subtitle": "Säkerhetsrelevant aktivitet på ditt konto. Granska allt du inte känner igen.", + "audit_col_time": "Tid", + "audit_col_action": "Åtgärd", + "audit_col_details": "Detaljer", + "audit_col_reason": "Anledning", + "audit_col_ip": "IP-adress", + "audit_col_device": "Enhet", + "audit_action_login": "Inloggad", + "audit_action_logout": "Utloggad", + "audit_action_password_changed": "Lösenord ändrat", + "audit_action_email_change_requested": "Ändring av e-post begärd", + "audit_action_email_changed": "E-post ändrad", + "audit_action_username_changed": "Användarnamn ändrat", + "audit_action_api_token_created": "API-token skapad", + "audit_action_api_token_deleted": "API-token borttagen", + "audit_action_oauth_connected": "Anslutning tillagd", + "audit_action_oauth_disconnected": "Anslutning borttagen", + "audit_action_account_deactivated": "Konto inaktiverat", + "audit_action_account_reactivated": "Konto återaktiverat", + "audit_action_account_deleted": "Konto borttaget", + "audit_action_automation_token_created": "Automatiseringstoken skapad", + "audit_action_automation_token_updated": "Automatiseringstoken uppdaterad", + "audit_action_automation_token_rotated": "Automatiseringstoken roterad", + "audit_action_automation_token_deleted": "Automatiseringstoken borttagen", + "audit_action_automation_token_used": "Automatiseringstoken använd", + "audit_meta_session": "Session {id}", + "audit_meta_changed": "{old} till {new}", + "audit_meta_email_requested": "Begärde ändring till {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} konto borttaget)", + "countPlural=other": "{name} ({count} konton borttagna)" + } + } + ], + "audit_meta_scheduled_deletion": "Schemalagd för borttagning", + "audit_meta_kept": "Sparat för återaktivering", + + "common_view": "Visa", + "common_save": "Spara", + "common_saving": "Sparar...", + "common_back": "Tillbaka", + "common_shared_by": "Delad av", + "common_user_avatar": "Profilbild", + "common_toast_saved": "Ändringarna har sparats", + "pause_reason_shocker": "Pausad på shockernivå", + "pause_reason_shocker_user_share": "Pausad på shocker- och användardelningsnivå", + "pause_reason_shocker_public_share": "Pausad på shocker- och offentlig delningsnivå", + "pause_reason_user_share": "Pausad på användardelningsnivå", + "pause_reason_public_share": "Pausad på offentlig delningsnivå", + "public_shares_subtitle": "En länk som vem som helst kan använda, inget konto krävs.", + "public_shares_new": "Ny delning", + "public_share_never_expires": "Går aldrig ut", + "public_shares_empty_title": "Inga offentliga delningar än", + "public_shares_empty_desc": "Skapa en länk som vem som helst kan använda för att styra dina shockers.", + "public_share_expired": "Utgången", + "public_share_no_expiry": "Inget utgångsdatum", + "public_share_label": "Offentlig delning", + "public_share_toast_created": "Ny offentlig delning skapad", + "public_share_create_title": "Skapa offentlig delning", + "public_share_toast_deleted": "Offentlig delning borttagen", + "public_share_delete_title": "Ta bort offentlig delning", + "public_share_delete_desc": "Är du säker på att du vill ta bort den offentliga delningen {#strong}{name}{/strong}?", + "public_share_edit_title": "Offentlig delning: {name}", + "public_share_edit_subtitle": "Redigering: ändringarna gäller när du sparar.", + "public_share_add_shocker": "Lägg till shocker", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "Lade till {count} shocker i delningen", + "countPlural=other": "Lade till {count} shockers i delningen" + } + } + ], + "public_share_empty_shockers_title": "Inga shockers i den här delningen", + "public_share_empty_shockers_desc": "Lägg till en shocker så kan alla med länken styra den.", + "public_share_load_failed": "Fel vid hämtning av delningsdetaljer", + "public_share_paused_here": "Pausad för den här delningen", + "public_share_resume_shocker": "Återuppta shocker", + "public_share_pause_shocker": "Pausa shocker", + "public_share_remove": "Ta bort från delning", + "public_share_toast_removed": "Shockern togs bort från delningen", + "public_share_add_title": "Lägg till shockers", + "public_share_add_desc": "Lägg till shockers i den här offentliga delningen. Du kan ställa in gränserna när de har lagts till.", + "public_share_add_placeholder": "Välj shockers att dela...", + "public_share_add_no_match": "Inga matchande shockers", + "public_share_add_submit": "Lägg till shockers", + "public_share_view_loading": "Läser in delningsdetaljer...", + "public_share_view_title": "Offentlig delningslänk", + "public_share_view_desc": "Gå in som gäst eller logga in med ditt OpenShock-konto", + "public_share_view_guest_name": "Gästnamn", + "public_share_view_enter": "Gå in", + "public_share_view_enter_guest": "Gå in som gäst", + "public_share_login": "Logga in", + "perm_shock_on": "Stöt aktiverad", + "perm_shock_off": "Stöt inaktiverad", + "perm_vibrate_on": "Vibration aktiverad", + "perm_vibrate_off": "Vibration inaktiverad", + "perm_sound_on": "Ljud aktiverat", + "perm_sound_off": "Ljud inaktiverat", + "perm_live_on": "Live aktiverat", + "perm_live_off": "Live inaktiverat", + "perm_live_control": "Livestyrning", + "user_selector_avatar_of": "{name}s profilbild", + "user_selector_placeholder": "Ange användarnamn", + "user_selector_aria": "Användarnamn att söka efter", + "user_selector_search": "Sök användare", + "user_selector_found": "Användare hittad", + + "common_remove": "Ta bort", + "user_shares_subtitle": "Direkta, permanenta delningar med andra användare.", + "user_shares_toast_invited": "Skickade en shocker-inbjudan till {name}", + "user_shares_redeem": "Lös in kod", + "user_shares_new": "Ny delning", + "user_shares_tab_shares": "Delningar", + "user_shares_tab_incoming": "Delade med mig", + "user_shares_tab_invites": "Inbjudningar", + "share_code_create_title": "Ny delningskod", + "share_code_create_desc": "Skapa en delningskod eller inbjudan", + "share_code_shocker_placeholder": "Välj shockers att dela...", + "share_code_no_match": "Inga matchande shockers", + "share_code_send_invite": "Skicka inbjudan", + "share_code_create": "Skapa delningskod", + "share_code_created_title": "Delningskod genererad", + "share_code_created_desc": "Kopiera delningskoden eller länken!", + "share_code_redeem_title": "Lös in delningskod", + "share_code_redeem_desc": "Ange delningskoden du vill lösa in", + "share_code_redeem_placeholder": "Ange delningskod", + "share_code_redeemed": "Inlöst!", + "share_code_shared_shockers": "Delade shockers", + "share_code_redeeming": "Löser in...", + "share_code_redeem": "Lös in", + "incoming_shares_empty_title": "Inget delat med dig", + "incoming_shares_empty_desc": "Ingen har delat en shocker med dig än.", + "incoming_share_toast_removed": "Tog bort delningen från {name}", + "incoming_share_remove_title": "Ta bort delning", + "incoming_share_remove_desc": "Är du säker på att du vill ta bort delningen från {#strong}{name}{/strong}?", + "incoming_share_toast_removed_shocker": "Tog bort {shocker} som delats av {name}", + "incoming_share_remove_shocker_title": "Ta bort den här delade shockern?", + "incoming_share_remove_shocker_desc": "Är du säker på att du vill ta bort den delade shockern {#strong}{shocker}{/strong} från {#strong}{name}{/strong}?", + "incoming_share_manage_from": "Hantera delningar från", + "share_remove": "Ta bort delning", + "invites_empty_title": "Inga inbjudningar än", + "invites_empty_desc": "Du har inga inkommande eller utgående inbjudningar.", + "invites_outgoing": "Utgående", + "invites_outgoing_empty_title": "Inga utgående inbjudningar", + "invites_outgoing_empty_desc": "Du har inga utgående inbjudningar.", + "invites_incoming": "Inkommande", + "invites_incoming_empty_title": "Inga inkommande inbjudningar", + "invites_incoming_empty_desc": "Du har inga inkommande inbjudningar.", + "invite_toast_accepted": "Accepterade inbjudan från {name}", + "invite_toast_declined": "Avböjde inbjudan från {name}", + "invite_deny_title": "Avböj inbjudan", + "invite_deny_label": "Avböj inbjudan", + "invite_deny": "Avböj", + "invite_deny_desc": "Är du säker på att du vill avböja inbjudan från {#strong}{name}{/strong}?", + "invite_accept": "Acceptera inbjudan", + "invite_toast_cancelled_for": "Drog tillbaka inbjudan till {name} ({id})", + "invite_toast_cancelled": "Drog tillbaka inbjudan {id}", + "invite_cancel_title": "Dra tillbaka inbjudan", + "invite_cancel": "Dra tillbaka", + "invite_cancel_for_desc": "Är du säker på att du vill dra tillbaka inbjudan till {#strong}{name}{/strong}?", + "invite_cancel_code_desc": "Är du säker på att du vill dra tillbaka inbjudan med koden {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Dra tillbaka väntande inbjudan", + "outgoing_shares_empty_title": "Inga delade shockers", + "outgoing_shares_empty_desc": "Du har inte delat några shockers med andra användare än.", + "outgoing_share_toast_removed": "Tog bort den delade shockern {name}", + "outgoing_share_remove_title": "Sluta dela den här shockern?", + "outgoing_share_editing_for": "Redigerar delningar för", + "outgoing_share_limits": "Gränser och behörigheter", + "outgoing_share_same": "Samma begränsningar på alla shockers", + "outgoing_share_per_desc": "Justera begränsningar per shocker", + "outgoing_share_all": "Alla", + "outgoing_share_per": "Per shocker", + + "outgoing_share_remove_desc": "Är du säker på att du vill sluta dela {#strong}{shocker}{/strong} med {#strong}{name}{/strong}?", + + "report_breadcrumb": "Rapportera API-tokens", + "report_toast_clipboard_failed": "Det gick inte att läsa urklipp: {error}", + "report_title": "Rapportera läckta API-tokens", + "report_paste": "Klistra in från urklipp", + "report_warning": "Det här formuläret är bara till för att rapportera API-tokens som läckt av misstag.", + "report_abuse_warning": "Avsiktligt missbruk leder till avstängning eller kraftiga begränsningar.", + "report_detected": "Upptäckta tokens", + "report_invalid": "En eller flera tokens verkar vara ogiltiga. Kontrollera formateringen.", + "report_acknowledge": "Jag bekräftar att jag förstår vad funktionen är till för och tar ansvar.", + "report_submit": "Skicka rapport", + "turnstile_disabled": "Turnstile inaktiverat", + "common_internal_error": "Internt fel", + "resend_toast_sent": "Aktiveringsmejl skickat. Kolla inkorgen och skräppostmappen.", + "resend_toast_throttled": "För många aktiveringsmejl har begärts. Försök igen senare.", + "resend_toast_unavailable": "Inget aktiveringsmejl kan skickas igen från den här webbläsaren. Om ditt konto inte är aktiverat än skickar en inloggning en ny länk.", + "resend_button": "Fick du inget mejl? Skicka igen", + "expiration_label": "Utgång", + "expiration_never": "Aldrig", + "expiration_custom": "Anpassad", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} dag", "countPlural=other": "{count} dagar" } + } + ], + "expiration_required": "Utgångsdatum krävs", + "expiration_never_desc": "Går aldrig ut", + "expiration_expires_at": "Går ut {time} ({date})", + "date_picker_placeholder": "Välj ett datum", + "telemetry_toast_title": "Vill du hjälpa till att förbättra OpenShock?", + "telemetry_toast_desc": "Skicka diagnostik så att vi kan åtgärda krascher och långsamma API-anrop. Rapporterna innehåller felmeddelandet, stackspårningen och din IP-adress. Du kan ändra detta när som helst i kontoinställningarna.", + "telemetry_toast_no": "Nej tack", + "telemetry_toast_errors": "Bara fel", + "telemetry_toast_full": "Full", + "table_show_details": "Visa detaljer", + "table_hide_details": "Dölj detaljer", + "table_no_results": "Inga resultat.", + "table_sort_asc": "Sortera efter {name}, stigande", + "table_sort_desc": "Sortera efter {name}, fallande", + "table_sort_none": "Sortera efter {name}, osorterad", + "cell_na": "Ej tillämpligt", + "cell_not_applicable": "Inte tillämpligt", + "cell_invalid": "Ogiltig", + "cell_unavailable": "Inte tillgänglig", + "cell_none": "Ingen", + "oauth_login_with": "Logga in med {provider}", + "oauth_signup_with": "Registrera dig med {provider}", + "signalr_connect_failed": "Det gick inte att ansluta till servern!", + "signalr_disconnect_failed": "Ett fel uppstod när anslutningen till servern bröts!", + "signalr_invalid_update": "Tog emot en ogiltig uppdatering från servern!", + "signalr_invalid_log": "Tog emot ogiltiga loggdata från servern!", + "signalr_invalid_ota": "Tog emot ogiltiga data om firmwareuppdatering från servern!", + "ota_toast_failed": "Hubbens firmwareuppdatering misslyckades: {message}", + "ota_toast_succeeded": "Hubbens firmwareuppdatering är klar!", + "ota_toast_rolled_back": "Hubbens firmware återgick till föregående version", + "lcg_connect_failed": "Det gick inte att ansluta till live-kontrollgatewayen", + "terminal_toast_bootloader_failed": "Det gick inte att gå in i startladdaren: {error}", + "terminal_toast_app_mode_failed": "Det gick inte att gå in i applikationsläge: {error}", + + "problem_account_account_not_activated_title": "Kontot är inte aktiverat", + "problem_account_account_not_activated_desc": "Leta efter aktiveringsmejlet i din inkorg.", + "problem_account_activation_not_found_title": "Aktiveringslänken är ogiltig", + "problem_account_activation_not_found_desc": "Länken kan ha gått ut eller redan använts.", + "problem_account_activation_resend_too_many_title": "För många aktiveringsmejl har begärts", + "problem_account_activation_resend_too_many_desc": "Vänta en stund innan du försöker igen.", + "problem_account_activation_resend_unavailable_title": "Det går inte att skicka aktiveringsmejlet igen", + "problem_account_activation_resend_unavailable_desc": "Logga in igen för att begära en ny aktiveringslänk.", + "problem_account_deactivate_already_deactivated_title": "Kontot är redan inaktiverat", + "problem_account_deactivate_denied_privileged_title": "Privilegierade konton kan inte inaktiveras", + "problem_account_deactivate_unauthorized_title": "Du får inte göra detta", + "problem_account_deactivated_title": "Det här kontot har inaktiverats", + "problem_account_email_already_in_use_title": "Den e-postadressen används redan", + "problem_account_email_invalid_title": "Den e-postadressen är ogiltig", + "problem_account_email_taken_title": "Den e-postadressen används redan", + "problem_account_email_too_many_requests_title": "För många begäranden om att ändra e-post", + "problem_account_email_too_many_requests_desc": "Vänta en stund innan du försöker igen.", + "problem_account_email_unchanged_title": "Det är redan din e-postadress", + "problem_account_email_verify_not_found_title": "Verifieringslänken är ogiltig", + "problem_account_email_verify_not_found_desc": "Länken kan ha gått ut eller redan använts.", + "problem_account_o_auth_only_title": "Det här kontot har inget lösenord", + "problem_account_o_auth_only_desc": "Logga in med leverantören du registrerade dig med.", + "problem_account_password_not_set_title": "Inget lösenord har angetts", + "problem_account_password_not_set_desc": "Det här kontot loggar in via en extern leverantör.", + "problem_account_password_old_password_invalid_title": "Det nuvarande lösenordet är fel", + "problem_account_username_invalid_title": "Det användarnamnet är inte tillåtet", + "problem_account_username_recently_changed_title": "Användarnamnet ändrades nyligen", + "problem_account_username_recently_changed_desc": "Du kan ändra ditt användarnamn en gång var 7:e dag.", + "problem_account_username_taken_title": "Det användarnamnet är redan upptaget", + "problem_admin_user_deactivated_title": "Den här användaren är inaktiverad", + "problem_admin_user_not_activated_title": "Den här användaren har inte aktiverats än", + "problem_api_token_can_only_delete_self_title": "En API-token kan bara ta bort sig själv", + "problem_api_token_not_found_title": "API-token hittades inte", + "problem_api_token_paused_title": "Den här API-token är pausad", + "problem_assign_lcg_bad_schema_version_title": "Hubbens protokollversion stöds inte", + "problem_assign_lcg_bad_schema_version_desc": "Uppdatera hubbens firmware för att ansluta.", + "problem_assign_lcg_no_lcg_available_title": "Ingen gateway tillgänglig", + "problem_assign_lcg_no_lcg_available_desc": "Ingen live control-gateway är tillgänglig just nu. Försök igen senare.", + "problem_authentication_account_deactivated_title": "Det här kontot har inaktiverats", + "problem_authentication_account_not_activated_title": "Det här kontot har inte aktiverats", + "problem_authentication_cookie_missing_or_invalid_title": "Du är inte inloggad", + "problem_authentication_cookie_missing_or_invalid_desc": "Din session kan ha gått ut. Logga in igen.", + "problem_authentication_header_missing_or_invalid_title": "Ogiltig API-token", + "problem_authentication_session_invalid_title": "Sessionen har gått ut", + "problem_authentication_session_invalid_desc": "Logga in igen.", + "problem_authentication_token_invalid_title": "Ogiltig API-token", + "problem_authentication_unknown_error_title": "Autentiseringen misslyckades", + "problem_authorization_policy_not_met_title": "Du har inte behörighet att göra detta", + "problem_authorization_token_only_title": "Den här åtgärden kräver en API-token", + "problem_authorization_token_permission_missing_title": "Den här API-token saknar en nödvändig behörighet", + "problem_authorization_unknown_error_title": "Auktoriseringen misslyckades", + "problem_authorization_user_session_only_title": "Den här åtgärden kräver en inloggad session", + "problem_automation_token_not_allowed_for_account_title": "Automatiseringstokens kan inte användas med privilegierade konton", + "problem_configuration_already_exists_title": "Det finns redan en konfigurationspost med det namnet", + "problem_configuration_invalid_name_format_title": "Ogiltigt konfigurationsnamn", + "problem_configuration_invalid_name_format_desc": "Endast A till Z och understreck är tillåtna.", + "problem_configuration_invalid_value_format_title": "Värdet matchar inte konfigurationstypen", + "problem_configuration_not_found_title": "Konfigurationsposten hittades inte", + "problem_control_stats_invalid_range_title": "Från-datumet får inte vara efter till-datumet", + "problem_control_stats_invalid_time_zone_title": "Okänd tidszon", + "problem_control_stats_missing_capability_title": "Kontrollstatistik är inte tillgänglig på den här servern", + "problem_device_not_found_title": "Hubben hittades inte", + "problem_device_not_online_title": "Hubben är frånkopplad", + "problem_device_too_many_hubs_title": "Du har nått det maximala antalet hubbar", + "problem_device_too_many_shockers_title": "Den här hubben har nått sitt maximala antal shockers", + "problem_endpoint_retired_title": "Den här funktionen är inte längre tillgänglig", + "problem_expression_error_title": "Ogiltigt filteruttryck", + "problem_internal_server_error_title": "Något gick fel hos oss", + "problem_login_invalid_credentials_title": "Ogiltigt användarnamn eller lösenord", + "problem_login_invalid_domain_title": "Inloggning från den här adressen är inte tillåten", + "problem_o_auth_connection_already_exists_title": "Ditt konto är redan anslutet till den här leverantören", + "problem_o_auth_connection_already_linked_title": "Det här externa kontot är redan kopplat till en annan användare", + "problem_o_auth_flow_anonymous_only_title": "Du är redan inloggad", + "problem_o_auth_flow_mismatch_title": "Inloggningsförsöket stämmer inte", + "problem_o_auth_flow_mismatch_desc": "Börja om från början.", + "problem_o_auth_flow_missing_data_title": "Leverantören skickade inte dina kontouppgifter", + "problem_o_auth_flow_missing_data_desc": "Försök igen.", + "problem_o_auth_flow_not_found_title": "Inloggningsförsöket har gått ut", + "problem_o_auth_flow_not_found_desc": "Börja om från början.", + "problem_o_auth_flow_unsupported_title": "Inloggningsflödet stöds inte", + "problem_o_auth_internal_error_title": "Något gick fel vid inloggningen", + "problem_o_auth_internal_error_desc": "Försök igen om en stund.", + "problem_o_auth_link_authenticated_user_only_title": "Du måste vara inloggad för att länka ett externt konto", + "problem_o_auth_provider_mismatch_title": "Inloggningsförsöket stämmer inte med leverantören", + "problem_o_auth_provider_mismatch_desc": "Börja om från början.", + "problem_o_auth_provider_unsupported_title": "Den här inloggningsleverantören stöds inte", + "problem_pair_code_not_found_title": "Parkopplingskoden hittades inte", + "problem_password_reset_not_found_title": "Länken för återställning av lösenord är ogiltig", + "problem_password_reset_not_found_desc": "Länken kan ha gått ut eller redan använts.", + "problem_session_not_found_title": "Sessionen hittades inte", + "problem_share_get_no_shares_title": "Du har inga delningar med den här användaren", + "problem_share_request_create_cannot_share_with_self_title": "Du kan inte dela med dig själv", + "problem_share_request_create_shocker_not_found_title": "En eller flera shockers hittades inte", + "problem_share_request_create_shocker_not_found_desc": "De kan ha tagits bort eller tillhör inte dig.", + "problem_share_request_not_found_title": "Inbjudan hittades inte", + "problem_share_user_not_found_title": "Delningen hittades inte", + "problem_share_code_already_linked_title": "Shockern är redan kopplad till ditt konto", + "problem_share_code_cant_link_own_share_code_title": "Du kan inte lösa in din egen delningskod", + "problem_share_code_not_found_title": "Delningskoden hittades inte", + "problem_share_link_expiry_date_in_past_title": "Utgångsdatumet kan inte ligga i det förflutna", + "problem_share_link_not_found_title": "Den offentliga delningen hittades inte", + "problem_share_link_shocker_already_in_share_link_title": "Shockern finns redan i den här offentliga delningen", + "problem_share_link_shocker_not_in_share_link_title": "Shockern finns inte i den här offentliga delningen", + "problem_shocker_control_no_permission_title": "Du har inte behörighet att styra den här shockern", + "problem_shocker_control_not_found_title": "Shockern hittades inte", + "problem_shocker_control_paused_title": "Shockern är pausad", + "problem_shocker_not_found_title": "Shockern hittades inte", + "problem_signup_registration_disabled_title": "Registrering är inaktiverad just nu", + "problem_signup_username_or_email_exists_title": "Det användarnamnet eller den e-postadressen används redan", + "problem_turnstile_invalid_title": "Verifieringen misslyckades", + "problem_turnstile_invalid_desc": "Slutför utmaningen igen och försök på nytt.", + "problem_user_not_found_title": "Användaren hittades inte", + "problem_user_privileged_delete_denied_title": "Privilegierade användare kan inte tas bort", + "problem_validation_error_title": "Vissa fält är ogiltiga", + "problem_webhook_not_found_title": "Webhooken hittades inte", + "problem_webhook_unsupported_title": "Endast Discord-webhooks stöds", + "problem_webhook_unsupported_desc": "Använd en discord.com-URL, inte canary eller ptb.", + + "error_too_many_requests": "För många förfrågningar", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Försök igen om {seconds} sekund.", + "secondsPlural=other": "Försök igen om {seconds} sekunder." + } + } + ], + "error_unexpected_response": "Oväntat svar från servern", + "error_internal": "Ett internt fel uppstod", + "error_network": "Ett nätverksfel uppstod", + + "dev_banner": "Det här är OpenShocks {#b}UTVECKLINGSMILJÖ{/b}. {#u}Ingen data sparas{/u}, och den skrivs regelbundet över med produktionsdata.", + "firmware_channel_bugs_warning": "Den här kanalen kan innehålla buggar." +} diff --git a/messages/uk.json b/messages/uk.json new file mode 100644 index 00000000..e9c62e1b --- /dev/null +++ b/messages/uk.json @@ -0,0 +1,1141 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Платформа для безпечного й надійного дистанційного керування шокерами з мінімальною затримкою.", + "landing_section_label": "Головна", + "landing_hubs_online": "Хабів онлайн зараз: ", + "landing_learn_more": "Дізнатися більше", + "landing_wiki": "Вікі", + "landing_meta_description": "Вітаємо в OpenShock, безкоштовній екосистемі з відкритим кодом для керування різними шокерами через інтернет.", + "instance_meta_description": "Вітаємо в {siteName}, незалежному екземплярі OpenShock, безкоштовної екосистеми з відкритим кодом для керування різними шокерами через інтернет.", + "header_sidebar_toggle": "Перемкнути бічну панель", + "header_avatar_alt": "Аватар {name}", + "header_menu_profile": "Профіль", + "header_menu_settings": "Налаштування", + "header_menu_logout": "Вийти", + "header_login": "Увійти", + "header_signup": "Реєстрація", + "header_github_title": "OpenShock на GitHub", + "header_discord_title": "Спільнота в Discord", + + "footer_made_with": "Зроблено з {#heart/} {#team}командою OpenShock{/team}", + "footer_connection_status_label": "Стан з'єднання із сервером", + "footer_signalr_state": "Стан SignalR", + "footer_frontend_version": "Версія фронтенду", + "footer_frontend_commit_title": "Коміт {commit}", + "footer_backend_version": "Версія бекенду", + "footer_backend_commit_title": "Коміт {commit}", + "footer_language_label": "Мова", + + "sidebar_home_link_label": "Головна OpenShock", + "sidebar_group_general": "Загальне", + "sidebar_home": "Головна", + "sidebar_shockers": "Шокери", + "sidebar_shared_shockers": "Спільні шокери", + "sidebar_hubs": "Хаби", + "sidebar_user_shares": "Доступ користувачам", + "sidebar_public_shares": "Публічні посилання", + "sidebar_serial_terminal": "Серійний термінал", + "sidebar_group_admin": "Адмін", + "sidebar_admin_monitoring": "Моніторинг", + "sidebar_admin_online_hubs": "Хаби онлайн", + "sidebar_admin_online_gateways": "Шлюзи онлайн", + "sidebar_admin_management": "Керування", + "sidebar_admin_users": "Користувачі", + "sidebar_admin_blacklists": "Чорні списки", + "sidebar_admin_webhooks": "Вебхуки", + "sidebar_admin_mail": "Пошта", + "sidebar_admin_automation_tokens": "Токени автоматизації", + "sidebar_admin_configuration": "Конфігурація", + "sidebar_group_settings": "Налаштування", + "sidebar_settings_api_tokens": "API-токени", + "sidebar_settings_sessions": "Сеанси", + "sidebar_settings_audit_log": "Журнал аудиту", + "sidebar_settings_connections": "Підключення", + "sidebar_settings_account": "Обліковий запис", + + "error_meta_title": "Сервіс недоступний", + "error_meta_description": "OpenShock зараз недоступний", + "error_meta_logo_alt": "Логотип OpenShock", + "error_fallback_message": "Щось пішло не так.", + "error_not_found_message": "Сторінку не знайдено", + "error_not_found_description": "Сторінки, яку ти шукаєш, не існує.", + "error_unexpected_description": "Сталася неочікувана помилка.", + "error_go_back": "Назад", + + "auth_layout_logo_alt": "Логотип OpenShock", + "auth_layout_invalid_redirect_removed": "Задля твоєї безпеки недійсну адресу переспрямування видалено.", + + "auth_activate_breadcrumb": "Активація облікового запису", + "auth_activate_title": "Активація облікового запису", + "auth_activate_activating": "Активуємо твій обліковий запис...", + "auth_activate_success": "Твій обліковий запис активовано", + "auth_activate_failed": "Це посилання для активації недійсне або застаріло", + "auth_activate_missing_token": "Відсутній токен активації", + "auth_activate_continue": "Перейти до входу", + "auth_activate_toast_success": "Обліковий запис активовано", + + "auth_forgot_breadcrumb": "Забув пароль", + "auth_forgot_title": "Забув пароль", + "auth_forgot_description": "Введи свою пошту, щоб скинути пароль", + "auth_forgot_email_label": "Пошта", + "auth_forgot_email_placeholder": "Пошта", + "auth_forgot_submit": "Скинути пароль", + "auth_forgot_signin_prompt": "Пам'ятаєш пароль? {#signin}Увійти{/signin}", + "auth_forgot_mail_disabled": "Скидання пароля недоступне на цьому сервері, бо поштовий провайдер не налаштований. Звернися до адміністратора, щоб відновити обліковий запис.", + "auth_forgot_toast_sent": "Запит на скидання пароля надіслано на вказану пошту", + + "auth_login_breadcrumb": "Вхід", + "auth_login_title": "З поверненням", + "auth_login_loading_methods": "Завантажуємо доступні способи входу", + "auth_login_choose_method": "Увійди одним із цих способів", + "auth_login_with_account": "Увійди з обліковим записом OpenShock", + "auth_login_activation_after_signup": "Твій обліковий запис створено. Ми надіслали посилання для активації на твою пошту. Перевір вхідні та папку «Спам».", + "auth_login_activation_pending": "Твій обліковий запис ще не активовано. Ми надіслали посилання для активації на твою пошту. Перевір вхідні та папку «Спам». Якщо лист не прийде, спробуй увійти пізніше, щоб отримати нове посилання.", + "auth_login_oauth_only": "Цей обліковий запис не має пароля. Увійди через провайдера, з яким реєструвався.", + "auth_login_oauth_only_with_buttons": "Цей обліковий запис не має пароля. Увійди через провайдера, з яким реєструвався, за допомогою кнопок вище.", + "auth_login_or_continue_with": "Або продовжити через", + "auth_login_username_label": "Ім'я користувача або пошта", + "auth_login_password_label": "Пароль", + "auth_login_submit": "Увійти", + "auth_login_signup_prompt": "Немає облікового запису? {#signup}Зареєструватися{/signup}", + "auth_login_legal": "Натискаючи «Увійти», ти погоджуєшся з нашими {#tos}Умовами використання{/tos} та {#privacy}Політикою конфіденційності{/privacy}.", + + "auth_oauth_create_breadcrumb": "Реєстрація через {provider}", + "auth_oauth_create_title": "Реєстрація через {#provider}{provider}{/provider}", + "auth_oauth_create_description": "Заповни дані облікового запису", + "auth_oauth_create_username_label": "Ім'я користувача", + "auth_oauth_create_username_placeholder": "Ім'я користувача", + "auth_oauth_create_email_label": "Пошта", + "auth_oauth_create_email_placeholder": "Пошта", + "auth_oauth_create_submit": "Зареєструватися", + "auth_oauth_create_legal": "Натискаючи «Зареєструватися», ти погоджуєшся з нашими {#tos}Умовами використання{/tos} та {#privacy}Політикою конфіденційності{/privacy}.", + + "auth_oauth_error_breadcrumb": "Помилка автентифікації", + "auth_oauth_error_title": "Помилка автентифікації", + "auth_oauth_error_back": "Назад до входу", + + "auth_reset_breadcrumb": "Скидання пароля", + "auth_reset_title": "Скидання пароля", + "auth_reset_checking": "Перевіряємо посилання...", + "auth_reset_choose_password": "Обери новий пароль для свого облікового запису", + "auth_reset_invalid": "Це посилання для скидання недійсне або застаріло", + "auth_reset_password_label": "Новий пароль", + "auth_reset_password_placeholder": "Новий пароль", + "auth_reset_confirm_label": "Підтверди новий пароль", + "auth_reset_confirm_placeholder": "Підтверди новий пароль", + "auth_reset_submit": "Скинути пароль", + "auth_reset_request_new": "Запитати нове посилання", + "auth_reset_toast_success": "Пароль скинуто", + + "auth_signup_breadcrumb": "Реєстрація", + "auth_signup_toast_created_mail": "Обліковий запис створено. Перевір пошту, щоб підтвердити його.", + "auth_signup_toast_created_no_mail": "Обліковий запис створено. Тепер можна увійти.", + "auth_signup_dialog_title": "Вітаємо! Дякуємо за реєстрацію! ❤️", + "auth_signup_dialog_created_mail": "Твій обліковий запис створено. 🎉 Перевір пошту, щоб підтвердити його.", + "auth_signup_dialog_verify_then_login": "Після підтвердження пошти ти зможеш увійти у свій обліковий запис.", + "auth_signup_dialog_created_no_mail": "Твій обліковий запис створено і він готовий до роботи. 🎉", + "auth_signup_dialog_login_now": "Тепер ти можеш увійти у свій обліковий запис.", + "auth_signup_title": "Створи обліковий запис", + "auth_signup_loading_methods": "Завантажуємо доступні способи реєстрації", + "auth_signup_using_email": "Реєстрація через пошту", + "auth_signup_choose_method": "Обери зручний спосіб реєстрації", + "auth_signup_back": "Назад", + "auth_signup_username_label": "Ім'я користувача", + "auth_signup_username_placeholder": "Іван OpenShock", + "auth_signup_email_label": "Пошта", + "auth_signup_email_placeholder": "ivan@example.com", + "auth_signup_password_label": "Пароль", + "auth_signup_password_placeholder": "Пароль", + "auth_signup_confirm_label": "Підтверди пароль", + "auth_signup_confirm_placeholder": "Підтверди пароль", + "auth_signup_submit": "Створити обліковий запис", + "auth_signup_signin_prompt": "Уже маєш обліковий запис? {#signin}Увійти{/signin}", + "auth_signup_or": "Або", + "auth_signup_with_email": "Реєстрація через пошту", + "auth_signup_legal": "Натискаючи «Створити обліковий запис», ти погоджуєшся з нашими {#tos}Умовами використання{/tos} та {#privacy}Політикою конфіденційності{/privacy}.", + + "auth_verify_breadcrumb": "Підтвердження пошти", + "auth_verify_title": "Підтвердження пошти", + "auth_verify_verifying": "Підтверджуємо твою адресу пошти...", + "auth_verify_success": "Твою пошту підтверджено", + "auth_verify_failed": "Це посилання для підтвердження недійсне або застаріло", + "auth_verify_missing_token": "Відсутній токен підтвердження", + "auth_verify_continue": "Перейти до входу", + "auth_verify_toast_success": "Пошту підтверджено", + + "common_cancel": "Скасувати", + "common_delete": "Видалити", + "common_edit": "Редагувати", + "common_share": "Поділитися", + "common_copy_id": "Копіювати ID", + "common_id_copied": "ID скопійовано", + "common_open_menu": "Відкрити меню", + "common_refresh": "Оновити", + "common_settings": "Налаштування", + "common_clear": "Очистити", + "common_online": "Онлайн", + "common_offline": "Офлайн", + "common_paused": "Призупинено", + "common_resume": "Відновити", + "common_resuming": "Відновлюємо...", + "common_coming_soon": "(Незабаром)", + "common_save_changes": "Зберегти зміни", + "common_danger_zone": "Небезпечна зона", + "common_name": "Назва", + "control_intensity": "Інтенсивність", + "control_duration": "Тривалість", + "control_max_intensity": "Макс. інтенсивність", + "control_max_duration": "Макс. тривалість", + "control_vibration": "Вібрація", + "control_value": "Значення", + "control_live_intensity": "Інтенсивність наживо", + "control_type_stop": "Стоп", + "control_type_shock": "Удар", + "control_type_vibrate": "Вібрація", + "control_type_sound": "Звук", + "live_tooltip_active": "Наживо через {gateway} ({country}), {latency} мс", + "live_tooltip_connecting": "Підключення...", + "live_tooltip_connect": "Підключити Live Control", + "live_tooltip_hub_start": "Ctrl+клік, щоб запустити весь хаб", + "live_tooltip_hub_stop": "Ctrl+клік, щоб зупинити весь хаб", + "pause_resume_shocker": "Відновити шокер", + "pause_pause_shocker": "Призупинити шокер", + "pause_resume_all": "Відновити всі шокери", + "pause_pause_all": "Призупинити всі шокери", + "shocker_label": "Шокер", + "shocker_hub": "Хаб", + "shocker_select_hub": "Обери хаб", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID має бути цілим числом від {min} до {max}.", + "shocker_model": "Модель", + "shocker_select_model": "Обери модель", + "shocker_name_placeholder": "Назва шокера", + "shocker_menu_view_logs": "Журнал", + "shocker_delete_title": "Видалити шокер", + "shocker_delete_desc": "Точно видалити «{name}»? Цю дію не можна скасувати.", + "shocker_toast_deleted": "Шокер «{name}» видалено", + "shocker_toast_paused": "Шокер призупинено", + "shocker_toast_resumed": "Шокер відновлено", + "shocker_add_desc": "Зареєструй новий шокер на одному зі своїх хабів.", + "shocker_add_name_placeholder": "Мій шокер", + "shockers_title": "Шокери", + "shockers_subtitle": "Усі шокери, під'єднані до твоїх хабів.", + "shockers_loading": "Завантажуємо шокери...", + "shockers_toast_refreshed": "Шокери оновлено", + "shockers_toast_need_hub": "Перш ніж додавати шокери, створи хаб.", + "shockers_toast_added": "Шокер додано", + "shockers_unknown_module": "Невідомий тип модуля", + "shockers_add": "Додати шокер", + "shockers_view_mode": "Режим перегляду", + "shockers_mode_classic": "Класичний", + "shockers_mode_rich": "Розширений", + "shockers_mode_simple": "Простий", + "shockers_mode_map": "Мапа", + "shockers_group_by_hub": "Групувати за хабом", + "shockers_global_limits": "Глобальні ліміти", + "shockers_logs_label": "Журнал", + "shockers_empty_title": "Шокерів поки немає", + "shockers_empty_no_hubs": "Спершу створи хаб, а потім додай до нього шокери.", + "shockers_empty_has_hubs": "Додай шокер до одного зі своїх хабів, щоб почати.", + "shockers_create_hub": "Створити хаб", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} шокер", + "countPlural=few": "{count} шокери", + "countPlural=many": "{count} шокерів", + "countPlural=other": "{count} шокера" + } + } + ], + "shared_shockers_title": "Спільні шокери", + "shared_shockers_subtitle": "Шокери, якими з тобою поділилися інші користувачі.", + "shared_shockers_empty_title": "З тобою ще не поділилися жодним шокером.", + "shared_shockers_empty_desc": "Коли хтось поділиться з тобою своїми шокерами, вони з'являться тут.", + "shocker_logs_title": "Журнал шокерів", + "shocker_logs_subtitle": "Усі команди керування, надіслані твоїм шокерам.", + "shocker_logs_live_title": "Нові записи з'являються в реальному часі", + "shocker_logs_paused_title": "Оновлення наживо зупиняються під час сортування або на будь-якій сторінці, крім першої", + "shocker_logs_live": "Наживо", + "shocker_logs_col_time": "Час", + "shocker_logs_col_type": "Тип", + "shocker_logs_col_by": "Хто", + "shocker_logs_filter_label": "Фільтр за шокером", + "shocker_logs_filter_placeholder": "Пошук шокерів...", + "shocker_logs_filter_all": "Усі шокери", + "shocker_logs_filter_none": "Немає відповідних шокерів", + "shocker_edit_title": "Редагувати шокер", + "shocker_edit_subtitle": "Зміни дані цього шокера або видали його.", + "shocker_edit_back": "Назад до шокерів", + "shocker_edit_load_failed": "Не вдалося завантажити шокер.", + "shocker_edit_loading": "Завантажуємо шокер...", + "shocker_edit_details_title": "Дані шокера", + "shocker_edit_details_desc": "Зміни назву, RF ID і модель цього шокера.", + "shocker_edit_pause_state": "Стан паузи", + "shocker_edit_is_paused": "Шокер призупинено", + "shocker_edit_is_active": "Шокер активний", + "shocker_edit_toast_updated": "Шокер оновлено", + "shocker_edit_delete_desc": "Остаточно видалити цей шокер. Цю дію не можна скасувати.", + + "common_close": "Закрити", + "common_continue": "Продовжити", + "common_loading": "Завантаження...", + "common_previous": "Назад", + "common_next": "Далі", + "common_steps": "Кроки", + "common_step_label": "Крок {number}: {title}", + "common_copy": "Копіювати", + "common_copied": "Скопійовано", + "common_never": "Ніколи", + "common_error": "Помилка: {message}", + "terminal_title": "Серійний термінал", + "terminal_connecting": "Підключення...", + "terminal_help_button": "Щось не виходить, допоможіть?", + "terminal_back_to_modes": "Назад до вибору режиму", + "terminal_mode_configure": "Налаштувати пристрій", + "terminal_mode_configure_desc": "Налаштуй WiFi, автентифікацію та інше. Включає інтерактивну серійну консоль.", + "terminal_mode_flash": "Прошити", + "terminal_mode_flash_desc": "Встанови або онови прошивку на підключеному пристрої.", + "terminal_mode_raw": "Серійний монітор", + "terminal_mode_raw_desc": "Лише консоль. Читай журнали пристрою та надсилай команди.", + "terminal_step_channel": "Обери канал", + "terminal_step_board": "Обери плату", + "terminal_go_to_step": "Перейти до кроку {number}: {title}", + "terminal_erase": "Стерти перед прошивкою", + "terminal_erase_desc": "Видаляє всі дані на пристрої, включно з наявними налаштуваннями", + "terminal_unsupported": "Твій браузер не підтримує цю функцію.", + "terminal_update_browser": "Онови браузер до останньої версії.", + "terminal_use_browsers": "Скористайся одним із цих браузерів:", + "terminal_connect_failed_bootloader": "Не вдалося увійти в режим завантажувача", + "terminal_connect_failed": "Не вдалося підключити пристрій", + "terminal_connect_failed_desc": "Нам не вдалося встановити серійне з'єднання з пристроєм.", + "terminal_quick_tries": "Що можна швидко спробувати:", + "terminal_try_replug": "Від'єднай і знову під'єднай пристрій.", + "terminal_try_cable": "Спробуй інший USB-кабель або порт.", + "terminal_try_driver": "Переконайся, що серійний драйвер встановлено.", + "terminal_open_troubleshooter": "Відкрити довідник з усунення проблем", + "terminal_log_reset_no_device": "Помилка хоста під час скидання: немає пристрою!", + "terminal_log_reset_error": "Помилка хоста під час скидання: {error}", + "terminal_log_send_no_device": "Не вдалося надіслати: немає пристрою!", + "terminal_log_send_error": "Не вдалося надіслати: {error}", + "terminal_log_firmware_disconnected": "Прошивка від'єдналася: {error}", + "terminal_log_erase_failed": "Не вдалося стерти флеш-пам'ять: {error}", + "terminal_log_hard_reset_failed": "Не вдалося виконати апаратне скидання: {error}", + "terminal_log_flash_complete": "Прошивку завершено", + "terminal_log_flash_failed": "Не вдалося прошити: {error}", + "terminal_log_command_failed": "Не вдалося записати команду застосунку: {error}", + "terminal_help_title": "Усунення проблем", + "terminal_help_desc": "Пройди ці кроки по черзі. Кожен виключає одну поширену причину.", + "terminal_help_step_cable": "USB-кабель", + "terminal_help_step_port": "USB-порт", + "terminal_help_step_driver": "Встановити драйвер", + "terminal_help_step_manual": "Ручне оновлення драйвера", + "terminal_help_step_discord": "Запитати в Discord", + "terminal_help_cable_body": "Багато кабелів USB-C і micro-USB лише заряджають і не передають дані. Візьми перевірений кабель для даних (яким ти вже передавав файли чи підключав інші пристрої) і знову під'єднай хаб.", + "terminal_help_port_body": "Під'єднай пристрій напряму до USB-порту комп'ютера. За можливості уникай USB-хабів, док-станцій і портів на передній панелі: вони часто спричиняють проблеми з живленням і сигналом. Якщо в тебе настільний ПК, спробуй порт на задній панелі.", + "terminal_help_driver_download": "Завантаж драйвер CP210x:", + "terminal_help_driver_extract": "Розпакуй вміст zip-архіву в папку на комп'ютері.", + "terminal_help_driver_run": "Відкрий папку й запусти {#code}{installer}{/code}. Виконуй підказки, щоб встановити.", + "terminal_help_driver_reconnect": "Знову під'єднай пристрій.", + "terminal_help_manual_intro": "Якщо інсталятор драйвера відпрацював, але пристрій досі не з'являється:", + "terminal_help_manual_open": "Відкрий Диспетчер пристроїв (натисни {#key}Win{/key} + {#key}X{/key} і вибери {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "У розділі {#code}Ports (COM & LPT){/code} знайди запис на кшталт:", + "terminal_help_manual_missing": "Якщо його немає, Windows взагалі не бачить пристрій. Повернися до кроків про кабель і порт.", + "terminal_help_manual_update": "Клацни правою кнопкою на пристрої та вибери {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Вибери {#code}Browse my computer for drivers{/code} і вкажи папку, куди розпакував zip із драйвером. Переконайся, що позначено {#code}Include subfolders{/code}.", + "terminal_help_manual_success": "Якщо все вдалося, запис тепер має називатися {#code}{deviceName}{/code}.", + "terminal_help_discord_intro": "Досі не виходить після всього цього? Заходь на наш Discord-сервер і питай у каналі {#code}{channel}{/code}. Вкажи:", + "terminal_help_discord_os": "свою операційну систему й браузер", + "terminal_help_discord_device": "пристрій, який використовуєш (модель плати, де ти її взяв)", + "terminal_help_discord_tried": "що ти вже пробував із попередніх кроків", + "terminal_help_discord_errors": "будь-які повідомлення про помилки або відповідний вивід термінала", + "terminal_help_discord_join": "Приєднатися до нашого Discord-сервера", + "terminal_risk_title": "⚠️ НЕСТАБІЛЬНА ПРОШИВКА", + "terminal_risk_intro": "Ти збираєшся встановити {#strong}експериментальну прошивку{/strong}, яка {#strong}завідомо нестабільна{/strong}.", + "terminal_risk_brick": "Це може назавжди вивести пристрій з ладу, вимагати ручного відновлення або зробити його непридатним.", + "terminal_risk_no_support": "Ми НЕ надаємо підтримку щодо проблем, спричинених цією прошивкою.", + "terminal_risk_acknowledge": "Я розумію, що вся відповідальність лежить на мені", + "terminal_risk_abort": "Скасувати", + "terminal_risk_accept": "Я БЕРУ ВСЮ ВІДПОВІДАЛЬНІСТЬ", + "firmware_channel_recommended": "Це рекомендований канал.", + "firmware_channel_danger": "НЕ ВИКОРИСТОВУЙ, ЯКЩО НЕ ЗНАЄШ, ЩО РОБИШ", + "firmware_channel_stable": "Стабільний", + "firmware_channel_beta": "Бета", + "firmware_channel_develop": "Розробка", + "terminal_board_select": "Обери плату...", + "terminal_board_search": "Пошук плат...", + "terminal_board_none": "Плату не знайдено.", + "terminal_flash_button": "Прошити", + "terminal_flash_progress": "Прогрес прошивки: {status}", + "terminal_flash_idle": "Очікування", + "terminal_flash_no_device": "Пристрій не вибрано.", + "terminal_flash_resetting": "Скидання...", + "terminal_flash_downloading": "Завантажуємо прошивку...", + "terminal_flash_download_failed": "Не вдалося завантажити прошивку.", + "terminal_flash_flashing": "Прошиваємо...", + "terminal_flash_rebooting": "Перезавантажуємо пристрій... (Якщо завис, перепідключи живлення вручну)", + "terminal_flash_done": "Пристрій перезавантажено! Прошивку завершено.", + "terminal_port_select": "Обрати пристрій", + "terminal_port_disconnect": "Від'єднати пристрій", + "terminal_port_connected": "Пристрій підключено: {#strong}{id}{/strong}", + "terminal_console": "Консоль", + "terminal_connected_device": "Підключений пристрій", + "terminal_resize": "Змінити розмір панелі термінала", + "terminal_reboot": "Перезавантажити", + "terminal_disconnect": "Від'єднати", + "terminal_fullscreen_exit_esc": "Вийти з повноекранного режиму (Esc)", + "terminal_fullscreen_exit": "Вийти з повноекранного режиму", + "terminal_fullscreen_fill": "На все вікно", + "terminal_command_label": "Серійна команда", + "terminal_command_placeholder": "Введи команду...", + "terminal_command_send": "Надіслати команду", + "terminal_colors": "Кольори", + "terminal_colors_menu": "Кольори...", + "terminal_colors_label": "Кольори консолі", + "terminal_colors_close": "Закрити кольори", + "terminal_color_input": "Колір: {name}", + "terminal_colors_reset": "Скинути до типових", + "terminal_color_bg": "Фон", + "terminal_color_fg": "Текст", + "terminal_color_ts": "Мітка часу", + "terminal_color_error": "Помилка", + "terminal_color_warning": "Попередження", + "terminal_color_info": "Інфо", + "terminal_color_debug": "Налагодження", + "terminal_color_verbose": "Докладно", + "terminal_options": "Параметри", + "terminal_options_label": "Параметри консолі", + "terminal_hide_system": "Приховати системні повідомлення", + "terminal_stick_bottom": "Тримати внизу", + "terminal_raw_output": "Сирий вивід", + "terminal_timestamps": "Мітки часу", + "terminal_timestamp_uptime": "Аптайм", + "terminal_timestamp_local": "Місцевий", + "terminal_timestamp_ms": "Мс", + "terminal_timestamp_off": "Вимк.", + "terminal_copy_settings": "Копіювати налаштування", + "terminal_import_settings": "Імпортувати налаштування", + "terminal_copy_selection": "Копіювати виділене", + "terminal_copy_all": "Копіювати весь вивід", + "terminal_toast_selection_copied": "Виділене скопійовано", + "terminal_toast_output_copied": "Вивід консолі скопійовано", + "terminal_toast_settings_copied": "Налаштування консолі скопійовано", + "terminal_toast_clipboard_unreadable": "Не вдалося прочитати буфер обміну", + "terminal_toast_settings_imported": "Налаштування консолі імпортовано", + "terminal_toast_settings_invalid": "У буфері обміну немає налаштувань консолі", + + "common_try_again": "Спробувати ще", + "terminal_cfg_intro": "Значення надсилаються на пристрій через UART. Відповідь пристрою дивись у консолі нижче. Команди без аргументу працюють як геттери: натисни кнопку {#eye/} біля поля, щоб прочитати поточне значення.", + "terminal_cfg_rf_title": "RF-передавач", + "terminal_cfg_rf_desc": "Керує RF-виходом для шокерів.", + "terminal_cfg_tx_pin": "GPIO-пін TX", + "terminal_cfg_example": "напр. {value}", + "terminal_cfg_read_value": "Прочитати поточне значення", + "terminal_cfg_set": "Задати", + "terminal_cfg_read": "Прочитати", + "terminal_cfg_reading": "Читаємо…", + "terminal_cfg_apply": "Застосувати", + "terminal_cfg_keepalive": "Keepalive увімкнено", + "terminal_cfg_keepalive_desc": "Періодично пінгує під'єднані шокери, щоб вони не засинали.", + "terminal_cfg_estop_title": "Аварійна зупинка", + "terminal_cfg_estop_desc": "Апаратна кнопка, яка зупиняє весь вихід.", + "terminal_cfg_estop_enabled": "EStop увімкнено", + "terminal_cfg_estop_pin": "GPIO-пін EStop", + "terminal_cfg_estop_note": "Примітка: для {#code}{latching}{/code} і {#code}{active}{/code} немає окремих команд, задай їх через JSON-конфіг нижче.", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Облікові дані мережі та ім'я хоста пристрою.", + "terminal_cfg_hostname": "Ім'я хоста", + "terminal_cfg_networks": "Мережі (JSON-масив)", + "terminal_cfg_invalid_json_array": "Має бути коректним JSON-масивом", + "terminal_cfg_ap_note": "Для налаштувань AP ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) немає окремих команд, використовуй JSON-конфіг.", + "terminal_cfg_backend_title": "Бекенд", + "terminal_cfg_backend_desc": "Сервер OpenShock і автентифікація.", + "terminal_cfg_domain": "Домен", + "terminal_cfg_domain_restart": "Зміна домену перезапустить пристрій.", + "terminal_cfg_auth_token": "Токен автентифікації", + "terminal_cfg_auth_token_placeholder": "Встав токен пристрою", + "terminal_cfg_hide": "Сховати", + "terminal_cfg_show": "Показати", + "terminal_cfg_serial_title": "Серійний ввід", + "terminal_cfg_echo": "Луна увімкнена", + "terminal_cfg_echo_desc": "Показувати введені символи в консолі.", + "terminal_cfg_advanced_title": "Розширене: повний конфіг", + "terminal_cfg_advanced_desc": "Для полів без окремих команд (captive portal, OTA, LAN тощо) заміни весь конфіг.", + "terminal_cfg_json_config": "JSON-конфіг", + "terminal_cfg_invalid_json": "Має бути коректним JSON", + "terminal_cfg_read_json": "Прочитати поточний конфіг як JSON", + "terminal_cfg_json_restart": "Застосування JSON-конфігу перезапустить пристрій.", + "terminal_cfg_raw_config": "Сирий конфіг FlatBuffer (base64)", + "terminal_cfg_invalid_base64": "Має бути коректним рядком base64", + "terminal_cfg_read_raw": "Прочитати поточний конфіг як base64", + "terminal_cfg_factory_reset": "Скидання до заводських", + "terminal_cfg_factory_reset_desc": "Повністю стирає конфігурацію пристрою.", + "terminal_cfg_factory_reset_title": "Скинути пристрій до заводських?", + "terminal_cfg_factory_reset_action": "Стерти конфіг", + "terminal_cfg_factory_reset_confirm": "Це зітре всю конфігурацію на пристрої: мережі WiFi, облікові дані бекенду, піни та всі інші налаштування. Пристрій повернеться до типових налаштувань.", + "terminal_cfg_read_failed_json_title": "Не вдалося прочитати JSON-конфігурацію", + "terminal_cfg_read_failed_raw_title": "Не вдалося прочитати сиру конфігурацію", + "terminal_cfg_read_failed_desc": "Пристрій не відповів після {attempts} спроб.", + "terminal_cfg_common_causes": "Поширені причини:", + "terminal_cfg_cause_busy": "Пристрій зайнятий іншою командою.", + "terminal_cfg_cause_disconnected": "Пристрій від'єднався або перезавантажився.", + "terminal_cfg_cause_unsupported": "Ця версія прошивки не підтримує цю команду.", + + "common_status": "Стан", + "common_version": "Версія", + "common_created": "Створено", + "common_create": "Створити", + "common_done": "Готово", + "common_enable": "Увімкнути", + "common_disable": "Вимкнути", + "common_are_you_sure": "Ти впевнений?", + "common_generating": "Генеруємо...", + "hubs_title": "Хаби", + "hubs_subtitle": "Усі хаби, зареєстровані у твоєму обліковому записі.", + "hubs_add": "Додати хаб", + "hubs_load_failed": "Не вдалося завантажити хаби.", + "hubs_empty_title": "Хабів поки немає", + "hubs_empty_desc": "Хаб це пристрій, який передає команди твоїм шокерам. Додай його, щоб почати.", + "hubs_create_title": "Створити хаб", + "hubs_name_label": "Назва хаба", + "hubs_name_placeholder": "Мій хаб", + "hub_toast_not_connected": "Немає з'єднання із сервером", + "hub_toast_try_later": "Спробуй ще раз за мить.", + "hub_reboot_title": "Перезавантажити {name}?", + "hub_reboot_desc": "Хаб від'єднається та перезапуститься. Під'єднані до нього шокери не реагуватимуть, доки він знову не вийде в мережу.", + "hub_reboot": "Перезавантажити", + "hub_hotspot_enable_title": "Увімкнути точку доступу Wi-Fi на {name}?", + "hub_hotspot_disable_title": "Вимкнути точку доступу Wi-Fi на {name}?", + "hub_hotspot_enable_desc": "Хаб транслює власну мережу для налаштування. Він залишається доступним у твоїй Wi-Fi, але точка доступу відкрита для всіх поблизу, доки ти її не вимкнеш.", + "hub_hotspot_disable_desc": "Точка доступу для налаштування вимкнеться. Якщо хаб ще не підключений до твоєї Wi-Fi, для повторного налаштування знадобиться фізичний доступ.", + "hub_delete_desc": "Ти збираєшся видалити хаб {#strong}{name}{/strong}.", + "hub_delete_shockers": "Також буде видалено ці шокери:", + "hub_edit_title": "Редагувати хаб", + "hub_edit_apply": "Застосувати", + "hub_pair_title_generate": "Згенерувати код сполучення?", + "hub_pair_title_generated": "Код сполучення згенеровано", + "hub_pair_title_paired": "Хаб сполучено", + "hub_pair_consumed": "{#strong}{name}{/strong} використав цей код і тепер сполучений.", + "hub_pair_used": "Код використано, він більше не дійсний.", + "hub_pair_generated_for": "Код сполучення для {#strong}{name}{/strong} згенеровано.", + "hub_copy_now": "Код нижче потім буде недоступний, тож скопіюй його зараз і онови ним клієнти.", + "hub_pair_generate_for": "Ти збираєшся згенерувати код сполучення для {#strong}{name}{/strong}.", + "hub_pair_valid_for": "Він буде дійсний 15 хвилин після створення.", + "hub_pair_one_active": "Для кожного хаба діє лише один код сполучення, новий замінює попередній активний.", + "hub_pair_complete": "Сполучення завершено", + "hub_pair_code_label": "Код сполучення:", + "hub_pair_copied_close": "Код скопійовано, закрити", + "hub_pair_get": "Отримати код", + "hub_token_generated": "Токен згенеровано", + "hub_token_generated_for": "Новий токен для {#strong}{name}{/strong} згенеровано.", + "hub_token_regenerate_for": "Ти збираєшся перегенерувати токен для {#strong}{name}{/strong}.", + "hub_token_invalidate": "Це анулює поточний токен і від'єднає клієнти, які ним користуються.", + "hub_token_confirm": "Точно хочеш це зробити?", + "hub_token_label": "Новий токен:", + "hub_token_copied_close": "Токен скопійовано, закрити", + "hub_token_regenerate": "Перегенерувати токен", + "hub_menu_update": "Оновити", + "hub_menu_label": "Хаб", + "hub_menu_hotspot_enable": "Увімкнути точку доступу", + "hub_menu_hotspot_disable": "Вимкнути точку доступу", + "hub_menu_pair": "Сполучити", + "hub_menu_estop": "Аварійна зупинка", + "hub_update_breadcrumb": "Оновлення", + "hub_update_unknown_hub": "Невідомий хаб", + "hub_update_unknown_task": "Невідоме завдання", + "hub_update_task_metadata": "Отримання метаданих", + "hub_update_task_preparing": "Підготовка до оновлення", + "hub_update_task_flash_fs": "Запис файлової системи", + "hub_update_task_verify_fs": "Перевірка файлової системи", + "hub_update_task_flash_app": "Запис застосунку", + "hub_update_task_bootable": "Позначення застосунку як завантажувального", + "hub_update_task_rebooting": "Перезавантаження", + "hub_update_status_started": "Розпочато", + "hub_update_status_running": "Виконується", + "hub_update_status_finished": "Завершено", + "hub_update_status_error": "Помилка", + "hub_update_status_timeout": "Час вичерпано", + "hub_update_confirm_title": "Підтвердь оновлення прошивки", + "hub_update_confirm_desc": "Оновити {#strong}{name}{/strong} до версії {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "Ця версія може бути не зі стабільного каналу й містити помилки.", + "hub_update_title": "Оновлення {name}", + "hub_update_subtitle": "Керуй оновленнями прошивки цього хаба.", + "hub_update_status_title": "Стан хаба", + "hub_update_firmware": "Прошивка: {#mono}{version}{/mono}", + "hub_update_confirm": "Оновити", + "hub_update_success": "Оновлення успішно завершено", + "hub_update_rolled_back": "Пристрій повернувся до попередньої версії", + "hub_update_back": "Назад до хабів", + "hub_update_flash_again": "Прошити ще раз", + "hub_update_card_title": "Оновлення прошивки", + "hub_update_card_desc": "Обери канал і версію прошивки для встановлення.", + "hub_update_to": "Оновити до {version}", + "hub_update_must_be_online": "Щоб почати оновлення, хаб має бути онлайн.", + "hub_update_updating_to": "Оновлюємо до {version}...", + "hub_update_total": "Загалом", + "hub_update_task": "Завдання", + "hub_update_history": "Історія оновлень", + "hub_update_no_history": "Для цього хаба історії оновлень немає.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Початок", + "hub_update_col_message": "Повідомлення", + "hub_update_loading": "Завантажуємо інформацію про хаб...", + "hub_update_not_found": "Хаб не знайдено.", + "home_breadcrumb": "Головна", + "home_welcome": "З поверненням", + "home_welcome_name": "З поверненням, {name}", + "home_subtitle": "Ось огляд твого OpenShock.", + "home_hubs_online": "{count} онлайн", + "home_hub_status": "Стан хабів", + "home_no_hubs": "Немає хабів", + "home_all_online": "Усі онлайн", + "home_all_offline": "Усі офлайн", + "home_some_online": "{online}/{total} онлайн", + "home_quick_links": "Швидкі посилання", + "home_my_shockers": "Мої шокери", + "home_my_shockers_desc": "Керуй своїми шокерами", + "home_hubs_desc": "Керуй своїми хабами", + "home_shared_desc": "Шокери, якими з тобою поділилися", + "home_public_desc": "Керуй посиланнями доступу", + "home_get_started": "Початок роботи", + "home_get_started_desc": "У тебе ще немає хабів. Створи хаб, щоб підключити перший пристрій, а потім додай до нього шокери.", + "home_set_up_hub": "Налаштувати хаб", + "home_first_shocker": "Додай перший шокер", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "У тебе налаштовано {count} хаб. Додай шокер, щоб почати керування.", + "countPlural=few": "У тебе налаштовано {count} хаби. Додай шокер, щоб почати керування.", + "countPlural=many": "У тебе налаштовано {count} хабів. Додай шокер, щоб почати керування.", + "countPlural=other": "У тебе налаштовано {count} хаба. Додай шокер, щоб почати керування." + } + } + ], + "home_go_to_shockers": "До шокерів", + "profile_title": "Профіль", + "profile_coming_soon": "Профіль скоро буде", + "profile_coming_soon_desc": "Твій публічний профіль поки недоступний. Дані облікового запису є в Налаштуваннях.", + + "common_retry": "Повторити", + "common_never_used": "Не використовувався", + "common_expires": "Діє до {time}", + "common_search_placeholder": "Пошук...", + "common_unknown": "Невідомо", + "settings_breadcrumb_account": "Обліковий запис", + "account_subtitle": "Твої дані для входу та дії з обліковим записом.", + "account_change_username": "Змінити ім'я користувача", + "account_change_email": "Змінити пошту", + "account_change_password": "Змінити пароль", + "account_username_label": "Ім'я користувача", + "account_email_label": "Пошта", + "account_password_label": "Пароль", + "account_new_password_label": "Новий пароль", + "account_confirm_password_label": "Підтверди новий пароль", + "account_oauth_only": "Недоступно для облікових записів лише з OAuth", + "account_oauth_no_password": "Цей обліковий запис входить через OAuth і не має пароля.", + "account_diagnostics": "Діагностика", + "account_diagnostics_desc": "Допоможи нам виправляти збої та повільні запити до API. Звіти містять повідомлення про помилку, стек викликів і твою IP-адресу. Типово вимкнено.", + "account_diagnostics_level": "Рівень діагностики", + "account_telemetry_off": "Вимк.", + "account_telemetry_off_desc": "Нічого не надсилати.", + "account_telemetry_errors": "Помилки", + "account_telemetry_errors_desc": "Надсилати лише звіти про помилки браузера.", + "account_telemetry_full": "Повна", + "account_telemetry_full_desc": "Звіти про помилки та трасування запитів до API (без переходів між сторінками).", + "account_toast_deactivated": "Обліковий запис деактивовано", + "account_deactivate_title": "Деактивувати обліковий запис", + "account_deactivate_desc": "Точно деактивувати свій обліковий запис?", + "account_deactivate": "Деактивувати", + "account_email_title": "Зміна пошти", + "account_email_desc": "Введи нову адресу пошти й підтвердь поточним паролем.", + "account_email_toast_sent": "Лист для підтвердження надіслано на {email}. Перейди за посиланням у листі, щоб застосувати зміну.", + "account_new_email": "Нова пошта", + "account_current_password": "Поточний пароль", + "account_password_title": "Зміна пароля", + "account_password_desc": "Введи поточний пароль і вибери новий.", + "account_password_toast": "Пароль змінено", + "account_username_title": "Зміна імені користувача", + "account_username_desc": "Введи нове ім'я користувача.", + "account_new_username": "Нове ім'я користувача", + "account_username_toast": "Ім'я користувача змінено", + "tokens_subtitle": "API-токени використовуються для автентифікації в OpenShock API.", + "tokens_generate": "Створити токен", + "tokens_toast_refreshed": "Токени оновлено", + "tokens_empty_title": "Немає API-токенів", + "tokens_empty_desc": "Створи токен для автентифікації в OpenShock API.", + "tokens_created_on": "Створено {date}", + "tokens_last_used": "Востаннє використано {time}", + "tokens_never_expires": "Безстроковий", + "tokens_load_failed": "Не вдалося завантажити API-токени.", + "token_toast_edited": "Токен змінено", + "token_name_required": "Назва обов'язкова", + "token_name_too_long": "Назва задовга", + "token_edit_title": "Редагувати API-токен", + "token_name_label": "Назва токена", + "token_name_placeholder": "Назва токена...", + "token_permissions": "Дозволи", + "token_perm_category_shockers": "Шокери", + "token_perm_category_devices": "Хаби", + "token_perm_category_usershares": "Доступ користувачам", + "token_perm_category_publicshares": "Публічні посилання", + "token_perm_use": "Використання", + "token_perm_edit": "Редагувати", + "token_perm_pause": "Пауза", + "token_perm_auth": "Автентифікація", + "token_shocker_control": "Керування шокерами", + "token_toast_paused": "Токен призупинено", + "token_toast_resumed": "Токен відновлено", + "token_delete_title": "Видалити API-токен", + "token_delete_desc": "Точно видалити {#strong}{name}{/strong}?", + "token_delete_permanent": "Цю дію не можна скасувати. Токен буде видалено назавжди.", + "token_toast_deleted": "Токен видалено", + "token_resume": "Відновити токен", + "token_pause": "Призупинити токен", + "token_mode_clamp_desc": "Clamp: запити поза дозволеним діапазоном обмежуються найближчою межею (мінімумом або максимумом).", + "token_mode_lerp_desc": "Lerp: увесь вхідний діапазон лінійно масштабується, щоб вміститися в дозволений діапазон від мін. до макс.", + "token_paused_desc": "Призупинений токен не може надсилати команди керування шокерами.", + "token_intensity_range": "Діапазон інтенсивності", + "token_duration_range": "Діапазон тривалості", + "token_new_breadcrumb": "Новий", + "token_redirect_not_allowed": "Вказаний redirect_uri не дозволено. Дозволені лише loopback-адреси або власні схеми застосунків.", + "token_params_missing": "Бракує обов'язкових GET-параметрів. Переконайся, що вказано name, redirect_uri і permissions.", + "token_invalid_permissions": "Указано недійсні дозволи: {list}", + "token_toast_created": "Токен створено", + "token_request_title": "Запит API-токена", + "token_access_granted": "Доступ надано", + "token_shared_redirecting": "Токен створено й передано застосунку. Повертаємо тебе на {#b}{uri}{/b}.", + "token_not_redirected": "Якщо переспрямування не відбулося автоматично, скористайся кнопкою нижче.", + "token_finish": "Завершити", + "token_generated_title": "API-токен створено", + "token_copy_now": "Скопіюй свій API-токен зараз, пізніше переглянути його не вийде!", + "token_new_title": "Новий API-токен", + "token_external_desc": "Зовнішній застосунок запитує доступ до твого облікового запису. Переглянь і за потреби зміни дозволи нижче, перш ніж надати доступ.", + "token_new_desc": "Налаштуй і створи новий API-токен для свого облікового запису.", + "token_external_requesting": "{#b}{name}{/b} запитує API-токен. Твій токен буде передано застосунку за адресою {#b}{uri}{/b}.", + "token_allow": "Дозволити", + "token_generate": "Створити", + "token_deny": "Відхилити", + "sessions_subtitle": "Усі активні сеанси твого облікового запису. Відклич ті, яких не впізнаєш.", + "sessions_unknown_device": "Невідомий пристрій", + "sessions_toast_refreshed": "Сеанси оновлено", + "sessions_load_failed": "Не вдалося завантажити сеанси.", + "sessions_empty_title": "Немає активних сеансів", + "sessions_empty_desc": "Сеанси з'являться тут, щойно ти увійдеш із браузера чи застосунку.", + "sessions_last_seen": "Остання активність {time}", + "sessions_signed_in": "Вхід {time}", + "session_toast_revoked": "Сеанс відкликано", + "session_revoke_title": "Відкликати сеанс", + "session_revoke": "Відкликати", + "session_revoke_desc": "Точно відкликати цей сеанс?", + "session_revoke_from": "Вхід із {#strong}{ip}{/strong} через {#strong}{agent}{/strong}", + "connections_title": "OAuth-підключення", + "connections_subtitle": "Прив'язуй або відв'язуй сторонні облікові записи, щоб швидше входити й тримати профіль синхронізованим.", + "connections_toast_linked": "Обліковий запис прив'язано.", + "connections_toast_cancelled": "Прив'язування скасовано.", + "connections_toast_failed": "Не вдалося прив'язати.", + "connections_toast_removed": "Підключення видалено", + "connections_refreshing": "Оновлюємо…", + "connections_link_new": "Прив'язати провайдера", + "connections_empty_title": "Підключень поки немає", + "connections_empty_desc": "Натисни «Прив'язати провайдера» вище, щоб підключити доступних провайдерів.", + "connections_unlink": "Відв'язати", + "connections_load_failed": "Не вдалося завантажити OAuth-підключення.", + "connections_unlink_title": "Відв'язати {name}?", + "connections_unlink_title_generic": "Відв'язати цей обліковий запис?", + "connections_unlink_desc": "Ти більше не зможеш входити через цього провайдера, доки знову його не прив'яжеш.", + "provider_starting": "Запускаємо {name}...", + "provider_link": "Прив'язати {name}", + "audit_subtitle": "Важливі для безпеки дії у твоєму обліковому записі. Перевір усе, чого не впізнаєш.", + "audit_col_time": "Час", + "audit_col_action": "Дія", + "audit_col_details": "Деталі", + "audit_col_reason": "Причина", + "audit_col_ip": "IP-адреса", + "audit_col_device": "Пристрій", + "audit_action_login": "Вхід", + "audit_action_logout": "Вихід", + "audit_action_password_changed": "Пароль змінено", + "audit_action_email_change_requested": "Запит на зміну пошти", + "audit_action_email_changed": "Пошту змінено", + "audit_action_username_changed": "Ім'я користувача змінено", + "audit_action_api_token_created": "API-токен створено", + "audit_action_api_token_deleted": "API-токен видалено", + "audit_action_oauth_connected": "Підключення додано", + "audit_action_oauth_disconnected": "Підключення видалено", + "audit_action_account_deactivated": "Обліковий запис деактивовано", + "audit_action_account_reactivated": "Обліковий запис відновлено", + "audit_action_account_deleted": "Обліковий запис видалено", + "audit_action_automation_token_created": "Токен автоматизації створено", + "audit_action_automation_token_updated": "Токен автоматизації оновлено", + "audit_action_automation_token_rotated": "Токен автоматизації замінено", + "audit_action_automation_token_deleted": "Токен автоматизації видалено", + "audit_action_automation_token_used": "Токен автоматизації використано", + "audit_meta_session": "Сеанс {id}", + "audit_meta_changed": "{old} на {new}", + "audit_meta_email_requested": "Запит на зміну на {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} (видалено {count} обліковий запис)", + "countPlural=few": "{name} (видалено {count} облікові записи)", + "countPlural=many": "{name} (видалено {count} облікових записів)", + "countPlural=other": "{name} (видалено {count} облікового запису)" + } + } + ], + "audit_meta_scheduled_deletion": "Заплановано видалення", + "audit_meta_kept": "Збережено для відновлення", + + "common_view": "Переглянути", + "common_save": "Зберегти", + "common_saving": "Зберігаємо...", + "common_back": "Назад", + "common_shared_by": "Поділився", + "common_user_avatar": "Аватар користувача", + "common_toast_saved": "Зміни збережено", + "pause_reason_shocker": "Призупинено на рівні шокера", + "pause_reason_shocker_user_share": "Призупинено на рівні шокера й доступу користувача", + "pause_reason_shocker_public_share": "Призупинено на рівні шокера й публічного посилання", + "pause_reason_user_share": "Призупинено на рівні доступу користувача", + "pause_reason_public_share": "Призупинено на рівні публічного посилання", + "public_shares_subtitle": "Посилання, яким може скористатися будь-хто, без облікового запису.", + "public_shares_new": "Нове посилання", + "public_share_never_expires": "Безстроковий", + "public_shares_empty_title": "Публічних посилань поки немає", + "public_shares_empty_desc": "Створи посилання, через яке будь-хто зможе керувати твоїми шокерами.", + "public_share_expired": "Термін минув", + "public_share_no_expiry": "Безстрокове", + "public_share_label": "Публічне посилання", + "public_share_toast_created": "Публічне посилання створено", + "public_share_create_title": "Створити публічне посилання", + "public_share_toast_deleted": "Публічне посилання видалено", + "public_share_delete_title": "Видалити публічне посилання", + "public_share_delete_desc": "Точно видалити публічне посилання {#strong}{name}{/strong}?", + "public_share_edit_title": "Публічне посилання: {name}", + "public_share_edit_subtitle": "Редагування: зміни застосуються після збереження.", + "public_share_add_shocker": "Додати шокер", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "До посилання додано {count} шокер", + "countPlural=few": "До посилання додано {count} шокери", + "countPlural=many": "До посилання додано {count} шокерів", + "countPlural=other": "До посилання додано {count} шокера" + } + } + ], + "public_share_empty_shockers_title": "У цьому посиланні немає шокерів", + "public_share_empty_shockers_desc": "Додай шокер, і будь-хто з посиланням зможе ним керувати.", + "public_share_load_failed": "Помилка під час отримання даних публічного посилання", + "public_share_paused_here": "Призупинено для цього посилання", + "public_share_resume_shocker": "Відновити шокер", + "public_share_pause_shocker": "Призупинити шокер", + "public_share_remove": "Прибрати з посилання", + "public_share_toast_removed": "Шокер прибрано з посилання", + "public_share_add_title": "Додати шокери", + "public_share_add_desc": "Додай шокери до цього публічного посилання. Ліміти можна задати після додавання.", + "public_share_add_placeholder": "Обери шокери для доступу...", + "public_share_add_no_match": "Немає відповідних шокерів", + "public_share_add_submit": "Додати шокери", + "public_share_view_loading": "Завантажуємо дані посилання...", + "public_share_view_title": "Публічне посилання", + "public_share_view_desc": "Увійди як гість або з обліковим записом OpenShock", + "public_share_view_guest_name": "Ім'я гостя", + "public_share_view_enter": "Увійти", + "public_share_view_enter_guest": "Увійти як гість", + "public_share_login": "Увійти", + "perm_shock_on": "Удар увімкнено", + "perm_shock_off": "Удар вимкнено", + "perm_vibrate_on": "Вібрацію увімкнено", + "perm_vibrate_off": "Вібрацію вимкнено", + "perm_sound_on": "Звук увімкнено", + "perm_sound_off": "Звук вимкнено", + "perm_live_on": "Live увімкнено", + "perm_live_off": "Live вимкнено", + "perm_live_control": "Live Control", + "user_selector_avatar_of": "Аватар {name}", + "user_selector_placeholder": "Введи ім'я користувача", + "user_selector_aria": "Ім'я користувача для пошуку", + "user_selector_search": "Знайти користувача", + "user_selector_found": "Користувача знайдено", + + "common_remove": "Прибрати", + "user_shares_subtitle": "Прямий постійний доступ для інших користувачів.", + "user_shares_toast_invited": "Запрошення до шокера надіслано {name}", + "user_shares_redeem": "Ввести код", + "user_shares_new": "Нове посилання", + "user_shares_tab_shares": "Доступи", + "user_shares_tab_incoming": "Доступні мені", + "user_shares_tab_invites": "Запрошення", + "share_code_create_title": "Новий код доступу", + "share_code_create_desc": "Створи код доступу або запрошення", + "share_code_shocker_placeholder": "Обери шокери для доступу...", + "share_code_no_match": "Немає відповідних шокерів", + "share_code_send_invite": "Надіслати запрошення", + "share_code_create": "Створити код доступу", + "share_code_created_title": "Код доступу створено", + "share_code_created_desc": "Скопіюй код доступу або посилання з кодом!", + "share_code_redeem_title": "Активувати код доступу", + "share_code_redeem_desc": "Введи код доступу, щоб активувати його", + "share_code_redeem_placeholder": "Введи код доступу", + "share_code_redeemed": "Код активовано!", + "share_code_shared_shockers": "Спільні шокери", + "share_code_redeeming": "Активуємо...", + "share_code_redeem": "Активувати", + "incoming_shares_empty_title": "З тобою нічим не поділилися", + "incoming_shares_empty_desc": "Поки ніхто не поділився з тобою шокером.", + "incoming_share_toast_removed": "Доступ від {name} прибрано", + "incoming_share_remove_title": "Прибрати доступ", + "incoming_share_remove_desc": "Точно прибрати доступ від {#strong}{name}{/strong}?", + "incoming_share_toast_removed_shocker": "Прибрано {shocker}, яким поділився {name}", + "incoming_share_remove_shocker_title": "Прибрати цей спільний шокер?", + "incoming_share_remove_shocker_desc": "Точно прибрати доступ до шокера {#strong}{shocker}{/strong} від {#strong}{name}{/strong}?", + "incoming_share_manage_from": "Керування доступом від", + "share_remove": "Прибрати доступ", + "invites_empty_title": "Запрошень поки немає", + "invites_empty_desc": "У тебе немає вхідних чи вихідних запрошень.", + "invites_outgoing": "Вихідні", + "invites_outgoing_empty_title": "Немає вихідних запрошень", + "invites_outgoing_empty_desc": "У тебе немає вихідних запрошень.", + "invites_incoming": "Вхідні", + "invites_incoming_empty_title": "Немає вхідних запрошень", + "invites_incoming_empty_desc": "У тебе немає вхідних запрошень.", + "invite_toast_accepted": "Запрошення від {name} прийнято", + "invite_toast_declined": "Запрошення від {name} відхилено", + "invite_deny_title": "Відхилити запрошення", + "invite_deny_label": "Відхилити запрошення", + "invite_deny": "Відхилити", + "invite_deny_desc": "Точно відхилити запрошення від {#strong}{name}{/strong}?", + "invite_accept": "Прийняти", + "invite_toast_cancelled_for": "Запрошення для {name} ({id}) скасовано", + "invite_toast_cancelled": "Запрошення {id} скасовано", + "invite_cancel_title": "Скасувати запрошення", + "invite_cancel": "Скасувати", + "invite_cancel_for_desc": "Точно скасувати запрошення для {#strong}{name}{/strong}?", + "invite_cancel_code_desc": "Точно скасувати запрошення з кодом {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Скасувати активне запрошення", + "outgoing_shares_empty_title": "Немає спільних шокерів", + "outgoing_shares_empty_desc": "Ти ще не поділився жодним шокером з іншими користувачами.", + "outgoing_share_toast_removed": "Доступ до шокера {name} прибрано", + "outgoing_share_remove_title": "Припинити доступ до цього шокера?", + "outgoing_share_editing_for": "Редагування доступу для", + "outgoing_share_limits": "Ліміти й дозволи", + "outgoing_share_same": "Однакові обмеження для всіх шокерів", + "outgoing_share_per_desc": "Окремі обмеження для кожного шокера", + "outgoing_share_all": "Усі", + "outgoing_share_per": "Окремо", + + "outgoing_share_remove_desc": "Точно припинити доступ {#strong}{name}{/strong} до {#strong}{shocker}{/strong}?", + + "report_breadcrumb": "Повідомити про токени", + "report_toast_clipboard_failed": "Не вдалося прочитати буфер обміну: {error}", + "report_title": "Повідомити про витік API-токенів", + "report_paste": "Вставити з буфера", + "report_warning": "Ця форма лише для повідомлень про випадковий витік API-токенів.", + "report_abuse_warning": "Навмисне зловживання призведе до блокування або суворих обмежень доступу до ендпоінтів.", + "report_detected": "Знайдені токени", + "report_invalid": "Один або кілька токенів схожі на недійсні. Перевір форматування.", + "report_acknowledge": "Я підтверджую, що розумію призначення цієї функції, і беру на себе відповідальність.", + "report_submit": "Надіслати звіт", + "turnstile_disabled": "Turnstile вимкнено", + "common_internal_error": "Внутрішня помилка", + "resend_toast_sent": "Лист для активації надіслано. Перевір вхідні та папку «Спам».", + "resend_toast_throttled": "Запитано забагато листів для активації. Спробуй пізніше.", + "resend_toast_unavailable": "З цього браузера не можна повторно надіслати лист для активації. Якщо обліковий запис ще не активовано, увійди, і ми надішлемо нове посилання.", + "resend_button": "Не отримав листа? Надіслати ще", + "expiration_label": "Термін дії", + "expiration_never": "Ніколи", + "expiration_custom": "Свій", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} день", + "countPlural=few": "{count} дні", + "countPlural=many": "{count} днів", + "countPlural=other": "{count} дня" + } + } + ], + "expiration_required": "Дата закінчення обов'язкова", + "expiration_never_desc": "Без терміну дії", + "expiration_expires_at": "Діє до {time} ({date})", + "date_picker_placeholder": "Обери дату", + "telemetry_toast_title": "Допоможеш покращити OpenShock?", + "telemetry_toast_desc": "Надсилай діагностику, щоб допомогти нам виправляти збої та повільні запити до API. Звіти містять повідомлення про помилку, стек викликів і твою IP-адресу. Це можна змінити будь-коли в налаштуваннях облікового запису.", + "telemetry_toast_no": "Ні, дякую", + "telemetry_toast_errors": "Лише помилки", + "telemetry_toast_full": "Повна", + "table_show_details": "Показати деталі", + "table_hide_details": "Сховати деталі", + "table_no_results": "Немає результатів.", + "table_sort_asc": "Сортувати за {name}, за зростанням", + "table_sort_desc": "Сортувати за {name}, за спаданням", + "table_sort_none": "Сортувати за {name}, без сортування", + "cell_na": "Н/Д", + "cell_not_applicable": "Не застосовується", + "cell_invalid": "Недійсне", + "cell_unavailable": "Недоступно", + "cell_none": "Немає", + "oauth_login_with": "Увійти через {provider}", + "oauth_signup_with": "Реєстрація через {provider}", + "signalr_connect_failed": "Не вдалося підключитися до сервера!", + "signalr_disconnect_failed": "Помилка під час від'єднання від сервера!", + "signalr_invalid_update": "Від сервера отримано недійсне оновлення!", + "signalr_invalid_log": "Від сервера отримано недійсні дані журналу!", + "signalr_invalid_ota": "Від сервера отримано недійсні дані оновлення прошивки!", + "ota_toast_failed": "Не вдалося оновити прошивку хаба: {message}", + "ota_toast_succeeded": "Прошивку хаба успішно оновлено!", + "ota_toast_rolled_back": "Прошивку хаба повернуто до попередньої версії", + "lcg_connect_failed": "Не вдалося підключитися до шлюзу Live Control", + "terminal_toast_bootloader_failed": "Не вдалося увійти в завантажувач: {error}", + "terminal_toast_app_mode_failed": "Не вдалося увійти в режим застосунку: {error}", + + "problem_account_account_not_activated_title": "Обліковий запис не активовано", + "problem_account_account_not_activated_desc": "Пошукай лист для активації у вхідних.", + "problem_account_activation_not_found_title": "Посилання для активації недійсне", + "problem_account_activation_not_found_desc": "Можливо, посилання застаріло або його вже використано.", + "problem_account_activation_resend_too_many_title": "Запитано забагато листів для активації", + "problem_account_activation_resend_too_many_desc": "Зачекай трохи, перш ніж пробувати знову.", + "problem_account_activation_resend_unavailable_title": "Не вдалося повторно надіслати лист для активації", + "problem_account_activation_resend_unavailable_desc": "Увійди ще раз, щоб запитати нове посилання для активації.", + "problem_account_deactivate_already_deactivated_title": "Обліковий запис уже деактивовано", + "problem_account_deactivate_denied_privileged_title": "Привілейовані облікові записи не можна деактивувати", + "problem_account_deactivate_unauthorized_title": "Тобі не дозволено це робити", + "problem_account_deactivated_title": "Цей обліковий запис деактивовано", + "problem_account_email_already_in_use_title": "Ця адреса пошти вже використовується", + "problem_account_email_invalid_title": "Ця адреса пошти недійсна", + "problem_account_email_taken_title": "Ця адреса пошти вже використовується", + "problem_account_email_too_many_requests_title": "Забагато запитів на зміну пошти", + "problem_account_email_too_many_requests_desc": "Зачекай трохи, перш ніж пробувати знову.", + "problem_account_email_unchanged_title": "Це вже твоя адреса пошти", + "problem_account_email_verify_not_found_title": "Посилання для підтвердження недійсне", + "problem_account_email_verify_not_found_desc": "Можливо, посилання застаріло або його вже використано.", + "problem_account_o_auth_only_title": "Цей обліковий запис не має пароля", + "problem_account_o_auth_only_desc": "Увійди через провайдера, з яким реєструвався.", + "problem_account_password_not_set_title": "Пароль не встановлено", + "problem_account_password_not_set_desc": "Цей обліковий запис входить через зовнішнього провайдера.", + "problem_account_password_old_password_invalid_title": "Поточний пароль неправильний", + "problem_account_username_invalid_title": "Таке ім'я користувача не дозволено", + "problem_account_username_recently_changed_title": "Ім'я користувача змінено надто нещодавно", + "problem_account_username_recently_changed_desc": "Ім'я користувача можна змінювати раз на 7 днів.", + "problem_account_username_taken_title": "Це ім'я користувача вже зайняте", + "problem_admin_user_deactivated_title": "Цього користувача деактивовано", + "problem_admin_user_not_activated_title": "Цей користувач ще не активований", + "problem_api_token_can_only_delete_self_title": "API-токен може видалити лише сам себе", + "problem_api_token_not_found_title": "API-токен не знайдено", + "problem_api_token_paused_title": "Цей API-токен призупинено", + "problem_assign_lcg_bad_schema_version_title": "Непідтримувана версія протоколу хаба", + "problem_assign_lcg_bad_schema_version_desc": "Онови прошивку хаба, щоб під'єднатися.", + "problem_assign_lcg_no_lcg_available_title": "Немає доступного шлюзу", + "problem_assign_lcg_no_lcg_available_desc": "Зараз немає доступного шлюзу живого керування. Спробуй пізніше.", + "problem_authentication_account_deactivated_title": "Цей обліковий запис деактивовано", + "problem_authentication_account_not_activated_title": "Цей обліковий запис не активовано", + "problem_authentication_cookie_missing_or_invalid_title": "Ти не ввійшов", + "problem_authentication_cookie_missing_or_invalid_desc": "Можливо, твій сеанс закінчився. Увійди ще раз.", + "problem_authentication_header_missing_or_invalid_title": "Недійсний API-токен", + "problem_authentication_session_invalid_title": "Сеанс закінчився", + "problem_authentication_session_invalid_desc": "Увійди ще раз.", + "problem_authentication_token_invalid_title": "Недійсний API-токен", + "problem_authentication_unknown_error_title": "Помилка автентифікації", + "problem_authorization_policy_not_met_title": "У тебе немає дозволу на це", + "problem_authorization_token_only_title": "Для цієї дії потрібен API-токен", + "problem_authorization_token_permission_missing_title": "Цьому API-токену бракує потрібного дозволу", + "problem_authorization_unknown_error_title": "Помилка авторизації", + "problem_authorization_user_session_only_title": "Для цієї дії потрібно ввійти в обліковий запис", + "problem_automation_token_not_allowed_for_account_title": "Токени автоматизації не можна використовувати з привілейованими обліковими записами", + "problem_configuration_already_exists_title": "Запис конфігурації з такою назвою вже існує", + "problem_configuration_invalid_name_format_title": "Недійсна назва конфігурації", + "problem_configuration_invalid_name_format_desc": "Дозволено лише літери від A до Z і підкреслення.", + "problem_configuration_invalid_value_format_title": "Значення не відповідає типу конфігурації", + "problem_configuration_not_found_title": "Запис конфігурації не знайдено", + "problem_control_stats_invalid_range_title": "Початкова дата не може бути пізнішою за кінцеву", + "problem_control_stats_invalid_time_zone_title": "Невідомий часовий пояс", + "problem_control_stats_missing_capability_title": "Статистика керування недоступна на цьому сервері", + "problem_device_not_found_title": "Хаб не знайдено", + "problem_device_not_online_title": "Хаб офлайн", + "problem_device_too_many_hubs_title": "Ти досяг максимальної кількості хабів", + "problem_device_too_many_shockers_title": "Цей хаб досяг максимальної кількості шокерів", + "problem_endpoint_retired_title": "Ця функція більше недоступна", + "problem_expression_error_title": "Недійсний вираз фільтра", + "problem_internal_server_error_title": "Щось пішло не так на нашому боці", + "problem_login_invalid_credentials_title": "Неправильне ім'я користувача або пароль", + "problem_login_invalid_domain_title": "Вхід із цієї адреси не дозволено", + "problem_o_auth_connection_already_exists_title": "Твій обліковий запис уже підключено до цього провайдера", + "problem_o_auth_connection_already_linked_title": "Цей зовнішній обліковий запис уже прив'язано до іншого користувача", + "problem_o_auth_flow_anonymous_only_title": "Ти вже ввійшов", + "problem_o_auth_flow_mismatch_title": "Спроба входу не збігається", + "problem_o_auth_flow_mismatch_desc": "Почни спочатку.", + "problem_o_auth_flow_missing_data_title": "Провайдер не повернув дані твого облікового запису", + "problem_o_auth_flow_missing_data_desc": "Спробуй ще раз.", + "problem_o_auth_flow_not_found_title": "Час спроби входу минув", + "problem_o_auth_flow_not_found_desc": "Почни спочатку.", + "problem_o_auth_flow_unsupported_title": "Непідтримуваний спосіб входу", + "problem_o_auth_internal_error_title": "Під час входу щось пішло не так", + "problem_o_auth_internal_error_desc": "Спробуй ще раз за мить.", + "problem_o_auth_link_authenticated_user_only_title": "Щоб прив'язати зовнішній обліковий запис, потрібно ввійти", + "problem_o_auth_provider_mismatch_title": "Спроба входу не відповідає провайдеру", + "problem_o_auth_provider_mismatch_desc": "Почни спочатку.", + "problem_o_auth_provider_unsupported_title": "Цей провайдер входу не підтримується", + "problem_pair_code_not_found_title": "Код сполучення не знайдено", + "problem_password_reset_not_found_title": "Посилання для скидання пароля недійсне", + "problem_password_reset_not_found_desc": "Можливо, посилання застаріло або його вже використано.", + "problem_session_not_found_title": "Сеанс не знайдено", + "problem_share_get_no_shares_title": "У тебе немає спільного доступу з цим користувачем", + "problem_share_request_create_cannot_share_with_self_title": "Не можна поділитися із самим собою", + "problem_share_request_create_shocker_not_found_title": "Один або кілька шокерів не знайдено", + "problem_share_request_create_shocker_not_found_desc": "Можливо, їх видалено або вони тобі не належать.", + "problem_share_request_not_found_title": "Запрошення не знайдено", + "problem_share_user_not_found_title": "Доступ не знайдено", + "problem_share_code_already_linked_title": "Шокер уже прив'язано до твого облікового запису", + "problem_share_code_cant_link_own_share_code_title": "Не можна активувати власний код доступу", + "problem_share_code_not_found_title": "Код доступу не знайдено", + "problem_share_link_expiry_date_in_past_title": "Дата закінчення не може бути в минулому", + "problem_share_link_not_found_title": "Публічне посилання не знайдено", + "problem_share_link_shocker_already_in_share_link_title": "Шокер уже є в цьому публічному посиланні", + "problem_share_link_shocker_not_in_share_link_title": "Шокера немає в цьому публічному посиланні", + "problem_shocker_control_no_permission_title": "У тебе немає дозволу керувати цим шокером", + "problem_shocker_control_not_found_title": "Шокер не знайдено", + "problem_shocker_control_paused_title": "Шокер призупинено", + "problem_shocker_not_found_title": "Шокер не знайдено", + "problem_signup_registration_disabled_title": "Реєстрацію зараз вимкнено", + "problem_signup_username_or_email_exists_title": "Це ім'я користувача або пошта вже використовується", + "problem_turnstile_invalid_title": "Перевірка не пройдена", + "problem_turnstile_invalid_desc": "Пройди перевірку ще раз і повтори спробу.", + "problem_user_not_found_title": "Користувача не знайдено", + "problem_user_privileged_delete_denied_title": "Привілейованих користувачів не можна видалити", + "problem_validation_error_title": "Деякі поля заповнено неправильно", + "problem_webhook_not_found_title": "Вебхук не знайдено", + "problem_webhook_unsupported_title": "Підтримуються лише вебхуки Discord", + "problem_webhook_unsupported_desc": "Використовуй URL discord.com, а не canary чи ptb.", + + "error_too_many_requests": "Забагато запитів", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Спробуй ще раз через {seconds} секунду.", + "secondsPlural=few": "Спробуй ще раз через {seconds} секунди.", + "secondsPlural=many": "Спробуй ще раз через {seconds} секунд.", + "secondsPlural=other": "Спробуй ще раз через {seconds} секунди." + } + } + ], + "error_unexpected_response": "Неочікувана відповідь сервера", + "error_internal": "Сталася внутрішня помилка", + "error_network": "Сталася помилка мережі", + + "dev_banner": "Це {#b}ТЕСТОВЕ{/b} середовище OpenShock. {#u}Дані не зберігаються{/u} і регулярно перезаписуються даними з продакшену.", + "firmware_channel_bugs_warning": "Цей канал може містити помилки." +} diff --git a/messages/uwu.json b/messages/uwu.json new file mode 100644 index 00000000..9f300eae --- /dev/null +++ b/messages/uwu.json @@ -0,0 +1,1126 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "Da go-to pwatfowm fow safe, wewiabwe, weaw wow-watency wemote shocking uwu.", + "landing_section_label": "Home den", + "landing_hubs_online": "Hubs onwine wight now: ", + "landing_learn_more": "Weawn mowe", + "landing_wiki": "Wiki", + "landing_meta_description": "Wecome to OpenShock uwu, a fwee and open-souwce ecosystem to contwol vawious shock cowwaws ovew da intewnet.", + "instance_meta_description": "Wecome to {siteName} uwu, an independent instance of OpenShock, a fwee and open-souwce ecosystem to contwol vawious shock cowwaws ovew da intewnet.", + "header_sidebar_toggle": "Fwip the sidebar~", + "header_avatar_alt": "{name}'s adorable little face ♡", + "header_menu_profile": "My fursona ✨", + "header_menu_settings": "Settings~", + "header_menu_logout": "Log out (you'll come back, right? *pouts*)", + "header_login": "Log in~", + "header_signup": "Join the pack! ♡", + "header_github_title": "OpenShock on GitHub~", + "header_discord_title": "Come hang out in our Discord den, cutie!", + + "footer_made_with": "Made with lots of {#heart/} by the {#team}OpenShock pack{/team} *wags tail happily*", + "footer_connection_status_label": "Is the server still there? *pokes gently*", + "footer_signalr_state": "SignalR vibes ✨", + "footer_frontend_version": "Frontend version", + "footer_frontend_commit_title": "Commit {commit} >w<", + "footer_backend_version": "Backend version", + "footer_backend_commit_title": "Commit {commit} >w<", + "footer_language_label": "Language~", + + "sidebar_home_link_label": "OpenShock home den", + "sidebar_group_general": "General stuffs", + "sidebar_home": "Home den", + "sidebar_shockers": "Zappy fwiends ⚡", + "sidebar_shared_shockers": "Zappy fwiends I borrowed hehe", + "sidebar_hubs": "Hubbies", + "sidebar_user_shares": "Sharing with fwiends ♡", + "sidebar_public_shares": "Sharing with everyone", + "sidebar_serial_terminal": "Serial terminal (beep boop~)", + "sidebar_group_admin": "Pack leader 👑", + "sidebar_admin_monitoring": "Keeping watch", + "sidebar_admin_online_hubs": "Hubbies who are awake", + "sidebar_admin_online_gateways": "Gateways who are awake", + "sidebar_admin_management": "Pack business", + "sidebar_admin_users": "Every lil fwiend", + "sidebar_admin_blacklists": "No-no lists", + "sidebar_admin_webhooks": "Web hookies", + "sidebar_admin_mail": "Love letters 💌", + "sidebar_admin_automation_tokens": "Robot tokens", + "sidebar_admin_configuration": "Knobs and dials", + "sidebar_group_settings": "Settings~", + "sidebar_settings_api_tokens": "API tokies", + "sidebar_settings_sessions": "Where I'm logged in", + "sidebar_settings_audit_log": "What I've been up to (no peeking!)", + "sidebar_settings_connections": "Linked accounts", + "sidebar_settings_account": "My account stuffs ✨", + + "error_meta_title": "OpenShock is taking a beauty nap", + "error_meta_description": "OpenShock is snoozing right now, pwease try again in a bit~", + "error_meta_logo_alt": "OpenShock logo", + "error_fallback_message": "Oopsie woopsie! Something went wrong! *flustered*", + "error_not_found_message": "This page wandered off! *sniff sniff*", + "error_not_found_description": "I sniffed everywhere, but this page doesn't exist... *sad ear flop*", + "error_unexpected_description": "Something unexpected happened! *hides behind fluffy tail*", + "error_go_back": "Go back~", + + "auth_layout_logo_alt": "OpenShock logo", + "auth_layout_invalid_redirect_removed": "Eep! I found a sketchy redirect link and chewed it up to keep you safe! *protective growl*", + + "auth_activate_breadcrumb": "Wake up account", + "auth_activate_title": "Wake up your account~", + "auth_activate_activating": "Waking up your account... *big sleepy stretch*", + "auth_activate_success": "Your account is wide awake! Yay~ ♡", + "auth_activate_failed": "This link is broken or too old... *whimpers*", + "auth_activate_missing_token": "The activation token wandered off somewhere... *pouts*", + "auth_activate_continue": "Onward to login!", + "auth_activate_toast_success": "Account activated! *happy tail wags*", + + "auth_forgot_breadcrumb": "Forgot pawsword", + "auth_forgot_title": "Forgot your pawsword? Silly~", + "auth_forgot_description": "Tell me your email and I'll fetch you a reset link!", + "auth_forgot_email_label": "Email", + "auth_forgot_email_placeholder": "Email", + "auth_forgot_submit": "Fetch reset link!", + "auth_forgot_signin_prompt": "Remembered it after all? {#signin}Log in~{/signin}", + "auth_forgot_mail_disabled": "Sowwy, this den has no mailbox set up, so I can't send reset links... *fidgets* Pwease ask your pack leader (the admin) to help you get back in!", + "auth_forgot_toast_sent": "Reset link fetched and sent to your email! *drops it at your feet*", + + "auth_login_breadcrumb": "Log in", + "auth_login_title": "Welcome back, cutie! ♡", + "auth_login_loading_methods": "Sniffing out ways to log in...", + "auth_login_choose_method": "Pick your favorite way to log in~", + "auth_login_with_account": "Log in with your OpenShock account", + "auth_login_activation_after_signup": "Your account is ready! I sent a wake-up link to your email. Check your inbox, and peek in the spam folder too~", + "auth_login_activation_pending": "Your account is still sleepy and not activated yet! I sent a wake-up link to your email. Check your inbox and spam folder. If nothing shows up, try logging in again later and I'll send a fresh one!", + "auth_login_oauth_only": "This account doesn't have a pawsword! Log in with the service you signed up with~", + "auth_login_oauth_only_with_buttons": "This account doesn't have a pawsword! Log in with the service you signed up with, using the buttons up there~", + "auth_login_or_continue_with": "Or continue with", + "auth_login_username_label": "Username or email", + "auth_login_password_label": "Pawsword (no peeking!)", + "auth_login_submit": "Log in~", + "auth_login_signup_prompt": "Not in the pack yet? {#signup}Join us, cutie!{/signup}", + "auth_login_legal": "By pressing Log in, you pinky-paw promise to follow our {#tos}Terms of Service{/tos} and our {#privacy}Privacy Policy{/privacy}. ♡", + + "auth_oauth_create_breadcrumb": "Join with {provider}", + "auth_oauth_create_title": "Join the pack with {#provider}{provider}{/provider}! ✨", + "auth_oauth_create_description": "Just a few more details and you're in~", + "auth_oauth_create_username_label": "Username", + "auth_oauth_create_username_placeholder": "Username", + "auth_oauth_create_email_label": "Email", + "auth_oauth_create_email_placeholder": "Email", + "auth_oauth_create_submit": "Join the pack! ♡", + "auth_oauth_create_legal": "By pressing Join the pack, you pinky-paw promise to follow our {#tos}Terms of Service{/tos} and our {#privacy}Privacy Policy{/privacy}. ♡", + + "auth_oauth_error_breadcrumb": "Login oopsie", + "auth_oauth_error_title": "Uh oh, login oopsie! *blushes*", + "auth_oauth_error_back": "Back to login", + + "auth_reset_breadcrumb": "Reset pawsword", + "auth_reset_title": "Reset pawsword", + "auth_reset_checking": "Sniffing your reset link...", + "auth_reset_choose_password": "Pick a shiny new pawsword~ ✨", + "auth_reset_invalid": "This reset link is broken or too old... *whimpers*", + "auth_reset_password_label": "New pawsword", + "auth_reset_password_placeholder": "New pawsword", + "auth_reset_confirm_label": "New pawsword again", + "auth_reset_confirm_placeholder": "New pawsword again", + "auth_reset_submit": "Reset pawsword!", + "auth_reset_request_new": "Fetch a new reset link", + "auth_reset_toast_success": "Pawsword reset! Don't forget it this time, silly~ hehe", + + "auth_signup_breadcrumb": "Join the pack", + "auth_signup_toast_created_mail": "Yay, account made! Check your email to verify it~", + "auth_signup_toast_created_no_mail": "Yay, account made! You can log in right away~", + "auth_signup_dialog_title": "Welcome to the pack!! Thank you for joining! ❤️ *nuzzles and twirls*", + "auth_signup_dialog_created_mail": "Your account is made! 🎉 Check your email to verify it~", + "auth_signup_dialog_verify_then_login": "Once your email is verified, you can hop right in!", + "auth_signup_dialog_created_no_mail": "Your account is made and ready to go! 🎉 *happy wiggle*", + "auth_signup_dialog_login_now": "You can log in right now~", + "auth_signup_title": "Join the pack! ♡", + "auth_signup_loading_methods": "Sniffing out ways to sign up...", + "auth_signup_using_email": "Signing up with email~", + "auth_signup_choose_method": "How do you wanna join the pack, cutie?", + "auth_signup_back": "Back", + "auth_signup_username_label": "Username", + "auth_signup_username_placeholder": "Fluffy McShockface", + "auth_signup_email_label": "Email", + "auth_signup_email_placeholder": "fluffy@example.com", + "auth_signup_password_label": "Pawsword", + "auth_signup_password_placeholder": "Pawsword", + "auth_signup_confirm_label": "Pawsword again", + "auth_signup_confirm_placeholder": "Pawsword again", + "auth_signup_submit": "Join the pack! ♡", + "auth_signup_signin_prompt": "Already in the pack? {#signin}Log in~{/signin}", + "auth_signup_or": "Or", + "auth_signup_with_email": "Join with email", + "auth_signup_legal": "By pressing Join the pack, you pinky-paw promise to follow our {#tos}Terms of Service{/tos} and our {#privacy}Privacy Policy{/privacy}. ♡", + + "auth_verify_breadcrumb": "Verify email", + "auth_verify_title": "Verify your email", + "auth_verify_verifying": "Sniffing your email address...", + "auth_verify_success": "Your email is verified! *happy bouncing* ✨", + "auth_verify_failed": "This verification link is broken or too old... *whimpers*", + "auth_verify_missing_token": "The verification token wandered off somewhere... *pouts*", + "auth_verify_continue": "Onward to login!", + "auth_verify_toast_success": "Email verified! *wags*", + + "common_cancel": "Nevermind~", + "common_delete": "Delete *gulp*", + "common_edit": "Edit~", + "common_share": "Share with fwiends ♡", + "common_copy_id": "Copy ID~", + "common_id_copied": "ID tucked into your clipboard~ ♡", + "common_open_menu": "Open menu~", + "common_refresh": "Freshen up~", + "common_settings": "Settings~", + "common_clear": "Clear it all~", + "common_online": "Awake ✨", + "common_offline": "Sleepy 💤", + "common_paused": "Napping~", + "common_resume": "Wake up!", + "common_resuming": "Waking up... *yawn*", + "common_coming_soon": "(Coming soon, hehe~)", + "common_save_changes": "Save it~ ♡", + "common_danger_zone": "The spooky zone ⚠️", + "common_name": "Name~", + "control_intensity": "Oomph", + "control_duration": "Time~", + "control_max_intensity": "Max oomph", + "control_max_duration": "Max time", + "control_vibration": "Bzzz", + "control_value": "Value", + "control_live_intensity": "Live oomph", + "control_type_stop": "Stop!", + "control_type_shock": "Zap ⚡", + "control_type_vibrate": "Bzzz", + "control_type_sound": "Beep boop", + "live_tooltip_active": "Live through {gateway} ({country}), {latency}ms, zoom zoom~", + "live_tooltip_connecting": "Connecting... *paws crossed*", + "live_tooltip_connect": "Go live, cutie!", + "live_tooltip_hub_start": "Ctrl+click to wake up the whole hubby~", + "live_tooltip_hub_stop": "Ctrl+click to tuck the whole hubby in~", + "pause_resume_shocker": "Wake up this zappy fwiend", + "pause_pause_shocker": "Let this zappy fwiend nap", + "pause_resume_all": "Wake up every zappy fwiend", + "pause_pause_all": "Nap time for every zappy fwiend", + "shocker_label": "Zappy fwiend", + "shocker_hub": "Hubby", + "shocker_select_hub": "Pick a hubby~", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID has to be a whole number from {min} to {max}, silly~", + "shocker_model": "Model~", + "shocker_select_model": "Pick a model~", + "shocker_name_placeholder": "What's its name?", + "shocker_menu_view_logs": "Peek at the logs", + "shocker_delete_title": "Say bye-bye to this shocker", + "shocker_delete_desc": "Are you suuure you wanna say bye-bye to \"{name}\"? It can never come back... *sniffles*", + "shocker_toast_deleted": "\"{name}\" waved bye-bye~ *sad tail droop*", + "shocker_toast_paused": "Shhh, it's napping now~", + "shocker_toast_resumed": "It's awake and ready! *twirls*", + "shocker_add_desc": "Bring a new zappy fwiend home to one of your hubbies~", + "shocker_add_name_placeholder": "Sir Zaps-a-Lot", + "shockers_title": "Zappy fwiends ⚡", + "shockers_subtitle": "All the zappy fwiends cuddled up with your hubbies~", + "shockers_loading": "Rounding up the zappy fwiends...", + "shockers_toast_refreshed": "All fresh and fluffy! ✨", + "shockers_toast_need_hub": "Your zappy fwiends need a hubby to live in first! Make one~", + "shockers_toast_added": "A new zappy fwiend joined the pack! ♡", + "shockers_unknown_module": "Huh? I don't know this module... *tilts head*", + "shockers_add": "Add a zappy fwiend", + "shockers_view_mode": "How it looks~", + "shockers_mode_classic": "Classic~", + "shockers_mode_rich": "Fancy ✨", + "shockers_mode_simple": "Simple~", + "shockers_mode_map": "Map 🗺️", + "shockers_group_by_hub": "Snuggle by hubby", + "shockers_global_limits": "Global limits", + "shockers_logs_label": "Logs~", + "shockers_empty_title": "No zappy fwiends yet... *pouts*", + "shockers_empty_no_hubs": "Make a hubby first, then invite some zappy fwiends over~", + "shockers_empty_has_hubs": "Give one of your hubbies a zappy fwiend to get started!", + "shockers_create_hub": "Make a hubby!", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} zappy fwiend", + "countPlural=other": "{count} zappy fwiends" + } + } + ], + "shared_shockers_title": "Zappy fwiends I borrowed hehe", + "shared_shockers_subtitle": "Zappy fwiends other cuties are letting you borrow~", + "shared_shockers_empty_title": "Nobody's shared their zappy fwiends with you yet... *sniff*", + "shared_shockers_empty_desc": "When a cutie shares theirs, they'll pop up right here! ♡", + "shocker_logs_title": "Zappy diary 📖", + "shocker_logs_subtitle": "Every little boop your zappy fwiends got~", + "shocker_logs_live_title": "New boops show up the moment they happen!", + "shocker_logs_paused_title": "Live updates nap while you sort or peek past the first page~", + "shocker_logs_live": "Live ✨", + "shocker_logs_col_time": "When", + "shocker_logs_col_type": "What", + "shocker_logs_col_by": "Who", + "shocker_logs_filter_label": "Pick a zappy fwiend", + "shocker_logs_filter_placeholder": "Sniff out a shocker...", + "shocker_logs_filter_all": "Every zappy fwiend", + "shocker_logs_filter_none": "Couldn't sniff any out... *sad*", + "shocker_edit_title": "Groom this zappy fwiend", + "shocker_edit_subtitle": "Brush its fur, give it a new name, or say goodbye~", + "shocker_edit_back": "Back to the zappy fwiends", + "shocker_edit_load_failed": "Couldn't fetch this shocker... *whimpers*", + "shocker_edit_loading": "Fetching your zappy fwiend...", + "shocker_edit_details_title": "All about this cutie", + "shocker_edit_details_desc": "Change its name, RF ID, and model~", + "shocker_edit_pause_state": "Nap status", + "shocker_edit_is_paused": "Taking a little nap 💤", + "shocker_edit_is_active": "Wide awake and ready! ⚡", + "shocker_edit_toast_updated": "All groomed and pretty! ✨", + "shocker_edit_delete_desc": "Say goodbye to this shocker forever. There's no undo... *sniffles*", + + "common_close": "Close~", + "common_continue": "Onward!", + "common_loading": "Loading... *wiggles*", + "common_previous": "Back~", + "common_next": "Next~", + "common_steps": "Steps", + "common_step_label": "Step {number}: {title}", + "common_copy": "Copy~", + "common_copied": "Copied! ♡", + "common_never": "Never", + "common_error": "Oopsie: {message}", + "terminal_title": "Serial terminal (beep boop~)", + "terminal_connecting": "Connecting... *paws crossed*", + "terminal_help_button": "Help me, I'm stuck! *whimpers*", + "terminal_back_to_modes": "Back to picking~", + "terminal_mode_configure": "Pamper my device", + "terminal_mode_configure_desc": "Set up WiFi, login stuff, and more! Comes with a chatty little console~", + "terminal_mode_flash": "Flash firmware ✨", + "terminal_mode_flash_desc": "Give your device a shiny new brain~", + "terminal_mode_raw": "Eavesdrop mode 👂", + "terminal_mode_raw_desc": "Just the console. Listen to your device chatter and boop it with commands~", + "terminal_step_channel": "Pick a channel~", + "terminal_step_board": "Pick a board~", + "terminal_go_to_step": "Hop to step {number}: {title}", + "terminal_erase": "Squeaky clean first", + "terminal_erase_desc": "Wipes everything, even its old settings", + "terminal_unsupported": "Your browser can't do this one, sowwy...", + "terminal_update_browser": "Pwease update your browser to the newest version~", + "terminal_use_browsers": "Try one of these browsers, cutie:", + "terminal_connect_failed_bootloader": "Couldn't get it into bootloader mode... *whimpers*", + "terminal_connect_failed": "Couldn't reach your device... *sad ears*", + "terminal_connect_failed_desc": "I tried and tried, but your device wouldn't talk to me.", + "terminal_quick_tries": "Quick things to try:", + "terminal_try_replug": "Unplug it and plug it back in~", + "terminal_try_cable": "Try a different USB cable or port.", + "terminal_try_driver": "Make sure the serial driver is installed!", + "terminal_open_troubleshooter": "Help me fix it!", + "terminal_log_reset_no_device": "Oopsie during reset: no device!", + "terminal_log_reset_error": "Oopsie during reset: {error}", + "terminal_log_send_no_device": "Couldn't send it: no device!", + "terminal_log_send_error": "Couldn't send it: {error}", + "terminal_log_firmware_disconnected": "Firmware wandered off: {error}", + "terminal_log_erase_failed": "Couldn't wipe flash: {error}", + "terminal_log_hard_reset_failed": "Hard reset went oopsie: {error}", + "terminal_log_flash_complete": "Flash complete! ✨", + "terminal_log_flash_failed": "Flashing went oopsie: {error}", + "terminal_log_command_failed": "Couldn't send the command: {error}", + "terminal_help_title": "Fix-it helper 🩹", + "terminal_help_desc": "Go through these one by one. Each one sniffs out a common problem~", + "terminal_help_step_cable": "USB cable", + "terminal_help_step_port": "USB port", + "terminal_help_step_driver": "Install driver", + "terminal_help_step_manual": "Manual driver update", + "terminal_help_step_discord": "Ask the pack on Discord", + "terminal_help_cable_body": "Lots of USB-C and micro-USB cables can only charge and can't carry data. Grab a data cable you know works (one you've moved files with before) and plug your hubby back in~", + "terminal_help_port_body": "Plug your device straight into your computer. USB hubs, docks, and front ports can be fussy with power and signal. On a desktop, try a port on the back~", + "terminal_help_driver_download": "Grab the CP210x driver:", + "terminal_help_driver_extract": "Unzip it into a folder on your computer.", + "terminal_help_driver_run": "Open the folder and run {#code}{installer}{/code}. Just follow along~", + "terminal_help_driver_reconnect": "Plug your device back in!", + "terminal_help_manual_intro": "Driver installed but your device is still hiding?", + "terminal_help_manual_open": "Open Device Manager (press {#key}Win{/key} + {#key}X{/key} and pick {#code}Device Manager{/code}).", + "terminal_help_manual_ports": "Under {#code}Ports (COM & LPT){/code}, sniff out something like:", + "terminal_help_manual_missing": "Not there? Windows can't see your device at all, so go back to the cable and port steps.", + "terminal_help_manual_update": "Right-click it and pick {#code}Update Driver{/code}.", + "terminal_help_manual_browse": "Choose {#code}Browse my computer for drivers{/code} and pick the folder you unzipped the driver into. Make sure {#code}Include subfolders{/code} is ticked!", + "terminal_help_manual_success": "If it worked, it should now say {#code}{deviceName}{/code}! Yay~", + "terminal_help_discord_intro": "Still stuck? Come to our Discord den and ask in {#code}{channel}{/code}! Tell us:", + "terminal_help_discord_os": "your operating system and browser", + "terminal_help_discord_device": "which device you have (board model, where you got it)", + "terminal_help_discord_tried": "what you already tried from the steps before", + "terminal_help_discord_errors": "any error messages or console output", + "terminal_help_discord_join": "Join our Discord den! ♡", + "terminal_risk_title": "⚠️ WOBBLY FIRMWARE", + "terminal_risk_intro": "You're about to flash {#strong}experimental firmware{/strong} that's {#strong}known to be wobbly{/strong}.", + "terminal_risk_brick": "This might turn your device into a brick, need manual rescuing, or just break it. For real.", + "terminal_risk_no_support": "We can NOT help you with problems this firmware causes.", + "terminal_risk_acknowledge": "I understand this is all on me", + "terminal_risk_abort": "Nope, nope!", + "terminal_risk_accept": "I ACCEPT FULL RESPONSIBILITY", + "firmware_channel_recommended": "This is the comfy recommended channel~ ♡", + "firmware_channel_danger": "DON'T USE THIS UNLESS YOU REALLY KNOW WHAT YOU'RE DOING", + "firmware_channel_stable": "Stabwe", + "firmware_channel_beta": "Beta~", + "firmware_channel_develop": "Devewop", + "terminal_board_select": "Pick a board...", + "terminal_board_search": "Sniff out a board...", + "terminal_board_none": "No board found... *sniff*", + "terminal_flash_button": "Flash! ⚡", + "terminal_flash_progress": "Progress: {status}", + "terminal_flash_idle": "Waiting~", + "terminal_flash_no_device": "No device picked yet!", + "terminal_flash_resetting": "Resetting... *spins*", + "terminal_flash_downloading": "Fetching firmware...", + "terminal_flash_download_failed": "Couldn't fetch the firmware... *whimpers*", + "terminal_flash_flashing": "Flashing firmware... *holds breath*", + "terminal_flash_rebooting": "Rebooting... (unplug and replug the power if it gets stuck)", + "terminal_flash_done": "All done! Your device has a shiny new brain ✨", + "terminal_port_select": "Pick a device~", + "terminal_port_disconnect": "Unplug device", + "terminal_port_connected": "Device connected! {#strong}{id}{/strong} ♡", + "terminal_console": "Console", + "terminal_connected_device": "Connected device", + "terminal_resize": "Resize terminal panel", + "terminal_reboot": "Reboot", + "terminal_disconnect": "Unplug", + "terminal_fullscreen_exit_esc": "Exit fullscreen (Esc)", + "terminal_fullscreen_exit": "Exit fullscreen", + "terminal_fullscreen_fill": "Fill the window", + "terminal_command_label": "Serial command", + "terminal_command_placeholder": "Type a command~", + "terminal_command_send": "Boop it!", + "terminal_colors": "Colors 🎨", + "terminal_colors_menu": "Colors... 🎨", + "terminal_colors_label": "Console colors", + "terminal_colors_close": "Close colors", + "terminal_color_input": "{name} color", + "terminal_colors_reset": "Back to default~", + "terminal_color_bg": "Background", + "terminal_color_fg": "Text", + "terminal_color_ts": "Timestamp", + "terminal_color_error": "Error", + "terminal_color_warning": "Warning", + "terminal_color_info": "Info", + "terminal_color_debug": "Debug", + "terminal_color_verbose": "Chatty", + "terminal_options": "Options~", + "terminal_options_label": "Console options", + "terminal_hide_system": "Hide system messages", + "terminal_stick_bottom": "Stick to bottom", + "terminal_raw_output": "Raw output", + "terminal_timestamps": "Timestamps", + "terminal_timestamp_uptime": "Uptime", + "terminal_timestamp_local": "Local", + "terminal_timestamp_ms": "Ms", + "terminal_timestamp_off": "Off", + "terminal_copy_settings": "Copy settings", + "terminal_import_settings": "Import settings", + "terminal_copy_selection": "Copy selection", + "terminal_copy_all": "Copy everything", + "terminal_toast_selection_copied": "Selection copied~", + "terminal_toast_output_copied": "Console output copied~", + "terminal_toast_settings_copied": "Console settings copied~", + "terminal_toast_clipboard_unreadable": "Couldn't peek at your clipboard...", + "terminal_toast_settings_imported": "Console settings imported! ✨", + "terminal_toast_settings_invalid": "That's not console settings, silly~", + + "common_try_again": "Try again!", + "terminal_cfg_intro": "Values get sent to your device over UART, and it answers in the console below. Commands without an argument just read the value; press the {#eye/} button next to a field to peek at it~", + "terminal_cfg_rf_title": "RF transmitter 📡", + "terminal_cfg_rf_desc": "How your device talks to its zappy fwiends.", + "terminal_cfg_tx_pin": "TX GPIO pin", + "terminal_cfg_example": "like {value}", + "terminal_cfg_read_value": "Peek at the current value", + "terminal_cfg_set": "Set~", + "terminal_cfg_read": "Peek", + "terminal_cfg_reading": "Peeking…", + "terminal_cfg_apply": "Apply~", + "terminal_cfg_keepalive": "Keepalive on", + "terminal_cfg_keepalive_desc": "Gives your zappy fwiends a little poke now and then so they don't fall asleep~", + "terminal_cfg_estop_title": "Emergency stop 🛑", + "terminal_cfg_estop_desc": "A big button that stops everything right away.", + "terminal_cfg_estop_enabled": "EStop on", + "terminal_cfg_estop_pin": "EStop GPIO pin", + "terminal_cfg_estop_note": "Psst: {#code}{latching}{/code} and {#code}{active}{/code} don't have their own commands; set them in the JSON config below.", + "terminal_cfg_wifi_title": "WiFi 📶", + "terminal_cfg_wifi_desc": "Network logins and what your device is called.", + "terminal_cfg_hostname": "Hostname", + "terminal_cfg_networks": "Networks (JSON array)", + "terminal_cfg_invalid_json_array": "That's not a valid JSON array, silly~", + "terminal_cfg_ap_note": "AP settings ({#code}{ssid}{/code}, {#code}{password}{/code}, {#code}{disabled}{/code}, {#code}{staDisabled}{/code}, {#code}{offlineMode}{/code}) don't have their own commands; use the JSON config.", + "terminal_cfg_backend_title": "Backend", + "terminal_cfg_backend_desc": "Where your device phones home, and how it logs in.", + "terminal_cfg_domain": "Domain", + "terminal_cfg_domain_restart": "Setting the domain makes your device take a quick nap and restart.", + "terminal_cfg_auth_token": "Auth token", + "terminal_cfg_auth_token_placeholder": "Paste device token", + "terminal_cfg_hide": "Hide", + "terminal_cfg_show": "Peek", + "terminal_cfg_serial_title": "Serial input", + "terminal_cfg_echo": "Echo on", + "terminal_cfg_echo_desc": "Your device repeats what you type, like a little parrot~", + "terminal_cfg_advanced_title": "Advanced: the whole config", + "terminal_cfg_advanced_desc": "For things without their own commands (captive portal, OTA, LAN, and so on), swap out the whole config.", + "terminal_cfg_json_config": "JSON config", + "terminal_cfg_invalid_json": "That's not valid JSON, silly~", + "terminal_cfg_read_json": "Peek at the config as JSON", + "terminal_cfg_json_restart": "Applying a JSON config makes your device restart.", + "terminal_cfg_raw_config": "Raw FlatBuffer config (base64)", + "terminal_cfg_invalid_base64": "That's not valid base64, silly~", + "terminal_cfg_read_raw": "Peek at the config as base64", + "terminal_cfg_factory_reset": "Factory reset", + "terminal_cfg_factory_reset_desc": "Wipes your device's memory completely.", + "terminal_cfg_factory_reset_title": "Wipe your device clean?", + "terminal_cfg_factory_reset_action": "Wipe it", + "terminal_cfg_factory_reset_confirm": "This forgets everything on your device: WiFi networks, backend logins, pins, all of it. It'll be like brand new.", + "terminal_cfg_read_failed_json_title": "Couldn't wead the JSON config~", + "terminal_cfg_read_failed_raw_title": "Couldn't wead the waw config~", + "terminal_cfg_read_failed_desc": "Your device stayed quiet after {attempts} tries... *pouts*", + "terminal_cfg_common_causes": "Maybe:", + "terminal_cfg_cause_busy": "Your device is busy with another command.", + "terminal_cfg_cause_disconnected": "Your device unplugged or took a nap.", + "terminal_cfg_cause_unsupported": "This firmware doesn't know that command yet.", + + "common_status": "Status", + "common_version": "Version", + "common_created": "Born on", + "common_create": "Make it!", + "common_done": "All done!", + "common_enable": "Turn on", + "common_disable": "Turn off", + "common_are_you_sure": "Are you suuure?", + "common_generating": "Making it... *concentrates*", + "hubs_title": "Hubbies", + "hubs_subtitle": "All the hubbies living in your den~", + "hubs_add": "Add a hubby", + "hubs_load_failed": "Couldn't fetch your hubbies... *whimpers*", + "hubs_empty_title": "No hubbies yet... *pouts*", + "hubs_empty_desc": "A hubby passes your boops along to your zappy fwiends. Add one to get started!", + "hubs_create_title": "Make a hubby", + "hubs_name_label": "Hubby's name", + "hubs_name_placeholder": "Hubby McHubface", + "hub_toast_not_connected": "The server isn't answering... *pokes*", + "hub_toast_try_later": "Try again in a sec~", + "hub_reboot_title": "Give {name} a quick nap?", + "hub_reboot_desc": "Your hubby will doze off and wake back up. Its zappy fwiends won't listen until it's back~", + "hub_reboot": "Nap time", + "hub_hotspot_enable_title": "Let {name} open its own Wi-Fi hotspot?", + "hub_hotspot_disable_title": "Close {name}'s Wi-Fi hotspot?", + "hub_hotspot_enable_desc": "Your hubby opens its own little setup network. It stays on your Wi-Fi too, but anyone nearby can join the hotspot until you turn it off.", + "hub_hotspot_disable_desc": "The setup hotspot closes. If your hubby isn't on your Wi-Fi yet, you'll need to go poke it in person to set it up again.", + "hub_delete_desc": "You're about to say bye-bye to {#strong}{name}{/strong}... *sniffles*", + "hub_delete_shockers": "These zappy fwiends will go too:", + "hub_edit_title": "Groom this hubby", + "hub_edit_apply": "Apply~", + "hub_pair_title_generate": "Make a pairing code?", + "hub_pair_title_generated": "Pairing code ready! ✨", + "hub_pair_title_paired": "Hubby paired! ♡", + "hub_pair_consumed": "{#strong}{name}{/strong} gobbled up the code and is now paired!", + "hub_pair_used": "That code is all used up now.", + "hub_pair_generated_for": "Pairing code made for {#strong}{name}{/strong}!", + "hub_copy_now": "You only get to see this code once, so copy it now and give it to your clients~", + "hub_pair_generate_for": "You're about to make a pairing code for {#strong}{name}{/strong}.", + "hub_pair_valid_for": "It stays good for 15 minutes.", + "hub_pair_one_active": "Each hubby only gets one code at a time, so a new one replaces the old one.", + "hub_pair_complete": "All paired up! ♡", + "hub_pair_code_label": "Pairing code:", + "hub_pair_copied_close": "Got it copied, close~", + "hub_pair_get": "Gimme a code!", + "hub_token_generated": "Shiny new token! ✨", + "hub_token_generated_for": "New token made for {#strong}{name}{/strong}!", + "hub_token_regenerate_for": "You're about to make a new token for {#strong}{name}{/strong}.", + "hub_token_invalidate": "The old token stops working and anything using it gets disconnected.", + "hub_token_confirm": "Really really sure?", + "hub_token_label": "New token:", + "hub_token_copied_close": "Got it copied, close~", + "hub_token_regenerate": "New token, please!", + "hub_menu_update": "Update ✨", + "hub_menu_label": "Hubby", + "hub_menu_hotspot_enable": "Open Wi-Fi hotspot", + "hub_menu_hotspot_disable": "Close Wi-Fi hotspot", + "hub_menu_pair": "Pair up", + "hub_menu_estop": "STOP EVERYTHING 🛑", + "hub_update_breadcrumb": "Update", + "hub_update_unknown_hub": "Mystery hubby", + "hub_update_unknown_task": "Mystery task", + "hub_update_task_metadata": "Sniffing metadata", + "hub_update_task_preparing": "Getting ready", + "hub_update_task_flash_fs": "Flashing filesystem", + "hub_update_task_verify_fs": "Checking filesystem", + "hub_update_task_flash_app": "Flashing the brain", + "hub_update_task_bootable": "Making it bootable", + "hub_update_task_rebooting": "Waking back up", + "hub_update_status_started": "Started", + "hub_update_status_running": "Running", + "hub_update_status_finished": "Done! ✨", + "hub_update_status_error": "Oopsie", + "hub_update_status_timeout": "Took too long", + "hub_update_confirm_title": "Ready for a new brain?", + "hub_update_confirm_desc": "Update {#strong}{name}{/strong} to {#strong}{version}{/strong}?", + "hub_update_unstable_warning": "This one might not be stable and could have some bugs crawling around.", + "hub_update_title": "Update {name}", + "hub_update_subtitle": "Give this hubby a shiny new brain~", + "hub_update_status_title": "Hubby status", + "hub_update_firmware": "Firmware: {#mono}{version}{/mono}", + "hub_update_confirm": "Update ✨", + "hub_update_success": "Update done! Shiny new brain ✨", + "hub_update_rolled_back": "Your device went back to its old brain", + "hub_update_back": "Back to the hubbies", + "hub_update_flash_again": "Flash again", + "hub_update_card_title": "Firmware update", + "hub_update_card_desc": "Pick a channel and version for your hubby~", + "hub_update_to": "Update to {version}", + "hub_update_must_be_online": "Your hubby has to be awake first!", + "hub_update_updating_to": "Updating to {version}... *holds breath*", + "hub_update_total": "Total", + "hub_update_task": "Task", + "hub_update_history": "Update diary 📖", + "hub_update_no_history": "No updates yet for this hubby.", + "hub_update_col_id": "ID", + "hub_update_col_started": "Started", + "hub_update_col_message": "Message", + "hub_update_loading": "Fetching your hubby...", + "hub_update_not_found": "Couldn't sniff out that hubby... *sad*", + "home_breadcrumb": "Home den", + "home_welcome": "Welcome back, cutie! ♡", + "home_welcome_name": "Welcome back, {name}! ♡", + "home_subtitle": "Here's how your little OpenShock den is doing~", + "home_hubs_online": "{count} awake", + "home_hub_status": "Hubby status", + "home_no_hubs": "No hubbies", + "home_all_online": "All awake ✨", + "home_all_offline": "All sleepy 💤", + "home_some_online": "{online}/{total} awake", + "home_quick_links": "Quick hops", + "home_my_shockers": "My zappy fwiends", + "home_my_shockers_desc": "Boop your zappy fwiends", + "home_hubs_desc": "Look after your hubbies", + "home_shared_desc": "Zappy fwiends you're borrowing", + "home_public_desc": "Your sharing links", + "home_get_started": "Let's get started!", + "home_get_started_desc": "No hubbies yet! Make one for your first device, then invite some zappy fwiends over~", + "home_set_up_hub": "Make a hubby!", + "home_first_shocker": "Add your first zappy fwiend!", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "You have {count} hubby ready! Give it a zappy fwiend to boop~", + "countPlural=other": "You have {count} hubbies ready! Give them a zappy fwiend to boop~" + } + } + ], + "home_go_to_shockers": "Go see the zappy fwiends", + "profile_title": "My fursona ✨", + "profile_coming_soon": "Your fursona page is coming soon~", + "profile_coming_soon_desc": "Your public page isn't ready yet. Your account stuff lives in Settings~", + + "common_retry": "Again!", + "common_never_used": "Never touched", + "common_expires": "Goes poof {time}", + "common_search_placeholder": "Sniff around...", + "common_unknown": "Mystery~", + "settings_breadcrumb_account": "My den", + "account_subtitle": "Your login bits and account stuff~", + "account_change_username": "New name~", + "account_change_email": "New email~", + "account_change_password": "New pawsword~", + "account_username_label": "Username", + "account_email_label": "Email", + "account_password_label": "Pawsword (no peeking!)", + "account_new_password_label": "New pawsword", + "account_confirm_password_label": "New pawsword again", + "account_oauth_only": "Not for OAuth-only cuties", + "account_oauth_no_password": "You sign in with OAuth, so there's no pawsword to change~", + "account_diagnostics": "Boo-boo reports", + "account_diagnostics_desc": "Help us patch up crashes and slow API calls! Reports carry the error, the stack trace and your IP. Off unless you say so.", + "account_diagnostics_level": "How much to tattle", + "account_telemetry_off": "Off", + "account_telemetry_off_desc": "Keep it all secret~", + "account_telemetry_errors": "Oopsies", + "account_telemetry_errors_desc": "Only tell us when something goes oopsie.", + "account_telemetry_full": "Everything!", + "account_telemetry_full_desc": "Oopsies plus API call traces (we don't follow you between pages).", + "account_toast_deactivated": "Account tucked away for a nap", + "account_deactivate_title": "Put your account to sleep?", + "account_deactivate_desc": "Are you suuure you wanna leave the pack? *ears droop*", + "account_deactivate": "Deactivate account", + "account_email_title": "New email~", + "account_email_desc": "Pop in your new email and prove it's you with your current pawsword~", + "account_email_toast_sent": "Sent a lil letter to {email}! Click the link inside to make it official ♡", + "account_new_email": "New email", + "account_current_password": "Current pawsword", + "account_password_title": "New pawsword~", + "account_password_desc": "Tell me your old pawsword, then pick a shiny new one~", + "account_password_toast": "New pawsword set! ✨", + "account_username_title": "New name~", + "account_username_desc": "What should we call you now, cutie?", + "account_new_username": "New name", + "account_username_toast": "New name, who dis? ♡", + "tokens_subtitle": "Tokens let your apps say hi to the OpenShock API~", + "tokens_generate": "Make a token", + "tokens_toast_refreshed": "Tokens all fresh! ✨", + "tokens_empty_title": "No tokens yet", + "tokens_empty_desc": "Make one so your apps can come play~", + "tokens_created_on": "Born {date}", + "tokens_last_used": "Last boop {time}", + "tokens_never_expires": "Forever and ever ♡", + "tokens_load_failed": "Couldn't fetch your tokens... *whimpers*", + "token_toast_edited": "Token all groomed! ✨", + "token_name_required": "It needs a name!", + "token_name_too_long": "That name's too long~", + "token_edit_title": "Groom this token", + "token_name_label": "Token's name", + "token_name_placeholder": "Name it something cute...", + "token_permissions": "What it's allowed to do", + "token_perm_category_shockers": "Zappy fwiends ⚡", + "token_perm_category_devices": "Hubbies", + "token_perm_category_usershares": "Sharing with fwiends ♡", + "token_perm_category_publicshares": "Sharing with everyone", + "token_perm_use": "Use", + "token_perm_edit": "Edit~", + "token_perm_pause": "Pause", + "token_perm_auth": "Authenticate", + "token_shocker_control": "Zappy fwiend rules", + "token_toast_paused": "Token is napping 💤", + "token_toast_resumed": "Token's awake! ✨", + "token_delete_title": "Say bye-bye to this token?", + "token_delete_desc": "Really say bye-bye to {#strong}{name}{/strong}?", + "token_delete_permanent": "No take-backsies! It'll be gone forever.", + "token_toast_deleted": "Token's gone... bye-bye ♡", + "token_resume": "Wake token up", + "token_pause": "Nap time for token", + "token_mode_clamp_desc": "Clamp: anything too big or too small gets squished to the nearest limit.", + "token_mode_lerp_desc": "Lerp: the whole range gets gently stretched to fit inside your min–max.", + "token_paused_desc": "A napping token can't boop any zappy fwiends.", + "token_intensity_range": "Zap range", + "token_duration_range": "Time range", + "token_new_breadcrumb": "New!", + "token_redirect_not_allowed": "That redirect_uri isn't allowed! Only loopback addresses or custom app schemes, please.", + "token_params_missing": "Some GET params went missing! Make sure name, redirect_uri and permissions are there.", + "token_invalid_permissions": "These permissions are silly: {list}", + "token_toast_created": "Token made! ✨", + "token_request_title": "Someone wants a token!", + "token_access_granted": "Access granted! ♡", + "token_shared_redirecting": "Token made and handed over! Hopping you back to {#b}{uri}{/b}~", + "token_not_redirected": "Didn't hop automatically? Press the button below~", + "token_finish": "All done!", + "token_generated_title": "Token made! ✨", + "token_copy_now": "Copy it now! You only get to peek at it once~", + "token_new_title": "New token~", + "token_external_desc": "Some app wants to come into your den! Check what it can do below before letting it in.", + "token_new_desc": "Set up a shiny new token for your account~", + "token_external_requesting": "{#b}{name}{/b} wants a token! It'll be handed to the app at {#b}{uri}{/b}~", + "token_allow": "Let it in!", + "token_generate": "Make it!", + "token_deny": "Nope!", + "sessions_subtitle": "Everywhere you're logged in! Kick out anyone you don't recognize.", + "sessions_unknown_device": "Mystery device", + "sessions_toast_refreshed": "Sessions all fresh! ✨", + "sessions_load_failed": "Couldn't fetch your sessions... *whimpers*", + "sessions_empty_title": "No sessions here", + "sessions_empty_desc": "Log in somewhere and it'll show up here~", + "sessions_last_seen": "Last sniffed {time}", + "sessions_signed_in": "Snuggled in {time}", + "session_toast_revoked": "Session kicked out! *hiss*", + "session_revoke_title": "Kick out this session?", + "session_revoke": "Kick out", + "session_revoke_desc": "Really kick this session out of the den?", + "session_revoke_from": "Snuggled in from {#strong}{ip}{/strong} on {#strong}{agent}{/strong}", + "connections_title": "OAuth buddies", + "connections_subtitle": "Hold paws with your other accounts to log in faster~", + "connections_toast_linked": "Paws held! ♡", + "connections_toast_cancelled": "Never mind then~", + "connections_toast_failed": "Couldn't hold paws... *whimpers*", + "connections_toast_removed": "Let go of their paw", + "connections_refreshing": "Refreshing…", + "connections_link_new": "Make a new buddy", + "connections_empty_title": "No buddies yet", + "connections_empty_desc": "Tap “Make a new buddy” up there to hold paws with one~", + "connections_unlink": "Let go", + "connections_load_failed": "Couldn't fetch your buddies... *whimpers*", + "connections_unlink_title": "Let go of {name}?", + "connections_unlink_title_generic": "Let go of this account?", + "connections_unlink_desc": "You won't be able to sign in with them anymore unless you hold paws again.", + "provider_starting": "Waking up {name}...", + "provider_link": "Hold paws with {name}", + "audit_subtitle": "Everything important that happened in your den. Sniff out anything weird!", + "audit_col_time": "When", + "audit_col_action": "What", + "audit_col_details": "Deets", + "audit_col_reason": "Why", + "audit_col_ip": "IP address", + "audit_col_device": "Device", + "audit_action_login": "Snuggled in", + "audit_action_logout": "Scampered off", + "audit_action_password_changed": "New pawsword", + "audit_action_email_change_requested": "Asked for a new email", + "audit_action_email_changed": "New email", + "audit_action_username_changed": "New name", + "audit_action_api_token_created": "Token made", + "audit_action_api_token_deleted": "Token gone", + "audit_action_oauth_connected": "New buddy", + "audit_action_oauth_disconnected": "Buddy let go", + "audit_action_account_deactivated": "Account napping", + "audit_action_account_reactivated": "Account woke up", + "audit_action_account_deleted": "Account gone", + "audit_action_automation_token_created": "Robot token made", + "audit_action_automation_token_updated": "Robot token groomed", + "audit_action_automation_token_rotated": "Robot token swapped", + "audit_action_automation_token_deleted": "Robot token gone", + "audit_action_automation_token_used": "Robot token booped", + "audit_meta_session": "Session {id}", + "audit_meta_changed": "{old} → {new}", + "audit_meta_email_requested": "Wants to be {email} now", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{name} ({count} account went poof)", + "countPlural=other": "{name} ({count} accounts went poof)" + } + } + ], + "audit_meta_scheduled_deletion": "Going away soon", + "audit_meta_kept": "Kept warm for later ♡", + + "common_view": "Peek", + "common_save": "Save~", + "common_saving": "Saving... *concentrates*", + "common_back": "Back", + "common_shared_by": "Shared by", + "common_user_avatar": "Cute avatar", + "common_toast_saved": "All saved! ✨", + "pause_reason_shocker": "Napping on the shocker itself", + "pause_reason_shocker_user_share": "Napping on the shocker and the user share", + "pause_reason_shocker_public_share": "Napping on the shocker and the public share", + "pause_reason_user_share": "Napping on the user share", + "pause_reason_public_share": "Napping on the public share", + "public_shares_subtitle": "A link anyone can use, no account needed~", + "public_shares_new": "New share!", + "public_share_never_expires": "Forever and ever ♡", + "public_shares_empty_title": "No public shares yet", + "public_shares_empty_desc": "Make a link so anyone can boop your zappy fwiends~", + "public_share_expired": "Went poof", + "public_share_no_expiry": "Forever ♡", + "public_share_label": "Public share", + "public_share_toast_created": "New public share made! ✨", + "public_share_create_title": "Make a public share", + "public_share_toast_deleted": "Public share's gone... bye-bye", + "public_share_delete_title": "Say bye-bye to this share?", + "public_share_delete_desc": "Really say bye-bye to {#strong}{name}{/strong}?", + "public_share_edit_title": "Public share: {name}", + "public_share_edit_subtitle": "Grooming mode! Nothing changes until you save~", + "public_share_add_shocker": "Add a zappy fwiend", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=one": "{count} zappy fwiend joined the share!", + "countPlural=other": "{count} zappy fwiends joined the share!" + } + } + ], + "public_share_empty_shockers_title": "No zappy fwiends here yet", + "public_share_empty_shockers_desc": "Add one and anyone with the link can boop it~", + "public_share_load_failed": "Couldn't fetch this share... *whimpers*", + "public_share_paused_here": "Napping in this share 💤", + "public_share_resume_shocker": "Wake it up", + "public_share_pause_shocker": "Nap time", + "public_share_remove": "Shoo from share", + "public_share_toast_removed": "Zappy fwiend left the share", + "public_share_add_title": "Invite zappy fwiends", + "public_share_add_desc": "Bring some zappy fwiends into this share! You can set their limits after~", + "public_share_add_placeholder": "Pick some zappy fwiends...", + "public_share_add_no_match": "No fwiends match that", + "public_share_add_submit": "Invite them!", + "public_share_view_loading": "Fetching the share...", + "public_share_view_title": "Public share link", + "public_share_view_desc": "Come in as a guest or log in with your OpenShock account~", + "public_share_view_guest_name": "Your cute name", + "public_share_view_enter": "Come in!", + "public_share_view_enter_guest": "Sneak in as a guest", + "public_share_login": "Log in~", + "perm_shock_on": "Zaps allowed", + "perm_shock_off": "No zaps", + "perm_vibrate_on": "Bzzz allowed", + "perm_vibrate_off": "No bzzz", + "perm_sound_on": "Beeps allowed", + "perm_sound_off": "No beeps", + "perm_live_on": "Live allowed", + "perm_live_off": "No live", + "perm_live_control": "Live boops", + "user_selector_avatar_of": "{name}'s cute avatar", + "user_selector_placeholder": "Who are we looking for?", + "user_selector_aria": "Name to sniff for", + "user_selector_search": "Sniff them out", + "user_selector_found": "Found them! ♡", + + "common_remove": "Shoo", + "user_shares_subtitle": "Your zappy fwiends, shared with your pack~", + "user_shares_toast_invited": "Sent {name} a lil invite! ♡", + "user_shares_redeem": "Use a code", + "user_shares_new": "New share!", + "user_shares_tab_shares": "Shares", + "user_shares_tab_incoming": "Shared with me", + "user_shares_tab_invites": "Invites", + "share_code_create_title": "New share code~", + "share_code_create_desc": "Make a code or invite someone to the pack", + "share_code_shocker_placeholder": "Pick some zappy fwiends...", + "share_code_no_match": "No fwiends match that", + "share_code_send_invite": "Send invite ♡", + "share_code_create": "Make a code", + "share_code_created_title": "Code ready! ✨", + "share_code_created_desc": "Copy the code or the link~", + "share_code_redeem_title": "Use a share code", + "share_code_redeem_desc": "Pop in the code you got~", + "share_code_redeem_placeholder": "Your secret code", + "share_code_redeemed": "Yay, it worked! ♡", + "share_code_shared_shockers": "Shared zappy fwiends", + "share_code_redeeming": "Using it...", + "share_code_redeem": "Use it!", + "incoming_shares_empty_title": "Nobody's shared yet", + "incoming_shares_empty_desc": "No one's lent you a zappy fwiend yet... *pouts*", + "incoming_share_toast_removed": "Let go of {name}'s share", + "incoming_share_remove_title": "Shoo this share?", + "incoming_share_remove_desc": "Really let go of {#strong}{name}{/strong}'s share?", + "incoming_share_toast_removed_shocker": "Let go of {name}'s {shocker}", + "incoming_share_remove_shocker_title": "Let go of this zappy fwiend?", + "incoming_share_remove_shocker_desc": "Really let go of {#strong}{name}{/strong}'s {#strong}{shocker}{/strong}?", + "incoming_share_manage_from": "Shares from", + "share_remove": "Shoo this share", + "invites_empty_title": "No invites yet", + "invites_empty_desc": "No invites coming or going~", + "invites_outgoing": "Sent", + "invites_outgoing_empty_title": "No invites sent", + "invites_outgoing_empty_desc": "You haven't invited anyone yet.", + "invites_incoming": "Received", + "invites_incoming_empty_title": "No invites for you yet", + "invites_incoming_empty_desc": "Nobody's invited you yet... *pouts*", + "invite_toast_accepted": "Joined {name}'s pack! ♡", + "invite_toast_declined": "Said no to {name}'s invite", + "invite_deny_title": "Say no?", + "invite_deny_label": "Say no?", + "invite_deny": "Nope", + "invite_deny_desc": "Really say no to {#strong}{name}{/strong}?", + "invite_accept": "Join the pack!", + "invite_toast_cancelled_for": "Took back {name}'s invite ({id})", + "invite_toast_cancelled": "Took back invite {id}", + "invite_cancel_title": "Take back invite?", + "invite_cancel": "Take back", + "invite_cancel_for_desc": "Really take back {#strong}{name}{/strong}'s invite?", + "invite_cancel_code_desc": "Really take back the invite with code {#strong}{code}{/strong}?", + "invite_cancel_outstanding": "Take back this invite", + "outgoing_shares_empty_title": "No shared zappy fwiends", + "outgoing_shares_empty_desc": "You haven't lent any zappy fwiends to your pack yet~", + "outgoing_share_toast_removed": "{name} came back home", + "outgoing_share_remove_title": "Bring this zappy fwiend home?", + "outgoing_share_editing_for": "Grooming shares for", + "outgoing_share_limits": "Limits & rules", + "outgoing_share_same": "Same rules for every fwiend", + "outgoing_share_per_desc": "Different rules for each fwiend", + "outgoing_share_all": "All", + "outgoing_share_per": "Each one", + + "outgoing_share_remove_desc": "Really bring {#strong}{shocker}{/strong} home from {#strong}{name}{/strong}?", + + "report_breadcrumb": "Tattle on tokens", + "report_toast_clipboard_failed": "Couldn't peek at your clipboard: {error}", + "report_title": "Report leaked tokens", + "report_paste": "Paste it in", + "report_warning": "This is only for tokens that slipped out by accident!", + "report_abuse_warning": "Being naughty on purpose gets you banned. No exceptions!", + "report_detected": "Tokens I sniffed out", + "report_invalid": "Some of these look funny. Check the formatting~", + "report_acknowledge": "I pinky-promise I know what this is for and I'll be responsible ♡", + "report_submit": "Send it!", + "turnstile_disabled": "Turnstile is napping", + "common_internal_error": "Oopsie inside", + "resend_toast_sent": "Sent another lil letter! Check your inbox and spam~", + "resend_toast_throttled": "That's a lot of letters! Wait a bit and try again~", + "resend_toast_unavailable": "Can't resend from this browser! If you're not activated yet, just log in and we'll send a fresh link~", + "resend_button": "No letter? Send another!", + "expiration_label": "Goes poof", + "expiration_never": "Never", + "expiration_custom": "Custom", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { "countPlural=one": "{count} day", "countPlural=other": "{count} days" } + } + ], + "expiration_required": "Pick when it goes poof!", + "expiration_never_desc": "This one's forever ♡", + "expiration_expires_at": "Goes poof {time} ({date})", + "date_picker_placeholder": "Pick a day~", + "telemetry_toast_title": "Help OpenShock be better? *puppy eyes*", + "telemetry_toast_desc": "Send us boo-boo reports so we can patch up crashes and slow API calls! They carry the error, stack trace and your IP. You can change your mind any time in Account settings~", + "telemetry_toast_no": "No thankies", + "telemetry_toast_errors": "Just oopsies", + "telemetry_toast_full": "Everything!", + "table_show_details": "Show deets", + "table_hide_details": "Hide deets", + "table_no_results": "Nothing here~", + "table_sort_asc": "Sort by {name}, going up", + "table_sort_desc": "Sort by {name}, going down", + "table_sort_none": "Sort by {name}, all jumbled", + "cell_na": "N/A", + "cell_not_applicable": "Doesn't apply", + "cell_invalid": "Silly", + "cell_unavailable": "Not here", + "cell_none": "Nothing", + "oauth_login_with": "Snuggle in with {provider}", + "oauth_signup_with": "Join the pack with {provider}", + "signalr_connect_failed": "Couldn't reach the server! *whimpers*", + "signalr_disconnect_failed": "Tripped while saying bye to the server!", + "signalr_invalid_update": "The server sent something silly!", + "signalr_invalid_log": "The server sent silly logs!", + "signalr_invalid_ota": "The server sent silly update data!", + "ota_toast_failed": "Hubby's update went oopsie: {message}", + "ota_toast_succeeded": "Hubby has a shiny new brain! ✨", + "ota_toast_rolled_back": "Hubby went back to its old brain", + "lcg_connect_failed": "Couldn't reach the live boop gateway... *whimpers*", + "terminal_toast_bootloader_failed": "Couldn't get to the bootloader: {error}", + "terminal_toast_app_mode_failed": "Couldn't wake the app up: {error}", + + "problem_account_account_not_activated_title": "Account isn't awake yet", + "problem_account_account_not_activated_desc": "Check your inbox for the activation letter~", + "problem_account_activation_not_found_title": "That activation link is silly", + "problem_account_activation_not_found_desc": "It might've gone poof or been used already.", + "problem_account_activation_resend_too_many_title": "That's a lot of activation letters!", + "problem_account_activation_resend_too_many_desc": "Take a lil break before trying again~", + "problem_account_activation_resend_unavailable_title": "Can't send another activation letter", + "problem_account_activation_resend_unavailable_desc": "Log in again and we'll send a fresh link~", + "problem_account_deactivate_already_deactivated_title": "This account is already napping", + "problem_account_deactivate_denied_privileged_title": "Special accounts can't go to sleep", + "problem_account_deactivate_unauthorized_title": "You're not allowed to do that", + "problem_account_deactivated_title": "This account is napping", + "problem_account_email_already_in_use_title": "Someone's already using that email", + "problem_account_email_invalid_title": "That email looks silly", + "problem_account_email_taken_title": "Someone's already using that email", + "problem_account_email_too_many_requests_title": "That's a lot of email changes!", + "problem_account_email_too_many_requests_desc": "Take a lil break before trying again~", + "problem_account_email_unchanged_title": "That's already your email, silly", + "problem_account_email_verify_not_found_title": "That verification link is silly", + "problem_account_email_verify_not_found_desc": "It might've gone poof or been used already.", + "problem_account_o_auth_only_title": "This account has no pawsword", + "problem_account_o_auth_only_desc": "Log in with the buddy you signed up with~", + "problem_account_password_not_set_title": "No pawsword set", + "problem_account_password_not_set_desc": "This account logs in through a buddy service.", + "problem_account_password_old_password_invalid_title": "That's not your current pawsword", + "problem_account_username_invalid_title": "That name isn't allowed", + "problem_account_username_recently_changed_title": "You just changed your name!", + "problem_account_username_recently_changed_desc": "You can only change it once every 7 days~", + "problem_account_username_taken_title": "Someone already has that name", + "problem_admin_user_deactivated_title": "This user is napping", + "problem_admin_user_not_activated_title": "This user isn't awake yet", + "problem_api_token_can_only_delete_self_title": "A token can only delete itself", + "problem_api_token_not_found_title": "Couldn't sniff out that token", + "problem_api_token_paused_title": "This token is napping 💤", + "problem_assign_lcg_bad_schema_version_title": "Hubby speaks an owd pwotocol", + "problem_assign_lcg_bad_schema_version_desc": "Update the hubby's firmwawe to connect~", + "problem_assign_lcg_no_lcg_available_title": "No gateway awound", + "problem_assign_lcg_no_lcg_available_desc": "No wive contwol gateway is fwee wight now. Twy again in a bit~", + "problem_authentication_account_deactivated_title": "This account is napping", + "problem_authentication_account_not_activated_title": "This account isn't awake yet", + "problem_authentication_cookie_missing_or_invalid_title": "You're not logged in", + "problem_authentication_cookie_missing_or_invalid_desc": "Your session might've gone poof. Log in again~", + "problem_authentication_header_missing_or_invalid_title": "That token is silly", + "problem_authentication_session_invalid_title": "Your session went poof", + "problem_authentication_session_invalid_desc": "Please log in again~", + "problem_authentication_token_invalid_title": "That token is silly", + "problem_authentication_unknown_error_title": "Couldn't tell who you are", + "problem_authorization_policy_not_met_title": "You're not allowed to do that", + "problem_authorization_token_only_title": "You need a token for this", + "problem_authorization_token_permission_missing_title": "This token is missing a permission", + "problem_authorization_unknown_error_title": "You're not allowed in here", + "problem_authorization_user_session_only_title": "You need to be logged in for this", + "problem_automation_token_not_allowed_for_account_title": "Robot tokens can't be used with special accounts", + "problem_configuration_already_exists_title": "There's already a config entry with that name!", + "problem_configuration_invalid_name_format_title": "That config name is silly", + "problem_configuration_invalid_name_format_desc": "Only A to Z and underscores, please.", + "problem_configuration_invalid_value_format_title": "That value doesn't fit this config", + "problem_configuration_not_found_title": "Couldn't sniff out that config entry", + "problem_control_stats_invalid_range_title": "The start can't be after the end, silly", + "problem_control_stats_invalid_time_zone_title": "Mystery time zone", + "problem_control_stats_missing_capability_title": "This sewvew doesn't do contwol stats", + "problem_device_not_found_title": "Couldn't sniff out that hubby", + "problem_device_not_online_title": "Your hubby is asleep 💤", + "problem_device_too_many_hubs_title": "You've got all the hubbies you can have!", + "problem_device_too_many_shockers_title": "This hubby can't hold any more zappy fwiends", + "problem_endpoint_retired_title": "This feature went bye-bye", + "problem_expression_error_title": "That filter is silly", + "problem_internal_server_error_title": "We made an oopsie on our end", + "problem_login_invalid_credentials_title": "Wrong name or pawsword", + "problem_login_invalid_domain_title": "Can't log in from here, sorry!", + "problem_o_auth_connection_already_exists_title": "You're already holding paws with that buddy", + "problem_o_auth_connection_already_linked_title": "That buddy account already belongs to someone else", + "problem_o_auth_flow_anonymous_only_title": "You're already snuggled in", + "problem_o_auth_flow_mismatch_title": "That login attempt got mixed up", + "problem_o_auth_flow_mismatch_desc": "Let's start over~", + "problem_o_auth_flow_missing_data_title": "Your buddy didn't send your details over", + "problem_o_auth_flow_missing_data_desc": "Try again~", + "problem_o_auth_flow_not_found_title": "That login attempt went poof", + "problem_o_auth_flow_not_found_desc": "Let's start over~", + "problem_o_auth_flow_unsupported_title": "We don't know that login dance", + "problem_o_auth_internal_error_title": "Login went oopsie", + "problem_o_auth_internal_error_desc": "Try again in a sec~", + "problem_o_auth_link_authenticated_user_only_title": "Log in first to hold paws with another account", + "problem_o_auth_provider_mismatch_title": "That login doesn't match the buddy", + "problem_o_auth_provider_mismatch_desc": "Let's start over~", + "problem_o_auth_provider_unsupported_title": "We don't know that buddy service", + "problem_pair_code_not_found_title": "Couldn't sniff out that pairing code", + "problem_password_reset_not_found_title": "That pawsword reset link is silly", + "problem_password_reset_not_found_desc": "It might've gone poof or been used already.", + "problem_session_not_found_title": "Couldn't sniff out that session", + "problem_share_get_no_shares_title": "You don't share anything with them", + "problem_share_request_create_cannot_share_with_self_title": "You can't share with yourself, silly", + "problem_share_request_create_shocker_not_found_title": "Some zappy fwiends went missing", + "problem_share_request_create_shocker_not_found_desc": "They might be gone or not yours.", + "problem_share_request_not_found_title": "Couldn't sniff out that invite", + "problem_share_user_not_found_title": "Couldn't sniff out that share", + "problem_share_code_already_linked_title": "That zappy fwiend is already yours", + "problem_share_code_cant_link_own_share_code_title": "You can't use your own code, silly", + "problem_share_code_not_found_title": "Couldn't sniff out that code", + "problem_share_link_expiry_date_in_past_title": "It can't go poof in the past, silly!", + "problem_share_link_not_found_title": "Couldn't sniff out that public share", + "problem_share_link_shocker_already_in_share_link_title": "That zappy fwiend is already here", + "problem_share_link_shocker_not_in_share_link_title": "That zappy fwiend isn't in this share", + "problem_shocker_control_no_permission_title": "You can't boop this zappy fwiend", + "problem_shocker_control_not_found_title": "Couldn't sniff out that zappy fwiend", + "problem_shocker_control_paused_title": "That zappy fwiend is napping 💤", + "problem_shocker_not_found_title": "Couldn't sniff out that zappy fwiend", + "problem_signup_registration_disabled_title": "The pack isn't taking new members right now", + "problem_signup_username_or_email_exists_title": "Someone already has that name or email", + "problem_turnstile_invalid_title": "Couldn't verify you", + "problem_turnstile_invalid_desc": "Do the lil challenge again and retry~", + "problem_user_not_found_title": "Couldn't sniff out that user", + "problem_user_privileged_delete_denied_title": "Special users can't be deleted", + "problem_validation_error_title": "Some boxes look silly", + "problem_webhook_not_found_title": "Couldn't sniff out that webhook", + "problem_webhook_unsupported_title": "Only Discord webhooks, please", + "problem_webhook_unsupported_desc": "Use a discord.com URL, not canary or ptb.", + + "error_too_many_requests": "Slow down, cutie!", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=one": "Try again in {seconds} second~", + "secondsPlural=other": "Try again in {seconds} seconds~" + } + } + ], + "error_unexpected_response": "The server said something weird", + "error_internal": "Something went oopsie inside", + "error_network": "The internet tripped over", + + "dev_banner": "This is the OpenShock {#b}DEVELOPMENT{/b} playground! {#u}Nothing gets saved{/u}, and it gets replaced with production data every so often~", + "firmware_channel_bugs_warning": "This channel might have some bugs crawling around~" +} diff --git a/messages/zh-Hans.json b/messages/zh-Hans.json new file mode 100644 index 00000000..b89351d6 --- /dev/null +++ b/messages/zh-Hans.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "安全、可靠、低延迟的电击器远程控制平台。", + "landing_section_label": "首页", + "landing_hubs_online": "当前在线 Hub 数:", + "landing_learn_more": "了解更多", + "landing_wiki": "Wiki", + "landing_meta_description": "欢迎使用 OpenShock,一个免费开源的生态系统,可通过互联网控制各种电击器。", + "instance_meta_description": "欢迎使用 {siteName},这是 OpenShock 的一个独立实例。OpenShock 是一个免费开源的生态系统,可通过互联网控制各种电击器。", + "header_sidebar_toggle": "切换侧边栏", + "header_avatar_alt": "{name} 的头像", + "header_menu_profile": "个人资料", + "header_menu_settings": "设置", + "header_menu_logout": "退出登录", + "header_login": "登录", + "header_signup": "注册", + "header_github_title": "GitHub 上的 OpenShock", + "header_discord_title": "社区 Discord", + + "footer_made_with": "由 {#team}OpenShock 团队{/team}用 {#heart/} 打造", + "footer_connection_status_label": "服务器连接状态", + "footer_signalr_state": "SignalR 状态", + "footer_frontend_version": "前端版本", + "footer_frontend_commit_title": "提交 {commit}", + "footer_backend_version": "后端版本", + "footer_backend_commit_title": "提交 {commit}", + "footer_language_label": "语言", + + "sidebar_home_link_label": "OpenShock 首页", + "sidebar_group_general": "常规", + "sidebar_home": "首页", + "sidebar_shockers": "电击器", + "sidebar_shared_shockers": "共享的电击器", + "sidebar_hubs": "Hub", + "sidebar_user_shares": "用户共享", + "sidebar_public_shares": "公开共享", + "sidebar_serial_terminal": "串口终端", + "sidebar_group_admin": "管理", + "sidebar_admin_monitoring": "监控", + "sidebar_admin_online_hubs": "在线 Hub", + "sidebar_admin_online_gateways": "在线网关", + "sidebar_admin_management": "管理", + "sidebar_admin_users": "用户", + "sidebar_admin_blacklists": "黑名单", + "sidebar_admin_webhooks": "Webhook", + "sidebar_admin_mail": "邮件", + "sidebar_admin_automation_tokens": "自动化令牌", + "sidebar_admin_configuration": "配置", + "sidebar_group_settings": "设置", + "sidebar_settings_api_tokens": "API 令牌", + "sidebar_settings_sessions": "会话", + "sidebar_settings_audit_log": "审计日志", + "sidebar_settings_connections": "关联账号", + "sidebar_settings_account": "账号设置", + + "error_meta_title": "服务不可用", + "error_meta_description": "OpenShock 当前不可用", + "error_meta_logo_alt": "OpenShock 标志", + "error_fallback_message": "出了点问题。", + "error_not_found_message": "页面未找到", + "error_not_found_description": "你访问的页面不存在。", + "error_unexpected_description": "发生了意外错误。", + "error_go_back": "返回", + + "auth_layout_logo_alt": "OpenShock 标志", + "auth_layout_invalid_redirect_removed": "为了你的安全,已移除一个无效的重定向链接。", + + "auth_activate_breadcrumb": "激活账号", + "auth_activate_title": "激活账号", + "auth_activate_activating": "正在激活你的账号...", + "auth_activate_success": "你的账号已激活", + "auth_activate_failed": "此激活链接无效或已过期", + "auth_activate_missing_token": "缺少激活令牌", + "auth_activate_continue": "继续登录", + "auth_activate_toast_success": "账号已激活", + + "auth_forgot_breadcrumb": "忘记密码", + "auth_forgot_title": "忘记密码", + "auth_forgot_description": "输入你的邮箱以重置密码", + "auth_forgot_email_label": "邮箱", + "auth_forgot_email_placeholder": "邮箱", + "auth_forgot_submit": "重置密码", + "auth_forgot_signin_prompt": "想起密码了?{#signin}登录{/signin}", + "auth_forgot_mail_disabled": "此实例未配置邮件服务,因此无法重置密码。请联系管理员帮你找回账号。", + "auth_forgot_toast_sent": "重置密码请求已发送到指定邮箱", + + "auth_login_breadcrumb": "登录", + "auth_login_title": "欢迎回来", + "auth_login_loading_methods": "正在加载可用的登录方式", + "auth_login_choose_method": "使用以下方式之一登录", + "auth_login_with_account": "使用你的 OpenShock 账号登录", + "auth_login_activation_after_signup": "你的账号已创建。我们已向你的邮箱发送了激活链接,请检查收件箱和垃圾邮件文件夹。", + "auth_login_activation_pending": "你的账号尚未激活。我们已向你的邮箱发送了激活链接,请检查收件箱和垃圾邮件文件夹。如果没有收到,请稍后再次登录以获取新链接。", + "auth_login_oauth_only": "此账号没有密码。请使用注册时所用的服务登录。", + "auth_login_oauth_only_with_buttons": "此账号没有密码。请使用上方按钮,通过注册时所用的服务登录。", + "auth_login_or_continue_with": "或通过以下方式继续", + "auth_login_username_label": "用户名或邮箱", + "auth_login_password_label": "密码", + "auth_login_submit": "登录", + "auth_login_signup_prompt": "还没有账号?{#signup}注册{/signup}", + "auth_login_legal": "点击“登录”即表示你同意我们的{#tos}服务条款{/tos}和{#privacy}隐私政策{/privacy}。", + + "auth_oauth_create_breadcrumb": "使用 {provider} 注册", + "auth_oauth_create_title": "使用 {#provider}{provider}{/provider} 注册", + "auth_oauth_create_description": "完善你的账号信息", + "auth_oauth_create_username_label": "用户名", + "auth_oauth_create_username_placeholder": "用户名", + "auth_oauth_create_email_label": "邮箱", + "auth_oauth_create_email_placeholder": "邮箱", + "auth_oauth_create_submit": "注册", + "auth_oauth_create_legal": "点击“注册”即表示你同意我们的{#tos}服务条款{/tos}和{#privacy}隐私政策{/privacy}。", + + "auth_oauth_error_breadcrumb": "认证错误", + "auth_oauth_error_title": "认证错误", + "auth_oauth_error_back": "返回登录", + + "auth_reset_breadcrumb": "重置密码", + "auth_reset_title": "重置密码", + "auth_reset_checking": "正在验证重置链接...", + "auth_reset_choose_password": "为你的账号设置新密码", + "auth_reset_invalid": "此重置链接无效或已过期", + "auth_reset_password_label": "新密码", + "auth_reset_password_placeholder": "新密码", + "auth_reset_confirm_label": "确认新密码", + "auth_reset_confirm_placeholder": "确认新密码", + "auth_reset_submit": "重置密码", + "auth_reset_request_new": "重新获取重置链接", + "auth_reset_toast_success": "密码已重置", + + "auth_signup_breadcrumb": "注册", + "auth_signup_toast_created_mail": "账号创建成功。请查收邮件以验证你的账号。", + "auth_signup_toast_created_no_mail": "账号创建成功。你现在可以登录了。", + "auth_signup_dialog_title": "欢迎!感谢你的注册!❤️", + "auth_signup_dialog_created_mail": "你的账号已创建。🎉 请查收邮件以验证你的账号。", + "auth_signup_dialog_verify_then_login": "验证邮箱后,你就可以登录账号了。", + "auth_signup_dialog_created_no_mail": "你的账号已创建,可以开始使用了。🎉", + "auth_signup_dialog_login_now": "你现在可以登录账号了。", + "auth_signup_title": "创建账号", + "auth_signup_loading_methods": "正在加载可用的注册方式", + "auth_signup_using_email": "使用邮箱注册", + "auth_signup_choose_method": "选择你偏好的注册方式", + "auth_signup_back": "返回", + "auth_signup_username_label": "用户名", + "auth_signup_username_placeholder": "张三", + "auth_signup_email_label": "邮箱", + "auth_signup_email_placeholder": "john@example.com", + "auth_signup_password_label": "密码", + "auth_signup_password_placeholder": "密码", + "auth_signup_confirm_label": "确认密码", + "auth_signup_confirm_placeholder": "确认密码", + "auth_signup_submit": "创建账号", + "auth_signup_signin_prompt": "已有账号?{#signin}登录{/signin}", + "auth_signup_or": "或", + "auth_signup_with_email": "使用邮箱注册", + "auth_signup_legal": "点击“创建账号”即表示你同意我们的{#tos}服务条款{/tos}和{#privacy}隐私政策{/privacy}。", + + "auth_verify_breadcrumb": "验证邮箱", + "auth_verify_title": "验证邮箱", + "auth_verify_verifying": "正在验证你的邮箱地址...", + "auth_verify_success": "你的邮箱已验证", + "auth_verify_failed": "此验证链接无效或已过期", + "auth_verify_missing_token": "缺少验证令牌", + "auth_verify_continue": "继续登录", + "auth_verify_toast_success": "邮箱已验证", + + "common_cancel": "取消", + "common_delete": "删除", + "common_edit": "编辑", + "common_share": "共享", + "common_copy_id": "复制 ID", + "common_id_copied": "ID 已复制到剪贴板", + "common_open_menu": "打开菜单", + "common_refresh": "刷新", + "common_settings": "设置", + "common_clear": "清除", + "common_online": "在线", + "common_offline": "离线", + "common_paused": "已暂停", + "common_resume": "恢复", + "common_resuming": "正在恢复...", + "common_coming_soon": "(即将推出)", + "common_save_changes": "保存更改", + "common_danger_zone": "危险区域", + "common_name": "名称", + "control_intensity": "强度", + "control_duration": "时长", + "control_max_intensity": "最大强度", + "control_max_duration": "最大时长", + "control_vibration": "振动", + "control_value": "数值", + "control_live_intensity": "实时强度", + "control_type_stop": "停止", + "control_type_shock": "电击", + "control_type_vibrate": "振动", + "control_type_sound": "声音", + "live_tooltip_active": "通过 {gateway}({country})实时连接,{latency}ms", + "live_tooltip_connecting": "正在连接...", + "live_tooltip_connect": "连接实时控制", + "live_tooltip_hub_start": "Ctrl+点击以启动整个 Hub", + "live_tooltip_hub_stop": "Ctrl+点击以停止整个 Hub", + "pause_resume_shocker": "恢复电击器", + "pause_pause_shocker": "暂停电击器", + "pause_resume_all": "恢复所有电击器", + "pause_pause_all": "暂停所有电击器", + "shocker_label": "电击器", + "shocker_hub": "Hub", + "shocker_select_hub": "选择 Hub", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID 必须是 {min} 到 {max} 之间的整数。", + "shocker_model": "型号", + "shocker_select_model": "选择型号", + "shocker_name_placeholder": "电击器名称", + "shocker_menu_view_logs": "查看日志", + "shocker_delete_title": "删除电击器", + "shocker_delete_desc": "确定要删除“{name}”吗?此操作无法撤销。", + "shocker_toast_deleted": "电击器“{name}”已删除", + "shocker_toast_paused": "电击器已暂停", + "shocker_toast_resumed": "电击器已恢复", + "shocker_add_desc": "将新的电击器注册到你的某个 Hub。", + "shocker_add_name_placeholder": "我的电击器", + "shockers_title": "电击器", + "shockers_subtitle": "与你的 Hub 配对的所有电击器。", + "shockers_loading": "正在加载电击器...", + "shockers_toast_refreshed": "电击器已刷新", + "shockers_toast_need_hub": "添加电击器前,你需要先创建一个 Hub。", + "shockers_toast_added": "电击器已添加", + "shockers_unknown_module": "未知模块类型", + "shockers_add": "添加电击器", + "shockers_view_mode": "视图模式", + "shockers_mode_classic": "经典", + "shockers_mode_rich": "丰富", + "shockers_mode_simple": "简洁", + "shockers_mode_map": "地图", + "shockers_group_by_hub": "按 Hub 分组", + "shockers_global_limits": "全局限制", + "shockers_logs_label": "日志", + "shockers_empty_title": "还没有电击器", + "shockers_empty_no_hubs": "请先创建一个 Hub,再向其中添加电击器。", + "shockers_empty_has_hubs": "向你的某个 Hub 添加电击器即可开始使用。", + "shockers_create_hub": "创建 Hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 个电击器" + } + } + ], + "shared_shockers_title": "共享的电击器", + "shared_shockers_subtitle": "其他用户与你共享的电击器。", + "shared_shockers_empty_title": "还没有人与你共享电击器。", + "shared_shockers_empty_desc": "当有人与你共享电击器时,它们会显示在这里。", + "shocker_logs_title": "电击器日志", + "shocker_logs_subtitle": "发送到你的电击器的所有控制指令。", + "shocker_logs_live_title": "新日志会实时显示", + "shocker_logs_paused_title": "排序或查看第一页以外的页面时,实时更新会暂停", + "shocker_logs_live": "实时", + "shocker_logs_col_time": "时间", + "shocker_logs_col_type": "类型", + "shocker_logs_col_by": "操作者", + "shocker_logs_filter_label": "按电击器筛选", + "shocker_logs_filter_placeholder": "搜索电击器...", + "shocker_logs_filter_all": "所有电击器", + "shocker_logs_filter_none": "没有匹配的电击器", + "shocker_edit_title": "编辑电击器", + "shocker_edit_subtitle": "修改此电击器的信息或将其移除。", + "shocker_edit_back": "返回电击器", + "shocker_edit_load_failed": "加载电击器失败。", + "shocker_edit_loading": "正在加载电击器...", + "shocker_edit_details_title": "电击器详情", + "shocker_edit_details_desc": "更新此电击器的名称、RF ID 和型号。", + "shocker_edit_pause_state": "暂停状态", + "shocker_edit_is_paused": "电击器已暂停", + "shocker_edit_is_active": "电击器已启用", + "shocker_edit_toast_updated": "电击器已更新", + "shocker_edit_delete_desc": "永久删除此电击器。此操作无法撤销。", + + "common_close": "关闭", + "common_continue": "继续", + "common_loading": "正在加载...", + "common_previous": "上一页", + "common_next": "下一页", + "common_steps": "步骤", + "common_step_label": "第 {number} 步:{title}", + "common_copy": "复制", + "common_copied": "已复制", + "common_never": "永不", + "common_error": "错误:{message}", + "terminal_title": "串口终端", + "terminal_connecting": "正在连接...", + "terminal_help_button": "遇到问题?获取帮助", + "terminal_back_to_modes": "返回模式选择", + "terminal_mode_configure": "配置设备", + "terminal_mode_configure_desc": "配置 WiFi、认证等。包含交互式串口控制台。", + "terminal_mode_flash": "刷写固件", + "terminal_mode_flash_desc": "在已连接的设备上安装或更新固件。", + "terminal_mode_raw": "串口监视器", + "terminal_mode_raw_desc": "仅控制台。读取设备日志并发送命令。", + "terminal_step_channel": "选择通道", + "terminal_step_board": "选择开发板", + "terminal_go_to_step": "前往第 {number} 步:{title}", + "terminal_erase": "刷写前擦除", + "terminal_erase_desc": "清除设备上的所有数据,包括现有配置", + "terminal_unsupported": "你的浏览器不支持此功能。", + "terminal_update_browser": "请将浏览器更新到最新版本。", + "terminal_use_browsers": "请使用以下浏览器之一:", + "terminal_connect_failed_bootloader": "无法进入 Bootloader 模式", + "terminal_connect_failed": "设备连接失败", + "terminal_connect_failed_desc": "无法与设备建立串口连接。", + "terminal_quick_tries": "可以先试试:", + "terminal_try_replug": "拔下设备后重新插入。", + "terminal_try_cable": "换一根 USB 线或换一个接口。", + "terminal_try_driver": "确认已安装串口驱动。", + "terminal_open_troubleshooter": "打开故障排除", + "terminal_log_reset_no_device": "重置时主机端出错:没有设备!", + "terminal_log_reset_error": "重置时主机端出错:{error}", + "terminal_log_send_no_device": "无法发送:没有设备!", + "terminal_log_send_error": "无法发送:{error}", + "terminal_log_firmware_disconnected": "固件已断开:{error}", + "terminal_log_erase_failed": "擦除闪存失败:{error}", + "terminal_log_hard_reset_failed": "硬重置失败:{error}", + "terminal_log_flash_complete": "刷写完成", + "terminal_log_flash_failed": "刷写失败:{error}", + "terminal_log_command_failed": "写入应用命令失败:{error}", + "terminal_help_title": "故障排除", + "terminal_help_desc": "请按顺序完成以下步骤,每一步都能排除一个常见原因。", + "terminal_help_step_cable": "USB 线", + "terminal_help_step_port": "USB 接口", + "terminal_help_step_driver": "安装驱动", + "terminal_help_step_manual": "手动更新驱动", + "terminal_help_step_discord": "在 Discord 上提问", + "terminal_help_cable_body": "很多 USB-C 和 Micro-USB 线只能充电,不能传输数据。请换一根确定可用的数据线(用来传过文件或连接过其他设备的),然后重新连接 Hub。", + "terminal_help_port_body": "请将设备直接插到电脑的 USB 接口上。尽量避免使用 USB 扩展坞、拓展坞和机箱前置接口,它们常常导致供电和信号问题。如果你用的是台式机,请尝试机箱背面的接口。", + "terminal_help_driver_download": "下载 CP210x 驱动:", + "terminal_help_driver_extract": "将 zip 文件解压到电脑上的一个文件夹中。", + "terminal_help_driver_run": "打开该文件夹并运行 {#code}{installer}{/code},按提示完成安装。", + "terminal_help_driver_reconnect": "重新连接设备。", + "terminal_help_manual_intro": "如果驱动安装程序已运行,但设备仍然没有出现:", + "terminal_help_manual_open": "打开设备管理器(按 {#key}Win{/key} + {#key}X{/key},然后选择 {#code}Device Manager{/code})。", + "terminal_help_manual_ports": "在 {#code}Ports (COM & LPT){/code} 下,查找类似这样的条目:", + "terminal_help_manual_missing": "如果没有找到,说明 Windows 完全没有检测到设备,请重新检查数据线和接口步骤。", + "terminal_help_manual_update": "右键点击该设备,选择 {#code}Update Driver{/code}。", + "terminal_help_manual_browse": "选择 {#code}Browse my computer for drivers{/code},然后选择你解压驱动 zip 的文件夹。确保已勾选 {#code}Include subfolders{/code}。", + "terminal_help_manual_success": "成功后,该条目应显示为 {#code}{deviceName}{/code}。", + "terminal_help_discord_intro": "以上步骤都试过了还是不行?来我们的 Discord 服务器,在 {#code}{channel}{/code} 频道提问。请附上:", + "terminal_help_discord_os": "你的操作系统和浏览器", + "terminal_help_discord_device": "你使用的设备(开发板型号、购买渠道)", + "terminal_help_discord_tried": "你已经尝试过前面哪些步骤", + "terminal_help_discord_errors": "任何错误信息或相关的终端输出", + "terminal_help_discord_join": "加入我们的 Discord 服务器", + "terminal_risk_title": "⚠️ 不稳定固件", + "terminal_risk_intro": "你即将刷写{#strong}实验性固件{/strong},它{#strong}已知不稳定{/strong}。", + "terminal_risk_brick": "这可能会让你的设备永久变砖、需要手动恢复,或完全无法使用。", + "terminal_risk_no_support": "对于此固件导致的问题,我们不提供任何支持。", + "terminal_risk_acknowledge": "我明白这完全由我自己负责", + "terminal_risk_abort": "中止", + "terminal_risk_accept": "我承担全部责任", + "firmware_channel_recommended": "这是推荐的通道。", + "firmware_channel_danger": "除非你清楚自己在做什么,否则不要使用", + "firmware_channel_stable": "稳定版", + "firmware_channel_beta": "测试版", + "firmware_channel_develop": "开发版", + "terminal_board_select": "选择开发板...", + "terminal_board_search": "搜索开发板...", + "terminal_board_none": "未找到开发板。", + "terminal_flash_button": "刷写", + "terminal_flash_progress": "刷写进度:{status}", + "terminal_flash_idle": "空闲", + "terminal_flash_no_device": "未选择设备。", + "terminal_flash_resetting": "正在重置...", + "terminal_flash_downloading": "正在下载固件...", + "terminal_flash_download_failed": "下载固件失败。", + "terminal_flash_flashing": "正在刷写固件...", + "terminal_flash_rebooting": "正在重启设备...(如果卡住,请手动重新接通电源)", + "terminal_flash_done": "设备已重启!刷写完成。", + "terminal_port_select": "选择设备", + "terminal_port_disconnect": "断开设备", + "terminal_port_connected": "已连接设备:{#strong}{id}{/strong}", + "terminal_console": "控制台", + "terminal_connected_device": "已连接的设备", + "terminal_resize": "调整终端面板大小", + "terminal_reboot": "重启", + "terminal_disconnect": "断开连接", + "terminal_fullscreen_exit_esc": "退出全屏(Esc)", + "terminal_fullscreen_exit": "退出全屏", + "terminal_fullscreen_fill": "填满窗口", + "terminal_command_label": "串口命令", + "terminal_command_placeholder": "输入命令...", + "terminal_command_send": "发送命令", + "terminal_colors": "颜色", + "terminal_colors_menu": "颜色...", + "terminal_colors_label": "控制台颜色", + "terminal_colors_close": "关闭颜色", + "terminal_color_input": "{name}颜色", + "terminal_colors_reset": "恢复默认", + "terminal_color_bg": "背景", + "terminal_color_fg": "文本", + "terminal_color_ts": "时间戳", + "terminal_color_error": "错误", + "terminal_color_warning": "警告", + "terminal_color_info": "信息", + "terminal_color_debug": "调试", + "terminal_color_verbose": "详细", + "terminal_options": "选项", + "terminal_options_label": "控制台选项", + "terminal_hide_system": "隐藏系统消息", + "terminal_stick_bottom": "固定在底部", + "terminal_raw_output": "原始输出", + "terminal_timestamps": "时间戳", + "terminal_timestamp_uptime": "运行时间", + "terminal_timestamp_local": "本地", + "terminal_timestamp_ms": "毫秒", + "terminal_timestamp_off": "关闭", + "terminal_copy_settings": "复制设置", + "terminal_import_settings": "导入设置", + "terminal_copy_selection": "复制所选内容", + "terminal_copy_all": "复制全部输出", + "terminal_toast_selection_copied": "所选内容已复制", + "terminal_toast_output_copied": "控制台输出已复制", + "terminal_toast_settings_copied": "控制台设置已复制", + "terminal_toast_clipboard_unreadable": "无法读取剪贴板", + "terminal_toast_settings_imported": "控制台设置已导入", + "terminal_toast_settings_invalid": "剪贴板中没有控制台设置", + + "common_try_again": "重试", + "terminal_cfg_intro": "数值通过 UART 发送到设备,可在下方控制台查看设备的响应。不带参数的命令用于读取,点击各字段旁的 {#eye/} 按钮即可读取当前值。", + "terminal_cfg_rf_title": "RF 发射器", + "terminal_cfg_rf_desc": "控制电击器的 RF 输出。", + "terminal_cfg_tx_pin": "TX GPIO 引脚", + "terminal_cfg_example": "例如 {value}", + "terminal_cfg_read_value": "读取当前值", + "terminal_cfg_set": "设置", + "terminal_cfg_read": "读取", + "terminal_cfg_reading": "正在读取…", + "terminal_cfg_apply": "应用", + "terminal_cfg_keepalive": "启用保活", + "terminal_cfg_keepalive_desc": "定期向已配对的电击器发送信号,使其保持唤醒。", + "terminal_cfg_estop_title": "紧急停止", + "terminal_cfg_estop_desc": "可停止所有输出的硬件按钮。", + "terminal_cfg_estop_enabled": "启用紧急停止", + "terminal_cfg_estop_pin": "紧急停止 GPIO 引脚", + "terminal_cfg_estop_note": "注意:{#code}{latching}{/code} 和 {#code}{active}{/code} 没有专用命令,请通过下方的 JSON 配置进行设置。", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "Station 凭据和设备主机名。", + "terminal_cfg_hostname": "主机名", + "terminal_cfg_networks": "网络(JSON 数组)", + "terminal_cfg_invalid_json_array": "必须是有效的 JSON 数组", + "terminal_cfg_ap_note": "AP 设置({#code}{ssid}{/code}、{#code}{password}{/code}、{#code}{disabled}{/code}、{#code}{staDisabled}{/code}、{#code}{offlineMode}{/code})没有专用命令,请使用 JSON 配置。", + "terminal_cfg_backend_title": "后端", + "terminal_cfg_backend_desc": "OpenShock 服务器和认证。", + "terminal_cfg_domain": "域名", + "terminal_cfg_domain_restart": "设置域名会重启设备。", + "terminal_cfg_auth_token": "认证令牌", + "terminal_cfg_auth_token_placeholder": "粘贴设备令牌", + "terminal_cfg_hide": "隐藏", + "terminal_cfg_show": "显示", + "terminal_cfg_serial_title": "串口输入", + "terminal_cfg_echo": "启用回显", + "terminal_cfg_echo_desc": "将输入的字符回显到控制台。", + "terminal_cfg_advanced_title": "高级:完整配置", + "terminal_cfg_advanced_desc": "对于没有专用命令的字段(强制门户、OTA、LAN 等),可替换整个配置。", + "terminal_cfg_json_config": "JSON 配置", + "terminal_cfg_invalid_json": "必须是有效的 JSON", + "terminal_cfg_read_json": "以 JSON 读取当前配置", + "terminal_cfg_json_restart": "应用 JSON 配置会重启设备。", + "terminal_cfg_raw_config": "原始 FlatBuffer 配置(base64)", + "terminal_cfg_invalid_base64": "必须是有效的 base64 字符串", + "terminal_cfg_read_raw": "以 base64 读取当前配置", + "terminal_cfg_factory_reset": "恢复出厂设置", + "terminal_cfg_factory_reset_desc": "清除设备的全部配置。", + "terminal_cfg_factory_reset_title": "要将设备恢复出厂设置吗?", + "terminal_cfg_factory_reset_action": "清除配置", + "terminal_cfg_factory_reset_confirm": "这将清除设备上的所有配置:WiFi 网络、后端凭据、引脚以及其他所有设置。设备将恢复为默认状态。", + "terminal_cfg_read_failed_json_title": "无法读取 JSON 配置", + "terminal_cfg_read_failed_raw_title": "无法读取原始配置", + "terminal_cfg_read_failed_desc": "尝试 {attempts} 次后设备仍无响应。", + "terminal_cfg_common_causes": "常见原因:", + "terminal_cfg_cause_busy": "设备正忙于处理其他命令。", + "terminal_cfg_cause_disconnected": "设备已断开或重启。", + "terminal_cfg_cause_unsupported": "该固件版本不支持此命令。", + + "common_status": "状态", + "common_version": "版本", + "common_created": "创建时间", + "common_create": "创建", + "common_done": "完成", + "common_enable": "启用", + "common_disable": "禁用", + "common_are_you_sure": "确定吗?", + "common_generating": "正在生成...", + "hubs_title": "Hub", + "hubs_subtitle": "注册到你账号的所有 Hub。", + "hubs_add": "添加 Hub", + "hubs_load_failed": "加载 Hub 失败。", + "hubs_empty_title": "还没有 Hub", + "hubs_empty_desc": "Hub 是向你的电击器转发指令的设备。添加一个即可开始使用。", + "hubs_create_title": "创建 Hub", + "hubs_name_label": "Hub 名称", + "hubs_name_placeholder": "我的 Hub", + "hub_toast_not_connected": "未连接到服务器", + "hub_toast_try_later": "请稍后重试。", + "hub_reboot_title": "要重启 {name} 吗?", + "hub_reboot_desc": "Hub 将断开连接并重启。在它重新上线前,与其配对的电击器都不会响应。", + "hub_reboot": "重启", + "hub_hotspot_enable_title": "要在 {name} 上启用 Wi-Fi 热点吗?", + "hub_hotspot_disable_title": "要在 {name} 上禁用 Wi-Fi 热点吗?", + "hub_hotspot_enable_desc": "Hub 会广播自己的配置网络。它仍可通过你的 Wi-Fi 访问,但在你关闭热点前,范围内的任何人都能连接。", + "hub_hotspot_disable_desc": "配置热点将关闭。如果 Hub 尚未连接到你的 Wi-Fi,你需要直接接触设备才能重新配置。", + "hub_delete_desc": "你即将删除 Hub {#strong}{name}{/strong}。", + "hub_delete_shockers": "以下电击器也会被删除:", + "hub_edit_title": "编辑 Hub", + "hub_edit_apply": "应用", + "hub_pair_title_generate": "要生成配对码吗?", + "hub_pair_title_generated": "配对码已生成", + "hub_pair_title_paired": "Hub 已配对", + "hub_pair_consumed": "{#strong}{name}{/strong} 已使用此配对码,现已完成配对。", + "hub_pair_used": "此配对码已被使用,不再有效。", + "hub_pair_generated_for": "已为 {#strong}{name}{/strong} 生成配对码。", + "hub_copy_now": "下面的配对码之后将无法再查看,请立即复制并更新到客户端中。", + "hub_pair_generate_for": "你即将为 {#strong}{name}{/strong} 生成配对码。", + "hub_pair_valid_for": "配对码在创建后 15 分钟内有效。", + "hub_pair_one_active": "每个 Hub 只能有一个有效的配对码,新生成的配对码会覆盖旧的。", + "hub_pair_complete": "配对完成", + "hub_pair_code_label": "配对码:", + "hub_pair_copied_close": "已复制,关闭", + "hub_pair_get": "获取配对码", + "hub_token_generated": "令牌已生成", + "hub_token_generated_for": "已为 {#strong}{name}{/strong} 生成新令牌。", + "hub_token_regenerate_for": "你即将为 {#strong}{name}{/strong} 重新生成令牌。", + "hub_token_invalidate": "此操作会使当前令牌失效,并断开使用该令牌的客户端。", + "hub_token_confirm": "确定要这样做吗?", + "hub_token_label": "新令牌:", + "hub_token_copied_close": "已复制,关闭", + "hub_token_regenerate": "重新生成令牌", + "hub_menu_update": "更新", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "启用 Wi-Fi 热点", + "hub_menu_hotspot_disable": "禁用 Wi-Fi 热点", + "hub_menu_pair": "配对", + "hub_menu_estop": "紧急停止", + "hub_update_breadcrumb": "更新", + "hub_update_unknown_hub": "未知 Hub", + "hub_update_unknown_task": "未知任务", + "hub_update_task_metadata": "正在获取元数据", + "hub_update_task_preparing": "正在准备更新", + "hub_update_task_flash_fs": "正在刷写文件系统", + "hub_update_task_verify_fs": "正在校验文件系统", + "hub_update_task_flash_app": "正在刷写应用程序", + "hub_update_task_bootable": "正在将应用程序标记为可启动", + "hub_update_task_rebooting": "正在重启", + "hub_update_status_started": "已开始", + "hub_update_status_running": "运行中", + "hub_update_status_finished": "已完成", + "hub_update_status_error": "错误", + "hub_update_status_timeout": "超时", + "hub_update_confirm_title": "确认固件更新", + "hub_update_confirm_desc": "要将 {#strong}{name}{/strong} 更新到版本 {#strong}{version}{/strong} 吗?", + "hub_update_unstable_warning": "此版本可能不属于稳定通道,可能存在 bug。", + "hub_update_title": "更新 {name}", + "hub_update_subtitle": "管理此 Hub 的固件更新。", + "hub_update_status_title": "Hub 状态", + "hub_update_firmware": "固件:{#mono}{version}{/mono}", + "hub_update_confirm": "更新", + "hub_update_success": "更新成功完成", + "hub_update_rolled_back": "设备已回滚到上一版本", + "hub_update_back": "返回 Hub", + "hub_update_flash_again": "重新刷写", + "hub_update_card_title": "固件更新", + "hub_update_card_desc": "选择要安装的固件通道和版本。", + "hub_update_to": "更新到 {version}", + "hub_update_must_be_online": "Hub 必须在线才能开始更新。", + "hub_update_updating_to": "正在更新到 {version}...", + "hub_update_total": "总进度", + "hub_update_task": "任务", + "hub_update_history": "更新历史", + "hub_update_no_history": "此 Hub 没有更新历史。", + "hub_update_col_id": "ID", + "hub_update_col_started": "开始时间", + "hub_update_col_message": "消息", + "hub_update_loading": "正在加载 Hub 信息...", + "hub_update_not_found": "未找到 Hub。", + "home_breadcrumb": "首页", + "home_welcome": "欢迎回来", + "home_welcome_name": "欢迎回来,{name}", + "home_subtitle": "这是你的 OpenShock 设置概览。", + "home_hubs_online": "{count} 个在线", + "home_hub_status": "Hub 状态", + "home_no_hubs": "没有 Hub", + "home_all_online": "全部在线", + "home_all_offline": "全部离线", + "home_some_online": "{online}/{total} 在线", + "home_quick_links": "快速链接", + "home_my_shockers": "我的电击器", + "home_my_shockers_desc": "控制你的电击器", + "home_hubs_desc": "管理你的 Hub", + "home_shared_desc": "与你共享的电击器", + "home_public_desc": "管理共享链接", + "home_get_started": "开始使用", + "home_get_started_desc": "你还没有任何 Hub。创建一个 Hub 来连接你的第一台设备,然后向其中添加电击器。", + "home_set_up_hub": "设置 Hub", + "home_first_shocker": "添加你的第一个电击器", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "你已设置 {count} 个 Hub。添加一个电击器即可开始控制。" + } + } + ], + "home_go_to_shockers": "前往电击器", + "profile_title": "个人资料", + "profile_coming_soon": "个人资料即将推出", + "profile_coming_soon_desc": "你的公开个人资料暂不可用。账号信息请在“设置”中查看。", + + "common_retry": "重试", + "common_never_used": "从未使用", + "common_expires": "{time}过期", + "common_search_placeholder": "搜索...", + "common_unknown": "未知", + "settings_breadcrumb_account": "账号", + "account_subtitle": "你的登录信息和账号操作。", + "account_change_username": "修改用户名", + "account_change_email": "修改邮箱", + "account_change_password": "修改密码", + "account_username_label": "用户名", + "account_email_label": "邮箱", + "account_password_label": "密码", + "account_new_password_label": "新密码", + "account_confirm_password_label": "确认新密码", + "account_oauth_only": "仅 OAuth 账号不可用", + "account_oauth_no_password": "此账号通过 OAuth 登录,没有密码。", + "account_diagnostics": "诊断", + "account_diagnostics_desc": "帮助我们修复崩溃和缓慢的 API 调用。报告包含错误信息、堆栈跟踪和你的 IP。默认关闭。", + "account_diagnostics_level": "诊断级别", + "account_telemetry_off": "关闭", + "account_telemetry_off_desc": "不发送任何数据。", + "account_telemetry_errors": "错误", + "account_telemetry_errors_desc": "仅发送浏览器错误报告。", + "account_telemetry_full": "完整", + "account_telemetry_full_desc": "错误报告以及 API 调用跟踪(不含页面导航)。", + "account_toast_deactivated": "账号已成功停用", + "account_deactivate_title": "停用账号", + "account_deactivate_desc": "确定要停用你的账号吗?", + "account_deactivate": "停用账号", + "account_email_title": "修改邮箱", + "account_email_desc": "输入新的邮箱地址,并使用当前密码确认。", + "account_email_toast_sent": "验证邮件已发送到 {email}。点击邮件中的链接即可完成更改。", + "account_new_email": "新邮箱", + "account_current_password": "当前密码", + "account_password_title": "修改密码", + "account_password_desc": "输入当前密码并设置新密码。", + "account_password_toast": "密码已修改", + "account_username_title": "修改用户名", + "account_username_desc": "输入新的用户名。", + "account_new_username": "新用户名", + "account_username_toast": "用户名已成功修改", + "tokens_subtitle": "API 令牌用于向 OpenShock API 进行认证。", + "tokens_generate": "生成令牌", + "tokens_toast_refreshed": "令牌已刷新", + "tokens_empty_title": "没有 API 令牌", + "tokens_empty_desc": "生成一个令牌以向 OpenShock API 进行认证。", + "tokens_created_on": "创建于 {date}", + "tokens_last_used": "上次使用:{time}", + "tokens_never_expires": "永不过期", + "tokens_load_failed": "加载 API 令牌失败。", + "token_toast_edited": "令牌已成功编辑", + "token_name_required": "名称为必填项", + "token_name_too_long": "名称过长", + "token_edit_title": "编辑 API 令牌", + "token_name_label": "令牌名称", + "token_name_placeholder": "令牌名称...", + "token_permissions": "权限", + "token_perm_category_shockers": "电击器", + "token_perm_category_devices": "Hub", + "token_perm_category_usershares": "用户共享", + "token_perm_category_publicshares": "公开共享", + "token_perm_use": "使用", + "token_perm_edit": "编辑", + "token_perm_pause": "暂停", + "token_perm_auth": "认证", + "token_shocker_control": "电击器控制", + "token_toast_paused": "令牌已暂停", + "token_toast_resumed": "令牌已恢复", + "token_delete_title": "删除 API 令牌", + "token_delete_desc": "确定要删除 {#strong}{name}{/strong} 吗?", + "token_delete_permanent": "此操作无法撤销,令牌将被永久删除。", + "token_toast_deleted": "令牌已成功删除", + "token_resume": "恢复令牌", + "token_pause": "暂停令牌", + "token_mode_clamp_desc": "截断(Clamp):超出允许范围的请求会被限制到最接近的边界值(最小值或最大值)。", + "token_mode_lerp_desc": "线性映射(Lerp):将完整的输入范围线性缩放到你允许的最小值至最大值范围内。", + "token_paused_desc": "已暂停的令牌无法发送电击器控制消息。", + "token_intensity_range": "强度范围", + "token_duration_range": "时长范围", + "token_new_breadcrumb": "新建", + "token_redirect_not_allowed": "提供的 redirect_uri 不被允许。仅允许回环地址或自定义应用协议。", + "token_params_missing": "缺少必需的 GET 参数。请确保提供了 name、redirect_uri 和 permissions。", + "token_invalid_permissions": "提供的权限无效:{list}", + "token_toast_created": "令牌已成功创建", + "token_request_title": "API 令牌请求", + "token_access_granted": "已授予访问权限", + "token_shared_redirecting": "令牌已创建并共享给该应用。正在将你重定向回 {#b}{uri}{/b}。", + "token_not_redirected": "如果没有自动跳转,请使用下方按钮。", + "token_finish": "完成", + "token_generated_title": "API 令牌已生成", + "token_copy_now": "请立即复制你的 API 令牌,之后将无法再次查看!", + "token_new_title": "新建 API 令牌", + "token_external_desc": "一个外部应用正在请求访问你的账号。允许访问前,请检查并调整下方的权限。", + "token_new_desc": "为你的账号配置并生成新的 API 令牌。", + "token_external_requesting": "{#b}{name}{/b} 正在请求 API 令牌。你的令牌将共享给位于 {#b}{uri}{/b} 的应用。", + "token_allow": "允许", + "token_generate": "生成", + "token_deny": "拒绝", + "sessions_subtitle": "你账号上的所有活跃会话。请撤销任何你不认识的会话。", + "sessions_unknown_device": "未知设备", + "sessions_toast_refreshed": "会话已刷新", + "sessions_load_failed": "加载会话失败。", + "sessions_empty_title": "没有活跃会话", + "sessions_empty_desc": "当你从浏览器或应用登录后,会话会显示在这里。", + "sessions_last_seen": "上次活动:{time}", + "sessions_signed_in": "登录于 {time}", + "session_toast_revoked": "会话已成功撤销", + "session_revoke_title": "撤销会话", + "session_revoke": "撤销", + "session_revoke_desc": "确定要撤销此会话吗?", + "session_revoke_from": "该会话从 {#strong}{ip}{/strong} 使用 {#strong}{agent}{/strong} 登录", + "connections_title": "OAuth 关联", + "connections_subtitle": "关联或解除关联第三方账号,以便更快登录并保持个人资料同步。", + "connections_toast_linked": "账号已关联。", + "connections_toast_cancelled": "关联流程已取消。", + "connections_toast_failed": "关联失败。", + "connections_toast_removed": "关联已移除", + "connections_refreshing": "正在刷新…", + "connections_link_new": "关联新服务", + "connections_empty_title": "还没有关联", + "connections_empty_desc": "点击上方的“关联新服务”来连接可用的服务。", + "connections_unlink": "解除关联", + "connections_load_failed": "加载 OAuth 关联失败。", + "connections_unlink_title": "要解除关联 {name} 吗?", + "connections_unlink_title_generic": "要解除关联此账号吗?", + "connections_unlink_desc": "除非重新关联,否则你将无法再使用此服务登录。", + "provider_starting": "正在启动 {name}...", + "provider_link": "关联 {name}", + "audit_subtitle": "你账号上与安全相关的活动。请检查任何你不认识的记录。", + "audit_col_time": "时间", + "audit_col_action": "操作", + "audit_col_details": "详情", + "audit_col_reason": "原因", + "audit_col_ip": "IP 地址", + "audit_col_device": "设备", + "audit_action_login": "已登录", + "audit_action_logout": "已退出", + "audit_action_password_changed": "密码已修改", + "audit_action_email_change_requested": "已请求修改邮箱", + "audit_action_email_changed": "邮箱已修改", + "audit_action_username_changed": "用户名已修改", + "audit_action_api_token_created": "API 令牌已创建", + "audit_action_api_token_deleted": "API 令牌已删除", + "audit_action_oauth_connected": "关联已添加", + "audit_action_oauth_disconnected": "关联已移除", + "audit_action_account_deactivated": "账号已停用", + "audit_action_account_reactivated": "账号已重新激活", + "audit_action_account_deleted": "账号已删除", + "audit_action_automation_token_created": "自动化令牌已创建", + "audit_action_automation_token_updated": "自动化令牌已更新", + "audit_action_automation_token_rotated": "自动化令牌已轮换", + "audit_action_automation_token_deleted": "自动化令牌已删除", + "audit_action_automation_token_used": "自动化令牌已使用", + "audit_meta_session": "会话 {id}", + "audit_meta_changed": "{old} 改为 {new}", + "audit_meta_email_requested": "已请求改为 {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{name}(已移除 {count} 个账号)" + } + } + ], + "audit_meta_scheduled_deletion": "已计划删除", + "audit_meta_kept": "保留以便重新激活", + + "common_view": "查看", + "common_save": "保存", + "common_saving": "正在保存...", + "common_back": "返回", + "common_shared_by": "共享者", + "common_user_avatar": "用户头像", + "common_toast_saved": "更改已成功保存", + "pause_reason_shocker": "已在电击器层级暂停", + "pause_reason_shocker_user_share": "已在电击器和用户共享层级暂停", + "pause_reason_shocker_public_share": "已在电击器和公开共享层级暂停", + "pause_reason_user_share": "已在用户共享层级暂停", + "pause_reason_public_share": "已在公开共享层级暂停", + "public_shares_subtitle": "任何人都能使用的链接,无需账号。", + "public_shares_new": "新建共享", + "public_share_never_expires": "永不过期", + "public_shares_empty_title": "还没有公开共享", + "public_shares_empty_desc": "创建一个任何人都能用来控制你的电击器的链接。", + "public_share_expired": "已过期", + "public_share_no_expiry": "永不过期", + "public_share_label": "公开共享", + "public_share_toast_created": "已创建新的公开共享", + "public_share_create_title": "创建公开共享", + "public_share_toast_deleted": "已删除公开共享", + "public_share_delete_title": "删除公开共享", + "public_share_delete_desc": "确定要删除公开共享 {#strong}{name}{/strong} 吗?", + "public_share_edit_title": "公开共享:{name}", + "public_share_edit_subtitle": "编辑中:保存后更改才会生效。", + "public_share_add_shocker": "添加电击器", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "已向共享添加 {count} 个电击器" + } + } + ], + "public_share_empty_shockers_title": "此共享中没有电击器", + "public_share_empty_shockers_desc": "添加电击器后,任何拥有链接的人都能控制它。", + "public_share_load_failed": "获取公开共享详情时出错", + "public_share_paused_here": "已在此共享中暂停", + "public_share_resume_shocker": "恢复电击器", + "public_share_pause_shocker": "暂停电击器", + "public_share_remove": "从共享中移除", + "public_share_toast_removed": "电击器已从共享中移除", + "public_share_add_title": "添加电击器", + "public_share_add_desc": "向此公开共享添加电击器。添加后即可设置它们的限制。", + "public_share_add_placeholder": "选择要共享的电击器...", + "public_share_add_no_match": "没有匹配的电击器", + "public_share_add_submit": "添加电击器", + "public_share_view_loading": "正在加载共享详情...", + "public_share_view_title": "公开共享链接", + "public_share_view_desc": "以访客身份进入,或使用你的 OpenShock 账号登录", + "public_share_view_guest_name": "访客名称", + "public_share_view_enter": "进入", + "public_share_view_enter_guest": "以访客身份进入", + "public_share_login": "登录", + "perm_shock_on": "已启用电击", + "perm_shock_off": "已禁用电击", + "perm_vibrate_on": "已启用振动", + "perm_vibrate_off": "已禁用振动", + "perm_sound_on": "已启用声音", + "perm_sound_off": "已禁用声音", + "perm_live_on": "已启用实时控制", + "perm_live_off": "已禁用实时控制", + "perm_live_control": "实时控制", + "user_selector_avatar_of": "{name} 的头像", + "user_selector_placeholder": "输入用户名", + "user_selector_aria": "要搜索的用户名", + "user_selector_search": "搜索用户", + "user_selector_found": "已找到用户", + + "common_remove": "移除", + "user_shares_subtitle": "与其他用户的直接永久共享。", + "user_shares_toast_invited": "已向 {name} 发送电击器邀请", + "user_shares_redeem": "兑换共享码", + "user_shares_new": "新建共享", + "user_shares_tab_shares": "共享", + "user_shares_tab_incoming": "与我共享", + "user_shares_tab_invites": "邀请", + "share_code_create_title": "新建共享码", + "share_code_create_desc": "创建共享码或邀请", + "share_code_shocker_placeholder": "选择要共享的电击器...", + "share_code_no_match": "没有匹配的电击器", + "share_code_send_invite": "发送共享邀请", + "share_code_create": "创建共享码", + "share_code_created_title": "共享码已生成", + "share_code_created_desc": "请复制共享码或共享链接!", + "share_code_redeem_title": "兑换共享码", + "share_code_redeem_desc": "输入要兑换的共享码", + "share_code_redeem_placeholder": "输入共享码", + "share_code_redeemed": "兑换成功!", + "share_code_shared_shockers": "共享的电击器", + "share_code_redeeming": "正在兑换...", + "share_code_redeem": "兑换", + "incoming_shares_empty_title": "没有与你共享的内容", + "incoming_shares_empty_desc": "还没有人与你共享电击器。", + "incoming_share_toast_removed": "已移除 {name} 的共享", + "incoming_share_remove_title": "移除共享", + "incoming_share_remove_desc": "确定要移除 {#strong}{name}{/strong} 的共享吗?", + "incoming_share_toast_removed_shocker": "已移除 {name} 共享的 {shocker}", + "incoming_share_remove_shocker_title": "要移除此共享的电击器吗?", + "incoming_share_remove_shocker_desc": "确定要移除 {#strong}{name}{/strong} 共享的电击器 {#strong}{shocker}{/strong} 吗?", + "incoming_share_manage_from": "管理来自以下用户的共享", + "share_remove": "移除共享", + "invites_empty_title": "还没有邀请", + "invites_empty_desc": "你没有收到或发出的共享邀请。", + "invites_outgoing": "已发出", + "invites_outgoing_empty_title": "没有已发出的邀请", + "invites_outgoing_empty_desc": "你没有已发出的共享邀请。", + "invites_incoming": "已收到", + "invites_incoming_empty_title": "没有收到的邀请", + "invites_incoming_empty_desc": "你没有收到的共享邀请。", + "invite_toast_accepted": "已接受 {name} 的共享邀请", + "invite_toast_declined": "已拒绝 {name} 的共享邀请", + "invite_deny_title": "拒绝邀请", + "invite_deny_label": "拒绝邀请", + "invite_deny": "拒绝", + "invite_deny_desc": "确定要拒绝 {#strong}{name}{/strong} 的邀请吗?", + "invite_accept": "接受邀请", + "invite_toast_cancelled_for": "已取消发给 {name} 的邀请({id})", + "invite_toast_cancelled": "已取消邀请 {id}", + "invite_cancel_title": "取消邀请", + "invite_cancel": "取消", + "invite_cancel_for_desc": "确定要取消发给 {#strong}{name}{/strong} 的邀请吗?", + "invite_cancel_code_desc": "确定要取消共享码为 {#strong}{code}{/strong} 的邀请吗?", + "invite_cancel_outstanding": "取消待处理的邀请", + "outgoing_shares_empty_title": "没有共享的电击器", + "outgoing_shares_empty_desc": "你还没有与其他用户共享任何电击器。", + "outgoing_share_toast_removed": "已移除电击器共享 {name}", + "outgoing_share_remove_title": "要停止共享此电击器吗?", + "outgoing_share_editing_for": "正在编辑共享对象:", + "outgoing_share_limits": "限制与权限", + "outgoing_share_same": "所有电击器使用相同的限制", + "outgoing_share_per_desc": "为每个电击器单独调整限制", + "outgoing_share_all": "全部", + "outgoing_share_per": "按电击器", + + "outgoing_share_remove_desc": "确定要停止与 {#strong}{name}{/strong} 共享 {#strong}{shocker}{/strong} 吗?", + + "report_breadcrumb": "举报 API 令牌", + "report_toast_clipboard_failed": "读取剪贴板失败:{error}", + "report_title": "举报泄露的 API 令牌", + "report_paste": "从剪贴板粘贴", + "report_warning": "此表单仅用于举报意外泄露的 API 令牌。", + "report_abuse_warning": "故意滥用将导致封禁或严格的接口限制。", + "report_detected": "检测到的令牌", + "report_invalid": "一个或多个令牌似乎无效,请检查格式问题。", + "report_acknowledge": "我确认已了解此功能的用途,并愿意承担责任。", + "report_submit": "提交举报", + "turnstile_disabled": "Turnstile 已禁用", + "common_internal_error": "内部错误", + "resend_toast_sent": "激活邮件已发送,请检查收件箱和垃圾邮件文件夹。", + "resend_toast_throttled": "请求的激活邮件过多,请稍后再试。", + "resend_toast_unavailable": "无法从此浏览器重新发送激活邮件。如果你的账号尚未激活,登录时会发送新链接。", + "resend_button": "没收到邮件?重新发送", + "expiration_label": "有效期", + "expiration_never": "永不", + "expiration_custom": "自定义", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 天" + } + } + ], + "expiration_required": "过期日期为必填项", + "expiration_never_desc": "永不过期", + "expiration_expires_at": "{time}过期({date})", + "date_picker_placeholder": "选择日期", + "telemetry_toast_title": "帮助改进 OpenShock?", + "telemetry_toast_desc": "发送诊断数据,帮助我们修复崩溃和缓慢的 API 调用。报告包含错误信息、堆栈跟踪和你的 IP。你可以随时在账号设置中更改。", + "telemetry_toast_no": "不用了", + "telemetry_toast_errors": "仅错误", + "telemetry_toast_full": "完整", + "table_show_details": "显示详情", + "table_hide_details": "隐藏详情", + "table_no_results": "没有结果。", + "table_sort_asc": "按{name}升序排序", + "table_sort_desc": "按{name}降序排序", + "table_sort_none": "按{name}排序,未排序", + "cell_na": "无", + "cell_not_applicable": "不适用", + "cell_invalid": "无效", + "cell_unavailable": "不可用", + "cell_none": "无", + "oauth_login_with": "使用 {provider} 登录", + "oauth_signup_with": "使用 {provider} 注册", + "signalr_connect_failed": "连接服务器失败!", + "signalr_disconnect_failed": "断开服务器连接时出错!", + "signalr_invalid_update": "从服务器收到无效的更新!", + "signalr_invalid_log": "从服务器收到无效的日志数据!", + "signalr_invalid_ota": "从服务器收到无效的固件更新数据!", + "ota_toast_failed": "Hub 固件更新失败:{message}", + "ota_toast_succeeded": "Hub 固件更新成功完成!", + "ota_toast_rolled_back": "Hub 固件已回滚到上一版本", + "lcg_connect_failed": "连接实时控制网关失败", + "terminal_toast_bootloader_failed": "进入 Bootloader 失败:{error}", + "terminal_toast_app_mode_failed": "进入应用模式失败:{error}", + + "problem_account_account_not_activated_title": "账号未激活", + "problem_account_account_not_activated_desc": "请在收件箱中查找激活邮件。", + "problem_account_activation_not_found_title": "激活链接无效", + "problem_account_activation_not_found_desc": "该链接可能已过期或已被使用。", + "problem_account_activation_resend_too_many_title": "请求的激活邮件过多", + "problem_account_activation_resend_too_many_desc": "请稍等一段时间后再试。", + "problem_account_activation_resend_unavailable_title": "无法重新发送激活邮件", + "problem_account_activation_resend_unavailable_desc": "请重新登录以获取新的激活链接。", + "problem_account_deactivate_already_deactivated_title": "账号已停用", + "problem_account_deactivate_denied_privileged_title": "特权账号无法停用", + "problem_account_deactivate_unauthorized_title": "你无权执行此操作", + "problem_account_deactivated_title": "此账号已被停用", + "problem_account_email_already_in_use_title": "该邮箱地址已被使用", + "problem_account_email_invalid_title": "该邮箱地址无效", + "problem_account_email_taken_title": "该邮箱地址已被使用", + "problem_account_email_too_many_requests_title": "修改邮箱的请求过多", + "problem_account_email_too_many_requests_desc": "请稍等一段时间后再试。", + "problem_account_email_unchanged_title": "这已经是你的邮箱地址", + "problem_account_email_verify_not_found_title": "验证链接无效", + "problem_account_email_verify_not_found_desc": "该链接可能已过期或已被使用。", + "problem_account_o_auth_only_title": "此账号没有密码", + "problem_account_o_auth_only_desc": "请使用注册时所用的服务登录。", + "problem_account_password_not_set_title": "未设置密码", + "problem_account_password_not_set_desc": "此账号通过外部服务登录。", + "problem_account_password_old_password_invalid_title": "当前密码不正确", + "problem_account_username_invalid_title": "不允许使用该用户名", + "problem_account_username_recently_changed_title": "用户名修改过于频繁", + "problem_account_username_recently_changed_desc": "每 7 天只能修改一次用户名。", + "problem_account_username_taken_title": "该用户名已被占用", + "problem_admin_user_deactivated_title": "该用户已被停用", + "problem_admin_user_not_activated_title": "该用户尚未激活", + "problem_api_token_can_only_delete_self_title": "API 令牌只能删除自身", + "problem_api_token_not_found_title": "未找到 API 令牌", + "problem_api_token_paused_title": "此 API 令牌已暂停", + "problem_assign_lcg_bad_schema_version_title": "不支持的 Hub 协议版本", + "problem_assign_lcg_bad_schema_version_desc": "请更新 Hub 固件后再连接。", + "problem_assign_lcg_no_lcg_available_title": "没有可用的网关", + "problem_assign_lcg_no_lcg_available_desc": "当前没有可用的实时控制网关,请稍后再试。", + "problem_authentication_account_deactivated_title": "此账号已被停用", + "problem_authentication_account_not_activated_title": "此账号尚未激活", + "problem_authentication_cookie_missing_or_invalid_title": "你尚未登录", + "problem_authentication_cookie_missing_or_invalid_desc": "你的会话可能已过期,请重新登录。", + "problem_authentication_header_missing_or_invalid_title": "API 令牌无效", + "problem_authentication_session_invalid_title": "会话已过期", + "problem_authentication_session_invalid_desc": "请重新登录。", + "problem_authentication_token_invalid_title": "API 令牌无效", + "problem_authentication_unknown_error_title": "认证失败", + "problem_authorization_policy_not_met_title": "你无权执行此操作", + "problem_authorization_token_only_title": "此操作需要 API 令牌", + "problem_authorization_token_permission_missing_title": "此 API 令牌缺少必需的权限", + "problem_authorization_unknown_error_title": "授权失败", + "problem_authorization_user_session_only_title": "此操作需要登录会话", + "problem_automation_token_not_allowed_for_account_title": "特权账号不能使用自动化令牌", + "problem_configuration_already_exists_title": "已存在同名配置项", + "problem_configuration_invalid_name_format_title": "配置名称无效", + "problem_configuration_invalid_name_format_desc": "只允许使用 A 到 Z 和下划线。", + "problem_configuration_invalid_value_format_title": "值与配置类型不匹配", + "problem_configuration_not_found_title": "未找到配置项", + "problem_control_stats_invalid_range_title": "开始日期不能晚于结束日期", + "problem_control_stats_invalid_time_zone_title": "未知时区", + "problem_control_stats_missing_capability_title": "此服务器不提供控制统计", + "problem_device_not_found_title": "未找到 Hub", + "problem_device_not_online_title": "Hub 离线", + "problem_device_too_many_hubs_title": "你的 Hub 数量已达上限", + "problem_device_too_many_shockers_title": "此 Hub 的电击器数量已达上限", + "problem_endpoint_retired_title": "此功能已不再可用", + "problem_expression_error_title": "筛选表达式无效", + "problem_internal_server_error_title": "我们这边出了点问题", + "problem_login_invalid_credentials_title": "用户名或密码错误", + "problem_login_invalid_domain_title": "不允许从此地址登录", + "problem_o_auth_connection_already_exists_title": "你的账号已关联此服务", + "problem_o_auth_connection_already_linked_title": "此外部账号已关联到其他用户", + "problem_o_auth_flow_anonymous_only_title": "你已经登录", + "problem_o_auth_flow_mismatch_title": "登录请求不匹配", + "problem_o_auth_flow_mismatch_desc": "请重新开始。", + "problem_o_auth_flow_missing_data_title": "该服务未返回你的账号信息", + "problem_o_auth_flow_missing_data_desc": "请重试。", + "problem_o_auth_flow_not_found_title": "登录请求已过期", + "problem_o_auth_flow_not_found_desc": "请重新开始。", + "problem_o_auth_flow_unsupported_title": "不支持的登录流程", + "problem_o_auth_internal_error_title": "登录过程中出了点问题", + "problem_o_auth_internal_error_desc": "请稍后重试。", + "problem_o_auth_link_authenticated_user_only_title": "你必须登录后才能关联外部账号", + "problem_o_auth_provider_mismatch_title": "登录请求与服务不匹配", + "problem_o_auth_provider_mismatch_desc": "请重新开始。", + "problem_o_auth_provider_unsupported_title": "不支持此登录服务", + "problem_pair_code_not_found_title": "未找到配对码", + "problem_password_reset_not_found_title": "密码重置链接无效", + "problem_password_reset_not_found_desc": "该链接可能已过期或已被使用。", + "problem_session_not_found_title": "未找到会话", + "problem_share_get_no_shares_title": "你与该用户之间没有共享", + "problem_share_request_create_cannot_share_with_self_title": "你不能与自己共享", + "problem_share_request_create_shocker_not_found_title": "未找到一个或多个电击器", + "problem_share_request_create_shocker_not_found_desc": "它们可能已被移除,或不属于你。", + "problem_share_request_not_found_title": "未找到共享邀请", + "problem_share_user_not_found_title": "未找到共享", + "problem_share_code_already_linked_title": "该电击器已关联到你的账号", + "problem_share_code_cant_link_own_share_code_title": "你不能兑换自己的共享码", + "problem_share_code_not_found_title": "未找到共享码", + "problem_share_link_expiry_date_in_past_title": "过期日期不能早于当前时间", + "problem_share_link_not_found_title": "未找到公开共享", + "problem_share_link_shocker_already_in_share_link_title": "该电击器已在此公开共享中", + "problem_share_link_shocker_not_in_share_link_title": "该电击器不在此公开共享中", + "problem_shocker_control_no_permission_title": "你无权控制此电击器", + "problem_shocker_control_not_found_title": "未找到电击器", + "problem_shocker_control_paused_title": "电击器已暂停", + "problem_shocker_not_found_title": "未找到电击器", + "problem_signup_registration_disabled_title": "当前已关闭注册", + "problem_signup_username_or_email_exists_title": "该用户名或邮箱已被使用", + "problem_turnstile_invalid_title": "验证失败", + "problem_turnstile_invalid_desc": "请重新完成验证后再试。", + "problem_user_not_found_title": "未找到用户", + "problem_user_privileged_delete_denied_title": "特权用户无法删除", + "problem_validation_error_title": "部分字段无效", + "problem_webhook_not_found_title": "未找到 Webhook", + "problem_webhook_unsupported_title": "仅支持 Discord Webhook", + "problem_webhook_unsupported_desc": "请使用 discord.com 链接,而不是 canary 或 ptb。", + + "error_too_many_requests": "请求过多", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=other": "请在 {seconds} 秒后重试。" + } + } + ], + "error_unexpected_response": "服务器响应异常", + "error_internal": "发生内部错误", + "error_network": "发生网络错误", + + "dev_banner": "这是 OpenShock {#b}开发{/b}环境。{#u}不会保存任何数据{/u},并且会定期被生产环境数据覆盖。", + "firmware_channel_bugs_warning": "此通道可能存在 bug。" +} diff --git a/messages/zh-Hant.json b/messages/zh-Hant.json new file mode 100644 index 00000000..dc12903c --- /dev/null +++ b/messages/zh-Hant.json @@ -0,0 +1,1123 @@ +{ + "$schema": "https://inlang.com/schema/inlang-message-format", + + "landing_tagline": "安全、可靠、低延遲的電擊器遠端控制平台。", + "landing_section_label": "首頁", + "landing_hubs_online": "目前在線 Hub 數:", + "landing_learn_more": "深入了解", + "landing_wiki": "Wiki", + "landing_meta_description": "歡迎使用 OpenShock,一個免費開源的生態系統,可透過網際網路控制各種電擊器。", + "instance_meta_description": "歡迎使用 {siteName},這是 OpenShock 的一個獨立實例。OpenShock 是一個免費開源的生態系統,可透過網際網路控制各種電擊器。", + "header_sidebar_toggle": "切換側邊欄", + "header_avatar_alt": "{name} 的大頭貼", + "header_menu_profile": "個人檔案", + "header_menu_settings": "設定", + "header_menu_logout": "登出", + "header_login": "登入", + "header_signup": "註冊", + "header_github_title": "GitHub 上的 OpenShock", + "header_discord_title": "社群 Discord", + + "footer_made_with": "由 {#team}OpenShock 團隊{/team}用 {#heart/} 打造", + "footer_connection_status_label": "伺服器連線狀態", + "footer_signalr_state": "SignalR 狀態", + "footer_frontend_version": "前端版本", + "footer_frontend_commit_title": "Commit {commit}", + "footer_backend_version": "後端版本", + "footer_backend_commit_title": "Commit {commit}", + "footer_language_label": "語言", + + "sidebar_home_link_label": "OpenShock 首頁", + "sidebar_group_general": "一般", + "sidebar_home": "首頁", + "sidebar_shockers": "電擊器", + "sidebar_shared_shockers": "共用的電擊器", + "sidebar_hubs": "Hub", + "sidebar_user_shares": "使用者分享", + "sidebar_public_shares": "公開分享", + "sidebar_serial_terminal": "序列終端機", + "sidebar_group_admin": "管理", + "sidebar_admin_monitoring": "監控", + "sidebar_admin_online_hubs": "線上 Hub", + "sidebar_admin_online_gateways": "線上閘道", + "sidebar_admin_management": "管理", + "sidebar_admin_users": "使用者", + "sidebar_admin_blacklists": "黑名單", + "sidebar_admin_webhooks": "Webhook", + "sidebar_admin_mail": "郵件", + "sidebar_admin_automation_tokens": "自動化權杖", + "sidebar_admin_configuration": "組態", + "sidebar_group_settings": "設定", + "sidebar_settings_api_tokens": "API 權杖", + "sidebar_settings_sessions": "工作階段", + "sidebar_settings_audit_log": "稽核記錄", + "sidebar_settings_connections": "連結的帳號", + "sidebar_settings_account": "帳號設定", + + "error_meta_title": "服務無法使用", + "error_meta_description": "OpenShock 目前無法使用", + "error_meta_logo_alt": "OpenShock 標誌", + "error_fallback_message": "發生錯誤。", + "error_not_found_message": "找不到頁面", + "error_not_found_description": "你要找的頁面不存在。", + "error_unexpected_description": "發生未預期的錯誤。", + "error_go_back": "返回", + + "auth_layout_logo_alt": "OpenShock 標誌", + "auth_layout_invalid_redirect_removed": "為了你的安全,已移除無效的重新導向網址。", + + "auth_activate_breadcrumb": "啟用帳號", + "auth_activate_title": "啟用帳號", + "auth_activate_activating": "正在啟用你的帳號...", + "auth_activate_success": "你的帳號已啟用", + "auth_activate_failed": "此啟用連結無效或已過期", + "auth_activate_missing_token": "缺少啟用權杖", + "auth_activate_continue": "繼續登入", + "auth_activate_toast_success": "帳號已啟用", + + "auth_forgot_breadcrumb": "忘記密碼", + "auth_forgot_title": "忘記密碼", + "auth_forgot_description": "輸入你的電子郵件以重設密碼", + "auth_forgot_email_label": "電子郵件", + "auth_forgot_email_placeholder": "電子郵件", + "auth_forgot_submit": "重設密碼", + "auth_forgot_signin_prompt": "想起密碼了?{#signin}登入{/signin}", + "auth_forgot_mail_disabled": "此站台未設定郵件服務,因此無法重設密碼。請聯絡管理員協助你找回帳號。", + "auth_forgot_toast_sent": "已將重設密碼要求寄到指定的電子郵件", + + "auth_login_breadcrumb": "登入", + "auth_login_title": "歡迎回來", + "auth_login_loading_methods": "正在載入可用的登入方式", + "auth_login_choose_method": "使用下列其中一種方式登入", + "auth_login_with_account": "使用你的 OpenShock 帳號登入", + "auth_login_activation_after_signup": "你的帳號已建立。我們已將啟用連結寄到你的電子郵件,請檢查收件匣和垃圾郵件資料夾。", + "auth_login_activation_pending": "你的帳號尚未啟用。我們已將啟用連結寄到你的電子郵件,請檢查收件匣和垃圾郵件資料夾。如果沒有收到,請稍後再登入一次以取得新的連結。", + "auth_login_oauth_only": "此帳號沒有密碼。請使用註冊時的服務登入。", + "auth_login_oauth_only_with_buttons": "此帳號沒有密碼。請使用上方按鈕,以註冊時的服務登入。", + "auth_login_or_continue_with": "或使用以下方式繼續", + "auth_login_username_label": "使用者名稱或電子郵件", + "auth_login_password_label": "密碼", + "auth_login_submit": "登入", + "auth_login_signup_prompt": "還沒有帳號?{#signup}註冊{/signup}", + "auth_login_legal": "點擊「登入」即表示你同意我們的{#tos}服務條款{/tos}及{#privacy}隱私權政策{/privacy}。", + + "auth_oauth_create_breadcrumb": "使用 {provider} 註冊", + "auth_oauth_create_title": "使用 {#provider}{provider}{/provider} 註冊", + "auth_oauth_create_description": "完成你的帳號資料", + "auth_oauth_create_username_label": "使用者名稱", + "auth_oauth_create_username_placeholder": "使用者名稱", + "auth_oauth_create_email_label": "電子郵件", + "auth_oauth_create_email_placeholder": "電子郵件", + "auth_oauth_create_submit": "註冊", + "auth_oauth_create_legal": "點擊「註冊」即表示你同意我們的{#tos}服務條款{/tos}及{#privacy}隱私權政策{/privacy}。", + + "auth_oauth_error_breadcrumb": "驗證錯誤", + "auth_oauth_error_title": "驗證錯誤", + "auth_oauth_error_back": "返回登入", + + "auth_reset_breadcrumb": "重設密碼", + "auth_reset_title": "重設密碼", + "auth_reset_checking": "正在驗證重設連結...", + "auth_reset_choose_password": "為你的帳號設定新密碼", + "auth_reset_invalid": "此重設連結無效或已過期", + "auth_reset_password_label": "新密碼", + "auth_reset_password_placeholder": "新密碼", + "auth_reset_confirm_label": "確認新密碼", + "auth_reset_confirm_placeholder": "確認新密碼", + "auth_reset_submit": "重設密碼", + "auth_reset_request_new": "要求新的重設連結", + "auth_reset_toast_success": "密碼已重設", + + "auth_signup_breadcrumb": "註冊", + "auth_signup_toast_created_mail": "帳號建立成功。請檢查你的電子郵件以驗證帳號。", + "auth_signup_toast_created_no_mail": "帳號建立成功。你現在可以登入了。", + "auth_signup_dialog_title": "歡迎!感謝你的註冊!❤️", + "auth_signup_dialog_created_mail": "你的帳號已建立。🎉 請檢查你的電子郵件以驗證帳號。", + "auth_signup_dialog_verify_then_login": "驗證電子郵件後,即可登入你的帳號。", + "auth_signup_dialog_created_no_mail": "你的帳號已建立,可以開始使用了。🎉", + "auth_signup_dialog_login_now": "你現在可以登入你的帳號了。", + "auth_signup_title": "建立你的帳號", + "auth_signup_loading_methods": "正在載入可用的註冊方式", + "auth_signup_using_email": "使用電子郵件註冊", + "auth_signup_choose_method": "選擇你偏好的註冊方式", + "auth_signup_back": "返回", + "auth_signup_username_label": "使用者名稱", + "auth_signup_username_placeholder": "John OpenShock", + "auth_signup_email_label": "電子郵件", + "auth_signup_email_placeholder": "john@example.com", + "auth_signup_password_label": "密碼", + "auth_signup_password_placeholder": "密碼", + "auth_signup_confirm_label": "確認密碼", + "auth_signup_confirm_placeholder": "確認密碼", + "auth_signup_submit": "建立帳號", + "auth_signup_signin_prompt": "已經有帳號了?{#signin}登入{/signin}", + "auth_signup_or": "或", + "auth_signup_with_email": "使用電子郵件註冊", + "auth_signup_legal": "點擊「建立帳號」即表示你同意我們的{#tos}服務條款{/tos}及{#privacy}隱私權政策{/privacy}。", + + "auth_verify_breadcrumb": "驗證電子郵件", + "auth_verify_title": "驗證電子郵件", + "auth_verify_verifying": "正在驗證你的電子郵件地址...", + "auth_verify_success": "你的電子郵件已驗證", + "auth_verify_failed": "此驗證連結無效或已過期", + "auth_verify_missing_token": "缺少驗證權杖", + "auth_verify_continue": "繼續登入", + "auth_verify_toast_success": "電子郵件已驗證", + + "common_cancel": "取消", + "common_delete": "刪除", + "common_edit": "編輯", + "common_share": "分享", + "common_copy_id": "複製 ID", + "common_id_copied": "已將 ID 複製到剪貼簿", + "common_open_menu": "開啟選單", + "common_refresh": "重新整理", + "common_settings": "設定", + "common_clear": "清除", + "common_online": "上線", + "common_offline": "離線", + "common_paused": "已暫停", + "common_resume": "繼續", + "common_resuming": "正在繼續...", + "common_coming_soon": "(即將推出)", + "common_save_changes": "儲存變更", + "common_danger_zone": "危險區域", + "common_name": "名稱", + "control_intensity": "強度", + "control_duration": "持續時間", + "control_max_intensity": "最大強度", + "control_max_duration": "最長時間", + "control_vibration": "震動", + "control_value": "數值", + "control_live_intensity": "即時強度", + "control_type_stop": "停止", + "control_type_shock": "電擊", + "control_type_vibrate": "震動", + "control_type_sound": "聲音", + "live_tooltip_active": "透過 {gateway}({country})即時連線,{latency}ms", + "live_tooltip_connecting": "連線中...", + "live_tooltip_connect": "連線到即時控制", + "live_tooltip_hub_start": "Ctrl+點擊以啟動整個 Hub", + "live_tooltip_hub_stop": "Ctrl+點擊以停止整個 Hub", + "pause_resume_shocker": "繼續電擊器", + "pause_pause_shocker": "暫停電擊器", + "pause_resume_all": "繼續所有電擊器", + "pause_pause_all": "暫停所有電擊器", + "shocker_label": "電擊器", + "shocker_hub": "Hub", + "shocker_select_hub": "選擇 Hub", + "shocker_rf_id": "RF ID", + "shocker_rf_id_invalid": "RF ID 必須是介於 {min} 到 {max} 之間的整數。", + "shocker_model": "型號", + "shocker_select_model": "選擇型號", + "shocker_name_placeholder": "電擊器名稱", + "shocker_menu_view_logs": "檢視記錄", + "shocker_delete_title": "刪除電擊器", + "shocker_delete_desc": "確定要刪除「{name}」嗎?此動作無法復原。", + "shocker_toast_deleted": "已刪除電擊器「{name}」", + "shocker_toast_paused": "電擊器已暫停", + "shocker_toast_resumed": "電擊器已繼續", + "shocker_add_desc": "將新的電擊器註冊到你的其中一個 Hub。", + "shocker_add_name_placeholder": "我的電擊器", + "shockers_title": "電擊器", + "shockers_subtitle": "所有已配對到你的 Hub 的電擊器。", + "shockers_loading": "正在載入電擊器...", + "shockers_toast_refreshed": "電擊器已重新整理", + "shockers_toast_need_hub": "新增電擊器之前,你需要先建立 Hub。", + "shockers_toast_added": "已新增電擊器", + "shockers_unknown_module": "未知的模組類型", + "shockers_add": "新增電擊器", + "shockers_view_mode": "檢視模式", + "shockers_mode_classic": "經典", + "shockers_mode_rich": "豐富", + "shockers_mode_simple": "簡易", + "shockers_mode_map": "地圖", + "shockers_group_by_hub": "依 Hub 分組", + "shockers_global_limits": "全域限制", + "shockers_logs_label": "記錄", + "shockers_empty_title": "尚無電擊器", + "shockers_empty_no_hubs": "請先建立 Hub,再新增電擊器。", + "shockers_empty_has_hubs": "將電擊器新增到你的其中一個 Hub 即可開始使用。", + "shockers_create_hub": "建立 Hub", + "shockers_count": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 個電擊器" + } + } + ], + "shared_shockers_title": "共用的電擊器", + "shared_shockers_subtitle": "其他使用者分享給你的電擊器。", + "shared_shockers_empty_title": "目前還沒有人分享電擊器給你。", + "shared_shockers_empty_desc": "當有人分享電擊器給你時,就會顯示在這裡。", + "shocker_logs_title": "電擊器記錄", + "shocker_logs_subtitle": "所有傳送到你的電擊器的控制指令。", + "shocker_logs_live_title": "新的記錄會即時顯示", + "shocker_logs_paused_title": "排序或檢視第一頁以外的頁面時,即時更新會暫停", + "shocker_logs_live": "即時", + "shocker_logs_col_time": "時間", + "shocker_logs_col_type": "類型", + "shocker_logs_col_by": "操作者", + "shocker_logs_filter_label": "依電擊器篩選", + "shocker_logs_filter_placeholder": "搜尋電擊器...", + "shocker_logs_filter_all": "所有電擊器", + "shocker_logs_filter_none": "沒有符合的電擊器", + "shocker_edit_title": "編輯電擊器", + "shocker_edit_subtitle": "變更此電擊器的資料或將其移除。", + "shocker_edit_back": "返回電擊器", + "shocker_edit_load_failed": "無法載入電擊器。", + "shocker_edit_loading": "正在載入電擊器...", + "shocker_edit_details_title": "電擊器詳細資料", + "shocker_edit_details_desc": "更新此電擊器的名稱、RF ID 和型號。", + "shocker_edit_pause_state": "暫停狀態", + "shocker_edit_is_paused": "電擊器已暫停", + "shocker_edit_is_active": "電擊器運作中", + "shocker_edit_toast_updated": "電擊器已更新", + "shocker_edit_delete_desc": "永久刪除此電擊器。此動作無法復原。", + + "common_close": "關閉", + "common_continue": "繼續", + "common_loading": "載入中...", + "common_previous": "上一頁", + "common_next": "下一頁", + "common_steps": "步驟", + "common_step_label": "步驟 {number}:{title}", + "common_copy": "複製", + "common_copied": "已複製", + "common_never": "永不", + "common_error": "錯誤:{message}", + "terminal_title": "序列終端機", + "terminal_connecting": "連線中...", + "terminal_help_button": "遇到問題了?需要協助嗎?", + "terminal_back_to_modes": "返回模式選擇", + "terminal_mode_configure": "設定裝置", + "terminal_mode_configure_desc": "設定 WiFi、驗證等項目。內含互動式序列主控台。", + "terminal_mode_flash": "燒錄韌體", + "terminal_mode_flash_desc": "在已連接的裝置上安裝或更新韌體。", + "terminal_mode_raw": "序列監視器", + "terminal_mode_raw_desc": "僅主控台。讀取裝置記錄並傳送指令。", + "terminal_step_channel": "選擇通道", + "terminal_step_board": "選擇開發板", + "terminal_go_to_step": "前往步驟 {number}:{title}", + "terminal_erase": "燒錄前先清除", + "terminal_erase_desc": "清除裝置上的所有資料,包括現有的設定", + "terminal_unsupported": "你的瀏覽器不支援此功能。", + "terminal_update_browser": "請將瀏覽器更新到最新版本。", + "terminal_use_browsers": "請使用下列其中一種瀏覽器:", + "terminal_connect_failed_bootloader": "無法進入開機載入程式模式", + "terminal_connect_failed": "裝置連線失敗", + "terminal_connect_failed_desc": "我們無法與裝置建立序列連線。", + "terminal_quick_tries": "可以先試試:", + "terminal_try_replug": "拔除裝置後重新插上。", + "terminal_try_cable": "換一條 USB 線或換一個連接埠。", + "terminal_try_driver": "確認已安裝序列驅動程式。", + "terminal_open_troubleshooter": "開啟疑難排解", + "terminal_log_reset_no_device": "重設時主機端發生錯誤:沒有裝置!", + "terminal_log_reset_error": "重設時主機端發生錯誤:{error}", + "terminal_log_send_no_device": "無法傳送:沒有裝置!", + "terminal_log_send_error": "無法傳送:{error}", + "terminal_log_firmware_disconnected": "韌體已中斷連線:{error}", + "terminal_log_erase_failed": "無法清除快閃記憶體:{error}", + "terminal_log_hard_reset_failed": "無法硬體重設:{error}", + "terminal_log_flash_complete": "燒錄完成", + "terminal_log_flash_failed": "燒錄失敗:{error}", + "terminal_log_command_failed": "無法寫入應用程式指令:{error}", + "terminal_help_title": "疑難排解", + "terminal_help_desc": "請依序完成這些步驟。每個步驟都能排除一種常見原因。", + "terminal_help_step_cable": "USB 線", + "terminal_help_step_port": "USB 連接埠", + "terminal_help_step_driver": "安裝驅動程式", + "terminal_help_step_manual": "手動更新驅動程式", + "terminal_help_step_discord": "到 Discord 詢問", + "terminal_help_cable_body": "許多 USB-C 和 micro-USB 線只能充電,無法傳輸資料。請換成確定可以傳輸資料的線(曾用來傳檔案或連接其他裝置的線),然後重新連接 Hub。", + "terminal_help_port_body": "請將裝置直接插在電腦的 USB 連接埠上。盡量避免使用 USB 集線器、擴充基座和機殼前方的連接埠,這些常是供電和訊號問題的來源。如果你使用桌上型電腦,請試試機殼背面的連接埠。", + "terminal_help_driver_download": "下載 CP210x 驅動程式:", + "terminal_help_driver_extract": "將 zip 檔的內容解壓縮到電腦上的資料夾。", + "terminal_help_driver_run": "開啟該資料夾並執行 {#code}{installer}{/code},依照提示完成安裝。", + "terminal_help_driver_reconnect": "重新連接裝置。", + "terminal_help_manual_intro": "如果已執行驅動程式安裝程式,但裝置仍未出現:", + "terminal_help_manual_open": "開啟裝置管理員(按 {#key}Win{/key} + {#key}X{/key} 並選擇 {#code}Device Manager{/code})。", + "terminal_help_manual_ports": "在 {#code}Ports (COM & LPT){/code} 底下,尋找類似這樣的項目:", + "terminal_help_manual_missing": "如果找不到,表示 Windows 完全沒有偵測到裝置,請回頭檢查 USB 線和連接埠的步驟。", + "terminal_help_manual_update": "在裝置上按右鍵,選擇 {#code}Update Driver{/code}。", + "terminal_help_manual_browse": "選擇 {#code}Browse my computer for drivers{/code},並選取你解壓縮驅動程式 zip 檔的資料夾。請確認已勾選 {#code}Include subfolders{/code}。", + "terminal_help_manual_success": "成功後,該項目應顯示為 {#code}{deviceName}{/code}。", + "terminal_help_discord_intro": "以上都試過了還是不行嗎?歡迎加入我們的 Discord 伺服器,在 {#code}{channel}{/code} 頻道提問。請附上:", + "terminal_help_discord_os": "你的作業系統和瀏覽器", + "terminal_help_discord_device": "你使用的裝置(開發板型號、購買來源)", + "terminal_help_discord_tried": "你已經試過前面哪些步驟", + "terminal_help_discord_errors": "任何錯誤訊息或相關的終端機輸出", + "terminal_help_discord_join": "加入我們的 Discord 伺服器", + "terminal_risk_title": "⚠️ 不穩定的韌體", + "terminal_risk_intro": "你即將燒錄{#strong}實驗性韌體{/strong},此韌體{#strong}已知不穩定{/strong}。", + "terminal_risk_brick": "這可能會讓你的裝置永久變磚、需要手動救援,或導致無法使用。", + "terminal_risk_no_support": "對於此韌體造成的問題,我們不會提供任何支援。", + "terminal_risk_acknowledge": "我了解這完全是我自己的責任", + "terminal_risk_abort": "中止", + "terminal_risk_accept": "我承擔全部責任", + "firmware_channel_recommended": "這是建議使用的通道。", + "firmware_channel_danger": "除非你清楚自己在做什麼,否則請勿使用", + "firmware_channel_stable": "穩定版", + "firmware_channel_beta": "測試版", + "firmware_channel_develop": "開發版", + "terminal_board_select": "選擇開發板...", + "terminal_board_search": "搜尋開發板...", + "terminal_board_none": "找不到開發板。", + "terminal_flash_button": "燒錄", + "terminal_flash_progress": "燒錄進度:{status}", + "terminal_flash_idle": "閒置", + "terminal_flash_no_device": "未選擇裝置。", + "terminal_flash_resetting": "正在重設...", + "terminal_flash_downloading": "正在下載韌體...", + "terminal_flash_download_failed": "無法下載韌體。", + "terminal_flash_flashing": "正在燒錄韌體...", + "terminal_flash_rebooting": "正在重新啟動裝置...(若卡住請手動重新接上電源)", + "terminal_flash_done": "裝置已重新啟動!燒錄完成。", + "terminal_port_select": "選擇裝置", + "terminal_port_disconnect": "中斷裝置連線", + "terminal_port_connected": "已連接裝置:{#strong}{id}{/strong}", + "terminal_console": "主控台", + "terminal_connected_device": "已連接的裝置", + "terminal_resize": "調整終端機面板大小", + "terminal_reboot": "重新啟動", + "terminal_disconnect": "中斷連線", + "terminal_fullscreen_exit_esc": "結束全螢幕(Esc)", + "terminal_fullscreen_exit": "結束全螢幕", + "terminal_fullscreen_fill": "填滿視窗", + "terminal_command_label": "序列指令", + "terminal_command_placeholder": "輸入指令...", + "terminal_command_send": "傳送指令", + "terminal_colors": "色彩", + "terminal_colors_menu": "色彩...", + "terminal_colors_label": "主控台色彩", + "terminal_colors_close": "關閉色彩", + "terminal_color_input": "{name}色彩", + "terminal_colors_reset": "還原預設值", + "terminal_color_bg": "背景", + "terminal_color_fg": "文字", + "terminal_color_ts": "時間戳記", + "terminal_color_error": "錯誤", + "terminal_color_warning": "警告", + "terminal_color_info": "資訊", + "terminal_color_debug": "偵錯", + "terminal_color_verbose": "詳細", + "terminal_options": "選項", + "terminal_options_label": "主控台選項", + "terminal_hide_system": "隱藏系統訊息", + "terminal_stick_bottom": "固定在底部", + "terminal_raw_output": "原始輸出", + "terminal_timestamps": "時間戳記", + "terminal_timestamp_uptime": "運作時間", + "terminal_timestamp_local": "本地", + "terminal_timestamp_ms": "毫秒", + "terminal_timestamp_off": "關閉", + "terminal_copy_settings": "複製設定", + "terminal_import_settings": "匯入設定", + "terminal_copy_selection": "複製選取內容", + "terminal_copy_all": "複製所有輸出", + "terminal_toast_selection_copied": "已複製選取內容", + "terminal_toast_output_copied": "已複製主控台輸出", + "terminal_toast_settings_copied": "已複製主控台設定", + "terminal_toast_clipboard_unreadable": "無法讀取剪貼簿", + "terminal_toast_settings_imported": "已匯入主控台設定", + "terminal_toast_settings_invalid": "剪貼簿中沒有主控台設定", + + "common_try_again": "再試一次", + "terminal_cfg_intro": "數值會透過 UART 傳送到裝置,可在下方主控台查看裝置的回應。不帶參數的指令會讀取數值;使用各欄位旁的 {#eye/} 按鈕即可讀取目前的值。", + "terminal_cfg_rf_title": "RF 發射器", + "terminal_cfg_rf_desc": "控制電擊器的 RF 輸出。", + "terminal_cfg_tx_pin": "TX GPIO 腳位", + "terminal_cfg_example": "例如 {value}", + "terminal_cfg_read_value": "讀取目前的值", + "terminal_cfg_set": "設定", + "terminal_cfg_read": "讀取", + "terminal_cfg_reading": "讀取中…", + "terminal_cfg_apply": "套用", + "terminal_cfg_keepalive": "啟用 Keepalive", + "terminal_cfg_keepalive_desc": "定期 ping 已配對的電擊器,讓它們保持喚醒。", + "terminal_cfg_estop_title": "緊急停止", + "terminal_cfg_estop_desc": "停止所有輸出的實體按鈕。", + "terminal_cfg_estop_enabled": "啟用 EStop", + "terminal_cfg_estop_pin": "EStop GPIO 腳位", + "terminal_cfg_estop_note": "注意:{#code}{latching}{/code} 和 {#code}{active}{/code} 沒有專用指令,請透過下方的 JSON 設定進行設定。", + "terminal_cfg_wifi_title": "WiFi", + "terminal_cfg_wifi_desc": "無線網路憑證和裝置主機名稱。", + "terminal_cfg_hostname": "主機名稱", + "terminal_cfg_networks": "網路(JSON 陣列)", + "terminal_cfg_invalid_json_array": "必須是有效的 JSON 陣列", + "terminal_cfg_ap_note": "AP 設定({#code}{ssid}{/code}、{#code}{password}{/code}、{#code}{disabled}{/code}、{#code}{staDisabled}{/code}、{#code}{offlineMode}{/code})沒有專用指令,請使用 JSON 設定。", + "terminal_cfg_backend_title": "後端", + "terminal_cfg_backend_desc": "OpenShock 伺服器與驗證。", + "terminal_cfg_domain": "網域", + "terminal_cfg_domain_restart": "設定網域會讓裝置重新啟動。", + "terminal_cfg_auth_token": "驗證權杖", + "terminal_cfg_auth_token_placeholder": "貼上裝置權杖", + "terminal_cfg_hide": "隱藏", + "terminal_cfg_show": "顯示", + "terminal_cfg_serial_title": "序列輸入", + "terminal_cfg_echo": "啟用回顯", + "terminal_cfg_echo_desc": "將輸入的字元回顯到主控台。", + "terminal_cfg_advanced_title": "進階:完整設定", + "terminal_cfg_advanced_desc": "針對沒有專用指令的欄位(Captive Portal、OTA、LAN 等),請取代整份設定。", + "terminal_cfg_json_config": "JSON 設定", + "terminal_cfg_invalid_json": "必須是有效的 JSON", + "terminal_cfg_read_json": "以 JSON 讀取目前設定", + "terminal_cfg_json_restart": "套用 JSON 設定會讓裝置重新啟動。", + "terminal_cfg_raw_config": "原始 FlatBuffer 設定(base64)", + "terminal_cfg_invalid_base64": "必須是有效的 base64 字串", + "terminal_cfg_read_raw": "以 base64 讀取目前設定", + "terminal_cfg_factory_reset": "恢復原廠設定", + "terminal_cfg_factory_reset_desc": "清除裝置的所有設定。", + "terminal_cfg_factory_reset_title": "要將裝置恢復原廠設定嗎?", + "terminal_cfg_factory_reset_action": "清除設定", + "terminal_cfg_factory_reset_confirm": "這會清除裝置上的所有設定,包括 WiFi 網路、後端憑證、腳位及其他所有設定。裝置將會還原為預設值。", + "terminal_cfg_read_failed_json_title": "無法讀取 JSON 設定", + "terminal_cfg_read_failed_raw_title": "無法讀取原始設定", + "terminal_cfg_read_failed_desc": "嘗試 {attempts} 次後裝置仍未回應。", + "terminal_cfg_common_causes": "常見原因:", + "terminal_cfg_cause_busy": "裝置正在處理其他指令。", + "terminal_cfg_cause_disconnected": "裝置已中斷連線或重新啟動。", + "terminal_cfg_cause_unsupported": "此韌體版本不支援這個指令。", + + "common_status": "狀態", + "common_version": "版本", + "common_created": "建立時間", + "common_create": "建立", + "common_done": "完成", + "common_enable": "啟用", + "common_disable": "停用", + "common_are_you_sure": "確定嗎?", + "common_generating": "產生中...", + "hubs_title": "Hub", + "hubs_subtitle": "所有註冊到你帳號的 Hub。", + "hubs_add": "新增 Hub", + "hubs_load_failed": "無法載入 Hub。", + "hubs_empty_title": "尚無 Hub", + "hubs_empty_desc": "Hub 是將指令轉送給電擊器的裝置。新增一個即可開始使用。", + "hubs_create_title": "建立 Hub", + "hubs_name_label": "Hub 名稱", + "hubs_name_placeholder": "我的 Hub", + "hub_toast_not_connected": "未連線到伺服器", + "hub_toast_try_later": "請稍後再試。", + "hub_reboot_title": "要重新啟動 {name} 嗎?", + "hub_reboot_desc": "Hub 將中斷連線並重新啟動。在它重新上線之前,所有配對的電擊器都不會回應。", + "hub_reboot": "重新啟動", + "hub_hotspot_enable_title": "要在 {name} 上啟用 Wi-Fi 熱點嗎?", + "hub_hotspot_disable_title": "要在 {name} 上停用 Wi-Fi 熱點嗎?", + "hub_hotspot_enable_desc": "Hub 會廣播自己的設定網路。它仍可透過你的 Wi-Fi 連線,但在你關閉熱點之前,範圍內的任何人都能連上。", + "hub_hotspot_disable_desc": "設定用熱點將會關閉。如果 Hub 尚未連上你的 Wi-Fi,你需要實際接觸裝置才能重新設定。", + "hub_delete_desc": "你即將刪除 Hub {#strong}{name}{/strong}。", + "hub_delete_shockers": "這也會一併刪除下列電擊器:", + "hub_edit_title": "編輯 Hub", + "hub_edit_apply": "套用", + "hub_pair_title_generate": "要產生配對碼嗎?", + "hub_pair_title_generated": "已產生配對碼", + "hub_pair_title_paired": "Hub 已配對", + "hub_pair_consumed": "{#strong}{name}{/strong} 已使用此配對碼,現已完成配對。", + "hub_pair_used": "此配對碼已使用,不再有效。", + "hub_pair_generated_for": "已為 {#strong}{name}{/strong} 產生配對碼。", + "hub_copy_now": "之後將無法再查看下方的代碼,請立即複製並更新至用戶端。", + "hub_pair_generate_for": "你即將為 {#strong}{name}{/strong} 產生配對碼。", + "hub_pair_valid_for": "配對碼在建立後 15 分鐘內有效。", + "hub_pair_one_active": "每個 Hub 只會有一組有效的配對碼,新產生的配對碼會取代舊的。", + "hub_pair_complete": "配對完成", + "hub_pair_code_label": "配對碼:", + "hub_pair_copied_close": "已複製代碼,關閉", + "hub_pair_get": "取得配對碼", + "hub_token_generated": "已產生權杖", + "hub_token_generated_for": "已為 {#strong}{name}{/strong} 產生新的權杖。", + "hub_token_regenerate_for": "你即將為 {#strong}{name}{/strong} 重新產生權杖。", + "hub_token_invalidate": "此動作會讓目前的權杖失效,並中斷使用它的用戶端連線。", + "hub_token_confirm": "確定要這麼做嗎?", + "hub_token_label": "新權杖:", + "hub_token_copied_close": "已複製權杖,關閉", + "hub_token_regenerate": "重新產生權杖", + "hub_menu_update": "更新", + "hub_menu_label": "Hub", + "hub_menu_hotspot_enable": "啟用 Wi-Fi 熱點", + "hub_menu_hotspot_disable": "停用 Wi-Fi 熱點", + "hub_menu_pair": "配對", + "hub_menu_estop": "緊急停止", + "hub_update_breadcrumb": "更新", + "hub_update_unknown_hub": "未知的 Hub", + "hub_update_unknown_task": "未知的工作", + "hub_update_task_metadata": "正在取得中繼資料", + "hub_update_task_preparing": "正在準備更新", + "hub_update_task_flash_fs": "正在燒錄檔案系統", + "hub_update_task_verify_fs": "正在驗證檔案系統", + "hub_update_task_flash_app": "正在燒錄應用程式", + "hub_update_task_bootable": "正在將應用程式標記為可開機", + "hub_update_task_rebooting": "正在重新啟動", + "hub_update_status_started": "已開始", + "hub_update_status_running": "執行中", + "hub_update_status_finished": "已完成", + "hub_update_status_error": "錯誤", + "hub_update_status_timeout": "逾時", + "hub_update_confirm_title": "確認韌體更新", + "hub_update_confirm_desc": "要將 {#strong}{name}{/strong} 更新到版本 {#strong}{version}{/strong} 嗎?", + "hub_update_unstable_warning": "此版本可能不是來自穩定通道,可能含有錯誤。", + "hub_update_title": "更新 {name}", + "hub_update_subtitle": "管理此 Hub 的韌體更新。", + "hub_update_status_title": "Hub 狀態", + "hub_update_firmware": "韌體:{#mono}{version}{/mono}", + "hub_update_confirm": "更新", + "hub_update_success": "更新成功完成", + "hub_update_rolled_back": "裝置已回復到先前的版本", + "hub_update_back": "返回 Hub", + "hub_update_flash_again": "重新燒錄", + "hub_update_card_title": "韌體更新", + "hub_update_card_desc": "選擇要安裝的韌體通道和版本。", + "hub_update_to": "更新到 {version}", + "hub_update_must_be_online": "Hub 必須上線才能開始更新。", + "hub_update_updating_to": "正在更新到 {version}...", + "hub_update_total": "總計", + "hub_update_task": "工作", + "hub_update_history": "更新記錄", + "hub_update_no_history": "找不到此 Hub 的更新記錄。", + "hub_update_col_id": "ID", + "hub_update_col_started": "開始時間", + "hub_update_col_message": "訊息", + "hub_update_loading": "正在載入 Hub 資訊...", + "hub_update_not_found": "找不到 Hub。", + "home_breadcrumb": "首頁", + "home_welcome": "歡迎回來", + "home_welcome_name": "歡迎回來,{name}", + "home_subtitle": "以下是你的 OpenShock 設定概覽。", + "home_hubs_online": "{count} 個上線", + "home_hub_status": "Hub 狀態", + "home_no_hubs": "沒有 Hub", + "home_all_online": "全部上線", + "home_all_offline": "全部離線", + "home_some_online": "{online}/{total} 上線", + "home_quick_links": "快速連結", + "home_my_shockers": "我的電擊器", + "home_my_shockers_desc": "控制你的電擊器", + "home_hubs_desc": "管理你的 Hub", + "home_shared_desc": "分享給你的電擊器", + "home_public_desc": "管理分享連結", + "home_get_started": "開始使用", + "home_get_started_desc": "你還沒有任何 Hub。建立 Hub 來連接你的第一個裝置,再新增電擊器。", + "home_set_up_hub": "設定 Hub", + "home_first_shocker": "新增你的第一個電擊器", + "home_first_shocker_desc": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "你已設定 {count} 個 Hub。新增電擊器即可開始控制。" + } + } + ], + "home_go_to_shockers": "前往電擊器", + "profile_title": "個人檔案", + "profile_coming_soon": "個人檔案即將推出", + "profile_coming_soon_desc": "你的公開個人檔案尚未開放。帳號資料位於「設定」中。", + + "common_retry": "重試", + "common_never_used": "從未使用", + "common_expires": "{time}到期", + "common_search_placeholder": "搜尋...", + "common_unknown": "未知", + "settings_breadcrumb_account": "帳號", + "account_subtitle": "你的登入資料和帳號操作。", + "account_change_username": "變更使用者名稱", + "account_change_email": "變更電子郵件", + "account_change_password": "變更密碼", + "account_username_label": "使用者名稱", + "account_email_label": "電子郵件", + "account_password_label": "密碼", + "account_new_password_label": "新密碼", + "account_confirm_password_label": "確認新密碼", + "account_oauth_only": "僅使用 OAuth 的帳號無法使用", + "account_oauth_no_password": "此帳號透過 OAuth 登入,沒有密碼。", + "account_diagnostics": "診斷", + "account_diagnostics_desc": "協助我們修正當機和緩慢的 API 呼叫。報告會包含錯誤訊息、堆疊追蹤和你的 IP。預設為關閉。", + "account_diagnostics_level": "診斷等級", + "account_telemetry_off": "關閉", + "account_telemetry_off_desc": "不傳送任何資料。", + "account_telemetry_errors": "錯誤", + "account_telemetry_errors_desc": "只傳送瀏覽器錯誤報告。", + "account_telemetry_full": "完整", + "account_telemetry_full_desc": "錯誤報告加上 API 呼叫的追蹤資料(不含頁面瀏覽)。", + "account_toast_deactivated": "帳號已成功停用", + "account_deactivate_title": "停用帳號", + "account_deactivate_desc": "確定要停用你的帳號嗎?", + "account_deactivate": "停用帳號", + "account_email_title": "變更電子郵件", + "account_email_desc": "輸入新的電子郵件地址,並以目前的密碼確認。", + "account_email_toast_sent": "驗證信已寄到 {email}。點擊信中的連結即可套用變更。", + "account_new_email": "新的電子郵件", + "account_current_password": "目前的密碼", + "account_password_title": "變更密碼", + "account_password_desc": "輸入目前的密碼並設定新密碼。", + "account_password_toast": "密碼已變更", + "account_username_title": "變更使用者名稱", + "account_username_desc": "輸入新的使用者名稱。", + "account_new_username": "新的使用者名稱", + "account_username_toast": "使用者名稱已成功變更", + "tokens_subtitle": "API 權杖用於向 OpenShock API 進行驗證。", + "tokens_generate": "產生權杖", + "tokens_toast_refreshed": "權杖已成功重新整理", + "tokens_empty_title": "沒有 API 權杖", + "tokens_empty_desc": "產生權杖以向 OpenShock API 進行驗證。", + "tokens_created_on": "建立於 {date}", + "tokens_last_used": "上次使用:{time}", + "tokens_never_expires": "永不過期", + "tokens_load_failed": "無法載入 API 權杖。", + "token_toast_edited": "權杖已成功編輯", + "token_name_required": "名稱為必填", + "token_name_too_long": "名稱過長", + "token_edit_title": "編輯 API 權杖", + "token_name_label": "權杖名稱", + "token_name_placeholder": "權杖名稱...", + "token_permissions": "權限", + "token_perm_category_shockers": "電擊器", + "token_perm_category_devices": "Hub", + "token_perm_category_usershares": "使用者分享", + "token_perm_category_publicshares": "公開分享", + "token_perm_use": "使用", + "token_perm_edit": "編輯", + "token_perm_pause": "暫停", + "token_perm_auth": "驗證", + "token_shocker_control": "電擊器控制", + "token_toast_paused": "權杖已暫停", + "token_toast_resumed": "權杖已繼續", + "token_delete_title": "刪除 API 權杖", + "token_delete_desc": "確定要刪除 {#strong}{name}{/strong} 嗎?", + "token_delete_permanent": "此動作無法復原,權杖將被永久刪除。", + "token_toast_deleted": "權杖已成功刪除", + "token_resume": "繼續權杖", + "token_pause": "暫停權杖", + "token_mode_clamp_desc": "Clamp:超出允許範圍的要求會被限制在最接近的上下限(最小值或最大值)。", + "token_mode_lerp_desc": "Lerp:將完整的輸入範圍線性縮放,使其落在你允許的最小值到最大值範圍內。", + "token_paused_desc": "已暫停的權杖無法傳送電擊器控制訊息。", + "token_intensity_range": "強度範圍", + "token_duration_range": "持續時間範圍", + "token_new_breadcrumb": "新增", + "token_redirect_not_allowed": "不允許提供的 redirect_uri。僅允許 loopback 位址或自訂應用程式配置。", + "token_params_missing": "缺少必要的 GET 參數。請確認已提供 name、redirect_uri 和 permissions。", + "token_invalid_permissions": "提供的權限無效:{list}", + "token_toast_created": "權杖已成功建立", + "token_request_title": "API 權杖要求", + "token_access_granted": "已授予存取權", + "token_shared_redirecting": "權杖已建立並分享給應用程式。正在將你重新導向回 {#b}{uri}{/b}。", + "token_not_redirected": "如果沒有自動重新導向,請使用下方按鈕。", + "token_finish": "完成", + "token_generated_title": "已產生 API 權杖", + "token_copy_now": "請立即複製你的 API 權杖,之後將無法再次查看!", + "token_new_title": "新增 API 權杖", + "token_external_desc": "有外部應用程式要求存取你的帳號。允許存取前,請檢查並調整下方的權限。", + "token_new_desc": "為你的帳號設定並產生新的 API 權杖。", + "token_external_requesting": "{#b}{name}{/b} 正在要求 API 權杖。你的權杖將分享給位於 {#b}{uri}{/b} 的應用程式。", + "token_allow": "允許", + "token_generate": "產生", + "token_deny": "拒絕", + "sessions_subtitle": "你帳號上所有使用中的工作階段。撤銷任何你不認得的工作階段。", + "sessions_unknown_device": "未知的裝置", + "sessions_toast_refreshed": "工作階段已成功重新整理", + "sessions_load_failed": "無法載入工作階段。", + "sessions_empty_title": "沒有使用中的工作階段", + "sessions_empty_desc": "從瀏覽器或 App 登入後,工作階段會顯示在這裡。", + "sessions_last_seen": "上次活動:{time}", + "sessions_signed_in": "登入時間:{time}", + "session_toast_revoked": "工作階段已成功撤銷", + "session_revoke_title": "撤銷工作階段", + "session_revoke": "撤銷", + "session_revoke_desc": "確定要撤銷此工作階段嗎?", + "session_revoke_from": "從 {#strong}{ip}{/strong} 使用 {#strong}{agent}{/strong} 登入的工作階段", + "connections_title": "OAuth 連結", + "connections_subtitle": "連結或解除連結第三方帳號,以更快登入並保持個人檔案同步。", + "connections_toast_linked": "帳號已連結。", + "connections_toast_cancelled": "已取消連結流程。", + "connections_toast_failed": "連結失敗。", + "connections_toast_removed": "已移除連結", + "connections_refreshing": "重新整理中…", + "connections_link_new": "連結新的服務", + "connections_empty_title": "尚無連結", + "connections_empty_desc": "選擇上方的「連結新的服務」來連結可用的服務。", + "connections_unlink": "解除連結", + "connections_load_failed": "無法載入 OAuth 連結。", + "connections_unlink_title": "要解除連結 {name} 嗎?", + "connections_unlink_title_generic": "要解除連結此帳號嗎?", + "connections_unlink_desc": "除非重新連結,否則你將無法再使用此服務登入。", + "provider_starting": "正在啟動 {name}...", + "provider_link": "連結 {name}", + "audit_subtitle": "你帳號上與安全性相關的活動。請檢查任何你不認得的項目。", + "audit_col_time": "時間", + "audit_col_action": "動作", + "audit_col_details": "詳細資料", + "audit_col_reason": "原因", + "audit_col_ip": "IP 位址", + "audit_col_device": "裝置", + "audit_action_login": "已登入", + "audit_action_logout": "已登出", + "audit_action_password_changed": "已變更密碼", + "audit_action_email_change_requested": "已要求變更電子郵件", + "audit_action_email_changed": "已變更電子郵件", + "audit_action_username_changed": "已變更使用者名稱", + "audit_action_api_token_created": "已建立 API 權杖", + "audit_action_api_token_deleted": "已刪除 API 權杖", + "audit_action_oauth_connected": "已新增連結", + "audit_action_oauth_disconnected": "已移除連結", + "audit_action_account_deactivated": "已停用帳號", + "audit_action_account_reactivated": "已重新啟用帳號", + "audit_action_account_deleted": "已刪除帳號", + "audit_action_automation_token_created": "已建立自動化權杖", + "audit_action_automation_token_updated": "已更新自動化權杖", + "audit_action_automation_token_rotated": "已輪替自動化權杖", + "audit_action_automation_token_deleted": "已刪除自動化權杖", + "audit_action_automation_token_used": "已使用自動化權杖", + "audit_meta_session": "工作階段 {id}", + "audit_meta_changed": "{old} 改為 {new}", + "audit_meta_email_requested": "要求變更為 {email}", + "audit_meta_accounts_removed": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{name}(已移除 {count} 個帳號)" + } + } + ], + "audit_meta_scheduled_deletion": "已排定刪除", + "audit_meta_kept": "保留以便重新啟用", + + "common_view": "檢視", + "common_save": "儲存", + "common_saving": "儲存中...", + "common_back": "返回", + "common_shared_by": "分享者", + "common_user_avatar": "使用者大頭貼", + "common_toast_saved": "變更已成功儲存", + "pause_reason_shocker": "已在電擊器層級暫停", + "pause_reason_shocker_user_share": "已在電擊器和使用者分享層級暫停", + "pause_reason_shocker_public_share": "已在電擊器和公開分享層級暫停", + "pause_reason_user_share": "已在使用者分享層級暫停", + "pause_reason_public_share": "已在公開分享層級暫停", + "public_shares_subtitle": "任何人都能使用的連結,無需帳號。", + "public_shares_new": "新增分享", + "public_share_never_expires": "永不過期", + "public_shares_empty_title": "尚無公開分享", + "public_shares_empty_desc": "建立一個任何人都能用來控制你的電擊器的連結。", + "public_share_expired": "已過期", + "public_share_no_expiry": "無到期日", + "public_share_label": "公開分享", + "public_share_toast_created": "已建立新的公開分享", + "public_share_create_title": "建立公開分享", + "public_share_toast_deleted": "已刪除公開分享", + "public_share_delete_title": "刪除公開分享", + "public_share_delete_desc": "確定要刪除公開分享 {#strong}{name}{/strong} 嗎?", + "public_share_edit_title": "公開分享:{name}", + "public_share_edit_subtitle": "編輯中:儲存後變更才會生效。", + "public_share_add_shocker": "新增電擊器", + "public_share_toast_added": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "已將 {count} 個電擊器加入分享" + } + } + ], + "public_share_empty_shockers_title": "此分享中沒有電擊器", + "public_share_empty_shockers_desc": "新增電擊器後,任何擁有連結的人都能控制它。", + "public_share_load_failed": "取得公開分享詳細資料時發生錯誤", + "public_share_paused_here": "已在此分享中暫停", + "public_share_resume_shocker": "繼續電擊器", + "public_share_pause_shocker": "暫停電擊器", + "public_share_remove": "從分享中移除", + "public_share_toast_removed": "已將電擊器從分享中移除", + "public_share_add_title": "新增電擊器", + "public_share_add_desc": "將電擊器新增到此公開分享。新增後即可設定它們的限制。", + "public_share_add_placeholder": "選擇要分享的電擊器...", + "public_share_add_no_match": "沒有符合的電擊器", + "public_share_add_submit": "新增電擊器", + "public_share_view_loading": "正在載入分享詳細資料...", + "public_share_view_title": "公開分享連結", + "public_share_view_desc": "以訪客身分進入,或使用你的 OpenShock 帳號登入", + "public_share_view_guest_name": "訪客名稱", + "public_share_view_enter": "進入", + "public_share_view_enter_guest": "以訪客身分進入", + "public_share_login": "登入", + "perm_shock_on": "已啟用電擊", + "perm_shock_off": "已停用電擊", + "perm_vibrate_on": "已啟用震動", + "perm_vibrate_off": "已停用震動", + "perm_sound_on": "已啟用聲音", + "perm_sound_off": "已停用聲音", + "perm_live_on": "已啟用即時", + "perm_live_off": "已停用即時", + "perm_live_control": "即時控制", + "user_selector_avatar_of": "{name} 的大頭貼", + "user_selector_placeholder": "輸入使用者名稱", + "user_selector_aria": "要搜尋的使用者名稱", + "user_selector_search": "搜尋使用者", + "user_selector_found": "已找到使用者", + + "common_remove": "移除", + "user_shares_subtitle": "與其他使用者的直接永久分享。", + "user_shares_toast_invited": "已傳送電擊器邀請給 {name}", + "user_shares_redeem": "兌換代碼", + "user_shares_new": "新增分享", + "user_shares_tab_shares": "分享", + "user_shares_tab_incoming": "分享給我的", + "user_shares_tab_invites": "邀請", + "share_code_create_title": "新的分享碼", + "share_code_create_desc": "建立分享碼或邀請", + "share_code_shocker_placeholder": "選擇要分享的電擊器...", + "share_code_no_match": "沒有符合的電擊器", + "share_code_send_invite": "傳送分享邀請", + "share_code_create": "建立分享碼", + "share_code_created_title": "已產生分享碼", + "share_code_created_desc": "請複製分享碼或代碼連結!", + "share_code_redeem_title": "兌換分享碼", + "share_code_redeem_desc": "輸入要兌換的分享碼", + "share_code_redeem_placeholder": "輸入分享碼", + "share_code_redeemed": "兌換成功!", + "share_code_shared_shockers": "分享的電擊器", + "share_code_redeeming": "兌換中...", + "share_code_redeem": "兌換", + "incoming_shares_empty_title": "沒有人分享給你", + "incoming_shares_empty_desc": "目前還沒有人分享電擊器給你。", + "incoming_share_toast_removed": "已移除 {name} 的分享", + "incoming_share_remove_title": "移除分享", + "incoming_share_remove_desc": "確定要移除 {#strong}{name}{/strong} 的分享嗎?", + "incoming_share_toast_removed_shocker": "已移除 {name} 分享的 {shocker}", + "incoming_share_remove_shocker_title": "要移除這個分享的電擊器嗎?", + "incoming_share_remove_shocker_desc": "確定要移除 {#strong}{name}{/strong} 分享的電擊器 {#strong}{shocker}{/strong} 嗎?", + "incoming_share_manage_from": "管理來自以下使用者的分享", + "share_remove": "移除分享", + "invites_empty_title": "尚無邀請", + "invites_empty_desc": "你沒有收到或送出的分享邀請。", + "invites_outgoing": "送出的", + "invites_outgoing_empty_title": "沒有送出的邀請", + "invites_outgoing_empty_desc": "你沒有送出的分享邀請。", + "invites_incoming": "收到的", + "invites_incoming_empty_title": "沒有收到的邀請", + "invites_incoming_empty_desc": "你沒有收到分享邀請。", + "invite_toast_accepted": "已接受 {name} 的分享邀請", + "invite_toast_declined": "已拒絕 {name} 的分享邀請", + "invite_deny_title": "拒絕邀請", + "invite_deny_label": "拒絕邀請", + "invite_deny": "拒絕", + "invite_deny_desc": "確定要拒絕 {#strong}{name}{/strong} 的邀請嗎?", + "invite_accept": "接受邀請", + "invite_toast_cancelled_for": "已取消給 {name} 的邀請({id})", + "invite_toast_cancelled": "已取消邀請 {id}", + "invite_cancel_title": "取消邀請", + "invite_cancel": "取消", + "invite_cancel_for_desc": "確定要取消給 {#strong}{name}{/strong} 的邀請嗎?", + "invite_cancel_code_desc": "確定要取消代碼為 {#strong}{code}{/strong} 的邀請嗎?", + "invite_cancel_outstanding": "取消未處理的邀請", + "outgoing_shares_empty_title": "沒有分享的電擊器", + "outgoing_shares_empty_desc": "你還沒有將任何電擊器分享給其他使用者。", + "outgoing_share_toast_removed": "已移除電擊器分享 {name}", + "outgoing_share_remove_title": "要停止分享此電擊器嗎?", + "outgoing_share_editing_for": "正在編輯分享對象:", + "outgoing_share_limits": "限制與權限", + "outgoing_share_same": "所有電擊器套用相同限制", + "outgoing_share_per_desc": "個別調整每個電擊器的限制", + "outgoing_share_all": "全部", + "outgoing_share_per": "個別電擊器", + + "outgoing_share_remove_desc": "確定要停止將 {#strong}{shocker}{/strong} 分享給 {#strong}{name}{/strong} 嗎?", + + "report_breadcrumb": "回報 API 權杖", + "report_toast_clipboard_failed": "無法讀取剪貼簿:{error}", + "report_title": "回報外洩的 API 權杖", + "report_paste": "從剪貼簿貼上", + "report_warning": "此表單僅用於回報意外外洩的 API 權杖。", + "report_abuse_warning": "蓄意濫用將導致停權或嚴格的端點限制。", + "report_detected": "偵測到的權杖", + "report_invalid": "一或多個權杖似乎無效,請檢查格式是否有誤。", + "report_acknowledge": "我確認了解此功能的用途並願意承擔責任。", + "report_submit": "送出回報", + "turnstile_disabled": "Turnstile 已停用", + "common_internal_error": "內部錯誤", + "resend_toast_sent": "已寄出啟用信,請檢查收件匣和垃圾郵件資料夾。", + "resend_toast_throttled": "要求的啟用信次數過多,請稍後再試。", + "resend_toast_unavailable": "無法從此瀏覽器重新寄送啟用信。如果你的帳號尚未啟用,登入時會寄送新的連結。", + "resend_button": "沒收到信嗎?重新寄送", + "expiration_label": "到期時間", + "expiration_never": "永不", + "expiration_custom": "自訂", + "expiration_days": [ + { + "declarations": ["input count", "local countPlural = count: plural"], + "selectors": ["countPlural"], + "match": { + "countPlural=other": "{count} 天" + } + } + ], + "expiration_required": "到期日為必填", + "expiration_never_desc": "永遠不會過期", + "expiration_expires_at": "{time}到期({date})", + "date_picker_placeholder": "選擇日期", + "telemetry_toast_title": "協助改善 OpenShock?", + "telemetry_toast_desc": "傳送診斷資料,協助我們修正當機和緩慢的 API 呼叫。報告會包含錯誤訊息、堆疊追蹤和你的 IP。你隨時可以在帳號設定中變更。", + "telemetry_toast_no": "不用了", + "telemetry_toast_errors": "僅限錯誤", + "telemetry_toast_full": "完整", + "table_show_details": "顯示詳細資料", + "table_hide_details": "隱藏詳細資料", + "table_no_results": "沒有結果。", + "table_sort_asc": "依{name}遞增排序", + "table_sort_desc": "依{name}遞減排序", + "table_sort_none": "依{name}排序,未排序", + "cell_na": "不適用", + "cell_not_applicable": "不適用", + "cell_invalid": "無效", + "cell_unavailable": "無法使用", + "cell_none": "無", + "oauth_login_with": "使用 {provider} 登入", + "oauth_signup_with": "使用 {provider} 註冊", + "signalr_connect_failed": "無法連線到伺服器!", + "signalr_disconnect_failed": "與伺服器中斷連線時發生錯誤!", + "signalr_invalid_update": "從伺服器收到無效的更新!", + "signalr_invalid_log": "從伺服器收到無效的記錄資料!", + "signalr_invalid_ota": "從伺服器收到無效的韌體更新資料!", + "ota_toast_failed": "Hub 韌體更新失敗:{message}", + "ota_toast_succeeded": "Hub 韌體更新成功完成!", + "ota_toast_rolled_back": "Hub 韌體已回復到先前的版本", + "lcg_connect_failed": "無法連線到即時控制閘道", + "terminal_toast_bootloader_failed": "無法進入開機載入程式:{error}", + "terminal_toast_app_mode_failed": "無法進入應用程式模式:{error}", + + "problem_account_account_not_activated_title": "帳號尚未啟用", + "problem_account_account_not_activated_desc": "請檢查收件匣中的啟用信。", + "problem_account_activation_not_found_title": "啟用連結無效", + "problem_account_activation_not_found_desc": "連結可能已過期或已被使用。", + "problem_account_activation_resend_too_many_title": "要求的啟用信次數過多", + "problem_account_activation_resend_too_many_desc": "請稍候一段時間再試。", + "problem_account_activation_resend_unavailable_title": "無法重新寄送啟用信", + "problem_account_activation_resend_unavailable_desc": "請重新登入以要求新的啟用連結。", + "problem_account_deactivate_already_deactivated_title": "帳號已停用", + "problem_account_deactivate_denied_privileged_title": "無法停用特權帳號", + "problem_account_deactivate_unauthorized_title": "你沒有權限執行此操作", + "problem_account_deactivated_title": "此帳號已被停用", + "problem_account_email_already_in_use_title": "此電子郵件地址已被使用", + "problem_account_email_invalid_title": "此電子郵件地址無效", + "problem_account_email_taken_title": "此電子郵件地址已被使用", + "problem_account_email_too_many_requests_title": "變更電子郵件的要求次數過多", + "problem_account_email_too_many_requests_desc": "請稍候一段時間再試。", + "problem_account_email_unchanged_title": "這已經是你的電子郵件地址", + "problem_account_email_verify_not_found_title": "驗證連結無效", + "problem_account_email_verify_not_found_desc": "連結可能已過期或已被使用。", + "problem_account_o_auth_only_title": "此帳號沒有密碼", + "problem_account_o_auth_only_desc": "請使用註冊時的服務登入。", + "problem_account_password_not_set_title": "尚未設定密碼", + "problem_account_password_not_set_desc": "此帳號透過外部服務登入。", + "problem_account_password_old_password_invalid_title": "目前的密碼不正確", + "problem_account_username_invalid_title": "不允許使用此使用者名稱", + "problem_account_username_recently_changed_title": "使用者名稱最近才變更過", + "problem_account_username_recently_changed_desc": "使用者名稱每 7 天只能變更一次。", + "problem_account_username_taken_title": "此使用者名稱已被使用", + "problem_admin_user_deactivated_title": "此使用者已被停用", + "problem_admin_user_not_activated_title": "此使用者尚未啟用", + "problem_api_token_can_only_delete_self_title": "API 權杖只能刪除自己", + "problem_api_token_not_found_title": "找不到 API 權杖", + "problem_api_token_paused_title": "此 API 權杖已暫停", + "problem_assign_lcg_bad_schema_version_title": "不支援的 Hub 協定版本", + "problem_assign_lcg_bad_schema_version_desc": "請更新 Hub 韌體後再連線。", + "problem_assign_lcg_no_lcg_available_title": "沒有可用的閘道", + "problem_assign_lcg_no_lcg_available_desc": "目前沒有可用的即時控制閘道,請稍後再試。", + "problem_authentication_account_deactivated_title": "此帳號已被停用", + "problem_authentication_account_not_activated_title": "此帳號尚未啟用", + "problem_authentication_cookie_missing_or_invalid_title": "你尚未登入", + "problem_authentication_cookie_missing_or_invalid_desc": "你的工作階段可能已過期,請重新登入。", + "problem_authentication_header_missing_or_invalid_title": "API 權杖無效", + "problem_authentication_session_invalid_title": "工作階段已過期", + "problem_authentication_session_invalid_desc": "請重新登入。", + "problem_authentication_token_invalid_title": "API 權杖無效", + "problem_authentication_unknown_error_title": "驗證失敗", + "problem_authorization_policy_not_met_title": "你沒有權限執行此操作", + "problem_authorization_token_only_title": "此操作需要 API 權杖", + "problem_authorization_token_permission_missing_title": "此 API 權杖缺少必要的權限", + "problem_authorization_unknown_error_title": "授權失敗", + "problem_authorization_user_session_only_title": "此操作需要登入的工作階段", + "problem_automation_token_not_allowed_for_account_title": "特權帳號無法使用自動化權杖", + "problem_configuration_already_exists_title": "已存在同名的組態項目", + "problem_configuration_invalid_name_format_title": "組態名稱無效", + "problem_configuration_invalid_name_format_desc": "只允許 A 到 Z 和底線。", + "problem_configuration_invalid_value_format_title": "數值與組態類型不符", + "problem_configuration_not_found_title": "找不到組態項目", + "problem_control_stats_invalid_range_title": "開始日期不能晚於結束日期", + "problem_control_stats_invalid_time_zone_title": "未知的時區", + "problem_control_stats_missing_capability_title": "此伺服器不提供控制統計", + "problem_device_not_found_title": "找不到 Hub", + "problem_device_not_online_title": "Hub 已離線", + "problem_device_too_many_hubs_title": "你的 Hub 數量已達上限", + "problem_device_too_many_shockers_title": "此 Hub 的電擊器數量已達上限", + "problem_endpoint_retired_title": "此功能已不再提供", + "problem_expression_error_title": "篩選運算式無效", + "problem_internal_server_error_title": "我們這邊發生了問題", + "problem_login_invalid_credentials_title": "使用者名稱或密碼錯誤", + "problem_login_invalid_domain_title": "不允許從此位址登入", + "problem_o_auth_connection_already_exists_title": "你的帳號已連結到此服務", + "problem_o_auth_connection_already_linked_title": "此外部帳號已連結到其他使用者", + "problem_o_auth_flow_anonymous_only_title": "你已經登入了", + "problem_o_auth_flow_mismatch_title": "登入嘗試不符", + "problem_o_auth_flow_mismatch_desc": "請重新開始。", + "problem_o_auth_flow_missing_data_title": "服務未傳回你的帳號資料", + "problem_o_auth_flow_missing_data_desc": "請再試一次。", + "problem_o_auth_flow_not_found_title": "登入嘗試已過期", + "problem_o_auth_flow_not_found_desc": "請重新開始。", + "problem_o_auth_flow_unsupported_title": "不支援的登入流程", + "problem_o_auth_internal_error_title": "登入時發生錯誤", + "problem_o_auth_internal_error_desc": "請稍後再試。", + "problem_o_auth_link_authenticated_user_only_title": "你必須先登入才能連結外部帳號", + "problem_o_auth_provider_mismatch_title": "登入嘗試與服務不符", + "problem_o_auth_provider_mismatch_desc": "請重新開始。", + "problem_o_auth_provider_unsupported_title": "不支援此登入服務", + "problem_pair_code_not_found_title": "找不到配對碼", + "problem_password_reset_not_found_title": "密碼重設連結無效", + "problem_password_reset_not_found_desc": "連結可能已過期或已被使用。", + "problem_session_not_found_title": "找不到工作階段", + "problem_share_get_no_shares_title": "你與此使用者之間沒有分享", + "problem_share_request_create_cannot_share_with_self_title": "你無法分享給自己", + "problem_share_request_create_shocker_not_found_title": "找不到一或多個電擊器", + "problem_share_request_create_shocker_not_found_desc": "它們可能已被移除,或不屬於你。", + "problem_share_request_not_found_title": "找不到分享邀請", + "problem_share_user_not_found_title": "找不到分享", + "problem_share_code_already_linked_title": "電擊器已連結到你的帳號", + "problem_share_code_cant_link_own_share_code_title": "你無法兌換自己的分享碼", + "problem_share_code_not_found_title": "找不到分享碼", + "problem_share_link_expiry_date_in_past_title": "到期日不能是過去的日期", + "problem_share_link_not_found_title": "找不到公開分享", + "problem_share_link_shocker_already_in_share_link_title": "電擊器已在此公開分享中", + "problem_share_link_shocker_not_in_share_link_title": "電擊器不在此公開分享中", + "problem_shocker_control_no_permission_title": "你沒有控制此電擊器的權限", + "problem_shocker_control_not_found_title": "找不到電擊器", + "problem_shocker_control_paused_title": "電擊器已暫停", + "problem_shocker_not_found_title": "找不到電擊器", + "problem_signup_registration_disabled_title": "目前已關閉註冊", + "problem_signup_username_or_email_exists_title": "此使用者名稱或電子郵件已被使用", + "problem_turnstile_invalid_title": "驗證失敗", + "problem_turnstile_invalid_desc": "請重新完成驗證後再試一次。", + "problem_user_not_found_title": "找不到使用者", + "problem_user_privileged_delete_denied_title": "無法刪除特權使用者", + "problem_validation_error_title": "部分欄位無效", + "problem_webhook_not_found_title": "找不到 Webhook", + "problem_webhook_unsupported_title": "僅支援 Discord Webhook", + "problem_webhook_unsupported_desc": "請使用 discord.com 網址,而非 canary 或 ptb。", + + "error_too_many_requests": "要求次數過多", + "error_retry_after": [ + { + "declarations": ["input seconds", "local secondsPlural = seconds: plural"], + "selectors": ["secondsPlural"], + "match": { + "secondsPlural=other": "請在 {seconds} 秒後再試。" + } + } + ], + "error_unexpected_response": "未預期的伺服器回應", + "error_internal": "發生內部錯誤", + "error_network": "發生網路錯誤", + + "dev_banner": "這是 OpenShock 的{#b}開發{/b}環境。{#u}不會儲存任何資料{/u},且會定期被正式環境的資料覆寫。", + "firmware_channel_bugs_warning": "此通道可能含有錯誤。" +} diff --git a/package.json b/package.json index 6a3402c6..89096234 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,8 @@ "build": "cross-env BUILD_ENV=production vite build", "preview": "cross-env BUILD_ENV=production vite preview", "prepare": "svelte-kit sync || echo '' && husky", - "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "check": "svelte-kit sync && pnpm run i18n:compile && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && pnpm run i18n:compile && svelte-check --tsconfig ./tsconfig.json --watch", "lint": "eslint .", "format:check": "prettier --check .", "format": "prettier --write .", @@ -17,12 +17,16 @@ "test:e2e": "playwright test", "test:unit": "vitest", "regen-api": "node scripts/regenerate-api.js", + "i18n:compile": "paraglide-js compile --silent", "check:problem-types": "node scripts/check-problem-types.js --strict" }, "devDependencies": { "@eslint/compat": "^2.1.1", "@eslint/js": "latest", "@hey-api/openapi-ts": "^0.99.0", + "@inlang/paraglide-js": "^3.2.0", + "@inlang/paraglide-js-svelte": "^1.0.5", + "@inlang/plugin-message-format": "^4.6.0", "@internationalized/date": "^3.12.4", "@lucide/svelte": "^1.61.0", "@microsoft/signalr": "^10.0.11", @@ -49,6 +53,7 @@ "eslint-plugin-compat": "^7.0.2", "eslint-plugin-svelte": "^3.23.1", "esptool-js": "0.7.1", + "flag-icons": "7.6.0", "globals": "^17.14.0", "husky": "^9.1.7", "layerchart": "^2.9.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8940896f..7f0422ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -249,6 +249,15 @@ importers: '@hey-api/openapi-ts': specifier: ^0.99.0 version: 0.99.0(typescript@6.0.3) + '@inlang/paraglide-js': + specifier: ^3.2.0 + version: 3.2.0(eslint@10.13.0(jiti@2.7.0)(supports-color@10.2.2))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)) + '@inlang/paraglide-js-svelte': + specifier: ^1.0.5 + version: 1.0.5(@inlang/paraglide-js@3.2.0(eslint@10.13.0(jiti@2.7.0)(supports-color@10.2.2))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0)) + '@inlang/plugin-message-format': + specifier: ^4.6.0 + version: 4.6.0 '@internationalized/date': specifier: ^3.12.4 version: 3.12.4 @@ -327,6 +336,9 @@ importers: esptool-js: specifier: 0.7.1 version: 0.7.1 + flag-icons: + specifier: 7.6.0 + version: 7.6.0 globals: specifier: ^17.14.0 version: 17.14.0 @@ -495,6 +507,74 @@ importers: packages: + '@bytecodealliance/jco-node-fs-darwin-arm64@0.3.2': + resolution: {integrity: sha512-WXQq1tRVUWhbK+ImH0G8Kni2AR0sdokLf/KyXRw5P6n4A9ZbgMHOuPfN/PEsYgw4eosuTAonutK0xILk/hA81A==} + engines: {node: '>=20'} + cpu: [arm64] + os: [darwin] + + '@bytecodealliance/jco-node-fs-darwin-x64@0.3.2': + resolution: {integrity: sha512-Fy/OjHnto7hNE5ksewVkmAMXG/uXyj+RAKFZWQFTzFkp73UyT5vuPjKq3nvx9KolUGWBG37BudEMb4ZAoD9TbQ==} + engines: {node: '>=20'} + cpu: [x64] + os: [darwin] + + '@bytecodealliance/jco-node-fs-linux-arm64-gnu@0.3.2': + resolution: {integrity: sha512-OafRtRu3tfOFQARfkia/LDEqSo2R3yAL1xPwzf4RcRW6JqkOY7qKWsUS5+LPVo/aFaSkMX7F7bdFGpFPmcoZJg==} + engines: {node: '>=20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@bytecodealliance/jco-node-fs-linux-arm64-musl@0.3.2': + resolution: {integrity: sha512-JblDiwD7+Y+w0d/tjaNDX4QdGvh5lyuDc+S/jDeT7sYA1caA9yiwIjLa8PC/lm2xudqSxD+Cuy4AosXvl+qI0g==} + engines: {node: '>=20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@bytecodealliance/jco-node-fs-linux-x64-gnu@0.3.2': + resolution: {integrity: sha512-6FzmHoLOsa6b4X9AuFLsvlpNF66Dt4sRRftZHaT1I1pYzCWrJkkpgNJhRXxf67ZPmOwBZJT4dan/g752Rx4xRw==} + engines: {node: '>=20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@bytecodealliance/jco-node-fs-linux-x64-musl@0.3.2': + resolution: {integrity: sha512-SbAJG2PDV8YAHBESHU9sVSckOitJyvlezdF4CGP5/mOp01JnijVkLVXzGK62yVSfa5TpAybbSd1rk+v36NAW/Q==} + engines: {node: '>=20'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@bytecodealliance/jco-node-fs-win32-arm64-msvc@0.3.2': + resolution: {integrity: sha512-nUWYdFysRQJGsIOCk0KAYN2smkNYiHG7rZ7m+0ZXqP+5wqWxKEjkDsORwXiBjdaWFLVww0anZ3SBxrju6P7hXQ==} + engines: {node: '>=20'} + cpu: [arm64] + os: [win32] + + '@bytecodealliance/jco-node-fs-win32-x64-msvc@0.3.2': + resolution: {integrity: sha512-RsPj2t8TvltsMWK7/Z7JcVC/IWPMi07/AJkNLiNTCuGTdT/sseqTThJJwhuz3sjFw7dJdxA+bSGT+23y/KT0fw==} + engines: {node: '>=20'} + cpu: [x64] + os: [win32] + + '@bytecodealliance/jco-node-fs@0.3.2': + resolution: {integrity: sha512-yxvqQreNcOQdMsEKZomkSqThtkxrAz3f1Cmy8BsV0UHi9saa2/D1KDB14IAXPYwDq/maS6lCzS+MuMQx6QkUgA==} + engines: {node: '>=20'} + + '@bytecodealliance/jco-transpile@0.13.0': + resolution: {integrity: sha512-9hZ2GMqOlYP1Bf7qQ8v3sCsmkFoXGbgi0HtjHipzrgyk+9GGDzvvbehTGe0oM54rcbKJacvyjpPDn7wtpgzwYA==} + + '@bytecodealliance/preview2-shim@0.24.1': + resolution: {integrity: sha512-QGZsKD5M76xBhwu3BzLWqYDEpaMX90QWrrfhkQPn2pN9t378koumtdAVH4lr25mqGCZt10YNXkWvyWkw/vJbLQ==} + + '@bytecodealliance/preview2-shim@0.25.0': + resolution: {integrity: sha512-6ZSDRJ8hJc/febZepzd68z3KzLcOXyCOKtRm8LB2rgAU88xV7ykq6dMb5I4a+sBh1cuV2Yb1159gDzI1q8UsoQ==} + + '@bytecodealliance/preview3-shim@0.6.1': + resolution: {integrity: sha512-61mEfjfgGmZhEMA0H3waawPKvYd3za9y0vJ7pmQz/9yvm4FR6Ef+cmqhnxDE7ezsM07MY1btP92ymmgsgFwxmg==} + '@cacheable/memory@2.2.0': resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} @@ -557,9 +637,18 @@ packages: '@dagrejs/graphlib@3.0.4': resolution: {integrity: sha512-HxZ7fCvAwTLCWCO0WjDkzAFQze8LdC6iOpKbetDKHIuDfIgMlIzYzqZ4nxwLlclQX+3ZVeZ1K2OuaOE2WWcyOg==} + '@emnapi/core@1.11.1': + resolution: {integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==} + + '@emnapi/runtime@1.11.1': + resolution: {integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==} + '@emnapi/runtime@1.11.3': resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} @@ -983,6 +1072,34 @@ packages: cpu: [x64] os: [win32] + '@inlang/paraglide-js-svelte@1.0.5': + resolution: {integrity: sha512-QBIlMX/I/IzsWJLx5O0Xt/aBhQs0cnifozswLxBt1IYGANUyfT7Seiu29jZ1OOHHyfrfa1g4AviO3nXsbrKsYw==} + peerDependencies: + '@inlang/paraglide-js': '>=2.11.0 <4' + svelte: ^5.0.0 + + '@inlang/paraglide-js@3.2.0': + resolution: {integrity: sha512-mjcVM+GTbr6Wr463gMHSGUHF0x7y1W0VizJSPyX8gjyxNFYKW0C0rRf1QEtWWMD8d0NBdzo4i7tnfcagR1FyKg==} + hasBin: true + peerDependencies: + eslint: ^9.0.0 || ^10.0.0 + vite: '>=5.0.0' + peerDependenciesMeta: + eslint: + optional: true + vite: + optional: true + + '@inlang/plugin-message-format@4.6.0': + resolution: {integrity: sha512-DK2GZvypDygLchnUaFK/RdCIm2baiRlQftOiesGNKDtjNqioqWHnnu0zg6NKNlo3kD42h5xlRCke7zEjBFzZrg==} + + '@inlang/recommend-sherlock@0.2.1': + resolution: {integrity: sha512-ckv8HvHy/iTqaVAEKrr+gnl+p3XFNwe5D2+6w6wJk2ORV2XkcRkKOJ/XsTUJbPSiyi4PI+p+T3bqbmNx/rDUlg==} + + '@inlang/sdk@4.2.0': + resolution: {integrity: sha512-Cmaqvn34wsxiF27318Zw2rg+017HHNJWV5MH8rfyVKVANZNpzlztxzRbFienE/gASMLD8oluYHHolIb/p6Egrw==} + engines: {node: '>=20.0.0'} + '@internationalized/date@3.12.4': resolution: {integrity: sha512-M1dEn4c1U1HsSlaVR8upZtSqvXrTkHDfv18H01uCSJyjVLDxnBR38v/fMxecmlwXKR4i9HeZcmgQAPE6A+aGJQ==} @@ -1029,6 +1146,9 @@ packages: '@layerstack/utils@2.0.0-next.19': resolution: {integrity: sha512-HyXCEz9pge4rFWklrSgFr3YIwdE1gP8WM6GPetmnKPDfYLF1/oetRFKI9FqiE+dw4brnULGPKJsVhjM3vQfD4A==} + '@lix-js/sdk@0.20.1': + resolution: {integrity: sha512-oscOFP8Cr1My6Wh2KVYC9+aJ1mHs+d7vnD+7PPJaA4L+Y1FR37Sm99SrFGfvUizaj/XtRi2GlDF2IOFt9iXMNQ==} + '@lucide/svelte@1.61.0': resolution: {integrity: sha512-Vwj4ADoKgVogLFpEbXv2PS2hh2fj+aAqPuiNydI88Zkyb1l7veL4fXgRrOX3tgpESHhIGneNkSSYhHupvCBshg==} peerDependencies: @@ -1054,6 +1174,13 @@ packages: os: [linux] libc: [glibc] + '@napi-rs/wasm-runtime@1.2.7': + resolution: {integrity: sha512-zJccwplOAbgfZju95IUHazLnx9RAPtPN2YGJXI6UbrgeaR9QfPjGrQL6ERkSAtnVCA4Q+83ApGyaX5zdpCaKkQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@emnapi/runtime': ^1.7.1 || 2.0.0-beta.2 || 2.0.0-beta.3 + '@opentelemetry/api@1.10.0': resolution: {integrity: sha512-lMkyes8iHrG+mk6WH7X70MdCLI2RS0FwNBY1PyQ8UemaijE2m5mv5A0Niy3HtbYTFrgkUEQjFMXmSAk2hQDuPQ==} engines: {node: '>=8.0.0'} @@ -1140,6 +1267,133 @@ packages: peerDependencies: '@opentelemetry/api': '>=1.10.0 <1.11.0' + '@oxc-minify/binding-android-arm-eabi@0.136.0': + resolution: {integrity: sha512-gk1jzky1vLeOcK7w9Ib2RT/UooZ7O21s8YSeXCsy4tzsmguKb3Cbsv/Ra2fKhMp4mKeKCzvC1Xa41OfSBWfWdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxc-minify/binding-android-arm64@0.136.0': + resolution: {integrity: sha512-5GIYanqud/ohXEcg2dsdn0+eSKXqclw5qlRUkvSM1sKEa4ZQ7hqOk8XPJBNPh3LXXw+Qw85B6jkmOFLKsCHp5w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-minify/binding-darwin-arm64@0.136.0': + resolution: {integrity: sha512-QAMpHKXWOoMCTenSZjQjVT5YmMooujlCKAf1T3PHFl2LuaA6ukQFXba0bgSLgAxRrAeX/itkwi4lzVQXtYmnRg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-minify/binding-darwin-x64@0.136.0': + resolution: {integrity: sha512-rDnoPj8hztiU8C1VNKuzujh7SgTJlgiUvUCiWQjTnVSLsABsLW9ZWd1l1Ji0VN3UW39wGpptgvahIWTrHnGH/A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-minify/binding-freebsd-x64@0.136.0': + resolution: {integrity: sha512-9fGSgP7uyPLCTjMx9z3AUV4UjnfOVoGTH5JzamLegPwGLJ97Gr1jht1437CRk8ZNabGmxQR6qNn3e+Tox2lswg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-minify/binding-linux-arm-gnueabihf@0.136.0': + resolution: {integrity: sha512-k0QvZS+x6ROI4O5Ikqn9dDU2dmkEJ46Yh6baZJI/eUk/a1k1GOs9/vyXItLZrKlwYrSgdEx2BFXbKgyd1NyRPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm-musleabihf@0.136.0': + resolution: {integrity: sha512-iRFxUc8ubotVfuyq3e4LPGbHrjvWd1/B3499a55GueMLc1EDJ0fHzNXJiCx2eMQGfzHtHodjmvrJ2BSvSXBNhQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm64-gnu@0.136.0': + resolution: {integrity: sha512-hbKxNCXJsULrb6EyG5SumzJKuPfP8Y0UQ/TElRgXVUhyyPf6cBPlF8HMq+MAylF98ACBzV8jBp2Mm62lJyTo+w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxc-minify/binding-linux-arm64-musl@0.136.0': + resolution: {integrity: sha512-T+u/CGKW0UXemJeVux4ix6rK+ug3bQCUEbu5hFlX9K61KQNd44rOcrM15mDK99L7USaXwmiwHeIkEDvmmyDMSA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxc-minify/binding-linux-ppc64-gnu@0.136.0': + resolution: {integrity: sha512-WNPTN2F448tb49BoqjV9IMRzZWa0WB8GHzrB+bnxKQPOyzz07T6rmDKrr4Hjl81ADGjDYSsr1fgXcjyLQFdMdw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxc-minify/binding-linux-riscv64-gnu@0.136.0': + resolution: {integrity: sha512-MvcCfu8OeabrmNN9wqhh8Gqizg68RQ3iOvXBJmlLMy5p1PC6az9bAwqOk98lsCmKI4I5LpULekOlfxRYh3o5Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxc-minify/binding-linux-riscv64-musl@0.136.0': + resolution: {integrity: sha512-rwJXFUFFA0egAULtOOgfW8YhhLhtWrr2qFxftvZ7/U6Xtxiev8i+eCwSNW1RpHiX74QMsJVpRE3ykoefqb1MtQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxc-minify/binding-linux-s390x-gnu@0.136.0': + resolution: {integrity: sha512-qizAxHmj7VHm5/D5qiIlvzxAS2tlmadDOJ5XFI7zx/wfnk/+fdk5iVaHOv+C4tDE/4wLQyMoBYVIs6R1LeN91w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxc-minify/binding-linux-x64-gnu@0.136.0': + resolution: {integrity: sha512-gcyLAad0UblkEhGjVfx5Mwq63OSx8r04IbcfwzpZYpHisO/vioMsrs4GkDsQZ2Ejc8cdUk6YMIrf9FwNBzh+Dw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-minify/binding-linux-x64-musl@0.136.0': + resolution: {integrity: sha512-QAK6kwBjljX6luYzeppVdRP3gTaFNFfp9iS/V0cCvU43wUZay5xFXBgmzBHYrzZV2MhzURNnXfEZRo9poAxyvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-minify/binding-openharmony-arm64@0.136.0': + resolution: {integrity: sha512-nIGxkTOnN9GwslmooxbZ3Ti2RgbX9QLHy0X9uO0pslOT+4dsNVUawBU/6r4M5cWM+ZdRD2tOF4V+n0l8tS59nQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-minify/binding-wasm32-wasi@0.136.0': + resolution: {integrity: sha512-YB3G8AHT6PpDS8/DfjlJrQjywj+/6gCkNBcAJdYzcYbQRIZE6SaTNowiGuZPR1m1jOl1WjcjefniKSmVxzhvRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@oxc-minify/binding-win32-arm64-msvc@0.136.0': + resolution: {integrity: sha512-UVRH3BlNc2rmla+sbSd5xTF/u+esCqZS6VSWPolZybcBh3TlVe1Sf5MOuHQWUaFoyv5uFOvee4hOfS/14nPvZw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-minify/binding-win32-ia32-msvc@0.136.0': + resolution: {integrity: sha512-zFGkUd82jci0E+isc2O36lVmmXVUDXyEMN2RYIyez+MBNqhdjPLIGx62FCsrJtLKeuiPf/8XkFv977aUtndUng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-minify/binding-win32-x64-msvc@0.136.0': + resolution: {integrity: sha512-VHgPwd5xibC9UYxBeq7nURTjY+wxhdumllij6JaCIUVfD9IRcrA66SVlJ5fPNoUXcRp8ZXhJfoIZwVz9wAEGJw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@oxc-project/types@0.155.0': resolution: {integrity: sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==} @@ -1401,6 +1655,9 @@ packages: cpu: [x64] os: [win32] + '@sinclair/typebox@0.31.30': + resolution: {integrity: sha512-MGsM7bVmHg3sUKCphlu3SGQ+T+5JTbygZWYArfKQCW5anJeACHeqLhcnf+R7XlCWZ+QR3C8JTBx3kCKJTN69ow==} + '@sindresorhus/is@7.2.0': resolution: {integrity: sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==} engines: {node: '>=18'} @@ -1574,6 +1831,9 @@ packages: resolution: {integrity: sha512-zQvlxSNi2qGM3L4jh85Z6hqMfdIR5qOfD9KHOU32nuKFJGN0RlJ7UvV1lsPb1fPVhpFYI0VP3jJGxLdLDpTKjQ==} engines: {node: '>=20'} + '@tybys/wasm-util@0.10.4': + resolution: {integrity: sha512-W3c4gRigFS0T/Ma4qIYF3GDAc5AQdHb1yL5znJT1Zv1YaD9Kitx656wBjvr19qbiosmZT8lWDM5BEMynUqX65A==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1846,6 +2106,9 @@ packages: resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} engines: {node: '>=0.10.0'} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -1869,6 +2132,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + binaryen@130.0.0: + resolution: {integrity: sha512-XDrb+zql0RbFPKgj7MuH9zOc78R3Fa/P/VSGnnpdwYsvNZPWjcMYMdAkKCOQEL2A7yqgjSMTDRFp6gfSDW+/QQ==} + hasBin: true + bits-ui@2.20.2: resolution: {integrity: sha512-cb1eQD1wZEhJWb1dTLiAdYWqeUI5v7f+7EAHmetxBuELI9lo4cpAIfGEjald/PR4wTR80Fu5DFH+IaY1OKn+tg==} engines: {node: '>=20'} @@ -1941,6 +2208,10 @@ packages: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} hasBin: true + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@15.0.0: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} @@ -1949,6 +2220,10 @@ packages: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + comment-json@4.6.2: + resolution: {integrity: sha512-R2rze/hDX30uul4NZoIZ76ImSJLFxn/1/ZxtKC1L77y2X1k+yYu1joKbAtMA2Fg3hZrTOiw0I5mwVMo0cf250w==} + engines: {node: '>= 6'} + commenting@1.1.0: resolution: {integrity: sha512-YeNK4tavZwtH7jEgK1ZINXzLKm6DZdEMfsaaieOsCAN0S8vsY7UeuO3Q7d/M018EFgE+IeUAuBOKkFccBZsUZA==} @@ -1958,6 +2233,10 @@ packages: confbox@0.3.1: resolution: {integrity: sha512-cKUSoKa8YxFZZSmraVi7onONx3amu77ngK3kGpsYHDH7drPwCRkQE1RYMPlLRrMtnciRj274XNRxcHxnKmDSnA==} + consola@3.4.0: + resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + engines: {node: ^14.18.0 || >=16.10.0} + cookie@1.1.1: resolution: {integrity: sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==} engines: {node: '>=18'} @@ -2251,6 +2530,11 @@ packages: resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + esptool-js@0.7.1: resolution: {integrity: sha512-vw1isT5ROHgpRmMG3y6B81dceeZ7O1WhF1x05qFbAlH8N0N/pOQqODzJLA+36lCbOXCw06iA4CWctyrQQ7VeSA==} @@ -2317,6 +2601,9 @@ packages: fetch-cookie@2.2.0: resolution: {integrity: sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==} + fflate@0.8.3: + resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + file-entry-cache@11.1.5: resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} @@ -2324,6 +2611,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + flag-icons@7.6.0: + resolution: {integrity: sha512-hir/PsXwr0EESyizKrXJzmkzpLIMf+1vlNKLqAfvdh+bsU94a7LYWTiubkHKqptGoCPzOUGcm6c4PfC9/BaGSQ==} + flat-cache@6.1.23: resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} @@ -2463,6 +2753,11 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} @@ -2473,6 +2768,10 @@ packages: known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} + kysely@0.28.19: + resolution: {integrity: sha512-sXoKWuQjtorwxDLiws0ZSPGGne/hs+fGHIII7vXquSBFgHwLXgFIHN9tTv3kNdVkJ5d3xtXC84GjjWMYLqdFWg==} + engines: {node: '>=20.0.0'} + layerchart@2.9.1: resolution: {integrity: sha512-ftS5hcrogs+AhfSnNzTkFZCMTjPh3UYcU7MNMpN+M+SHx1AIm/IKxY2t2cJMmxAmc+JJfbB5Z6BmnqV6v7IOnw==} peerDependencies: @@ -2730,6 +3029,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + oxc-minify@0.136.0: + resolution: {integrity: sha512-u9UvPFTYVwQ/i1kpp/c20S/SbvLaLV0Ngzyhgi0YV4B1SlxM7RgnnePl4vY9N3Z9sTRcozL1MRStI3PlUN9RFA==} + engines: {node: ^20.19.0 || >=22.12.0} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3248,6 +3551,10 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + unplugin@2.3.11: + resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} + engines: {node: '>=18.12.0'} + update-browserslist-db@1.3.4: resolution: {integrity: sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==} hasBin: true @@ -3260,6 +3567,9 @@ packages: url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.1.0: + resolution: {integrity: sha512-IGjKp/o0NL3Bso1PymYURCJxMPNAf/ILOpendP9f5B6e1rTJgdgiOvgfoT8VxCAdY+Wisb9uhGaJJf3yZ2V9nw==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3267,6 +3577,14 @@ packages: resolution: {integrity: sha512-Sc5u1VVln93y1Xnz4R+CunOZc7R9LUcTmhj7Rc7Eg3HVcf7rVn2FOoa812fe0W8p3jD7xeoGSYbfqCGGH2B6xw==} hasBin: true + valibot@1.5.0: + resolution: {integrity: sha512-nil6AkP2TChWL43Z5uJ6GTxX01CUA+g8LWUM+N/rB9NBbkUMaUsi9PUNzlUPgoKASgmx9f7eGOYpJ04/fSa6FQ==} + peerDependencies: + typescript: '>=5' + peerDependenciesMeta: + typescript: + optional: true + vaul-svelte@1.0.0-next.7: resolution: {integrity: sha512-7zN7Bi3dFQixvvbUJY9uGDe7Ws/dGZeBQR2pXdXmzQiakjrxBvWo0QrmsX3HK+VH+SZOltz378cmgmCS9f9rSg==} engines: {node: '>=18', pnpm: '>=8.7.0'} @@ -3379,6 +3697,9 @@ packages: webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-virtual-modules@0.6.2: + resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -3466,6 +3787,61 @@ packages: snapshots: + '@bytecodealliance/jco-node-fs-darwin-arm64@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-darwin-x64@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-linux-arm64-gnu@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-linux-arm64-musl@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-linux-x64-gnu@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-linux-x64-musl@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-win32-arm64-msvc@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs-win32-x64-msvc@0.3.2': + optional: true + + '@bytecodealliance/jco-node-fs@0.3.2': + optionalDependencies: + '@bytecodealliance/jco-node-fs-darwin-arm64': 0.3.2 + '@bytecodealliance/jco-node-fs-darwin-x64': 0.3.2 + '@bytecodealliance/jco-node-fs-linux-arm64-gnu': 0.3.2 + '@bytecodealliance/jco-node-fs-linux-arm64-musl': 0.3.2 + '@bytecodealliance/jco-node-fs-linux-x64-gnu': 0.3.2 + '@bytecodealliance/jco-node-fs-linux-x64-musl': 0.3.2 + '@bytecodealliance/jco-node-fs-win32-arm64-msvc': 0.3.2 + '@bytecodealliance/jco-node-fs-win32-x64-msvc': 0.3.2 + + '@bytecodealliance/jco-transpile@0.13.0': + dependencies: + '@bytecodealliance/preview2-shim': 0.24.1 + '@bytecodealliance/preview3-shim': 0.6.1 + binaryen: 130.0.0 + oxc-minify: 0.136.0 + + '@bytecodealliance/preview2-shim@0.24.1': + dependencies: + '@bytecodealliance/jco-node-fs': 0.3.2 + + '@bytecodealliance/preview2-shim@0.25.0': + dependencies: + '@bytecodealliance/jco-node-fs': 0.3.2 + + '@bytecodealliance/preview3-shim@0.6.1': + dependencies: + '@bytecodealliance/jco-node-fs': 0.3.2 + '@bytecodealliance/preview2-shim': 0.25.0 + '@cacheable/memory@2.2.0': dependencies: '@cacheable/utils': 2.5.0 @@ -3513,11 +3889,27 @@ snapshots: '@dagrejs/graphlib@3.0.4': {} + '@emnapi/core@1.11.1': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.11.3': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@epic-web/invariant@1.0.0': {} '@esbuild/aix-ppc64@0.28.2': @@ -3821,6 +4213,45 @@ snapshots: '@img/sharp-win32-x64@0.35.5': optional: true + '@inlang/paraglide-js-svelte@1.0.5(@inlang/paraglide-js@3.2.0(eslint@10.13.0(jiti@2.7.0)(supports-color@10.2.2))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0))': + dependencies: + '@inlang/paraglide-js': 3.2.0(eslint@10.13.0(jiti@2.7.0)(supports-color@10.2.2))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)) + svelte: 5.57.2(@typescript-eslint/types@8.72.0) + + '@inlang/paraglide-js@3.2.0(eslint@10.13.0(jiti@2.7.0)(supports-color@10.2.2))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0))': + dependencies: + '@inlang/recommend-sherlock': 0.2.1 + '@inlang/sdk': 4.2.0 + commander: 11.1.0 + consola: 3.4.0 + jiti: 2.7.0 + json5: 2.2.3 + magic-string: 0.30.21 + unplugin: 2.3.11 + urlpattern-polyfill: 10.1.0 + valibot: 1.5.0(typescript@6.0.3) + optionalDependencies: + eslint: 10.13.0(jiti@2.7.0)(supports-color@10.2.2) + vite: 8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0) + transitivePeerDependencies: + - typescript + + '@inlang/plugin-message-format@4.6.0': + dependencies: + '@inlang/sdk': 4.2.0 + '@sinclair/typebox': 0.31.30 + + '@inlang/recommend-sherlock@0.2.1': + dependencies: + comment-json: 4.6.2 + + '@inlang/sdk@4.2.0': + dependencies: + '@lix-js/sdk': 0.20.1 + '@sinclair/typebox': 0.31.30 + kysely: 0.28.19 + uuid: 14.0.3 + '@internationalized/date@3.12.4': dependencies: '@swc/helpers': 0.5.23 @@ -3882,6 +4313,12 @@ snapshots: d3-time: 3.1.0 d3-time-format: 4.1.0 + '@lix-js/sdk@0.20.1': + dependencies: + '@bytecodealliance/jco-transpile': 0.13.0 + binaryen: 130.0.0 + fflate: 0.8.3 + '@lucide/svelte@1.61.0(svelte@5.57.2(@typescript-eslint/types@8.72.0))': dependencies: svelte: 5.57.2(@typescript-eslint/types@8.72.0) @@ -3907,6 +4344,13 @@ snapshots: '@napi-rs/lzma-linux-x64-gnu@1.5.1': optional: true + '@napi-rs/wasm-runtime@1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@tybys/wasm-util': 0.10.4 + optional: true + '@opentelemetry/api@1.10.0': {} '@opentelemetry/context-async-hooks@3.1.0(@opentelemetry/api@1.10.0)': @@ -4000,6 +4444,70 @@ snapshots: '@opentelemetry/sdk-logs': 3.1.0(@opentelemetry/api@1.10.0) '@opentelemetry/sdk-trace': 3.1.0(@opentelemetry/api@1.10.0) + '@oxc-minify/binding-android-arm-eabi@0.136.0': + optional: true + + '@oxc-minify/binding-android-arm64@0.136.0': + optional: true + + '@oxc-minify/binding-darwin-arm64@0.136.0': + optional: true + + '@oxc-minify/binding-darwin-x64@0.136.0': + optional: true + + '@oxc-minify/binding-freebsd-x64@0.136.0': + optional: true + + '@oxc-minify/binding-linux-arm-gnueabihf@0.136.0': + optional: true + + '@oxc-minify/binding-linux-arm-musleabihf@0.136.0': + optional: true + + '@oxc-minify/binding-linux-arm64-gnu@0.136.0': + optional: true + + '@oxc-minify/binding-linux-arm64-musl@0.136.0': + optional: true + + '@oxc-minify/binding-linux-ppc64-gnu@0.136.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-gnu@0.136.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-musl@0.136.0': + optional: true + + '@oxc-minify/binding-linux-s390x-gnu@0.136.0': + optional: true + + '@oxc-minify/binding-linux-x64-gnu@0.136.0': + optional: true + + '@oxc-minify/binding-linux-x64-musl@0.136.0': + optional: true + + '@oxc-minify/binding-openharmony-arm64@0.136.0': + optional: true + + '@oxc-minify/binding-wasm32-wasi@0.136.0': + dependencies: + '@emnapi/core': 1.11.1 + '@emnapi/runtime': 1.11.1 + '@napi-rs/wasm-runtime': 1.2.7(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) + optional: true + + '@oxc-minify/binding-win32-arm64-msvc@0.136.0': + optional: true + + '@oxc-minify/binding-win32-ia32-msvc@0.136.0': + optional: true + + '@oxc-minify/binding-win32-x64-msvc@0.136.0': + optional: true + '@oxc-project/types@0.155.0': {} '@playwright/test@1.65.0': @@ -4146,6 +4654,8 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.65.0': optional: true + '@sinclair/typebox@0.31.30': {} + '@sindresorhus/is@7.2.0': {} '@speed-highlight/core@1.2.24': {} @@ -4288,6 +4798,11 @@ snapshots: dependencies: '@tanstack/store': 0.11.2 + '@tybys/wasm-util@0.10.4': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -4515,6 +5030,8 @@ snapshots: array-find-index@1.0.2: {} + array-timsort@1.0.3: {} + assertion-error@2.0.1: {} ast-metadata-inferer@0.8.1: @@ -4529,6 +5046,8 @@ snapshots: baseline-browser-mapping@2.11.32: {} + binaryen@130.0.0: {} + bits-ui@2.20.2(@internationalized/date@3.12.4)(@sveltejs/kit@3.1.0(@opentelemetry/api@1.10.0)(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2(@typescript-eslint/types@8.72.0))(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0)): dependencies: '@floating-ui/core': 1.8.0 @@ -4615,16 +5134,25 @@ snapshots: color-support@1.1.3: {} + commander@11.1.0: {} + commander@15.0.0: {} commander@7.2.0: {} + comment-json@4.6.2: + dependencies: + array-timsort: 1.0.3 + esprima: 4.0.1 + commenting@1.1.0: {} confbox@0.2.4: {} confbox@0.3.1: {} + consola@3.4.0: {} + cookie@1.1.1: {} cookie@2.0.1: {} @@ -4949,6 +5477,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.19.0) eslint-visitor-keys: 5.0.1 + esprima@4.0.1: {} + esptool-js@0.7.1: dependencies: atob-lite: 2.0.0 @@ -4999,6 +5529,8 @@ snapshots: set-cookie-parser: 2.7.3 tough-cookie: 4.1.4 + fflate@0.8.3: {} + file-entry-cache@11.1.5: dependencies: flat-cache: 6.1.23 @@ -5008,6 +5540,8 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + flag-icons@7.6.0: {} + flat-cache@6.1.23: dependencies: cacheable: 2.5.0 @@ -5111,6 +5645,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json5@2.2.3: {} + keyv@5.6.0: dependencies: '@keyv/serialize': 1.1.1 @@ -5119,6 +5655,8 @@ snapshots: known-css-properties@0.37.0: {} + kysely@0.28.19: {} + layerchart@2.9.1(@sveltejs/kit@3.1.0(@opentelemetry/api@1.10.0)(@sveltejs/vite-plugin-svelte@7.3.1(svelte@5.57.2(@typescript-eslint/types@8.72.0))(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0))(typescript@6.0.3)(vite@8.3.5(@types/node@26.6.6)(esbuild@0.28.2)(jiti@2.7.0)))(svelte@5.57.2(@typescript-eslint/types@8.72.0)): dependencies: '@dagrejs/dagre': 2.0.4 @@ -5349,6 +5887,29 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + oxc-minify@0.136.0: + optionalDependencies: + '@oxc-minify/binding-android-arm-eabi': 0.136.0 + '@oxc-minify/binding-android-arm64': 0.136.0 + '@oxc-minify/binding-darwin-arm64': 0.136.0 + '@oxc-minify/binding-darwin-x64': 0.136.0 + '@oxc-minify/binding-freebsd-x64': 0.136.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.136.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.136.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.136.0 + '@oxc-minify/binding-linux-arm64-musl': 0.136.0 + '@oxc-minify/binding-linux-ppc64-gnu': 0.136.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.136.0 + '@oxc-minify/binding-linux-riscv64-musl': 0.136.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.136.0 + '@oxc-minify/binding-linux-x64-gnu': 0.136.0 + '@oxc-minify/binding-linux-x64-musl': 0.136.0 + '@oxc-minify/binding-openharmony-arm64': 0.136.0 + '@oxc-minify/binding-wasm32-wasi': 0.136.0 + '@oxc-minify/binding-win32-arm64-msvc': 0.136.0 + '@oxc-minify/binding-win32-ia32-msvc': 0.136.0 + '@oxc-minify/binding-win32-x64-msvc': 0.136.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -5868,6 +6429,13 @@ snapshots: universalify@0.2.0: {} + unplugin@2.3.11: + dependencies: + '@jridgewell/remapping': 2.3.5 + acorn: 8.19.0 + picomatch: 4.0.7 + webpack-virtual-modules: 0.6.2 + update-browserslist-db@1.3.4(browserslist@4.29.4): dependencies: browserslist: 4.29.4 @@ -5883,10 +6451,16 @@ snapshots: querystringify: 2.2.0 requires-port: 1.0.0 + urlpattern-polyfill@10.1.0: {} + util-deprecate@1.0.2: {} uuid@14.0.3: {} + valibot@1.5.0(typescript@6.0.3): + optionalDependencies: + typescript: 6.0.3 + vaul-svelte@1.0.0-next.7(svelte@5.57.2(@typescript-eslint/types@8.72.0)): dependencies: runed: 0.23.4(svelte@5.57.2(@typescript-eslint/types@8.72.0)) @@ -5946,6 +6520,8 @@ snapshots: webidl-conversions@3.0.1: {} + webpack-virtual-modules@0.6.2: {} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 diff --git a/project.inlang/paraglide.config.ts b/project.inlang/paraglide.config.ts new file mode 100644 index 00000000..91b6198e --- /dev/null +++ b/project.inlang/paraglide.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@inlang/paraglide-js'; + +export default defineConfig({ + outdir: './src/lib/paraglide', + emitTsDeclarations: true, + // Pinned so the CLI (used by `check`) and the Vite plugin emit the same layout. + outputStructure: 'message-modules', + // `custom-preferred` replaces `preferredLanguage` to map zh-CN and zh-TW to our Chinese locales, see src/lib/i18n/preferred-locale.ts. + strategy: ['cookie', 'custom-preferred', 'baseLocale'], + cookieSameSite: 'lax', + cookieSecure: 'auto', +}); diff --git a/project.inlang/settings.json b/project.inlang/settings.json new file mode 100644 index 00000000..9276ccde --- /dev/null +++ b/project.inlang/settings.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://inlang.com/schema/project-settings", + "baseLocale": "en", + "locales": [ + "en", + "de", + "nb", + "es", + "sv", + "fi", + "fr", + "et", + "nl", + "uk", + "ja", + "zh-Hans", + "zh-Hant", + "uwu" + ], + "modules": ["./node_modules/@inlang/plugin-message-format/dist/index.js"], + "plugin.inlang.messageFormat": { + "pathPattern": "./messages/{locale}.json" + } +} diff --git a/src/app.html b/src/app.html index 1b63d067..8871682b 100644 --- a/src/app.html +++ b/src/app.html @@ -1,5 +1,5 @@ - +
diff --git a/src/env.ts b/src/env.ts index 37667279..1ea4fb10 100644 --- a/src/env.ts +++ b/src/env.ts @@ -25,6 +25,23 @@ function optionalText(value: string | undefined): string { return value?.trim() ?? ''; } +/** + * Optional full sentence. Before i18n this variable held a fragment that was appended to + * "Welcome toAre you sure you want to remove the share for {invite.name}?
+
+
Are you sure you want to deny {invite.owner.name}'s invite?
+
+
Accept Invite
+{m.invite_accept()}
Deny Invite
+{m.invite_deny_label()}
- {page.error?.message ?? 'Something went wrong.'} + {errorHeading(page.error?.message)}
- {page.status === 404 - ? "The page you're looking for doesn't exist." - : 'An unexpected error occurred.'} + {page.status === 404 ? m.error_not_found_description() : m.error_unexpected_description()}
-
- This is the OpenShock DEVELOPMENT environment. No data is saved, and
- regularly overwritten by production data
+
Loading share details...
+{m.public_share_view_loading()}
{:then shareLinkRoot} {#if entered}{@render children?.()}
+{/snippet}
+
+{#snippet key({ children }: { children?: Snippet })}
+ - Many USB-C and micro-USB cables are charge-only and don't carry data. Swap to a known-good data - cable (one you've used to transfer files or connect other devices) and reconnect the hub. + {m.terminal_help_cable_body()}
{/snippet} {#snippet portBody()}- Plug the device directly into a USB port on your computer. Avoid USB hubs, docking stations, and - front-panel ports if possible; these are common sources of power and signal issues. If you're on - a desktop, try a port on the back of the machine. + {m.terminal_help_port_body()}
{/snippet} {#snippet driverBody()}Download the CP210x driver:
+{m.terminal_help_driver_download()}
CP210xVCPInstaller_x64.exe. Follow the prompts to
- install.
+ If the driver installer ran but the device still doesn't show up:
+{m.terminal_help_manual_intro()}
Device Manager).
+ Ports (COM & LPT), look for an entry like:
+ Silicon Labs CP210x USB to UART BridgeSilicon Labs CP210x USB to UART Bridge (COM...){DEVICE_NAME}{DEVICE_NAME} (COM...)Update Driver.
+ Browse my computer for drivers and select the folder you extracted the driver
- zip into. Make sure Include subfolders is checked.
+ Silicon Labs CP210x USB to UART Bridge.
+
- Still stuck after all of the above? Hop into our Discord server and ask in the
- # 💭┃support-chat channel. Please include:
+
{deviceLabel}
@@ -401,15 +405,15 @@
Colors
+{m.terminal_colors()}