mirror of
https://github.com/seriousm4x/UpSnap.git
synced 2026-03-31 06:24:09 -04:00
feat: replace typesafe-i18n with inlang/paraglide-js
typesafe-i18n is no longer maintained
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -234,3 +234,5 @@ backend/pb_public/*
|
||||
|
||||
dist/
|
||||
vite.config.js.timestamp*
|
||||
|
||||
frontend/src/lib/paraglide
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"adapter": "svelte",
|
||||
"$schema": "https://unpkg.com/typesafe-i18n@5.26.2/schema/typesafe-i18n.json",
|
||||
"outputPath": "./src/lib/i18n/"
|
||||
}
|
||||
192
frontend/messages/de.json
Normal file
192
frontend/messages/de.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Admin",
|
||||
"account_account_type_user": "Benutzer",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Nachdem das Passwort geändert wurde, musst du dich neu einloggen.",
|
||||
"account_change_password_confirm": "Password bestätigen",
|
||||
"account_change_password_label": "Altes Passwort",
|
||||
"account_change_password_new": "Neues Password",
|
||||
"account_change_password_title": "Passwort ändern",
|
||||
"account_language_title": "Sprache",
|
||||
"account_page_title": "Account",
|
||||
"buttons_add": "Hinzufügen",
|
||||
"buttons_cancel": "Abbrechen",
|
||||
"buttons_change": "Ändern",
|
||||
"buttons_confirm": "Bestätigen",
|
||||
"buttons_delete": "Löschen",
|
||||
"buttons_reset": "Zurücksetzen",
|
||||
"buttons_save": "Speichern",
|
||||
"device_card_btn_more_edit": "Bearbeiten",
|
||||
"device_card_btn_more_reboot": "Neustart",
|
||||
"device_card_btn_more_sleep": "Ruhezustand",
|
||||
"device_card_btn_more": "Mehr",
|
||||
"device_card_nic_tooltip_pending": "Warten",
|
||||
"device_card_nic_tooltip_power_no_permission": "Keine Berechtigung zum einschalten",
|
||||
"device_card_nic_tooltip_power": "Einschalten",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Kein Ausschaltbefehl gesetzt",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Keine Berechtigung zum ausschalten",
|
||||
"device_card_nic_tooltip_shutdown": "Ausschalten",
|
||||
"device_card_password": "Passwort",
|
||||
"device_card_tooltip_last_status_change": "Letzte Statusänderung",
|
||||
"device_card_tooltip_shutdown_cron": "Ausschalten Cron",
|
||||
"device_card_tooltip_wake_cron": "Einschalten Cron",
|
||||
"device_card_tooltip_wake_password": "Einschalten Passwort",
|
||||
"device_general_description_placeholder": "Eine Beschreibung des Geräts",
|
||||
"device_general_description": "Beschreibung",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Name",
|
||||
"device_general_netmask": "Netmask",
|
||||
"device_general_required_field": "Pflichtfeld",
|
||||
"device_general": "Allgemein",
|
||||
"device_groups_desc": "Du kannst Geräte einer Gruppe hinzufügen, um sie auf dem Dashboard nach Gruppen sortiert anzuzeigen.",
|
||||
"device_groups_placeholder": "z.B. 'Keller' or 'Büro'",
|
||||
"device_groups": "Gruppen",
|
||||
"device_link_desc": "Macht Ihren Gerätenamen zu einem anklickbaren Link, ideal zum Beispiel für die Verknüpfung eines Dashboards.",
|
||||
"device_link_open_new_tab": "Neuer Tab",
|
||||
"device_link_open_no": "Nein",
|
||||
"device_link_open_same_tab": "Selber Tab",
|
||||
"device_link_open": "Automatisch Link öffnen",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Bitte bestätigen, um {device} herunterzufahren.",
|
||||
"device_modal_confirm_shutdown_title": "{device} herunterfahren?",
|
||||
"device_modal_confirm_wake_desc": "Bitte bestätigen, um {device} einzuschalten.",
|
||||
"device_modal_confirm_wake_title": "{device} einschalten?",
|
||||
"device_network_scan_add_all": "Alle Geräte hinzufügen",
|
||||
"device_network_scan_desc": "Automatisches Scannen deines Netzwerks nach Geräten. Damit dies funktioniert, musst du UpSnap als Administrator/root ausführen und nmap installiert und im $PATH verfügbar haben (Für Docker-Benutzer ist das bereits der Fall, und du musst nichts weiter tun). Das Scannen kann einige Sekunden dauern.",
|
||||
"device_network_scan_include_unknown": "Schließe Geräte ein, bei denen der Name 'Unknown' ist.",
|
||||
"device_network_scan_ip_range": "IP-Bereich",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac Hersteller:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Netmask:",
|
||||
"device_network_scan_new_netmask": "Neue Netmask",
|
||||
"device_network_scan_no_range": "Kein Scan-Bereich",
|
||||
"device_network_scan_range_saved": "Scan-Bereich gespeichert",
|
||||
"device_network_scan_replace_netmask": "Netmask für alle Geräte ändern?",
|
||||
"device_network_scan_running": "Scan läuft",
|
||||
"device_network_scan_unsaved_changes": "Ungespeicherte Änderungen",
|
||||
"device_network_scan": "Scan",
|
||||
"device_page_title": "Neues Gerät",
|
||||
"device_password_desc": "Einige Netzwerkkarten bieten die Möglichkeit, ein Passwort für Magic Packets zu setzen, auch <span class=\"badge\">SecureON</span> genannt. Das Passwort kann nur 0, 4 oder 6 Zeichen lang sein.",
|
||||
"device_password": "Password",
|
||||
"device_ping_cmd": "Eigener Ping-Befehl",
|
||||
"device_ping_desc": "Du kannst einen benutzerdefinierten Shell-Befehl verwenden, um festzustellen, ob das Gerät eingeschaltet ist. Der Befehl sollte einen Exit-Code von <span class=\"badge\">0</span> zurückgeben, um anzuzeigen, dass das Gerät eingeschaltet ist. Jeder andere Exit-Code setzt den Status auf offline.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Port hinzufügen",
|
||||
"device_ports_desc": "UpSnap kann auch prüfen, ob bestimmte Ports offen sind.",
|
||||
"device_ports_name": "Name",
|
||||
"device_ports_number": "Nummer",
|
||||
"device_ports": "Ports",
|
||||
"device_require_confirmation": "Bestätigung erforderlich",
|
||||
"device_shutdown_cmd": "Befehl zum ausschalten",
|
||||
"device_shutdown_cron_desc": "Genau wie das Einrichten eines Cron-Jobs, um das Gerät aufzuwecken, kannst du auch einen Cron-Job planen, um dieses Gerät herunterzufahren.",
|
||||
"device_shutdown_cron_enable": "Aktivieren",
|
||||
"device_shutdown_cron": "Cron",
|
||||
"device_shutdown_desc": "Dieser <strong>Shell-Befehl</strong> wird in deinem Container ausgeführt (wenn du Docker verwendest) oder auf deinem Host (wenn du die Binärdatei verwendest). Um zu überprüfen, ob das funktioniert, kannst du den Befehl zuerst im Container oder auf deiner Host-Shell ausführen. Übliche Befehle sind <span class=\"badge\">net rpc</span> für Windows, <span class=\"badge\">sshpass</span> für Linux oder <span class=\"badge\">curl</span> im Allgemeinen, um Webanfragen durchzuführen.",
|
||||
"device_shutdown_examples_linux": "Entfernten Linux PC ausschalten:",
|
||||
"device_shutdown_examples_windows": "Entfernten Windows PC ausschalten:",
|
||||
"device_shutdown_examples": "Beispiele:",
|
||||
"device_shutdown": "Ausschalten",
|
||||
"device_sol_authorization": "Authorisierung",
|
||||
"device_sol_desc1": "Du kannst Computer mithilfe des Tools <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> in den Ruhezustand versetzen. Sleep-On-LAN (SOL) ist ein externes Tool/Daemon, das auf den PCs arbeitet, die du in den Ruhezustand versetzen möchtest, und stellt einen REST-Endpunkt bereit. Für Anweisungen zur Einrichtung von Sleep-On-LAN verweise bitte auf den Abschnitt <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a>.",
|
||||
"device_sol_desc2": "SOL ist so konfiguriert, dass es Anfragen über HTTP statt über UDP sendet, um eine Autorisierung zu ermöglichen und die Zuverlässigkeit der Anfragen zu erhöhen.",
|
||||
"device_sol_desc3": "Daher stell bitte sicher, dass du <span class=\"badge\">HTTP:<DEINPORT></span> im Abschnitt <span class=\"badge\">Listener</span> der <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL-Konfiguration</a> hinzufügst.",
|
||||
"device_sol_enable": "Sleep-On-LAN aktivieren",
|
||||
"device_sol_password": "SOL Passwort",
|
||||
"device_sol_port": "SOL Port",
|
||||
"device_sol_user": "SOL Benutzer",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manuell",
|
||||
"device_tabs.1": "Netzwerkscan",
|
||||
"device_wake_cmd": "Eigener Einschalt-Befehl",
|
||||
"device_wake_cron_enable": "Aktivieren",
|
||||
"device_wake_cron": "Cron",
|
||||
"device_wake_desc": "Du kannst das Gerät mit einem Cron-Job einschalten.",
|
||||
"device_wake": "Einschalten",
|
||||
"home_add_first_device": "Füge dein erstes Gerät hinzu",
|
||||
"home_grant_permissions": "Bitte frag den Administrator, dir Berechtigungen für bestehende Geräte zu erteilen oder neue Geräte zu erstellen.",
|
||||
"home_no_devices": "Keine Geräte.",
|
||||
"home_order_groups": "Gruppen",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Name",
|
||||
"home_order_tooltip": "Sortieren",
|
||||
"home_page_title": "Home",
|
||||
"home_search_placeholder": "Suche nach Geräten",
|
||||
"login_btn_login": "Login",
|
||||
"login_btn_more": "Mehr",
|
||||
"login_email_label": "Email oder Nutzername:",
|
||||
"login_menu_title_auth_providers": "Andere Login Provider",
|
||||
"login_password_label": "Passwort:",
|
||||
"login_welcome": "Willkommen",
|
||||
"navbar_edit_account": "Account bearbeiten",
|
||||
"navbar_logout": "Abmelden",
|
||||
"navbar_new": "Neu",
|
||||
"navbar_theme": "Theme",
|
||||
"settings_icon_desc": "Eigenes Favicon nutzen. Unterstützte Dateitypen sind:",
|
||||
"settings_icon_title": "Icon",
|
||||
"settings_invalid_cron": "Ungültige cron Syntax",
|
||||
"settings_lazy_ping_desc": "Wenn Lazy Ping aktiviert ist, pingt UpSnap die Geräte nur an, wenn ein aktiver Benutzer die Website besucht. Wenn es ausgeschaltet ist, pingt UpSnap die Geräte immer an.",
|
||||
"settings_lazy_ping_enable": "Aktivieren",
|
||||
"settings_lazy_ping_title": "Lazy Ping",
|
||||
"settings_page_title": "Einstellungen",
|
||||
"settings_ping_interval_desc1": "Legt den Intervall fest, in dem Geräte gepingt werden. Leer lassen um den Standardwert von <span class=\"badge\">@every 3s</span> zu verwenden.",
|
||||
"settings_ping_interval_desc2": "Lerne mehr über die korrekte Cron Syntax auf <a class=\"link\" href=\"https://de.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> oder sieh dir die <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">Paketdokumentation</a> an.",
|
||||
"settings_ping_interval_title": "Ping Intervall",
|
||||
"settings_upsnap_version": "UpSnap Version",
|
||||
"settings_website_title_desc": "Setzt den Seiten- und den Tabtitel.",
|
||||
"settings_website_title_title": "Seitentitel",
|
||||
"toasts_admin_saved": "Admin gespeichert",
|
||||
"toasts_device_created": "{device} erstellt",
|
||||
"toasts_device_deleted": "{device} gelöscht",
|
||||
"toasts_device_updated": "{device} geändert",
|
||||
"toasts_devices_created_multiple": "{count} Geräte erstellt",
|
||||
"toasts_group_created": "Gruppe {group} erstellt",
|
||||
"toasts_group_deleted": "Gruppe {group} gelöscht",
|
||||
"toasts_no_permission": "Du hast keine Berechtigung für {url}",
|
||||
"toasts_password_changed": "Passwort geändert. Bitte neu einloggen.",
|
||||
"toasts_passwords_missmatch": "Passwörter stimmen nicht überein",
|
||||
"toasts_permissions_created": "Berechtigungen für {username} erstellt",
|
||||
"toasts_permissions_deleted": "Berechtigungen für {username} gelöscht",
|
||||
"toasts_permissions_updated_personal": "Deine Berechtigungen wurden aktualisiert",
|
||||
"toasts_permissions_updated": "Berechtigungen für {username} geändert",
|
||||
"toasts_settings_saved": "Einstellungen gespeichert",
|
||||
"toasts_user_created": "Benutzer {username} erstellt",
|
||||
"toasts_user_deleted": "Benutzer {username} gelöscht",
|
||||
"toasts_user_saved": "Benutzer gespeichert",
|
||||
"users_allow_create_devices": "{username} erlauben neue Geräte zu erstellen und Gerätegruppen zu bearbeiten",
|
||||
"users_confirm_delete_desc": "Soll {username} wirklich gelöscht werden?",
|
||||
"users_confirm_delete_title": "Löschen bestätigen",
|
||||
"users_create_new_device": "Neues Gerät erstellen",
|
||||
"users_create_new_user": "Neuen Benutzer erstellen",
|
||||
"users_delete": "Löschen",
|
||||
"users_device_permissions": "Geräteberechtigungen",
|
||||
"users_page_title": "Benutzer",
|
||||
"users_password_confirm": "Passwort bestätigen",
|
||||
"users_password": "Passwort",
|
||||
"users_power": "Power",
|
||||
"users_read": "Lesen",
|
||||
"users_required_field": "Pflichtfeld",
|
||||
"users_toggle": "Toggle",
|
||||
"users_update": "Ändern",
|
||||
"users_username": "Benutzername",
|
||||
"welcome_not_expected_back": "Bring mich zurück",
|
||||
"welcome_not_expected_desc": "Du hast die Einrichtung bereits abgeschlossen! Hier gibt es nichts zu tun.",
|
||||
"welcome_not_expected_title": "Ich hab dich hier nicht erwartet! 🧐",
|
||||
"welcome_progress_step1": "Willkommen",
|
||||
"welcome_progress_step2": "Account erstellen",
|
||||
"welcome_progress_step3": "Fertig",
|
||||
"welcome_step1_page_title": "Willkommen bei UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Weiter",
|
||||
"welcome_step1_setup_desc": "Bitte schließe die nachfolgenden Schritte ab, um die Einrichtung abzuschließen.",
|
||||
"welcome_step2_btn_create": "Erstellen",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "min. 10 Zeichen",
|
||||
"welcome_step2_label_password_confirm": "Passwort bestätigen:",
|
||||
"welcome_step2_label_password": "Passwort:",
|
||||
"welcome_step2_page_title": "Erstelle einen Admin Account",
|
||||
"welcome_step3_btn_done": "Los geht's!",
|
||||
"welcome_step3_page_desc": "Füge Geräte zu deinem Dashboard hinzu.",
|
||||
"welcome_step3_page_title": "Du bist fertig! 🎉"
|
||||
}
|
||||
192
frontend/messages/en.json
Normal file
192
frontend/messages/en.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Admin",
|
||||
"account_account_type_user": "User",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "After the password has been changed, you will need to log in again.",
|
||||
"account_change_password_confirm": "Confirm password",
|
||||
"account_change_password_label": "Old password",
|
||||
"account_change_password_new": "New password",
|
||||
"account_change_password_title": "Change password",
|
||||
"account_language_title": "Language",
|
||||
"account_page_title": "Account",
|
||||
"buttons_add": "Add",
|
||||
"buttons_cancel": "Cancel",
|
||||
"buttons_change": "Change",
|
||||
"buttons_confirm": "Confirm",
|
||||
"buttons_delete": "Delete",
|
||||
"buttons_reset": "Reset",
|
||||
"buttons_save": "Save",
|
||||
"device_card_btn_more_edit": "Edit",
|
||||
"device_card_btn_more_reboot": "Reboot",
|
||||
"device_card_btn_more_sleep": "Sleep",
|
||||
"device_card_btn_more": "More",
|
||||
"device_card_nic_tooltip_pending": "Pending",
|
||||
"device_card_nic_tooltip_power_no_permission": "No permission to power on this device",
|
||||
"device_card_nic_tooltip_power": "Power on",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "No shutdown command set",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "No permission to shut down this device",
|
||||
"device_card_nic_tooltip_shutdown": "Shut down",
|
||||
"device_card_password": "Password",
|
||||
"device_card_tooltip_last_status_change": "Last status change",
|
||||
"device_card_tooltip_shutdown_cron": "Shutdown cron",
|
||||
"device_card_tooltip_wake_cron": "Wake cron",
|
||||
"device_card_tooltip_wake_password": "Wake password",
|
||||
"device_general_description_placeholder": "Some description of the device",
|
||||
"device_general_description": "Description",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Name",
|
||||
"device_general_netmask": "Netmask",
|
||||
"device_general_required_field": "required field",
|
||||
"device_general": "General",
|
||||
"device_groups_desc": "You can add devices to a group to have them sorted by group on the dashboard.",
|
||||
"device_groups_placeholder": "e.g. 'Basement' or 'Office'",
|
||||
"device_groups": "Groups",
|
||||
"device_link_desc": "Makes your device name a clickable link, perfect for linking a dashboard for example.",
|
||||
"device_link_open_new_tab": "New tab",
|
||||
"device_link_open_no": "No",
|
||||
"device_link_open_same_tab": "Same tab",
|
||||
"device_link_open": "Automatically open link",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Please confirm to shutdown {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Shutdown {device}?",
|
||||
"device_modal_confirm_wake_desc": "Please confirm to wake {device}.",
|
||||
"device_modal_confirm_wake_title": "Wake {device}?",
|
||||
"device_network_scan_add_all": "Add all devices",
|
||||
"device_network_scan_desc": "Automatically scan your network for devices. For this to work, you need to run UpSnap as root/admin and have nmap installed and available in your $PATH (For docker users, thats already the case and you don't need to do anything). Scanning might take some seconds.",
|
||||
"device_network_scan_include_unknown": "Include devices where name is \"Unknown\"",
|
||||
"device_network_scan_ip_range": "IP range",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac vendor:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Netmask:",
|
||||
"device_network_scan_new_netmask": "New netmask",
|
||||
"device_network_scan_no_range": "No scan range",
|
||||
"device_network_scan_range_saved": "Scan range saved",
|
||||
"device_network_scan_replace_netmask": "Replace netmask for all devices?",
|
||||
"device_network_scan_running": "Scan running",
|
||||
"device_network_scan_unsaved_changes": "Unsaved changes",
|
||||
"device_network_scan": "Scan",
|
||||
"device_page_title": "New device",
|
||||
"device_password_desc": "Some network cards have the option to set a password for magic packets, also called <span class=\"badge\">SecureON</span>. Password can only be 0, 4 or 6 characters in length.",
|
||||
"device_password": "Password",
|
||||
"device_ping_cmd": "Custom ping command",
|
||||
"device_ping_desc": "You can use a custom shell command to see if the device is powered on. The command should return an exit code of <span class=\"badge\">0</span> to indicate that the device is powered on, any other exit code will mark the device as powered off.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Add new port",
|
||||
"device_ports_desc": "UpSnap can also check if given ports are open.",
|
||||
"device_ports_name": "Name",
|
||||
"device_ports_number": "Number",
|
||||
"device_ports": "Ports",
|
||||
"device_require_confirmation": "Require Confirmation",
|
||||
"device_shutdown_cmd": "Shutdown command",
|
||||
"device_shutdown_cron_desc": "Just like setting a cron to wake the device, you can also schedule a cron job to shut down this device.",
|
||||
"device_shutdown_cron_enable": "Enable shutdown cron",
|
||||
"device_shutdown_cron": "Shutdown cron",
|
||||
"device_shutdown_desc": "This <strong>shell command</strong> will run inside your container (if you use docker) or on your host (if you use the binary). To verify that it works, you can run the command inside the container or on your host shell first. Common commands are <span class=\"badge\">net rpc</span> for windows, <span class=\"badge\">sshpass</span> for linux or <span class=\"badge\">curl</span> in general to make web requests.",
|
||||
"device_shutdown_examples_linux": "Shutdown remote linux machine:",
|
||||
"device_shutdown_examples_windows": "Shutdown remote windows machine:",
|
||||
"device_shutdown_examples": "Examples:",
|
||||
"device_shutdown": "Shutdown",
|
||||
"device_sol_authorization": "Authorization",
|
||||
"device_sol_desc1": "You can put computers to sleep using the <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> tool. Sleep-On-LAN (SOL) is an external tool/daemon that operates on the PCs you want to put to sleep, providing a REST endpoint. For instructions on setting up Sleep-On-LAN, please refer to the <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a> section.",
|
||||
"device_sol_desc2": "SOL is configured to send requests over HTTP instead of UDP to enable authorization and make requests more reliable.",
|
||||
"device_sol_desc3": "Therefore, please ensure that you include <span class=\"badge\">HTTP:<YOURPORT></span> in the <span class=\"badge\">Listeners</span> section of the <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL configuration</a>.",
|
||||
"device_sol_enable": "Enable Sleep-On-LAN",
|
||||
"device_sol_password": "SOL Password",
|
||||
"device_sol_port": "SOL Port",
|
||||
"device_sol_user": "SOL User",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manual",
|
||||
"device_tabs.1": "Network Scan",
|
||||
"device_wake_cmd": "Custom wake command",
|
||||
"device_wake_cron_enable": "Enable wake cron",
|
||||
"device_wake_cron": "Wake cron",
|
||||
"device_wake_desc": "You can power this device using a scheduled cron job.",
|
||||
"device_wake": "Wake",
|
||||
"home_add_first_device": "Add your first device",
|
||||
"home_grant_permissions": "Please ask the admin to grant you permissions to existing devices or to create new ones.",
|
||||
"home_no_devices": "No devices here.",
|
||||
"home_order_groups": "Groups",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Name",
|
||||
"home_order_tooltip": "Order",
|
||||
"home_page_title": "Home",
|
||||
"home_search_placeholder": "Search for devices",
|
||||
"login_btn_login": "Login",
|
||||
"login_btn_more": "More",
|
||||
"login_email_label": "Email or Username:",
|
||||
"login_menu_title_auth_providers": "Other Auth Providers",
|
||||
"login_password_label": "Password:",
|
||||
"login_welcome": "Welcome",
|
||||
"navbar_edit_account": "Edit account",
|
||||
"navbar_logout": "Logout",
|
||||
"navbar_new": "New",
|
||||
"navbar_theme": "Theme",
|
||||
"settings_icon_desc": "Set a custom favicon. Supported file types are:",
|
||||
"settings_icon_title": "Icon",
|
||||
"settings_invalid_cron": "Invalid cron syntax",
|
||||
"settings_lazy_ping_desc": "When lazy ping is turned on, UpSnap will only ping devices if there is an active user visiting the website. If it's turned off, UpSnap will always ping devices.",
|
||||
"settings_lazy_ping_enable": "Enable",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "Settings",
|
||||
"settings_ping_interval_desc1": "Sets the interval in which the devices are pinged. Leave blank to use default value of <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Learn more about the correct syntax for cron on <a class=\"link\" href=\"https://en.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> or refer to the <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">package documentation</a>.",
|
||||
"settings_ping_interval_title": "Ping interval",
|
||||
"settings_upsnap_version": "UpSnap version",
|
||||
"settings_website_title_desc": "Sets the title of the website and in the browser tab.",
|
||||
"settings_website_title_title": "Website title",
|
||||
"toasts_admin_saved": "Admin saved",
|
||||
"toasts_device_created": "Created {device}",
|
||||
"toasts_device_deleted": "Deleted {device}",
|
||||
"toasts_device_updated": "Updated {device}",
|
||||
"toasts_devices_created_multiple": "Created {count} devices",
|
||||
"toasts_group_created": "Created group {group}",
|
||||
"toasts_group_deleted": "Deleted group {group}",
|
||||
"toasts_no_permission": "You don't have permission to visit {url}",
|
||||
"toasts_password_changed": "Password changed. Please login again.",
|
||||
"toasts_passwords_missmatch": "Passwords don't match",
|
||||
"toasts_permissions_created": "Permissions for {username} created",
|
||||
"toasts_permissions_deleted": "Permissions for {username} deleted",
|
||||
"toasts_permissions_updated_personal": "Your permissions have been updated",
|
||||
"toasts_permissions_updated": "Permissions for {username} updated",
|
||||
"toasts_settings_saved": "Saved settings",
|
||||
"toasts_user_created": "User {username} created",
|
||||
"toasts_user_deleted": "User {username} deleted",
|
||||
"toasts_user_saved": "User saved",
|
||||
"users_allow_create_devices": "Allow {username} to create new devices and edit device groups",
|
||||
"users_confirm_delete_desc": "Are you sure you want to delete {username}?",
|
||||
"users_confirm_delete_title": "Confirm delete",
|
||||
"users_create_new_device": "Create new device",
|
||||
"users_create_new_user": "Create new user",
|
||||
"users_delete": "Delete",
|
||||
"users_device_permissions": "Device permissions",
|
||||
"users_page_title": "Users",
|
||||
"users_password_confirm": "Password confirm",
|
||||
"users_password": "Password",
|
||||
"users_power": "Power",
|
||||
"users_read": "Read",
|
||||
"users_required_field": "required field",
|
||||
"users_toggle": "Toggle",
|
||||
"users_update": "Update",
|
||||
"users_username": "Username",
|
||||
"welcome_not_expected_back": "Take me back",
|
||||
"welcome_not_expected_desc": "You are already done with the setup! Nothing to do.",
|
||||
"welcome_not_expected_title": "I didn't expect you here! 🧐",
|
||||
"welcome_progress_step1": "Welcome",
|
||||
"welcome_progress_step2": "Create account",
|
||||
"welcome_progress_step3": "Done",
|
||||
"welcome_step1_page_title": "Welcome to UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Next",
|
||||
"welcome_step1_setup_desc": "Please complete the following steps to finish the setup.",
|
||||
"welcome_step2_btn_create": "Create",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "min. 10 characters",
|
||||
"welcome_step2_label_password_confirm": "Password confirm:",
|
||||
"welcome_step2_label_password": "Password:",
|
||||
"welcome_step2_page_title": "Create an admin account",
|
||||
"welcome_step3_btn_done": "Lets go!",
|
||||
"welcome_step3_page_desc": "Go ahead and add some devices to your dashboard.",
|
||||
"welcome_step3_page_title": "You are all set! 🎉"
|
||||
}
|
||||
192
frontend/messages/es.json
Normal file
192
frontend/messages/es.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Admin",
|
||||
"account_account_type_user": "Usuario",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Después de cambiar la contraseña, deberá iniciar sesión nuevamente.",
|
||||
"account_change_password_confirm": "Confirmar contraseña",
|
||||
"account_change_password_label": "Antigua contraseña",
|
||||
"account_change_password_new": "Nueva contraseña",
|
||||
"account_change_password_title": "Cambiar contraseña",
|
||||
"account_language_title": "Idioma",
|
||||
"account_page_title": "Cuenta",
|
||||
"buttons_add": "Añadir",
|
||||
"buttons_cancel": "Cancelar",
|
||||
"buttons_change": "Alterar",
|
||||
"buttons_confirm": "Confirmar",
|
||||
"buttons_delete": "Eliminar",
|
||||
"buttons_reset": "Reiniciar",
|
||||
"buttons_save": "Guardar",
|
||||
"device_card_btn_more_edit": "Editar",
|
||||
"device_card_btn_more_reboot": "Reiniciar",
|
||||
"device_card_btn_more_sleep": "Suspender",
|
||||
"device_card_btn_more": "Más",
|
||||
"device_card_nic_tooltip_pending": "Pendiente",
|
||||
"device_card_nic_tooltip_power_no_permission": "No tienes permiso para encender este dispositivo",
|
||||
"device_card_nic_tooltip_power": "Encender",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "El comando de apagado no está definido",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "No tienes permiso para apagar este dispositivo",
|
||||
"device_card_nic_tooltip_shutdown": "Apagar",
|
||||
"device_card_password": "Contraseña",
|
||||
"device_card_tooltip_last_status_change": "Último cambio de estado",
|
||||
"device_card_tooltip_shutdown_cron": "Shutdown cron",
|
||||
"device_card_tooltip_wake_cron": "Wake cron",
|
||||
"device_card_tooltip_wake_password": "Wake password",
|
||||
"device_general_description_placeholder": "Descripción del dispositivo",
|
||||
"device_general_description": "Descripción",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Nombre",
|
||||
"device_general_netmask": "Máscara de red",
|
||||
"device_general_required_field": "Campo obligatorio",
|
||||
"device_general": "General",
|
||||
"device_groups_desc": "Puede agregar dispositivos a un grupo para ordenarlos por grupo en el dashboard.",
|
||||
"device_groups_placeholder": "e.g. 'Basement' o 'Office'",
|
||||
"device_groups": "Grupos",
|
||||
"device_link_desc": "Permite que el nombre de su dispositivo sea un enlace. Perfecto para dashboard, por ejemplo.",
|
||||
"device_link_open_new_tab": "Nueva pestaña",
|
||||
"device_link_open_no": "No",
|
||||
"device_link_open_same_tab": "Misma pestaña",
|
||||
"device_link_open": "Abrir enlace automáticamente",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Por favor confirme para apagar {device}.",
|
||||
"device_modal_confirm_shutdown_title": "{device} apagar?",
|
||||
"device_modal_confirm_wake_desc": "Confirme para activar {device}.",
|
||||
"device_modal_confirm_wake_title": "{device} activar?",
|
||||
"device_network_scan_add_all": "Añadir todos los dispositivos",
|
||||
"device_network_scan_desc": "Escanee automáticamente su red en busca de dispositivos. Para que esto funcione, necesita ejecutar UpSnap como root/admin y tener nmap instalado y disponible en su $PATH (para los usuarios de Docker, ese ya es el caso y no necesitan hacer nada). El escaneo puede tardar algunos segundos.",
|
||||
"device_network_scan_include_unknown": "Incluir dispositivos donde este el nombre 'Unknown'",
|
||||
"device_network_scan_ip_range": "Rango IP",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Proveedor Mac:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Máscara de red:",
|
||||
"device_network_scan_new_netmask": "Nueva máscara de red",
|
||||
"device_network_scan_no_range": "Sin rango de escaneo",
|
||||
"device_network_scan_range_saved": "Rango de escaneo guardado",
|
||||
"device_network_scan_replace_netmask": "Reemplazar máscara de red para todos los dispositivos?",
|
||||
"device_network_scan_running": "Escaneo en curso",
|
||||
"device_network_scan_unsaved_changes": "Cambios sin guardar",
|
||||
"device_network_scan": "Escaneo",
|
||||
"device_page_title": "Nuevo dispositivo",
|
||||
"device_password_desc": "Algunos adaptadores de red tienen la opción de definir una contraseña para magic pockets, también conocidos como <span class=\"badge\">SecureON</span>. la contraseña sólo podrá contener 0, 4 o 6 caracteres.",
|
||||
"device_password": "Contraseña",
|
||||
"device_ping_cmd": "Comando ping personalizado",
|
||||
"device_ping_desc": "Puede utilizar un comando de shell personalizado para ver si el dispositivo está conectado. El comando debe devolver un código de salida de <span class=\"badge\">0</span> para indicar que el dispositivo está encendido; cualquier otro código de salida marcará el dispositivo como apagado.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Añadir nuevo puerto",
|
||||
"device_ports_desc": "UpSnap puede comprobar si ciertos puertos están abiertos.",
|
||||
"device_ports_name": "Nombre",
|
||||
"device_ports_number": "Número",
|
||||
"device_ports": "Puertos",
|
||||
"device_require_confirmation": "Requiere confirmación",
|
||||
"device_shutdown_cmd": "Comando para Apagar",
|
||||
"device_shutdown_cron_desc": "Al igual que configurar un cron para encender el dispositivo, también puede programar un cron job para apagar este dispositivo.",
|
||||
"device_shutdown_cron_enable": "Activar apagado de cron",
|
||||
"device_shutdown_cron": "Apagar cron",
|
||||
"device_shutdown_desc": "Este <strong>comando de shell</strong> se ejecutará dentro de su contenedor (si usa Docker) o en su host (si usa el binario). Para verificar que funciona, primero puede ejecutar el comando dentro del contenedor o en el shell de su host. Los comandos comunes son <span class=\"badge\">net rpc</span> para Windows, <span class=\"badge\">sshpass</span> para Linux o <span class=\"badge\">curl</span> en general para realizar solicitudes web.",
|
||||
"device_shutdown_examples_linux": "Apagar el dispositivo Linux remoto:",
|
||||
"device_shutdown_examples_windows": "Apagar el dispositivo Windows remoto:",
|
||||
"device_shutdown_examples": "Ejemplos:",
|
||||
"device_shutdown": "Apagar",
|
||||
"device_sol_authorization": "Autorización",
|
||||
"device_sol_desc1": "Puedes poner las computadoras en modo de suspensión usando <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> herramienta. Sleep-On-LAN (SOL) es una herramienta/daemon externo que opera en las PC que desea poner en suspensión y proporciona un punto final REST. Para obtener instrucciones sobre cómo configurar Sleep-On-LAN, consulte <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Uso</a> sección.",
|
||||
"device_sol_desc2": "SOL está configurado para enviar solicitudes a través de HTTP en lugar de UDP para permitir la autorización y hacer que las solicitudes sean más confiables.",
|
||||
"device_sol_desc3": "Por lo tanto, asegúrese de incluir <span class=\"badge\">HTTP:<YOURPORT></span> en la sección <span class=\"badge\">Oyentes</span> de <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">configuración SOL</a>.",
|
||||
"device_sol_enable": "Activar Sleep-On-LAN",
|
||||
"device_sol_password": "Contraseña SOL",
|
||||
"device_sol_port": "Puerto SOL",
|
||||
"device_sol_user": "Usuario SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manual",
|
||||
"device_tabs.1": "búsqueda de red",
|
||||
"device_wake_cmd": "Comando de encendido personalizado",
|
||||
"device_wake_cron_enable": "Activar wake cron",
|
||||
"device_wake_cron": "Encender cron",
|
||||
"device_wake_desc": "Podrá encender este dispositivo utilizando un scheduled cron job.",
|
||||
"device_wake": "Encender",
|
||||
"home_add_first_device": "Añade tu primer dispositivo",
|
||||
"home_grant_permissions": "Pídale al administrador que le otorgue permisos para los dispositivos existentes o que cree otros nuevos.",
|
||||
"home_no_devices": "Sin dispositivos.",
|
||||
"home_order_groups": "Grupos",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nombre",
|
||||
"home_order_tooltip": "Orden",
|
||||
"home_page_title": "Inicio",
|
||||
"home_search_placeholder": "Buscar dispositivos",
|
||||
"login_btn_login": "Entrar",
|
||||
"login_btn_more": "Más",
|
||||
"login_email_label": "Email o Nombre de usuario:",
|
||||
"login_menu_title_auth_providers": "Otros proveedores de autenticación",
|
||||
"login_password_label": "Contraseña:",
|
||||
"login_welcome": "Bienvenido",
|
||||
"navbar_edit_account": "Editar cuenta",
|
||||
"navbar_logout": "Salir",
|
||||
"navbar_new": "Nuevo",
|
||||
"navbar_theme": "Tema",
|
||||
"settings_icon_desc": "Establece un favicon personalizado. Los tipos de archivos admitidos son:",
|
||||
"settings_icon_title": "Icon",
|
||||
"settings_invalid_cron": "Sintaxis cron no válida",
|
||||
"settings_lazy_ping_desc": "Cuando el ping diferido está activado, UpSnap solo hará ping a los dispositivos si hay un usuario activo visitando el sitio web. Si está desactivado, UpSnap siempre hará ping a los dispositivos.",
|
||||
"settings_lazy_ping_enable": "Activar",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "Ajustes",
|
||||
"settings_ping_interval_desc1": "Establece el intervalo en el que se realiza el ping. Déjelo en blanco para usar el valor predeterminado de <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Puedes ver la sintaxis correcta para cron en <a class=\"link\" href=\"https://en.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> o en <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">documentación cron</a>.",
|
||||
"settings_ping_interval_title": "Intervalo ping",
|
||||
"settings_upsnap_version": "Versión UpSnap",
|
||||
"settings_website_title_desc": "Establece el título del sitio web y en la pestaña del navegador.",
|
||||
"settings_website_title_title": "Titulo de la página",
|
||||
"toasts_admin_saved": "Administrador guardado",
|
||||
"toasts_device_created": "Creado {device}",
|
||||
"toasts_device_deleted": "{device} apagado",
|
||||
"toasts_device_updated": "{device} actualizado",
|
||||
"toasts_devices_created_multiple": "Añadidos {count} dispositivos",
|
||||
"toasts_group_created": "Grupo {group} creado",
|
||||
"toasts_group_deleted": "Grupo {group} eliminado",
|
||||
"toasts_no_permission": "Tu no tienes permiso para visitar {url}",
|
||||
"toasts_password_changed": "Contraseña cambiada. Por favor acceda otra vez",
|
||||
"toasts_passwords_missmatch": "Las contraseñas no coinciden",
|
||||
"toasts_permissions_created": "Permisos creados para {username}",
|
||||
"toasts_permissions_deleted": "Permisos para {username} eliminados",
|
||||
"toasts_permissions_updated_personal": "Tus permisos han sido actualizados",
|
||||
"toasts_permissions_updated": "Permisos para {username} actualizados",
|
||||
"toasts_settings_saved": "Configuraciones guardadas",
|
||||
"toasts_user_created": "Usuario {username} creado",
|
||||
"toasts_user_deleted": "Usuario {username} eliminado",
|
||||
"toasts_user_saved": "Usuario actualizado",
|
||||
"users_allow_create_devices": "{username} permitir crear nuevos dispositivos y editar grupos de dispositivos",
|
||||
"users_confirm_delete_desc": "Estás seguro que quieres borrar {username}?",
|
||||
"users_confirm_delete_title": "Confirmar",
|
||||
"users_create_new_device": "Añadir dispositivo",
|
||||
"users_create_new_user": "Crear nuevo usuario",
|
||||
"users_delete": "Eliminar",
|
||||
"users_device_permissions": "Permisos del dispositivo",
|
||||
"users_page_title": "Usuarios",
|
||||
"users_password_confirm": "Confirmar contraseña",
|
||||
"users_password": "Contraseña",
|
||||
"users_power": "Energía",
|
||||
"users_read": "Leer",
|
||||
"users_required_field": "Campo obligatorio",
|
||||
"users_toggle": "Alternar",
|
||||
"users_update": "Editar",
|
||||
"users_username": "Usuario",
|
||||
"welcome_not_expected_back": "Llévame de vuelta",
|
||||
"welcome_not_expected_desc": "Ya has terminado con la configuración! Nada que hacer!",
|
||||
"welcome_not_expected_title": "No te esperaba por aquí! 🧐",
|
||||
"welcome_progress_step1": "Bienvenido",
|
||||
"welcome_progress_step2": "Crear cuenta",
|
||||
"welcome_progress_step3": "Terminado",
|
||||
"welcome_step1_page_title": "Bienvenido a UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Siguiente",
|
||||
"welcome_step1_setup_desc": "Por favor complete los siguientes pasos para terminar la configuración.",
|
||||
"welcome_step2_btn_create": "Crear",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "min. 10 caracteres",
|
||||
"welcome_step2_label_password_confirm": "Confirmar contraseña:",
|
||||
"welcome_step2_label_password": "Contraseña:",
|
||||
"welcome_step2_page_title": "Crear cuenta de administrador",
|
||||
"welcome_step3_btn_done": "Vamos!",
|
||||
"welcome_step3_page_desc": "Añada algún dispositivo a su dashboard.",
|
||||
"welcome_step3_page_title": "Ya está hecho! 🎉"
|
||||
}
|
||||
192
frontend/messages/fr.json
Normal file
192
frontend/messages/fr.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Administrateur",
|
||||
"account_account_type_user": "Utilisateur",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Après la modification du mot de passe, vous devrez vous reconnecter.",
|
||||
"account_change_password_confirm": "Confirmation du mot de passe",
|
||||
"account_change_password_label": "Ancien mot de passe",
|
||||
"account_change_password_new": "Nouveau mot de passe",
|
||||
"account_change_password_title": "Modification du mot de passe",
|
||||
"account_language_title": "Langue",
|
||||
"account_page_title": "Compte",
|
||||
"buttons_add": "Ajouter",
|
||||
"buttons_cancel": "Annuler",
|
||||
"buttons_change": "Modifier",
|
||||
"buttons_confirm": "Confirmer",
|
||||
"buttons_delete": "Supprimer",
|
||||
"buttons_reset": "Réinitialiser",
|
||||
"buttons_save": "Sauvegarder",
|
||||
"device_card_btn_more_edit": "Modifier",
|
||||
"device_card_btn_more_reboot": "Redémarrer",
|
||||
"device_card_btn_more_sleep": "Veille",
|
||||
"device_card_btn_more": "Plus",
|
||||
"device_card_nic_tooltip_pending": "En attente",
|
||||
"device_card_nic_tooltip_power_no_permission": "Vous n'avez pas la permission pour allumer cet appareil",
|
||||
"device_card_nic_tooltip_power": "Allumer",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Aucune commande d'arrêt n'est définie",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Vous n'avez pas la permission pour éteindre cet appareil",
|
||||
"device_card_nic_tooltip_shutdown": "Éteindre",
|
||||
"device_card_password": "Mot de passe",
|
||||
"device_card_tooltip_last_status_change": "Dernier changement de statut",
|
||||
"device_card_tooltip_shutdown_cron": "Arrêt avec cron",
|
||||
"device_card_tooltip_wake_cron": "Réveil avec cron",
|
||||
"device_card_tooltip_wake_password": "Mot de passe de réveil",
|
||||
"device_general_description_placeholder": "Description de l'appareil",
|
||||
"device_general_description": "Description",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Nom",
|
||||
"device_general_netmask": "Masque réseau",
|
||||
"device_general_required_field": "champ requis",
|
||||
"device_general": "Général",
|
||||
"device_groups_desc": "Vous pouvez ajouter des appareils à un groupe pour pouvoir les trier sur le tableau de bord.",
|
||||
"device_groups_placeholder": "par ex. « Bureau »",
|
||||
"device_groups": "Groupes",
|
||||
"device_link_desc": "Rend le nom de votre appareil cliquable, parfait pour y lier un tableau de bord par exemple.",
|
||||
"device_link_open_new_tab": "Nouvel onglet",
|
||||
"device_link_open_no": "Non",
|
||||
"device_link_open_same_tab": "Même onglet",
|
||||
"device_link_open": "Ouvrir automatiquement un lien",
|
||||
"device_link": "Lien",
|
||||
"device_modal_confirm_shutdown_desc": "Veuillez confirmer l'arrêt de {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Arrêter {device} ?",
|
||||
"device_modal_confirm_wake_desc": "Veuillez confirmer le réveil de {device}.",
|
||||
"device_modal_confirm_wake_title": "Réveiller {device} ?",
|
||||
"device_network_scan_add_all": "Ajouter tous les appareils",
|
||||
"device_network_scan_desc": "Analyser automatiquement votre réseau pour trouver des appareils. Pour que cela fonctionne, vous devez exécuter UpSnap en tant que root/administrateur et avoir nmap installé et disponible dans votre $PATH (pour les utilisateurs Docker, cela est déjà le cas et vous n'avez besoin de rien faire). L'analyse peut prendre quelques secondes.",
|
||||
"device_network_scan_include_unknown": "Inclure les appareils dont le nom est « Inconnu »",
|
||||
"device_network_scan_ip_range": "Plage IP",
|
||||
"device_network_scan_ip": "IP :",
|
||||
"device_network_scan_mac_vendor": "Fabricant ayant l'adresse Mac :",
|
||||
"device_network_scan_mac": "Mac :",
|
||||
"device_network_scan_netmask": "Masque réseau :",
|
||||
"device_network_scan_new_netmask": "Nouveau masque réseau",
|
||||
"device_network_scan_no_range": "Aucune plage d'analyse",
|
||||
"device_network_scan_range_saved": "Plage d'analyse sauvegardée",
|
||||
"device_network_scan_replace_netmask": "Remplacer le masque réseau pour tous les appareils ?",
|
||||
"device_network_scan_running": "Analyse en cours",
|
||||
"device_network_scan_unsaved_changes": "Modifications non sauvegardées",
|
||||
"device_network_scan": "Analyser",
|
||||
"device_page_title": "Nouvel appareil",
|
||||
"device_password_desc": "Certaines cartes réseau ont l'option pour définir un mot de passe pour les paquets magiques, aussi appelée <span class='badge'>SecureON</span>. Le mot de passe ne peut être que de 0, 4 ou 6 caractères.",
|
||||
"device_password": "Mot de passe",
|
||||
"device_ping_cmd": "Commande ping personnalisée",
|
||||
"device_ping_desc": "Vous pouvez utiliser une commande shell personnalisée pour vérifier si l'appareil est sous tension. La commande doit renvoyer un code de sortie de <span class='badge'>0</span> pour indiquer que l'appareil est sous tension, tout autre code de sortie indiquera que l'appareil est hors tension.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Ajouter un nouveau port",
|
||||
"device_ports_desc": "UpSnap peut aussi vérifier si certains ports sont ouverts.",
|
||||
"device_ports_name": "Nom",
|
||||
"device_ports_number": "Numéro",
|
||||
"device_ports": "Ports",
|
||||
"device_require_confirmation": "Demande de confirmation",
|
||||
"device_shutdown_cmd": "Commande d'arrêt",
|
||||
"device_shutdown_cron_desc": "Exactement comme configurer cron pour réveiller l'appareil, vous pouvez aussi planifier un job cron pour arrêter cet appareil.",
|
||||
"device_shutdown_cron_enable": "Activer l'arrêt avec cron",
|
||||
"device_shutdown_cron": "Arrêt avec cron",
|
||||
"device_shutdown_desc": "Cette <strong>commande shell</strong> va s'exécuter au sein de votre conteneur (si vous utilisez Docker) ou sur votre hôte (si vous utilisez l'exécutable). Pour vérifier que cela fonctionne, vous pouvez d'abord exécuter la commande à l'intérieur du conteneur ou sur le shell de l'hôte. Les commandes courantes sont <span class='badge'>net rpc</span> pour Windows, <span class='badge'>sshpass</span> pour Linux ou <span class='badge'>curl</span> en général pour faire des requêtes web.",
|
||||
"device_shutdown_examples_linux": "Arrêter une machine Linux distante :",
|
||||
"device_shutdown_examples_windows": "Arrêter une machine Windows distante :",
|
||||
"device_shutdown_examples": "Exemples :",
|
||||
"device_shutdown": "Arrêt",
|
||||
"device_sol_authorization": "Autorisation",
|
||||
"device_sol_desc1": "Vous pouvez mettre les ordinateurs en veille à l'aide de l'outil <a class='link' href='https://github.com/SR-G/sleep-on-lan' target='_blank'>Sleep-On-LAN</a>. Sleep-On-LAN (SOL) est un outil/daemon externe qui fonctionne sur les PC que vous souhaitez mettre en veille, fournissant un point de terminaison REST. Pour obtenir des instructions sur la configuration de Sleep-On-LAN, veuillez vous référer à la section <a href='https://github.com/SR-G/sleep-on-lan#usage' class='link' target='_blank'>Usage</a>.",
|
||||
"device_sol_desc2": "SOL est configuré pour envoyer des requêtes avec le protocole HTTP au lieu d'UDP pour activer l'autorisation et faire des requêtes plus fiables.",
|
||||
"device_sol_desc3": "Par conséquent, veuillez vous assurer que vous incluez <span class='badge'>HTTP:<VOTREPORT></span> dans la section <span class='badge'>Listeners</span> de la <a href='https://github.com/SR-G/sleep-on-lan#configuration' class='link' target='_blank'>configuration SOL</a>.",
|
||||
"device_sol_enable": "Activer Sleep-On-LAN",
|
||||
"device_sol_password": "Mot de passe SOL",
|
||||
"device_sol_port": "Port SOL",
|
||||
"device_sol_user": "Utilisateur SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manuel",
|
||||
"device_tabs.1": "Analyse du réseau",
|
||||
"device_wake_cmd": "Commande de réveil personnalisée",
|
||||
"device_wake_cron_enable": "Activer le réveil avec cron",
|
||||
"device_wake_cron": "Réveil avec cron",
|
||||
"device_wake_desc": "Vous pouvez allumer cet appareil en utilisant un job cron planifié.",
|
||||
"device_wake": "Réveil",
|
||||
"home_add_first_device": "Ajoutez votre premier appareil",
|
||||
"home_grant_permissions": "Veuillez demander à votre administrateur les permissions aux appareils existants ou créez-en de nouveaux.",
|
||||
"home_no_devices": "Aucun appareil ici.",
|
||||
"home_order_groups": "Groupes",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nom",
|
||||
"home_order_tooltip": "Tri",
|
||||
"home_page_title": "Accueil",
|
||||
"home_search_placeholder": "Recherche de dispositifs",
|
||||
"login_btn_login": "Connexion",
|
||||
"login_btn_more": "Plus",
|
||||
"login_email_label": "Courriel ou nom d'utilisateur :",
|
||||
"login_menu_title_auth_providers": "Autres fournisseurs d'authentification",
|
||||
"login_password_label": "Mot de passe :",
|
||||
"login_welcome": "Bienvenue",
|
||||
"navbar_edit_account": "Modifier le compte",
|
||||
"navbar_logout": "Déconnexion",
|
||||
"navbar_new": "Nouveau",
|
||||
"navbar_theme": "Thème",
|
||||
"settings_icon_desc": "Définit un favicon personnalisé. Les types de fichier compatibles sont :",
|
||||
"settings_icon_title": "Icône",
|
||||
"settings_invalid_cron": "Syntaxe cron invalide",
|
||||
"settings_lazy_ping_desc": "Lorsque le mode ping fainéant est activé, UpSnap ne va effectuer des requêtes de ping sur les appareils que lorsqu'un utilisateur actif visite le site. Si vous désactivez cette fonction, UpSnap exécutera toujours ces requêtes.",
|
||||
"settings_lazy_ping_enable": "Activer",
|
||||
"settings_lazy_ping_title": "Ping fainéant",
|
||||
"settings_page_title": "Paramètres",
|
||||
"settings_ping_interval_desc1": "Définit l'intervalle dans lequel les appareils reçoivent une requête ping. Laissez vide pour utiliser la valeur par défaut de <span class='badge'>@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Pour écrire une syntaxe correcte pour l'utilitaire cron, consultez <a class='link' href='https://fr.wikipedia.org/wiki/Cron' target='_blank'>Wikipédia</a> ou référez-vous à la <a class='link' href='https://github.com/harrisiirak/cron-parser' target='_blank'>documentation du paquet</a>.",
|
||||
"settings_ping_interval_title": "Intervalle de ping",
|
||||
"settings_upsnap_version": "Version de UpSnap",
|
||||
"settings_website_title_desc": "Définit le titre du site ainsi que le texte affiché dans l'onglet du navigateur.",
|
||||
"settings_website_title_title": "Titre du site",
|
||||
"toasts_admin_saved": "Administrateur sauvegardé",
|
||||
"toasts_device_created": "{device} créé",
|
||||
"toasts_device_deleted": "{device} supprimé",
|
||||
"toasts_device_updated": "{device} mis à jour",
|
||||
"toasts_devices_created_multiple": "{count} appareils créés",
|
||||
"toasts_group_created": "Groupe {group} créé",
|
||||
"toasts_group_deleted": "Groupe {group} supprimé",
|
||||
"toasts_no_permission": "Vous n'avez pas la permission de visiter {url}",
|
||||
"toasts_password_changed": "Mot de passe modifié. Veuillez vous reconnecter.",
|
||||
"toasts_passwords_missmatch": "Les mots de passe ne correspondent pas",
|
||||
"toasts_permissions_created": "Permissions pour {username} créées",
|
||||
"toasts_permissions_deleted": "Permissions pour {username} supprimées",
|
||||
"toasts_permissions_updated_personal": "Vos permissions ont été mises à jour",
|
||||
"toasts_permissions_updated": "Permissions pour {username} mises à jour",
|
||||
"toasts_settings_saved": "Paramètres sauvegardés",
|
||||
"toasts_user_created": "Utilisateur {username} créé",
|
||||
"toasts_user_deleted": "Utilisateur {username} supprimé",
|
||||
"toasts_user_saved": "Utilisateur sauvegardé",
|
||||
"users_allow_create_devices": "Autoriser {username} à créer de nouveaux appareils et à modifier les groupes d'appareils",
|
||||
"users_confirm_delete_desc": "Voulez-vous vraiment supprimer {username} ?",
|
||||
"users_confirm_delete_title": "Confirmation de la suppression",
|
||||
"users_create_new_device": "Créer un nouvel appareil",
|
||||
"users_create_new_user": "Création d'un nouvel utilisateur",
|
||||
"users_delete": "Supprimer",
|
||||
"users_device_permissions": "Permissions des appareils",
|
||||
"users_page_title": "Utilisateurs",
|
||||
"users_password_confirm": "Confirmation du mot de passe",
|
||||
"users_password": "Mot de passe",
|
||||
"users_power": "Allumer",
|
||||
"users_read": "Lire",
|
||||
"users_required_field": "champ requis",
|
||||
"users_toggle": "Inverser",
|
||||
"users_update": "Mettre à jour",
|
||||
"users_username": "Nom d'utilisateur",
|
||||
"welcome_not_expected_back": "Ramène-moi",
|
||||
"welcome_not_expected_desc": "Vous avez déjà terminé l'installation ! Il n'y a plus rien à faire.",
|
||||
"welcome_not_expected_title": "Je ne vous attendais pas ici ! 🧐",
|
||||
"welcome_progress_step1": "Bienvenue",
|
||||
"welcome_progress_step2": "Créer un compte",
|
||||
"welcome_progress_step3": "Fin",
|
||||
"welcome_step1_page_title": "Bienvenue sur UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Suivant",
|
||||
"welcome_step1_setup_desc": "Veuillez suivre les étapes suivantes pour terminer l'installation.",
|
||||
"welcome_step2_btn_create": "Créer",
|
||||
"welcome_step2_label_email": "Courriel :",
|
||||
"welcome_step2_label_min_chars": "min. 10 caractères",
|
||||
"welcome_step2_label_password_confirm": "Confirmation du mot de passe :",
|
||||
"welcome_step2_label_password": "Mot de passe :",
|
||||
"welcome_step2_page_title": "Création du compte administrateur",
|
||||
"welcome_step3_btn_done": "C'est parti !",
|
||||
"welcome_step3_page_desc": "Allez-y et ajoutez quelques appareils à votre tableau de bord.",
|
||||
"welcome_step3_page_title": "Vous êtes tout bon ! 🎉"
|
||||
}
|
||||
192
frontend/messages/id.json
Normal file
192
frontend/messages/id.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Admin",
|
||||
"account_account_type_user": "Pengguna",
|
||||
"account_avatar_title": "Personifikasi",
|
||||
"account_change_password_body": "Setelah kata sandi diubah, Anda harus masuk kembali.",
|
||||
"account_change_password_confirm": "Konfirmasi kata sandi",
|
||||
"account_change_password_label": "Kata sandi lama",
|
||||
"account_change_password_new": "Kata sandi baru",
|
||||
"account_change_password_title": "Ubah kata sandi",
|
||||
"account_language_title": "Bahasa",
|
||||
"account_page_title": "Akun",
|
||||
"buttons_add": "Tambah",
|
||||
"buttons_cancel": "Batal",
|
||||
"buttons_change": "Ubah",
|
||||
"buttons_confirm": "Konfirmasi",
|
||||
"buttons_delete": "Hapus",
|
||||
"buttons_reset": "Atur Ulang",
|
||||
"buttons_save": "Simpan",
|
||||
"device_card_btn_more_edit": "Ubah",
|
||||
"device_card_btn_more_reboot": "Mulai ulang",
|
||||
"device_card_btn_more_sleep": "Tidur",
|
||||
"device_card_btn_more": "Lainnya",
|
||||
"device_card_nic_tooltip_pending": "Tertunda",
|
||||
"device_card_nic_tooltip_power_no_permission": "Tidak ada izin untuk menyalakan perangkat ini",
|
||||
"device_card_nic_tooltip_power": "Nyalakan",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Tidak ada perintah mematikan yang diatur",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Tidak ada izin untuk mematikan perangkat ini",
|
||||
"device_card_nic_tooltip_shutdown": "Matikan",
|
||||
"device_card_password": "Kata Sandi",
|
||||
"device_card_tooltip_last_status_change": "Status perubahan terakhir",
|
||||
"device_card_tooltip_shutdown_cron": "Jadwal Mati",
|
||||
"device_card_tooltip_wake_cron": "Jadwal Bangun",
|
||||
"device_card_tooltip_wake_password": "Kata sandi bangun",
|
||||
"device_general_description_placeholder": "Deskripsi perangkat ini",
|
||||
"device_general_description": "Deskripsi",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Nama",
|
||||
"device_general_netmask": "Netmask",
|
||||
"device_general_required_field": "wajib diisi",
|
||||
"device_general": "Umum",
|
||||
"device_groups_desc": "Anda dapat menambahkan perangkat ke dalam grup agar ditampilkan secara terorganisir di dasbor.",
|
||||
"device_groups_placeholder": "Contoh: 'Ruang Bawah Tanah' atau 'Kantor'",
|
||||
"device_groups": "Grup",
|
||||
"device_link_desc": "Membuat nama perangkat Anda menjadi tautan yang dapat diklik, contohnya untuk menghubungkan ke dasbor.",
|
||||
"device_link_open_new_tab": "Tab baru",
|
||||
"device_link_open_no": "Tidak",
|
||||
"device_link_open_same_tab": "Tab yang sama",
|
||||
"device_link_open": "Buka tautan secara otomatis",
|
||||
"device_link": "Tautan",
|
||||
"device_modal_confirm_shutdown_desc": "Harap konfirmasi untuk mematikan {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Matikan {device}?",
|
||||
"device_modal_confirm_wake_desc": "Harap konfirmasi untuk membangunkan {device}.",
|
||||
"device_modal_confirm_wake_title": "Bangunkan {device}?",
|
||||
"device_network_scan_add_all": "Tambahkan semua perangkat",
|
||||
"device_network_scan_desc": "Pindai jaringan Anda secara otomatis untuk menemukan perangkat. Agar ini berfungsi, Anda perlu menjalankan UpSnap sebagai root/admin dan memastikan nmap sudah terinstal serta tersedia di $PATH Anda (Untuk pengguna Docker, ini sudah diatur secara otomatis). Pemindaian mungkin memerlukan beberapa detik.",
|
||||
"device_network_scan_include_unknown": "Sertakan perangkat dengan nama 'Tidak Diketahui'",
|
||||
"device_network_scan_ip_range": "Rentang IP",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Vendor Mac:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Netmask:",
|
||||
"device_network_scan_new_netmask": "Netmask baru",
|
||||
"device_network_scan_no_range": "Tidak ada rentang pemindaian",
|
||||
"device_network_scan_range_saved": "Rentang pemindaian disimpan",
|
||||
"device_network_scan_replace_netmask": "Ganti netmask untuk semua perangkat?",
|
||||
"device_network_scan_running": "Pemindaian sedang berjalan",
|
||||
"device_network_scan_unsaved_changes": "Perubahan belum disimpan",
|
||||
"device_network_scan": "Pindai",
|
||||
"device_page_title": "Perangkat Baru",
|
||||
"device_password_desc": "Beberapa kartu jaringan memiliki opsi untuk mengatur kata sandi untuk paket ajaib, juga disebut <span class='badge'>SecureON</span>. Kata sandi hanya dapat memiliki panjang 0, 4, atau 6 karakter.",
|
||||
"device_password": "Kata sandi",
|
||||
"device_ping_cmd": "Perintah ping khusus",
|
||||
"device_ping_desc": "Anda dapat menggunakan perintah shell khusus untuk melihat apakah perangkat menyala. Perintah harus mengembalikan kode keluar <span class='badge'>0</span> untuk menunjukkan bahwa perangkat menyala, selain kode tadi menandakan bahwa perangkat mati.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Tambahkan port baru",
|
||||
"device_ports_desc": "UpSnap juga dapat memeriksa apakah port tertentu terbuka.",
|
||||
"device_ports_name": "Nama",
|
||||
"device_ports_number": "Nomor",
|
||||
"device_ports": "Port",
|
||||
"device_require_confirmation": "Memerlukan Konfirmasi",
|
||||
"device_shutdown_cmd": "Perintah mematikan",
|
||||
"device_shutdown_cron_desc": "Sama seperti mengatur penjadwalan untuk menyalakan perangkat, Anda juga dapat mengatur tugas penjadwal untuk mematikan perangkat ini.",
|
||||
"device_shutdown_cron_enable": "Menyalakan tugas penjadwalan",
|
||||
"device_shutdown_cron": "Mematikan tugas penjadwalan",
|
||||
"device_shutdown_desc": "Perintah <strong>shell command</strong> ini akan berjalan dalam kontainer (jika menggunakan Docker) atau di host Anda (jika menggunakan binary). Untuk memastikan ini berfungsi, Anda dapat menjalankan perintah di dalam kontainer atau di shell host terlebih dahulu. Perintah umum meliputi <span class='badge'>net rpc</span> untuk Windows, <span class='badge'>sshpass</span> untuk Linux atau <span class='badge'>curl</span> untuk permintaan web secara umum.",
|
||||
"device_shutdown_examples_linux": "Mematikan Linux jarak jauh:",
|
||||
"device_shutdown_examples_windows": "Mematikan Windows jarak jauh:",
|
||||
"device_shutdown_examples": "Contoh:",
|
||||
"device_shutdown": "Matikan",
|
||||
"device_sol_authorization": "Otorisasi",
|
||||
"device_sol_desc1": "Anda dapat membuat tidur komputer menggunakan alat <a class='link' href='https://github.com/SR-G/sleep-on-lan' target='_blank'>Sleep-On-LAN</a>. Sleep-On-LAN (SOL) merupakan alat/daemon eksternal yang berjalan di PC yang ingin Anda tidurkan, dengan menyediakan REST endpoint. Untuk instruksi pemasangan Sleep-On-LAN, silakan merujuk ke bagian <a href='https://github.com/SR-G/sleep-on-lan#usage' class='link' target='_blank'>Penggunaan</a>.",
|
||||
"device_sol_desc2": "SOL dikonfigurasi untuk mengirim permintaan melalui HTTP, bukan UDP, guna memungkinkan otorisasi dan membuat permintaan lebih andal.",
|
||||
"device_sol_desc3": "Oleh karena itu, pastikan Anda menyertakan <span class='badge'>HTTP:<YOURPORT></span> dalam bagian <span class='badge'>Listeners</span> dari <a href='https://github.com/SR-G/sleep-on-lan#configuration' class='link' target='_blank'>SOL configuration</a>.",
|
||||
"device_sol_enable": "Aktifkan Sleep-On-LAN",
|
||||
"device_sol_password": "Kata sandi SOL",
|
||||
"device_sol_port": "Port SOL",
|
||||
"device_sol_user": "Pengguna SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manual",
|
||||
"device_tabs.1": "Pindai Jaringan",
|
||||
"device_wake_cmd": "Perintah bangunkan khusus",
|
||||
"device_wake_cron_enable": "Aktifkan jadwal bangun",
|
||||
"device_wake_cron": "Jadwal Bangun",
|
||||
"device_wake_desc": "Anda dapat menyalakan perangkat ini menggunakan tugas penjadwalan.",
|
||||
"device_wake": "Bangunkan",
|
||||
"home_add_first_device": "Tambahkan perangkat pertama Anda",
|
||||
"home_grant_permissions": "Mohon minta admin untuk memberikan izin ke perangkat yang sudah ada atau membuat perangkat baru.",
|
||||
"home_no_devices": "Tidak ada perangkat terdeteksi.",
|
||||
"home_order_groups": "Grup",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nama",
|
||||
"home_order_tooltip": "Urutan",
|
||||
"home_page_title": "Beranda",
|
||||
"home_search_placeholder": "Mencari perangkat",
|
||||
"login_btn_login": "Masuk",
|
||||
"login_btn_more": "Lainnya",
|
||||
"login_email_label": "Email atau Nama Pengguna:",
|
||||
"login_menu_title_auth_providers": "Penyedia Autentikasi Lainnya",
|
||||
"login_password_label": "Kata Sandi:",
|
||||
"login_welcome": "Selamat Datang",
|
||||
"navbar_edit_account": "Ubah akun",
|
||||
"navbar_logout": "Keluar",
|
||||
"navbar_new": "Baru",
|
||||
"navbar_theme": "Tema",
|
||||
"settings_icon_desc": "Atur favicon khusus. Jenis file yang didukung:",
|
||||
"settings_icon_title": "Ikon",
|
||||
"settings_invalid_cron": "Sintaks tugas penjadwalan tidak valid",
|
||||
"settings_lazy_ping_desc": "Saat Ping Santai diaktifkan, UpSnap hanya akan memping perangkat jika ada pengguna yang mengakses situs web. Jika dinonaktifkan, UpSnap akan selalu memping perangkat.",
|
||||
"settings_lazy_ping_enable": "Aktifkan",
|
||||
"settings_lazy_ping_title": "Ping Santai",
|
||||
"settings_page_title": "Pengaturan",
|
||||
"settings_ping_interval_desc1": "Menetapkan interval waktu di mana perangkat akan diping. Biarkan kosong untuk menggunakan nilai default <span class='badge'>@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Pelajari lebih lanjut tentang sintaks tugas penjadwalan yang benar di <a class='link' href='https://en.wikipedia.org/wiki/Cron' target='_blank'>Wikipedia</a> atau lihat <a class='link' href='https://github.com/harrisiirak/cron-parser' target='_blank'>dokumentasi paket</a>.",
|
||||
"settings_ping_interval_title": "Interval Ping",
|
||||
"settings_upsnap_version": "Versi UpSnap",
|
||||
"settings_website_title_desc": "Mengatur judul situs web dan tab di browser.",
|
||||
"settings_website_title_title": "Judul Situs Web",
|
||||
"toasts_admin_saved": "Admin disimpan",
|
||||
"toasts_device_created": "Membuat {device}",
|
||||
"toasts_device_deleted": "Menghapus {device}",
|
||||
"toasts_device_updated": "Memperbarui {device}",
|
||||
"toasts_devices_created_multiple": "Membuat {count} perangkat",
|
||||
"toasts_group_created": "Membuat grup {group}",
|
||||
"toasts_group_deleted": "Menghapus grup {group}",
|
||||
"toasts_no_permission": "Anda tidak memiliki izin untuk mengakses {url}",
|
||||
"toasts_password_changed": "Kata sandi diubah. Silakan masuk kembali.",
|
||||
"toasts_passwords_missmatch": "Kata sandi tidak cocok",
|
||||
"toasts_permissions_created": "Izin untuk {username} dibuat",
|
||||
"toasts_permissions_deleted": "Izin untuk {username} dihapus",
|
||||
"toasts_permissions_updated_personal": "Izin Anda telah diperbarui",
|
||||
"toasts_permissions_updated": "Izin untuk {username} diperbarui",
|
||||
"toasts_settings_saved": "Pengaturan disimpan",
|
||||
"toasts_user_created": "Pengguna {username} dibuat",
|
||||
"toasts_user_deleted": "Pengguna {username} dihapus",
|
||||
"toasts_user_saved": "Pengguna disimpan",
|
||||
"users_allow_create_devices": "Izinkan {username} untuk membuat perangkat baru dan mengedit grup perangkat",
|
||||
"users_confirm_delete_desc": "Apakah Anda yakin ingin menghapus {username}?",
|
||||
"users_confirm_delete_title": "Konfirmasi Penghapusan",
|
||||
"users_create_new_device": "Buat perangkat baru",
|
||||
"users_create_new_user": "Buat pengguna baru",
|
||||
"users_delete": "Hapus",
|
||||
"users_device_permissions": "Izin Perangkat",
|
||||
"users_page_title": "Pengguna",
|
||||
"users_password_confirm": "Konfirmasi Kata Sandi",
|
||||
"users_password": "Kata Sandi",
|
||||
"users_power": "Daya",
|
||||
"users_read": "Baca",
|
||||
"users_required_field": "Kolom wajib diisi",
|
||||
"users_toggle": "Alihkan",
|
||||
"users_update": "Perbarui",
|
||||
"users_username": "Nama Pengguna",
|
||||
"welcome_not_expected_back": "Kembali ke halaman utama",
|
||||
"welcome_not_expected_desc": "Anda sudah menyelesaikan pengaturan! Tidak ada yang perlu dilakukan.",
|
||||
"welcome_not_expected_title": "Saya tidak mengira Anda akan berada di sini! 🧐",
|
||||
"welcome_progress_step1": "Selamat Datang",
|
||||
"welcome_progress_step2": "Buat Akun",
|
||||
"welcome_progress_step3": "Selesai",
|
||||
"welcome_step1_page_title": "Selamat Datang di UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Lanjut",
|
||||
"welcome_step1_setup_desc": "Silakan selesaikan langkah-langkah berikut untuk menyelesaikan pengaturan.",
|
||||
"welcome_step2_btn_create": "Buat",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "minimal 10 karakter",
|
||||
"welcome_step2_label_password_confirm": "Konfirmasi Kata Sandi:",
|
||||
"welcome_step2_label_password": "Kata Sandi:",
|
||||
"welcome_step2_page_title": "Buat Akun Admin",
|
||||
"welcome_step3_btn_done": "Ayo mulai!",
|
||||
"welcome_step3_page_desc": "Silakan tambahkan beberapa perangkat ke dasbor Anda.",
|
||||
"welcome_step3_page_title": "Semua sudah siap! 🎉"
|
||||
}
|
||||
192
frontend/messages/it.json
Normal file
192
frontend/messages/it.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Amministratore",
|
||||
"account_account_type_user": "Utente",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Dopo aver cambiato la password, dovrai effettuare di nuovo il login.",
|
||||
"account_change_password_confirm": "Conferma la password",
|
||||
"account_change_password_label": "Vecchia password",
|
||||
"account_change_password_new": "Nuova password",
|
||||
"account_change_password_title": "Cambia password",
|
||||
"account_language_title": "Lingua",
|
||||
"account_page_title": "Account",
|
||||
"buttons_add": "Aggiungi",
|
||||
"buttons_cancel": "Annulla",
|
||||
"buttons_change": "Cambia",
|
||||
"buttons_confirm": "Conferma",
|
||||
"buttons_delete": "Cancella",
|
||||
"buttons_reset": "Resetta",
|
||||
"buttons_save": "Salva",
|
||||
"device_card_btn_more_edit": "Modifica",
|
||||
"device_card_btn_more_reboot": "Riavvia",
|
||||
"device_card_btn_more_sleep": "Dormi",
|
||||
"device_card_btn_more": "...",
|
||||
"device_card_nic_tooltip_pending": "In attesa",
|
||||
"device_card_nic_tooltip_power_no_permission": "Non hai i permessi necessari per accendere questo dispositivo",
|
||||
"device_card_nic_tooltip_power": "Accendi",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Nessun comando di spegnimento impostato",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Non hai i permessi necessari per spegnere questo dispositivo",
|
||||
"device_card_nic_tooltip_shutdown": "Spegni",
|
||||
"device_card_password": "Password",
|
||||
"device_card_tooltip_last_status_change": "Ultimo cambiamento di stato",
|
||||
"device_card_tooltip_shutdown_cron": "Spegnimento programmato",
|
||||
"device_card_tooltip_wake_cron": "Sveglia programmata",
|
||||
"device_card_tooltip_wake_password": "Password sveglia",
|
||||
"device_general_description_placeholder": "Descrizione del dispositivo",
|
||||
"device_general_description": "Descrizione",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Nome",
|
||||
"device_general_netmask": "Maschera di rete",
|
||||
"device_general_required_field": "Campo obbligatorio",
|
||||
"device_general": "Generale",
|
||||
"device_groups_desc": "Puoi aggiungere un dispositivo ad un gruppo per averli raggruppati nel schermata principale.",
|
||||
"device_groups_placeholder": "per esempio 'Cantina' o 'Ufficio'",
|
||||
"device_groups": "Gruppi",
|
||||
"device_link_desc": "Rende il nome del tuo dispositivo un collegamento, perfetto per collegare ad esempio un sito.",
|
||||
"device_link_open_new_tab": "Nuova scheda",
|
||||
"device_link_open_no": "No",
|
||||
"device_link_open_same_tab": "Stessa scheda",
|
||||
"device_link_open": "Aprire automaticamente il link",
|
||||
"device_link": "Collegamento",
|
||||
"device_modal_confirm_shutdown_desc": "Sicuro di voler spegnere {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Spegnere {device}?",
|
||||
"device_modal_confirm_wake_desc": "Sicuro di voler accendere {device}.",
|
||||
"device_modal_confirm_wake_title": "Accendere {device}?",
|
||||
"device_network_scan_add_all": "Aggiungi tutti i dispositivi",
|
||||
"device_network_scan_desc": "Scansiona automaticamente la tua rete per i dispositivi disponibili. Affinche' funzioni, devi eseguire UpSnap come root/admin ed avere nmap installato e disponibile nella variabile d'ambiente $PATH (per gli utenti docker, questo è gia' il caso e non devi cambiare niente). La scansione puo' richiedere alcuni secondi.",
|
||||
"device_network_scan_include_unknown": "Includi i dispositivi il cui nome è 'Unknown' o 'Sconosciuto'",
|
||||
"device_network_scan_ip_range": "Intervallo IP",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Fornitore Mac:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Maschera di rete:",
|
||||
"device_network_scan_new_netmask": "Nuova maschera di rete",
|
||||
"device_network_scan_no_range": "Nessuno intervallo di scansione",
|
||||
"device_network_scan_range_saved": "Intervallo di scansione salvato",
|
||||
"device_network_scan_replace_netmask": "Modificare la maschera di rete per tutti i dispositivi?",
|
||||
"device_network_scan_running": "Scansione in corso",
|
||||
"device_network_scan_unsaved_changes": "Modifiche non salvate",
|
||||
"device_network_scan": "Scansiona",
|
||||
"device_page_title": "Nuovo dispositivo",
|
||||
"device_password_desc": "Alcune schede di rete hanno una opzione per settare una password per i magic packets, chiamata anche <span class='badge'>SecureON</span>. La lunghezza della password può essere solo di 0, 4 o 6 caratteri.",
|
||||
"device_password": "Password",
|
||||
"device_ping_cmd": "Comando ping personalizzato",
|
||||
"device_ping_desc": "Puoi usare un comando personalizzato per controllare che il dispositivo sia acceso. Il comando deve ritornare un codice uguale a <span class='badge'>0</span> per confermare che il dispositivo sia acceso, mentre qualunque altro codice indica che il dispositivo è spento.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Aggiungi nuova porta",
|
||||
"device_ports_desc": "UpSnap puo' anche controllare che le porte siano aperte.",
|
||||
"device_ports_name": "Nome",
|
||||
"device_ports_number": "Numero",
|
||||
"device_ports": "Porte",
|
||||
"device_require_confirmation": "Chiedi conferma",
|
||||
"device_shutdown_cmd": "Comando di spegnimento",
|
||||
"device_shutdown_cron_desc": "Settando i parametri esattamente come faresti con cron su linux, potrai così anche impostare un azione di spegnimento su questo dispositivo.",
|
||||
"device_shutdown_cron_enable": "Abilita lo spegnimento tramite cron",
|
||||
"device_shutdown_cron": "Parametri di spegnimento per cron",
|
||||
"device_shutdown_desc": "Questo <strong>prompt dei comandi</strong> girerà nel tuo container (se usi docker) o direttamente sul tuo host (se usi i file di installazione). Per verificare che funzioni correttamente, puoi eseguire i comandi direttamente nel container o nel tuo sistema host. Alcuni comandi comuni sono <span class='badge'>net rpc</span> per windows, <span class='badge'>sshpass</span> per linux oppure <span class='badge'>curl</span> in generale per fare richieste con HTTP.",
|
||||
"device_shutdown_examples_linux": "Spegni macchina linux remota:",
|
||||
"device_shutdown_examples_windows": "Spegni macchina windows remota:",
|
||||
"device_shutdown_examples": "Esempi:",
|
||||
"device_shutdown": "Spegni",
|
||||
"device_sol_authorization": "Autorizzazione",
|
||||
"device_sol_desc1": "Puoi spegnere il tuo dispositivo usando lo strumento <a class='link' href='https://github.com/SR-G/sleep-on-lan' target='_blank'>Sleep-On-LAN</a>. Sleep-On-LAN (SOL) è uno strumento esterno che opera sul dispositivo che vuoi spegnere, il quale rende disponibile un endpoint REST. Puoi riferirti al link <a href='https://github.com/SR-G/sleep-on-lan#usage' class='link' target='_blank'>Uso</a> (in inglese) per le istruzioni.",
|
||||
"device_sol_desc2": "Lo strumento SOL è configurato per mandare richieste con il protocollo HTTP invece che UDP per abilitare l'autorizzazione e rendere le richieste più affidabili.",
|
||||
"device_sol_desc3": "Pertanto, assicuratevi di includere <span class='badge'>HTTP:<LA-TUA-PORTA></span> nella sezione <span class='badge'>Listeners</span> della <a href='https://github.com/SR-G/sleep-on-lan#configuration' class='link' target='_blank'>configurazione di SOL</a>.",
|
||||
"device_sol_enable": "Abilita Sleep-On-LAN",
|
||||
"device_sol_password": "Password SOL",
|
||||
"device_sol_port": "Porta SOL",
|
||||
"device_sol_user": "Utente SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manuale",
|
||||
"device_tabs.1": "Scansiona la rete",
|
||||
"device_wake_cmd": "Comando di accensione personalizzato",
|
||||
"device_wake_cron_enable": "Abilita sveglia programmata",
|
||||
"device_wake_cron": "Sveglia programmata",
|
||||
"device_wake_desc": "Puoi accendere questo dispositivo con una sveglia programmata.",
|
||||
"device_wake": "Accendi",
|
||||
"home_add_first_device": "Aggiungi il tuo primo dispositivo",
|
||||
"home_grant_permissions": "Per favore chiedi all'amministratore di darti i permessi necessari per aggiungere un nuovo dispositivo.",
|
||||
"home_no_devices": "Nessun dispositivo qui.",
|
||||
"home_order_groups": "Gruppi",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nome",
|
||||
"home_order_tooltip": "Ordine",
|
||||
"home_page_title": "Home",
|
||||
"home_search_placeholder": "Ricerca di dispositivi",
|
||||
"login_btn_login": "Login",
|
||||
"login_btn_more": "Di più...",
|
||||
"login_email_label": "Email o nome utente:",
|
||||
"login_menu_title_auth_providers": "Altri gestori di autenticazione",
|
||||
"login_password_label": "Password:",
|
||||
"login_welcome": "Benvenuti",
|
||||
"navbar_edit_account": "Modifica account",
|
||||
"navbar_logout": "Esci",
|
||||
"navbar_new": "Nuovo",
|
||||
"navbar_theme": "Tema",
|
||||
"settings_icon_desc": "Imposta una icona personalizzata. I tipi di file supportati sono:",
|
||||
"settings_icon_title": "Icona",
|
||||
"settings_invalid_cron": "Sintassi cron non valida",
|
||||
"settings_lazy_ping_desc": "Quando il ping pigro è abilitato, UpSnap effettuerà i ping verso di dispositivi solamente quando un utente effettivamente visita il sito. Se è spento, allora UpSnap continuerà con il ping sempre.",
|
||||
"settings_lazy_ping_enable": "Abilita",
|
||||
"settings_lazy_ping_title": "Ping pigro",
|
||||
"settings_page_title": "Opzioni",
|
||||
"settings_ping_interval_desc1": "Imposta l'intervallo nel quale i dispositivi vengono testati con ping. Lasciare in bianco per lasciare il valore predefinito <span class='badge'>@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Per ulteriori dettagli circa la sintassi corretta di cron, fare riferimento a <a class='link' href='https://it.wikipedia.org/wiki/Cron' target='_blank'>Wikipedia</a> oppure a <a class='link' href='https://github.com/harrisiirak/cron-parser' target='_blank'>questa documentazione</a> (in inglese).",
|
||||
"settings_ping_interval_title": "Intervallo di ping",
|
||||
"settings_upsnap_version": "Versione UpSnap",
|
||||
"settings_website_title_desc": "Imposta il nome del sito.",
|
||||
"settings_website_title_title": "Nome del sito",
|
||||
"toasts_admin_saved": "Account amministratore salvato",
|
||||
"toasts_device_created": "Creato dispositivo {device}",
|
||||
"toasts_device_deleted": "{device} cancellato",
|
||||
"toasts_device_updated": "{device} aggiornato",
|
||||
"toasts_devices_created_multiple": "Creato/i {count} dispositivi",
|
||||
"toasts_group_created": "Gruppo {group} creato",
|
||||
"toasts_group_deleted": "Gruppo {group} cancellato",
|
||||
"toasts_no_permission": "Non hai i permessi necessari per visitare {url}",
|
||||
"toasts_password_changed": "Password cambiata. Per favore, effettuate di nuovo il login.",
|
||||
"toasts_passwords_missmatch": "Le password non corrispondono",
|
||||
"toasts_permissions_created": "I permessi per {username} sono stati creati",
|
||||
"toasts_permissions_deleted": "I permessi per {username} sono stati cancellati",
|
||||
"toasts_permissions_updated_personal": "I tuoi permessi sono stati aggiornati",
|
||||
"toasts_permissions_updated": "I permessi per {username} sono stati aggiornati",
|
||||
"toasts_settings_saved": "Impostazioni salvate",
|
||||
"toasts_user_created": "Utente {username} creato",
|
||||
"toasts_user_deleted": "Utente {username} cancellato",
|
||||
"toasts_user_saved": "Account utente salvato",
|
||||
"users_allow_create_devices": "Permetti a {username} di creare nuovi dispositivi e gestire i gruppi di dispositivi.",
|
||||
"users_confirm_delete_desc": "Sei sicuro di voler rimuovere {username}?",
|
||||
"users_confirm_delete_title": "Conferma rimozione",
|
||||
"users_create_new_device": "Crea un nuovo dispositivo",
|
||||
"users_create_new_user": "Crea nuovo utente",
|
||||
"users_delete": "Cancella",
|
||||
"users_device_permissions": "Permessi dispositivo",
|
||||
"users_page_title": "Utenti",
|
||||
"users_password_confirm": "Conferma la password",
|
||||
"users_password": "Password",
|
||||
"users_power": "Accendi",
|
||||
"users_read": "Leggi",
|
||||
"users_required_field": "Campo obbligatorio",
|
||||
"users_toggle": "Inverti",
|
||||
"users_update": "Modifica",
|
||||
"users_username": "Nome utente",
|
||||
"welcome_not_expected_back": "Indietro",
|
||||
"welcome_not_expected_desc": "L'installazione è già terminata! Non ci sono operazioni da svolgere qui.",
|
||||
"welcome_not_expected_title": "Non mi aspettavo di vederti qui! 🧐",
|
||||
"welcome_progress_step1": "Benvenuti",
|
||||
"welcome_progress_step2": "Creare un account",
|
||||
"welcome_progress_step3": "Fatto",
|
||||
"welcome_step1_page_title": "Benvenuti ad UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Avanti",
|
||||
"welcome_step1_setup_desc": "Per favore, completate i seguenti passaggi per terminare l'installazione.",
|
||||
"welcome_step2_btn_create": "Crea",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "Min. 10 caratteri",
|
||||
"welcome_step2_label_password_confirm": "Conferma la password:",
|
||||
"welcome_step2_label_password": "Password:",
|
||||
"welcome_step2_page_title": "Creare un account amministratore",
|
||||
"welcome_step3_btn_done": "Andiamo!",
|
||||
"welcome_step3_page_desc": "Prosegui adesso per aggiungere dispositivi alla tua lista.",
|
||||
"welcome_step3_page_title": "Abbiamo finito! 🎉"
|
||||
}
|
||||
192
frontend/messages/ja.json
Normal file
192
frontend/messages/ja.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "管理者",
|
||||
"account_account_type_user": "ユーザー",
|
||||
"account_avatar_title": "アバター",
|
||||
"account_change_password_body": "パスワードを変更すると、再度ログインする必要があります。",
|
||||
"account_change_password_confirm": "パスワードの確認",
|
||||
"account_change_password_label": "現在のパスワード",
|
||||
"account_change_password_new": "新しいパスワード",
|
||||
"account_change_password_title": "パスワード変更",
|
||||
"account_language_title": "言語",
|
||||
"account_page_title": "アカウント",
|
||||
"buttons_add": "追加",
|
||||
"buttons_cancel": "キャンセル",
|
||||
"buttons_change": "変更",
|
||||
"buttons_confirm": "確認",
|
||||
"buttons_delete": "削除",
|
||||
"buttons_reset": "リセット",
|
||||
"buttons_save": "保存",
|
||||
"device_card_btn_more_edit": "編集",
|
||||
"device_card_btn_more_reboot": "再起動",
|
||||
"device_card_btn_more_sleep": "スリープ",
|
||||
"device_card_btn_more": "詳細",
|
||||
"device_card_nic_tooltip_pending": "保留中",
|
||||
"device_card_nic_tooltip_power_no_permission": "このデバイスの電源をオンにする権限がありません",
|
||||
"device_card_nic_tooltip_power": "電源オン",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "シャットダウンコマンドが設定されていません",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "このデバイスをシャットダウンする権限がありません",
|
||||
"device_card_nic_tooltip_shutdown": "シャットダウン済み",
|
||||
"device_card_password": "パスワード",
|
||||
"device_card_tooltip_last_status_change": "最終ステータス変更",
|
||||
"device_card_tooltip_shutdown_cron": "シャットダウンスケジュール",
|
||||
"device_card_tooltip_wake_cron": "起動スケジュール",
|
||||
"device_card_tooltip_wake_password": "起動パスワード",
|
||||
"device_general_description_placeholder": "装置の説明",
|
||||
"device_general_description": "説明",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "名前",
|
||||
"device_general_netmask": "ネットマスク",
|
||||
"device_general_required_field": "必須項目",
|
||||
"device_general": "一般",
|
||||
"device_groups_desc": "デバイスをグループに追加することで、ダッシュボード上でグループごとに並べ替えることができます。",
|
||||
"device_groups_placeholder": "例: '自宅' や 'オフィス' など",
|
||||
"device_groups": "グループ",
|
||||
"device_link_desc": "デバイス名をクリック可能なリンクにします。たとえばダッシュボードへのリンクに最適です。",
|
||||
"device_link_open_new_tab": "新しいタブ",
|
||||
"device_link_open_no": "いいえ",
|
||||
"device_link_open_same_tab": "同じタブ",
|
||||
"device_link_open": "自動的にリンクを開く",
|
||||
"device_link": "リンク",
|
||||
"device_modal_confirm_shutdown_desc": "{device} をシャットダウンすることを確認してください。",
|
||||
"device_modal_confirm_shutdown_title": "{device} をシャットダウンしますか?",
|
||||
"device_modal_confirm_wake_desc": "{device} を起動することを確認してください。",
|
||||
"device_modal_confirm_wake_title": "{device} を起動しますか?",
|
||||
"device_network_scan_add_all": "すべてのデバイスを追加",
|
||||
"device_network_scan_desc": "ネットワーク上のデバイスを自動的にスキャンします。この機能を使用するには、UpSnap を root/admin 権限で実行し、nmap が $PATH にインストールされて利用可能である必要があります(Docker ユーザーの場合、すでに設定済みで何もする必要はありません)。スキャンには数秒かかる場合があります。",
|
||||
"device_network_scan_include_unknown": "名前が「Unknown」のデバイスを含める",
|
||||
"device_network_scan_ip_range": "IP 範囲",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac ベンダー:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "ネットマスク:",
|
||||
"device_network_scan_new_netmask": "新しいネットマスク",
|
||||
"device_network_scan_no_range": "スキャン範囲なし",
|
||||
"device_network_scan_range_saved": "スキャン範囲が保存されました",
|
||||
"device_network_scan_replace_netmask": "すべてのデバイスのネットマスクを置き換えますか?",
|
||||
"device_network_scan_running": "スキャン実行中",
|
||||
"device_network_scan_unsaved_changes": "未保存の変更",
|
||||
"device_network_scan": "スキャン",
|
||||
"device_page_title": "新しいデバイス",
|
||||
"device_password_desc": "一部のネットワークカードには、マジックパケット用のパスワード(<span class=\"badge\">SecureON</span> とも呼ばれる)を設定するオプションがあります。パスワードは 0、4、または 6 文字のみの長さである必要があります。",
|
||||
"device_password": "パスワード",
|
||||
"device_ping_cmd": "カスタム Ping コマンド",
|
||||
"device_ping_desc": "デバイスがオンになっているか確認するためにカスタムシェルコマンドを使用できます。このコマンドは、デバイスがオンであることを示すには終了コード <span class=\"badge\">0</span> を返す必要があります。その他の終了コードはオフとして扱われます。",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "新しいポートを追加",
|
||||
"device_ports_desc": "UpSnap は指定されたポートが開いているか確認することもできます。",
|
||||
"device_ports_name": "名前",
|
||||
"device_ports_number": "番号",
|
||||
"device_ports": "ポート",
|
||||
"device_require_confirmation": "確認を要求",
|
||||
"device_shutdown_cmd": "シャットダウンコマンド",
|
||||
"device_shutdown_cron_desc": "デバイスを起動するために cron を設定するのと同様に、このデバイスをシャットダウンするための cron ジョブをスケジュールすることもできます。",
|
||||
"device_shutdown_cron_enable": "シャットダウンスケジュールを有効化",
|
||||
"device_shutdown_cron": "シャットダウンスケジュール",
|
||||
"device_shutdown_desc": "この <strong>シェルコマンド</strong> は、コンテナ内(Docker を使用している場合)またはホスト(バイナリを使用している場合)で実行されます。機能を確認するには、まずコマンドをコンテナ内またはホストのシェルで実行してください。一般的なコマンドには、Windows 用の <span class=\"badge\">net rpc</span>、Linux 用の <span class=\"badge\">sshpass</span>、またはウェブリクエストを行うための <span class=\"badge\">curl</span> などがあります。",
|
||||
"device_shutdown_examples_linux": "リモート Linux マシンのシャットダウン:",
|
||||
"device_shutdown_examples_windows": "リモート Windows マシンのシャットダウン:",
|
||||
"device_shutdown_examples": "例:",
|
||||
"device_shutdown": "シャットダウン",
|
||||
"device_sol_authorization": "認証",
|
||||
"device_sol_desc1": "<a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> ツールを使用してコンピュータをスリープ状態にすることができます。Sleep-On-LAN(SOL)は、スリープ状態にしたい PC で動作する外部ツール/デーモンで、REST エンドポイントを提供します。Sleep-On-LAN のセットアップ方法については、<a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a> セクションを参照してください。",
|
||||
"device_sol_desc2": "SOL は、認証を有効にし、要求をより信頼性の高いものにするために、UDP の代わりに HTTP を使用してリクエストを送信するように構成されています。",
|
||||
"device_sol_desc3": "したがって、<a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL 構成</a>の <span class=\"badge\">Listeners</span> セクションに <span class=\"badge\">HTTP:<YOURPORT></span> を含めるようにしてください。",
|
||||
"device_sol_enable": "Sleep-On-LAN を有効化",
|
||||
"device_sol_password": "SOL パスワード",
|
||||
"device_sol_port": "SOL ポート",
|
||||
"device_sol_user": "SOL ユーザー",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "手動",
|
||||
"device_tabs.1": "ネットワークスキャン",
|
||||
"device_wake_cmd": "カスタム起動コマンド",
|
||||
"device_wake_cron_enable": "起動スケジュールを有効化",
|
||||
"device_wake_cron": "起動スケジュール",
|
||||
"device_wake_desc": "スケジュールされた cron ジョブを使用してこのデバイスを起動できます。",
|
||||
"device_wake": "起動",
|
||||
"home_add_first_device": "最初のデバイスを追加してください",
|
||||
"home_grant_permissions": "既存のデバイスへの権限を付与するか、新しいデバイスを作成するために管理者に依頼してください。",
|
||||
"home_no_devices": "デバイスがありません",
|
||||
"home_order_groups": "グループ",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "名前",
|
||||
"home_order_tooltip": "順序",
|
||||
"home_page_title": "ホーム",
|
||||
"home_search_placeholder": "デバイスの検索",
|
||||
"login_btn_login": "ログイン",
|
||||
"login_btn_more": "詳細",
|
||||
"login_email_label": "メールアドレスまたはユーザー名:",
|
||||
"login_menu_title_auth_providers": "他の認証プロバイダー",
|
||||
"login_password_label": "パスワード:",
|
||||
"login_welcome": "ようこそ",
|
||||
"navbar_edit_account": "アカウント編集",
|
||||
"navbar_logout": "ログアウト",
|
||||
"navbar_new": "新規",
|
||||
"navbar_theme": "テーマ",
|
||||
"settings_icon_desc": "カスタムファビコンを設定します。サポートされているファイルタイプ:",
|
||||
"settings_icon_title": "アイコン",
|
||||
"settings_invalid_cron": "無効なcron構文",
|
||||
"settings_lazy_ping_desc": "Lazy ping をオンにすると、UpSnap はアクティブなユーザーがウェブサイトを訪れている場合にのみデバイスを ping します。オフの場合、UpSnap は常にデバイスを ping します。",
|
||||
"settings_lazy_ping_enable": "有効化",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "設定",
|
||||
"settings_ping_interval_desc1": "デバイスが ping される間隔を設定します。空白の場合、デフォルト値 <span class=\"badge\">@every 3s</span> が使用されます。",
|
||||
"settings_ping_interval_desc2": "cron の正しい構文については、<a class=\"link\" href=\"https://en.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> または <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">パッケージドキュメント</a> を参照してください。",
|
||||
"settings_ping_interval_title": "Ping 間隔",
|
||||
"settings_upsnap_version": "UpSnap バージョン",
|
||||
"settings_website_title_desc": "ウェブサイトおよびブラウザタブのタイトルを設定します。",
|
||||
"settings_website_title_title": "ウェブサイトタイトル",
|
||||
"toasts_admin_saved": "管理者を保存しました",
|
||||
"toasts_device_created": "{device} を作成しました",
|
||||
"toasts_device_deleted": "{device} を削除しました",
|
||||
"toasts_device_updated": "{device} を更新しました",
|
||||
"toasts_devices_created_multiple": "{count} 台のデバイスを作成しました",
|
||||
"toasts_group_created": "グループ {group} を作成しました",
|
||||
"toasts_group_deleted": "グループ {group} を削除しました",
|
||||
"toasts_no_permission": "{url} へのアクセス権がありません",
|
||||
"toasts_password_changed": "パスワードが変更されました。再度ログインしてください。",
|
||||
"toasts_passwords_missmatch": "パスワードが一致しません",
|
||||
"toasts_permissions_created": "{username} の権限を作成しました",
|
||||
"toasts_permissions_deleted": "{username} の権限を削除しました",
|
||||
"toasts_permissions_updated_personal": "あなたの権限が更新されました",
|
||||
"toasts_permissions_updated": "{username} の権限を更新しました",
|
||||
"toasts_settings_saved": "設定を保存しました",
|
||||
"toasts_user_created": "ユーザー {username} を作成しました",
|
||||
"toasts_user_deleted": "ユーザー {username} を削除しました",
|
||||
"toasts_user_saved": "ユーザーを保存しました",
|
||||
"users_allow_create_devices": "{username} が新しいデバイスを作成し、デバイスグループを編集できるようにする",
|
||||
"users_confirm_delete_desc": "{username} を削除してもよろしいですか?",
|
||||
"users_confirm_delete_title": "削除の確認",
|
||||
"users_create_new_device": "新しいデバイスを作成",
|
||||
"users_create_new_user": "新しいユーザーを作成",
|
||||
"users_delete": "削除",
|
||||
"users_device_permissions": "デバイスの権限",
|
||||
"users_page_title": "ユーザー",
|
||||
"users_password_confirm": "パスワードの確認",
|
||||
"users_password": "パスワード",
|
||||
"users_power": "電源",
|
||||
"users_read": "読み取り",
|
||||
"users_required_field": "必須項目",
|
||||
"users_toggle": "切り替え",
|
||||
"users_update": "更新",
|
||||
"users_username": "ユーザー名",
|
||||
"welcome_not_expected_back": "戻る",
|
||||
"welcome_not_expected_desc": "セットアップはすでに完了しています!やるべきことはありません。",
|
||||
"welcome_not_expected_title": "ここにいるとは思いませんでした! 🧐",
|
||||
"welcome_progress_step1": "ようこそ",
|
||||
"welcome_progress_step2": "アカウント作成",
|
||||
"welcome_progress_step3": "完了",
|
||||
"welcome_step1_page_title": "UpSnap へようこそ 🥳",
|
||||
"welcome_step1_setup_btn_next": "次へ",
|
||||
"welcome_step1_setup_desc": "セットアップを完了するには、以下の手順を完了してください。",
|
||||
"welcome_step2_btn_create": "作成",
|
||||
"welcome_step2_label_email": "メールアドレス:",
|
||||
"welcome_step2_label_min_chars": "最小 10 文字",
|
||||
"welcome_step2_label_password_confirm": "パスワードの確認:",
|
||||
"welcome_step2_label_password": "パスワード:",
|
||||
"welcome_step2_page_title": "管理者アカウントを作成",
|
||||
"welcome_step3_btn_done": "始めましょう!",
|
||||
"welcome_step3_page_desc": "ダッシュボードにデバイスを追加してください。",
|
||||
"welcome_step3_page_title": "準備完了です! 🎉"
|
||||
}
|
||||
192
frontend/messages/nl.json
Normal file
192
frontend/messages/nl.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Beheerder",
|
||||
"account_account_type_user": "Gebruiker",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Na het wijzigen van het wachtwoord moet je opnieuw inloggen.",
|
||||
"account_change_password_confirm": "Bevestig wachtwoord",
|
||||
"account_change_password_label": "Oud wachtwoord",
|
||||
"account_change_password_new": "Nieuw wachtwoord",
|
||||
"account_change_password_title": "Wachtwoord wijzigen",
|
||||
"account_language_title": "Taal",
|
||||
"account_page_title": "Account",
|
||||
"buttons_add": "Toevoegen",
|
||||
"buttons_cancel": "Annuleren",
|
||||
"buttons_change": "Wijzigen",
|
||||
"buttons_confirm": "Bevestigen",
|
||||
"buttons_delete": "Verwijderen",
|
||||
"buttons_reset": "Resetten",
|
||||
"buttons_save": "Opslaan",
|
||||
"device_card_btn_more_edit": "Bewerken",
|
||||
"device_card_btn_more_reboot": "Herstarten",
|
||||
"device_card_btn_more_sleep": "Slaapstand",
|
||||
"device_card_btn_more": "Meer",
|
||||
"device_card_nic_tooltip_pending": "In behandeling",
|
||||
"device_card_nic_tooltip_power_no_permission": "Geen toestemming om dit apparaat aan te zetten",
|
||||
"device_card_nic_tooltip_power": "Aanzetten",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Geen uitschakel-opdracht ingesteld",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Geen toestemming om dit apparaat uit te schakelen",
|
||||
"device_card_nic_tooltip_shutdown": "Afsluiten",
|
||||
"device_card_password": "Wachtwoord",
|
||||
"device_card_tooltip_last_status_change": "Laatste statuswijziging",
|
||||
"device_card_tooltip_shutdown_cron": "Afsluiten cron",
|
||||
"device_card_tooltip_wake_cron": "Wek cron",
|
||||
"device_card_tooltip_wake_password": "Wek wachtwoord",
|
||||
"device_general_description_placeholder": "Enige beschrijving van het apparaat",
|
||||
"device_general_description": "Beschrijving",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Naam",
|
||||
"device_general_netmask": "Subnetmask",
|
||||
"device_general_required_field": "vereist veld",
|
||||
"device_general": "Algemeen",
|
||||
"device_groups_desc": "Je kunt apparaten aan een groep toevoegen om ze op het dashboard per groep te sorteren.",
|
||||
"device_groups_placeholder": "bijv. 'Kelder' of 'Kantoor'",
|
||||
"device_groups": "Groepen",
|
||||
"device_link_desc": "Maakt de apparaatsnaam een klikbare link, ideaal om bijvoorbeeld een dashboard te linken.",
|
||||
"device_link_open_new_tab": "Nieuw tabblad",
|
||||
"device_link_open_no": "Nee",
|
||||
"device_link_open_same_tab": "Zelfde tab",
|
||||
"device_link_open": "Link automatisch openen",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Bevestig om {device} af te sluiten.",
|
||||
"device_modal_confirm_shutdown_title": "Afsluiten {device}?",
|
||||
"device_modal_confirm_wake_desc": "Bevestig om {device} te wekken.",
|
||||
"device_modal_confirm_wake_title": "Wek {device}?",
|
||||
"device_network_scan_add_all": "Alle apparaten toevoegen",
|
||||
"device_network_scan_desc": "Automatisch jouw netwerk scannen op apparaten. Voor dit te laten werken, moet je UpSnap als root/admin uitvoeren en moet nmap geïnstalleerd en beschikbaar zijn in jouw $PATH (Voor docker-gebruikers is dit al het geval en hoef je niets meer te doen). Scannen kan enkele seconden duren.",
|
||||
"device_network_scan_include_unknown": "Voeg apparaten toe waarvan de naam 'Onbekend' is",
|
||||
"device_network_scan_ip_range": "IP-bereik",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac leverancier:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Subnetmasker:",
|
||||
"device_network_scan_new_netmask": "Nieuw subnetmasker",
|
||||
"device_network_scan_no_range": "Geen scanbereik",
|
||||
"device_network_scan_range_saved": "Scanbereik opgeslagen",
|
||||
"device_network_scan_replace_netmask": "Subnetmasker voor alle apparaten vervangen?",
|
||||
"device_network_scan_running": "Scan loopt",
|
||||
"device_network_scan_unsaved_changes": "Niet-opgeslagen wijzigingen",
|
||||
"device_network_scan": "Scannen",
|
||||
"device_page_title": "Nieuw apparaat",
|
||||
"device_password_desc": "Sommige netwerkkaarten hebben de optie om een wachtwoord voor magic packets in te stellen, ook wel <span class=\"badge\">SecureON</span> genoemd. Het wachtwoord kan alleen 0, 4 of 6 tekens lang zijn.",
|
||||
"device_password": "Wachtwoord",
|
||||
"device_ping_cmd": "Aangepaste ping-opdracht",
|
||||
"device_ping_desc": "Je kunt een aangepaste shell-opdracht gebruiken om te zien of het apparaat aan staat. De opdracht moet een exitcode van <span class=\"badge\">0</span> retourneren om aan te geven dat het apparaat aan is, elke andere exitcode markeert het apparaat als uitgeschakeld.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Voeg nieuwe poort toe",
|
||||
"device_ports_desc": "UpSnap kan ook controleren of gegeven poorten open zijn.",
|
||||
"device_ports_name": "Naam",
|
||||
"device_ports_number": "Nummer",
|
||||
"device_ports": "Poorten",
|
||||
"device_require_confirmation": "Bevestiging vereist",
|
||||
"device_shutdown_cmd": "Afsluitopdracht",
|
||||
"device_shutdown_cron_desc": "Net als het instellen van een cron om het apparaat te wekken, kun je ook een cron-taak plannen om dit apparaat af te sluiten.",
|
||||
"device_shutdown_cron_enable": "Afsluitcron inschakelen",
|
||||
"device_shutdown_cron": "Afsluitcron",
|
||||
"device_shutdown_desc": "Deze <strong>shell-opdracht</strong> wordt uitgevoerd binnen de container (als je docker gebruikt) of op jouw host (als je de binaire versie gebruikt). Om te verifiëren dat het werkt, kun je de opdracht eerst binnen de container of op jouw host-shell uitvoeren. Veelvoorkomende opdrachten zijn <span class=\"badge\">net rpc</span> voor Windows, <span class=\"badge\">sshpass</span> voor Linux of <span class=\"badge\">curl</span> in het algemeen om webverzoeken te doen.",
|
||||
"device_shutdown_examples_linux": "Afsluiten van een externe Linux-machine:",
|
||||
"device_shutdown_examples_windows": "Afsluiten van een externe Windows-machine:",
|
||||
"device_shutdown_examples": "Voorbeelden:",
|
||||
"device_shutdown": "Afsluiten",
|
||||
"device_sol_authorization": "Autorisatie",
|
||||
"device_sol_desc1": "Je kunt computers in de slaapstand zetten met de <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> tool. Sleep-On-LAN (SOL) is een externe tool/daemon die op de PC's werkt die je in de slaapstand wilt zetten en biedt een REST-endpoint. Voor instructies over het instellen van Sleep-On-LAN, zie de <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Gebruik</a> sectie.",
|
||||
"device_sol_desc2": "SOL is geconfigureerd om verzoeken over HTTP in plaats van UDP te verzenden om autorisatie mogelijk te maken en verzoeken betrouwbaarder te maken.",
|
||||
"device_sol_desc3": "Zorg er daarom voor dat je <span class=\"badge\">HTTP:<JOUWPOORT></span> opneemt in de <span class=\"badge\">Listeners</span> sectie van de <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL-configuratie</a>.",
|
||||
"device_sol_enable": "Sleep-On-LAN inschakelen",
|
||||
"device_sol_password": "SOL Wachtwoord",
|
||||
"device_sol_port": "SOL Poort",
|
||||
"device_sol_user": "SOL Gebruiker",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Handmatig",
|
||||
"device_tabs.1": "Netwerkscan",
|
||||
"device_wake_cmd": "Aangepaste wek-opdracht",
|
||||
"device_wake_cron_enable": "Wek cron inschakelen",
|
||||
"device_wake_cron": "Wek cron",
|
||||
"device_wake_desc": "Je kunt dit apparaat inschakelen met een geplande cron-taak.",
|
||||
"device_wake": "Wek",
|
||||
"home_add_first_device": "Voeg je eerste apparaat toe",
|
||||
"home_grant_permissions": "Vraag de admin om je toestemming te geven voor bestaande apparaten of om nieuwe te creëren.",
|
||||
"home_no_devices": "Geen apparaten gevonden.",
|
||||
"home_order_groups": "Groepen",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Naam",
|
||||
"home_order_tooltip": "Sorteren",
|
||||
"home_page_title": "Home",
|
||||
"home_search_placeholder": "Apparaten zoeken",
|
||||
"login_btn_login": "Inloggen",
|
||||
"login_btn_more": "Meer",
|
||||
"login_email_label": "E-mail of gebruikersnaam:",
|
||||
"login_menu_title_auth_providers": "Andere auth-providers",
|
||||
"login_password_label": "Wachtwoord:",
|
||||
"login_welcome": "Welkom",
|
||||
"navbar_edit_account": "Account bewerken",
|
||||
"navbar_logout": "Uitloggen",
|
||||
"navbar_new": "Nieuw",
|
||||
"navbar_theme": "Thema",
|
||||
"settings_icon_desc": "Stel een aangepast favicon in. Ondersteunde bestandstypen zijn:",
|
||||
"settings_icon_title": "Icoon",
|
||||
"settings_invalid_cron": "Ongeldige cron syntaxis",
|
||||
"settings_lazy_ping_desc": "Wanneer lazy ping is ingeschakeld, pingt UpSnap alleen apparaten als er een actieve gebruiker de website bezoekt. Als het is uitgeschakeld, pingt UpSnap altijd apparaten.",
|
||||
"settings_lazy_ping_enable": "Inschakelen",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "Instellingen",
|
||||
"settings_ping_interval_desc1": "Stelt de interval in waarin de apparaten worden gepingt. Laat leeg om de standaardwaarde van <span class=\"badge\">@every 3s</span> te gebruiken.",
|
||||
"settings_ping_interval_desc2": "Leer meer over de juiste syntax voor cron op <a class=\"link\" href=\"https://en.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> of raadpleeg de <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">pakketdocumentatie</a>.",
|
||||
"settings_ping_interval_title": "Ping-interval",
|
||||
"settings_upsnap_version": "UpSnap versie",
|
||||
"settings_website_title_desc": "Stelt de titel van de website en in het browsertabblad in.",
|
||||
"settings_website_title_title": "Website titel",
|
||||
"toasts_admin_saved": "Beheerder opgeslagen",
|
||||
"toasts_device_created": "Aangemaakt {device}",
|
||||
"toasts_device_deleted": "Verwijderd {device}",
|
||||
"toasts_device_updated": "Bijgewerkt {device}",
|
||||
"toasts_devices_created_multiple": "Aangemaakt {count} apparaten",
|
||||
"toasts_group_created": "Groep {group} aangemaakt",
|
||||
"toasts_group_deleted": "Groep {group} verwijderd",
|
||||
"toasts_no_permission": "Je hebt geen toestemming om {url} te bezoeken",
|
||||
"toasts_password_changed": "Wachtwoord gewijzigd. Log alsjeblieft opnieuw in.",
|
||||
"toasts_passwords_missmatch": "Wachtwoorden komen niet overeen",
|
||||
"toasts_permissions_created": "Rechten voor {username} aangemaakt",
|
||||
"toasts_permissions_deleted": "Rechten voor {username} verwijderd",
|
||||
"toasts_permissions_updated_personal": "Jouw rechten zijn bijgewerkt",
|
||||
"toasts_permissions_updated": "Rechten voor {username} bijgewerkt",
|
||||
"toasts_settings_saved": "Instellingen opgeslagen",
|
||||
"toasts_user_created": "Gebruiker {username} aangemaakt",
|
||||
"toasts_user_deleted": "Gebruiker {username} verwijderd",
|
||||
"toasts_user_saved": "Gebruiker opgeslagen",
|
||||
"users_allow_create_devices": "Sta {username} toe om nieuwe apparaten te maken en apparaatgroepen te bewerken",
|
||||
"users_confirm_delete_desc": "Weet je zeker dat je {username} wilt verwijderen?",
|
||||
"users_confirm_delete_title": "Bevestig verwijderen",
|
||||
"users_create_new_device": "Nieuw apparaat maken",
|
||||
"users_create_new_user": "Nieuwe gebruiker aanmaken",
|
||||
"users_delete": "Verwijderen",
|
||||
"users_device_permissions": "Apparaattoestemmingen",
|
||||
"users_page_title": "Gebruikers",
|
||||
"users_password_confirm": "Bevestig wachtwoord",
|
||||
"users_password": "Wachtwoord",
|
||||
"users_power": "Aanzetten",
|
||||
"users_read": "Lezen",
|
||||
"users_required_field": "vereist veld",
|
||||
"users_toggle": "Wisselen",
|
||||
"users_update": "Bijwerken",
|
||||
"users_username": "Gebruikersnaam",
|
||||
"welcome_not_expected_back": "Breng me terug",
|
||||
"welcome_not_expected_desc": "Je bent al klaar met de installatie! Er is niets meer te doen.",
|
||||
"welcome_not_expected_title": "Ik zag je hier niet aankomen! 🧐",
|
||||
"welcome_progress_step1": "Welkom",
|
||||
"welcome_progress_step2": "Account aanmaken",
|
||||
"welcome_progress_step3": "Klaar",
|
||||
"welcome_step1_page_title": "Welkom bij UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Volgende",
|
||||
"welcome_step1_setup_desc": "Voltooi de volgende stappen om de installatie te voltooien.",
|
||||
"welcome_step2_btn_create": "Aanmaken",
|
||||
"welcome_step2_label_email": "E-mail:",
|
||||
"welcome_step2_label_min_chars": "min. 10 tekens",
|
||||
"welcome_step2_label_password_confirm": "Bevestig wachtwoord:",
|
||||
"welcome_step2_label_password": "Wachtwoord:",
|
||||
"welcome_step2_page_title": "Maak een beheerdersaccount aan",
|
||||
"welcome_step3_btn_done": "Laten we beginnen!",
|
||||
"welcome_step3_page_desc": "Ga je gang en voeg enkele apparaten toe aan je dashboard.",
|
||||
"welcome_step3_page_title": "Je bent helemaal klaar! 🎉"
|
||||
}
|
||||
192
frontend/messages/pl.json
Normal file
192
frontend/messages/pl.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Administrator",
|
||||
"account_account_type_user": "Użytkownik",
|
||||
"account_avatar_title": "Awatar",
|
||||
"account_change_password_body": "Po zmianie hasła, będzie konieczne ponowne zalogowanie.",
|
||||
"account_change_password_confirm": "Potwierdź hasło",
|
||||
"account_change_password_label": "Stare hasło",
|
||||
"account_change_password_new": "Nowe hasło",
|
||||
"account_change_password_title": "Zmiana hasła",
|
||||
"account_language_title": "Język",
|
||||
"account_page_title": "Konto",
|
||||
"buttons_add": "Nowy",
|
||||
"buttons_cancel": "Anuluj",
|
||||
"buttons_change": "Zmień",
|
||||
"buttons_confirm": "Potwierdź",
|
||||
"buttons_delete": "Usuń",
|
||||
"buttons_reset": "Resetuj",
|
||||
"buttons_save": "Zapisz",
|
||||
"device_card_btn_more_edit": "Edytuj",
|
||||
"device_card_btn_more_reboot": "Zrestartuj",
|
||||
"device_card_btn_more_sleep": "Wyłącz",
|
||||
"device_card_btn_more": "Więcej",
|
||||
"device_card_nic_tooltip_pending": "Oczekiwanie",
|
||||
"device_card_nic_tooltip_power_no_permission": "Brak uprawnień do włączania tego urządzenia",
|
||||
"device_card_nic_tooltip_power": "Włącz",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Brak ustawionej polecenia do wyłączania",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Brak uprawnień do wyłączania tego urządzenia",
|
||||
"device_card_nic_tooltip_shutdown": "Wyłącz",
|
||||
"device_card_password": "Hasło",
|
||||
"device_card_tooltip_last_status_change": "Ostatnia zmiana statusu",
|
||||
"device_card_tooltip_shutdown_cron": "Cron do wyłączania",
|
||||
"device_card_tooltip_wake_cron": "Cron do włączania",
|
||||
"device_card_tooltip_wake_password": "Hasło do włączania",
|
||||
"device_general_description_placeholder": "Przykładowy opis urządzenia",
|
||||
"device_general_description": "Opis",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "MAC",
|
||||
"device_general_name": "Nazwa",
|
||||
"device_general_netmask": "Maska sieci",
|
||||
"device_general_required_field": "pole wymagane",
|
||||
"device_general": "Ogólne",
|
||||
"device_groups_desc": "Możesz dodać urządzenie do grup, aby sortować je według grup na pulpicie",
|
||||
"device_groups_placeholder": "np. 'Piwnica' lub 'Biuro'",
|
||||
"device_groups": "Grupy",
|
||||
"device_link_desc": "Twoje urządzenie może być klikalnym łączem. Świetne do linkowania np. pulpitów.",
|
||||
"device_link_open_new_tab": "W nowej karcie",
|
||||
"device_link_open_no": "Nie",
|
||||
"device_link_open_same_tab": "W tej samej karcie",
|
||||
"device_link_open": "Otwórz link automatycznie",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Potwierdź wyłączenie {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Wyłączyć {device}?",
|
||||
"device_modal_confirm_wake_desc": "Potwierdź włączenie {device}.",
|
||||
"device_modal_confirm_wake_title": "Włączyć {device}?",
|
||||
"device_network_scan_add_all": "Dodaj wszystkie urządzenia",
|
||||
"device_network_scan_desc": "Automatycznie skanuj sieć w poszukiwaniu urządzeń. Aby to zadziałało, musisz uruchomić UpSnap jako root/admin i mieć nmap zainstalowany oraz dostępny w $PATH (preinstalowany w obrazach dockerowych). Skanowanie może chwilę potrwać.",
|
||||
"device_network_scan_include_unknown": "Uwzględnij urządzenia, których nazwa to \"Unknown\"",
|
||||
"device_network_scan_ip_range": "Zakres IP",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Dostawca MAC:",
|
||||
"device_network_scan_mac": "MAC:",
|
||||
"device_network_scan_netmask": "Maska sieci:",
|
||||
"device_network_scan_new_netmask": "Nowa maska sieci",
|
||||
"device_network_scan_no_range": "Brak zakresu skanowania",
|
||||
"device_network_scan_range_saved": "Zapisano zakres skanowania",
|
||||
"device_network_scan_replace_netmask": "Zastąpić maskę sieci dla wszystkich urządzeń?",
|
||||
"device_network_scan_running": "Skanowanie w toku",
|
||||
"device_network_scan_unsaved_changes": "Niezapisane zmiany",
|
||||
"device_network_scan": "Skanuj",
|
||||
"device_page_title": "Nowe urządzenie",
|
||||
"device_password_desc": "Niektóre karty sieciowe mają możliwość ustawienia hasła dla magicznych pakietów, znanych również jako <span class=\"badge\">SecureON</span>. Hasło może mieć 0, 4 lub 6 znaków długości.",
|
||||
"device_password": "Hasło",
|
||||
"device_ping_cmd": "Niestandardowe polecenie ping",
|
||||
"device_ping_desc": "Możesz wykorzystać niestandardowe polecenie powłoki, aby sprawdzić, czy urządzenie jest włączone. Polecenie powinno zwrócić kod zakończenia <span class=\"badge\">0</span> aby wskazać, że urządzenie jest włączone. Dowolny inny kod zakończenia poskutkuje oznaczeniem urządzenia jako wyłączone.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Dodaj nowy port",
|
||||
"device_ports_desc": "UpSnap może sprawdzić czy podane porty są otwarte.",
|
||||
"device_ports_name": "Nazwa",
|
||||
"device_ports_number": "Numer",
|
||||
"device_ports": "Porty",
|
||||
"device_require_confirmation": "Wymagaj potwierdzenia",
|
||||
"device_shutdown_cmd": "Polecenie do wyłączania",
|
||||
"device_shutdown_cron_desc": "Podobnie jak możesz harmonogramować zadanie cron do włączania urządzenia, możesz robić to również do jego wyłączania.",
|
||||
"device_shutdown_cron_enable": "Włącz cron do wyłączania",
|
||||
"device_shutdown_cron": "Cron do wyłączania",
|
||||
"device_shutdown_desc": "To <strong>polecenie powłoki</strong> zostanie wywołane w Twoim kontenerze (jeżeli używasz Dockera) lub na Twoim hoście (jeżeli używasz pliku binarnego). Aby zweryfikować jego działanie, możesz je najpierw uruchomić wewnątrz kontenera lub na hoście. Powszechne polecenia to <span class=\"badge\">net rpc</span> dla Windowsa, <span class=\"badge\">sshpass</span> dla Linuxa lub <span class=\"badge\">curl</span> do wykonywania żądań internetowych.",
|
||||
"device_shutdown_examples_linux": "Wyłącz zdalną maszynę Linux:",
|
||||
"device_shutdown_examples_windows": "Wyłącz zdalną maszynę Windows:",
|
||||
"device_shutdown_examples": "Przykłady:",
|
||||
"device_shutdown": "Wyłącz",
|
||||
"device_sol_authorization": "Autoryzacja",
|
||||
"device_sol_desc1": "Możesz wyłączać urządzenia za pomocą narzędzia <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) jest zewnętrznym narzędziem/demonem, działającym na urządzeniach które chcesz wyłączać. Tworzy on endpoint REST. Aby dowiedzieć się jak skonfigurować SOL, zapoznaj się z <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">instrukcją użytkownika</a>.",
|
||||
"device_sol_desc2": "SOL przyjmuje żądania za pomocą HTTP zamiast UDP, aby zwiększyć niezawodność i umożliwić autoryzację.",
|
||||
"device_sol_desc3": "W związku z tym, uwzględnij <span class=\"badge\">HTTP:<TWÓJPORT></span> w sekcji <span class=\"badge\">Listeners</span> twojej <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">konfiguracji SOL</a>.",
|
||||
"device_sol_enable": "Włącz Sleep-On-LAN",
|
||||
"device_sol_password": "Hasło SOL",
|
||||
"device_sol_port": "Port SOL",
|
||||
"device_sol_user": "Użytkownik SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Ręcznie",
|
||||
"device_tabs.1": "Skanuj sieć",
|
||||
"device_wake_cmd": "Niestandardowe polecenie do włączania",
|
||||
"device_wake_cron_enable": "Włącz cron do włączania",
|
||||
"device_wake_cron": "Cron do włączania",
|
||||
"device_wake_desc": "Możesz włączyć to urządzenie za pomocą zaplanowanego zadania cron.",
|
||||
"device_wake": "Włączanie",
|
||||
"home_add_first_device": "Utwórz pierwsze urządzenie",
|
||||
"home_grant_permissions": "Poproś administratora o przyznanie uprawnień do istniejących urządzeń lub do tworzenia nowych.",
|
||||
"home_no_devices": "Brak urządzeń.",
|
||||
"home_order_groups": "Grupowanie",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nazwa",
|
||||
"home_order_tooltip": "Kolejność",
|
||||
"home_page_title": "Strona Główna",
|
||||
"home_search_placeholder": "Wyszukiwanie urządzeń",
|
||||
"login_btn_login": "Zaloguj",
|
||||
"login_btn_more": "Więcej",
|
||||
"login_email_label": "Email lub nazwa użytkownika:",
|
||||
"login_menu_title_auth_providers": "Inni dostawcy autoryzacji",
|
||||
"login_password_label": "Hasło:",
|
||||
"login_welcome": "Witaj",
|
||||
"navbar_edit_account": "Edytuj konto",
|
||||
"navbar_logout": "Wyloguj",
|
||||
"navbar_new": "Utwórz",
|
||||
"navbar_theme": "Motyw",
|
||||
"settings_icon_desc": "Ustaw niestandardowy favicon. Obsługiwane są typy plików:",
|
||||
"settings_icon_title": "Ikona",
|
||||
"settings_invalid_cron": "Nieprawidłowa składnia cron",
|
||||
"settings_lazy_ping_desc": "Gdy leniwe pingowanie jest włączone, UpSnap będzie pingować urządzenia tylko wtedy, gdy użytkownicy odwiedzają stronę. Gdy ta opcja jest wyłączona, UpSnap będzie pingować urządzenia nieustannie.",
|
||||
"settings_lazy_ping_enable": "Włącz",
|
||||
"settings_lazy_ping_title": "Leniwe pingowanie",
|
||||
"settings_page_title": "Ustawienia",
|
||||
"settings_ping_interval_desc1": "Ustawia interwał, w którym urządzenia są pingowane. Pozostaw puste aby użyć domyślnej wartości <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Dowiedz się więcej na temat składni cron na <a class=\"link\" href=\"https://pl.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedii</a> lub w <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">dokumentacji pakietu cron</a>.",
|
||||
"settings_ping_interval_title": "Interwał pingowania",
|
||||
"settings_upsnap_version": "Wersja UpSnap",
|
||||
"settings_website_title_desc": "Ustawia tytuł strony internetowej i na karcie przeglądarki.",
|
||||
"settings_website_title_title": "Tytuł strony",
|
||||
"toasts_admin_saved": "Administrator zapisany",
|
||||
"toasts_device_created": "Utworzono {device}",
|
||||
"toasts_device_deleted": "Usunięto {device}",
|
||||
"toasts_device_updated": "Zaktualizowano {device}",
|
||||
"toasts_devices_created_multiple": "Utworzono {count} urządzeń",
|
||||
"toasts_group_created": "Utworzono grupę {group}",
|
||||
"toasts_group_deleted": "Usunięto grupę {group}",
|
||||
"toasts_no_permission": "Nie masz uprawnień aby odwiedzić {url}",
|
||||
"toasts_password_changed": "Hasło zostało zmienione. Zaloguj się ponownie.",
|
||||
"toasts_passwords_missmatch": "Hasła się różnią",
|
||||
"toasts_permissions_created": "Uprawnienia dla {username} zostały utworzone",
|
||||
"toasts_permissions_deleted": "Uprawnienia dla {username} zostały usunięte",
|
||||
"toasts_permissions_updated_personal": "Twoje uprawnienia zostały zaktualizowane",
|
||||
"toasts_permissions_updated": "Uprawnienia dla {username} zostały zaktualizowane",
|
||||
"toasts_settings_saved": "Zapisano ustawienia",
|
||||
"toasts_user_created": "Użytkownik {username} utworzony",
|
||||
"toasts_user_deleted": "Użytkownik {username} usunięty",
|
||||
"toasts_user_saved": "Użytkownik zapisany",
|
||||
"users_allow_create_devices": "Pozwól {username} tworzyć nowe urządzenia i edytować grupy urządzeń",
|
||||
"users_confirm_delete_desc": "Czy na pewno chcesz usunąć {username}?",
|
||||
"users_confirm_delete_title": "Potwierdź usunięcie",
|
||||
"users_create_new_device": "Utwórz nowe urządzenie",
|
||||
"users_create_new_user": "Utwórz użytkownika",
|
||||
"users_delete": "Usuwanie",
|
||||
"users_device_permissions": "Uprawnienia do urządzeń",
|
||||
"users_page_title": "Użytkownicy",
|
||||
"users_password_confirm": "Potwierdź hasło",
|
||||
"users_password": "Hasło",
|
||||
"users_power": "Włączanie",
|
||||
"users_read": "Odczyt",
|
||||
"users_required_field": "pole wymagane",
|
||||
"users_toggle": "Przełącz",
|
||||
"users_update": "Aktualizacja",
|
||||
"users_username": "Nazwa użytkownika",
|
||||
"welcome_not_expected_back": "Powrót",
|
||||
"welcome_not_expected_desc": "Konfiguracja zakończona! Nie musisz nic więcej robić.",
|
||||
"welcome_not_expected_title": "Stało się coś niespodziewanego! 🧐",
|
||||
"welcome_progress_step1": "Witaj",
|
||||
"welcome_progress_step2": "Utwórz konto",
|
||||
"welcome_progress_step3": "Gotowe",
|
||||
"welcome_step1_page_title": "Witaj w UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Dalej",
|
||||
"welcome_step1_setup_desc": "Wykonaj następujące kroki, aby dokończyć konfigurację.",
|
||||
"welcome_step2_btn_create": "Utwórz",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "min. 10 znaków",
|
||||
"welcome_step2_label_password_confirm": "Potwierdź hasło:",
|
||||
"welcome_step2_label_password": "Hasło:",
|
||||
"welcome_step2_page_title": "Utwórz konto administratora",
|
||||
"welcome_step3_btn_done": "Lecimy!",
|
||||
"welcome_step3_page_desc": "A teraz dodaj kilka urządzeń do Twojego pulpitu.",
|
||||
"welcome_step3_page_title": "Wszystko gotowe! 🎉"
|
||||
}
|
||||
192
frontend/messages/pt.json
Normal file
192
frontend/messages/pt.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "Admin",
|
||||
"account_account_type_user": "Utilizador",
|
||||
"account_avatar_title": "Avatar",
|
||||
"account_change_password_body": "Terá de voltar a entrar após alterar a sua password.",
|
||||
"account_change_password_confirm": "Confirmar password",
|
||||
"account_change_password_label": "Antiga password",
|
||||
"account_change_password_new": "Nova password",
|
||||
"account_change_password_title": "Alterar password",
|
||||
"account_language_title": "Idioma",
|
||||
"account_page_title": "Conta",
|
||||
"buttons_add": "Adicionar",
|
||||
"buttons_cancel": "Cancelar",
|
||||
"buttons_change": "Alterar",
|
||||
"buttons_confirm": "Confirmar",
|
||||
"buttons_delete": "Apagar",
|
||||
"buttons_reset": "Repor",
|
||||
"buttons_save": "Guardar",
|
||||
"device_card_btn_more_edit": "Editar",
|
||||
"device_card_btn_more_reboot": "Reiniciar",
|
||||
"device_card_btn_more_sleep": "Suspender",
|
||||
"device_card_btn_more": "Mais",
|
||||
"device_card_nic_tooltip_pending": "Pendente",
|
||||
"device_card_nic_tooltip_power_no_permission": "Não tem permissão para ligar este dispositivo",
|
||||
"device_card_nic_tooltip_power": "Ligar",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "Comando para desligar não está definido",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "Não tem permissão para desligar este dispositivo",
|
||||
"device_card_nic_tooltip_shutdown": "Desligar",
|
||||
"device_card_password": "Password",
|
||||
"device_card_tooltip_last_status_change": "Última alteração de estado",
|
||||
"device_card_tooltip_shutdown_cron": "Shutdown cron",
|
||||
"device_card_tooltip_wake_cron": "Wake cron",
|
||||
"device_card_tooltip_wake_password": "Wake password",
|
||||
"device_general_description_placeholder": "Alguma descrição do dispositivo",
|
||||
"device_general_description": "Descrição",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "Nome",
|
||||
"device_general_netmask": "Máscara de rede",
|
||||
"device_general_required_field": "campo obrigatório",
|
||||
"device_general": "Geral",
|
||||
"device_groups_desc": "Pode adicionar dispositivos a grupos para ordenar na dashboard.",
|
||||
"device_groups_placeholder": "e.g. 'Cave' ou 'Escritório'",
|
||||
"device_groups": "Grupos",
|
||||
"device_link_desc": "Permite que o nome do seu dispositivo seja um link. Perfeito para dashboard, por exemplo.",
|
||||
"device_link_open_new_tab": "Novo separador",
|
||||
"device_link_open_no": "Não",
|
||||
"device_link_open_same_tab": "O mesmo separador",
|
||||
"device_link_open": "Abrir automaticamente a ligação",
|
||||
"device_link": "Link",
|
||||
"device_modal_confirm_shutdown_desc": "Confirme o encerramento do {device}.",
|
||||
"device_modal_confirm_shutdown_title": "Desligar {device}?",
|
||||
"device_modal_confirm_wake_desc": "Confirme para ativar {device}.",
|
||||
"device_modal_confirm_wake_title": "Despertar {device}?",
|
||||
"device_network_scan_add_all": "Adicionar todos os dispositivos",
|
||||
"device_network_scan_desc": "Procurar automaticamente na sua rede por dispositivos. Terá de executar o UpSnap como root/admin e ter o nmap instalado e disponível no seu $PATH (No caso de usar docker, não tem de fazer nada). Poderá demorar alguns segundos.",
|
||||
"device_network_scan_include_unknown": "Incluir dispositivos em que o nome é \"Unknown\"",
|
||||
"device_network_scan_ip_range": "Intervalo IP",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Fornecedor Mac:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "Máscara de rede:",
|
||||
"device_network_scan_new_netmask": "Nova máscara de rede",
|
||||
"device_network_scan_no_range": "Sem intervalo de IP",
|
||||
"device_network_scan_range_saved": "Intervalo de pesquisa guardado",
|
||||
"device_network_scan_replace_netmask": "Substituir máscara de rede para todos os dispositivos?",
|
||||
"device_network_scan_running": "Pesquisa em curso",
|
||||
"device_network_scan_unsaved_changes": "Alterações por guardar",
|
||||
"device_network_scan": "Pesquisar",
|
||||
"device_page_title": "Novo dispositivo",
|
||||
"device_password_desc": "Alguns adaptadores de rede têm a opção de definir uma password para magic packets, também conhecido como <span class=\"badge\">SecureON</span>. A password só poderá conter 0, 4 ou 6 caracteres.",
|
||||
"device_password": "Password",
|
||||
"device_ping_cmd": "Comando ping personalizado",
|
||||
"device_ping_desc": "Pode utilizar um comando shell personalizado para ver se o dispositivo está ligado. O comando deve devolver um código de saída de <span class=\"badge\">0</span> para indicar que o dispositivo está ligado, qualquer outro código de saída marcará o dispositivo como desligado.",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "Adicionar novo porto",
|
||||
"device_ports_desc": "UpSnap pode verificar se certos portos estão abertos.",
|
||||
"device_ports_name": "Nome",
|
||||
"device_ports_number": "Número",
|
||||
"device_ports": "Portos",
|
||||
"device_require_confirmation": "Exigir confirmação",
|
||||
"device_shutdown_cmd": "Comando para desligar",
|
||||
"device_shutdown_cron_desc": "Assim como pode ter um cron job para ligar o seu dispositivo, pode também usar para desligar.",
|
||||
"device_shutdown_cron_enable": "Ativar shutdown cron",
|
||||
"device_shutdown_cron": "Shutdown cron",
|
||||
"device_shutdown_desc": "Este <strong>comando shell</strong> irá correr dentro do teu container (no caso de usar docker) ou no seu host (na versão standalone). Para verificar que funciona, pode executar o comando primeiro no seu container/host. Comandos comuns são <span class=\"badge\">net rpc</span> para windows, <span class=\"badge\">sshpass</span> para linux ou <span class=\"badge\">curl</span> em geral para enviar pedidos web.",
|
||||
"device_shutdown_examples_linux": "Desligar dispositivo linux remoto:",
|
||||
"device_shutdown_examples_windows": "Desligar dispositivo windows remoto:",
|
||||
"device_shutdown_examples": "Exemplos:",
|
||||
"device_shutdown": "Desligar",
|
||||
"device_sol_authorization": "Autenticação",
|
||||
"device_sol_desc1": "Poderá suspender o seu dispositivo usando a ferramenta <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) é uma ferramenta externa que terá de ser executada no dispositivo que quer suspender, facilitando um REST endpoint. Para instruções em como configurar Sleep-On-LAN, veja a secção <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a>.",
|
||||
"device_sol_desc2": "SOL envia pedidos através de HTTP em vez de UDP para permitir autenticação e tornar os pedidos mais seguros.",
|
||||
"device_sol_desc3": "Portanto, tenha a certeza que inclui <span class=\"badge\">HTTP:<SEU_PORTO></span> na secção <span class=\"badge\">Listeners</span> de <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">configuração SOL</a>.",
|
||||
"device_sol_enable": "Ativar Sleep-On-LAN",
|
||||
"device_sol_password": "Password SOL",
|
||||
"device_sol_port": "Porto SOL",
|
||||
"device_sol_user": "Utilizador SOL",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "Manual",
|
||||
"device_tabs.1": "Pesquisa de rede",
|
||||
"device_wake_cmd": "Comando de despertar personalizado",
|
||||
"device_wake_cron_enable": "Ativar wake cron",
|
||||
"device_wake_cron": "Wake cron",
|
||||
"device_wake_desc": "Poderá ligar este dispositivo através dum cron job agendado.",
|
||||
"device_wake": "Ligar",
|
||||
"home_add_first_device": "Adicione o seu primeiro dispositivo",
|
||||
"home_grant_permissions": "Peça ao administrador para alterar as suas permissões para dispositivos existentes ou para criar novos.",
|
||||
"home_no_devices": "Sem dispositivos.",
|
||||
"home_order_groups": "Grupos",
|
||||
"home_order_ip": "IP",
|
||||
"home_order_name": "Nome",
|
||||
"home_order_tooltip": "Ordem",
|
||||
"home_page_title": "Início",
|
||||
"home_search_placeholder": "Procurar dispositivos",
|
||||
"login_btn_login": "Entrar",
|
||||
"login_btn_more": "Mais",
|
||||
"login_email_label": "Email ou Utilizador:",
|
||||
"login_menu_title_auth_providers": "Outros provedores de autenticação",
|
||||
"login_password_label": "Password:",
|
||||
"login_welcome": "Bem-vindo",
|
||||
"navbar_edit_account": "Editar conta",
|
||||
"navbar_logout": "Sair",
|
||||
"navbar_new": "Novo",
|
||||
"navbar_theme": "Tema",
|
||||
"settings_icon_desc": "Define um favicon personalizado. Tipos de ficheiros suportados são:",
|
||||
"settings_icon_title": "Ícone",
|
||||
"settings_invalid_cron": "Sintaxe inválida do cron",
|
||||
"settings_lazy_ping_desc": "Quando o lazy ping está activo, o UpSnap irá apenas executar o ping se existir um utilizador ativo no website. Se desligado, o UpSnap irá executar sempre o ping.",
|
||||
"settings_lazy_ping_enable": "Activar",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "Definições",
|
||||
"settings_ping_interval_desc1": "Define o intervalo em que o ping é executado. Deixe em branco para usar o valor por defeito de <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "Poderá ver a sintaxe correta para cron em <a class=\"link\" href=\"https://en.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> ou em <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">documentação cron</a>.",
|
||||
"settings_ping_interval_title": "Intervalo ping",
|
||||
"settings_upsnap_version": "Versão UpSnap",
|
||||
"settings_website_title_desc": "Define o título do website.",
|
||||
"settings_website_title_title": "Título do website",
|
||||
"toasts_admin_saved": "Administrador atualizado",
|
||||
"toasts_device_created": "Adicionado dispositivo {device}",
|
||||
"toasts_device_deleted": "{device} apagado",
|
||||
"toasts_device_updated": "{device} atualizado",
|
||||
"toasts_devices_created_multiple": "Adicionados {count} dispositivos",
|
||||
"toasts_group_created": "Grupo {group} criado",
|
||||
"toasts_group_deleted": "Grupo {group} apagado",
|
||||
"toasts_no_permission": "Não tem permissão para visitar {url}",
|
||||
"toasts_password_changed": "Password alterada. Terá de entrar novamente.",
|
||||
"toasts_passwords_missmatch": "As passwords não correspondem",
|
||||
"toasts_permissions_created": "Permissões criadas para {username}",
|
||||
"toasts_permissions_deleted": "Permissões apagadas para {username}",
|
||||
"toasts_permissions_updated_personal": "As suas permissões foram atualizadas",
|
||||
"toasts_permissions_updated": "Permissões atualizadas para {username}",
|
||||
"toasts_settings_saved": "Definições guardadas",
|
||||
"toasts_user_created": "Utilizador {username} criado",
|
||||
"toasts_user_deleted": "Utilizador {username} apagado",
|
||||
"toasts_user_saved": "Utilizador atualizado",
|
||||
"users_allow_create_devices": "Permitir a {username} adicionar novos dispositivos e editar grupos de dispositivos",
|
||||
"users_confirm_delete_desc": "Tem a certeza que quer apagar {username}?",
|
||||
"users_confirm_delete_title": "Confirmar",
|
||||
"users_create_new_device": "Adicionar dispositivo",
|
||||
"users_create_new_user": "Criar novo utilizador",
|
||||
"users_delete": "Apagar",
|
||||
"users_device_permissions": "Permissões de dispositivos",
|
||||
"users_page_title": "Utilizadores",
|
||||
"users_password_confirm": "Confirmar password",
|
||||
"users_password": "Password",
|
||||
"users_power": "Ligar/desligar",
|
||||
"users_read": "Ver",
|
||||
"users_required_field": "campo obrigatório",
|
||||
"users_toggle": "Alternar",
|
||||
"users_update": "Editar",
|
||||
"users_username": "Utilizador",
|
||||
"welcome_not_expected_back": "Voltar",
|
||||
"welcome_not_expected_desc": "A configuração está concluída. Nada a fazer aqui.",
|
||||
"welcome_not_expected_title": "Não esperava ver aqui alguém! 🧐",
|
||||
"welcome_progress_step1": "Bem-vindo",
|
||||
"welcome_progress_step2": "Criar conta",
|
||||
"welcome_progress_step3": "Concluído",
|
||||
"welcome_step1_page_title": "Bem-vindo ao UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "Seguinte",
|
||||
"welcome_step1_setup_desc": "Complete os próximos passos para terminar a configuração.",
|
||||
"welcome_step2_btn_create": "Criar",
|
||||
"welcome_step2_label_email": "Email:",
|
||||
"welcome_step2_label_min_chars": "min. 10 caracteres",
|
||||
"welcome_step2_label_password_confirm": "Confirmar password:",
|
||||
"welcome_step2_label_password": "Password:",
|
||||
"welcome_step2_page_title": "Criar conta de administrador",
|
||||
"welcome_step3_btn_done": "Vamos!",
|
||||
"welcome_step3_page_desc": "Adicione alguns dispositivos à sua dashboard.",
|
||||
"welcome_step3_page_title": "Concluído! 🎉"
|
||||
}
|
||||
192
frontend/messages/zh-TW.json
Normal file
192
frontend/messages/zh-TW.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "管理員",
|
||||
"account_account_type_user": "普通使用者",
|
||||
"account_avatar_title": "頭像",
|
||||
"account_change_password_body": "更改密碼後,將需重新登入",
|
||||
"account_change_password_confirm": "確認密碼",
|
||||
"account_change_password_label": "舊密碼",
|
||||
"account_change_password_new": "新密碼",
|
||||
"account_change_password_title": "更改密碼",
|
||||
"account_language_title": "語言",
|
||||
"account_page_title": "帳號資訊",
|
||||
"buttons_add": "新增",
|
||||
"buttons_cancel": "取消",
|
||||
"buttons_change": "更改",
|
||||
"buttons_confirm": "確認",
|
||||
"buttons_delete": "刪除",
|
||||
"buttons_reset": "重設",
|
||||
"buttons_save": "保存",
|
||||
"device_card_btn_more_edit": "編輯",
|
||||
"device_card_btn_more_reboot": "重新啟動",
|
||||
"device_card_btn_more_sleep": "睡眠",
|
||||
"device_card_btn_more": "更多",
|
||||
"device_card_nic_tooltip_pending": "等待中...",
|
||||
"device_card_nic_tooltip_power_no_permission": "無開啟此裝置之權限",
|
||||
"device_card_nic_tooltip_power": "開機",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "未設定關機指令",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "無關閉此裝置之權限",
|
||||
"device_card_nic_tooltip_shutdown": "關機",
|
||||
"device_card_password": "密碼",
|
||||
"device_card_tooltip_last_status_change": "最後狀態更新",
|
||||
"device_card_tooltip_shutdown_cron": "關機排程",
|
||||
"device_card_tooltip_wake_cron": "喚醒排程",
|
||||
"device_card_tooltip_wake_password": "喚醒密碼",
|
||||
"device_general_description_placeholder": "關於這个裝置的描述",
|
||||
"device_general_description": "描述",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "名稱",
|
||||
"device_general_netmask": "子網域遮罩",
|
||||
"device_general_required_field": "必填",
|
||||
"device_general": "通用",
|
||||
"device_groups_desc": "你可以將裝置加到群組, 以便在控制面板上依群組排序。",
|
||||
"device_groups_placeholder": "例如: 'Basement' 或 'Office'",
|
||||
"device_groups": "群組",
|
||||
"device_link_desc": "讓您的裝置名稱成為可點擊的連結,非常適合用來連結儀表板等。",
|
||||
"device_link_open_new_tab": "新標籤",
|
||||
"device_link_open_no": "毋",
|
||||
"device_link_open_same_tab": "同一個標籤",
|
||||
"device_link_open": "自動開啟連結",
|
||||
"device_link": "連結",
|
||||
"device_modal_confirm_shutdown_desc": "你確定要關閉 {device} 嗎?",
|
||||
"device_modal_confirm_shutdown_title": "關閉 {device}?",
|
||||
"device_modal_confirm_wake_desc": "你確定要喚醒 {device} 嗎?",
|
||||
"device_modal_confirm_wake_title": "喚醒 {device}?",
|
||||
"device_network_scan_add_all": "新增全部裝置",
|
||||
"device_network_scan_desc": "自動掃描網路上的設備,要使用這個功能,你需要以root/系統管理員權限執行 UpSnap, 並在你的 $PATH 中安裝nmap(使用docker安裝者不需執行任何操作),掃描可能需一段時間。",
|
||||
"device_network_scan_include_unknown": "包括名稱為 “Unknown” 的裝置",
|
||||
"device_network_scan_ip_range": "IP 範圍",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac 供應商:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "子網域遮罩:",
|
||||
"device_network_scan_new_netmask": "新子網域遮罩",
|
||||
"device_network_scan_no_range": "無掃瞄範圍",
|
||||
"device_network_scan_range_saved": "掃瞄範圍已儲存",
|
||||
"device_network_scan_replace_netmask": "替換所有設備的子網域遮罩?",
|
||||
"device_network_scan_running": "掃描中",
|
||||
"device_network_scan_unsaved_changes": "未儲存的更改",
|
||||
"device_network_scan": "掃描",
|
||||
"device_page_title": "新裝置",
|
||||
"device_password_desc": "一些網路介面卡能給 magic packets 設密碼, 也可稱作 <span class=\"badge\">SecureON</span>. 密碼長度只能為0、4或6個字。",
|
||||
"device_password": "密碼",
|
||||
"device_ping_cmd": "自定義 ping 指令",
|
||||
"device_ping_desc": "你可以使用自定義的指令來檢查裝置是否開機。該指令應返回退出碼 <span class=\"badge\">0</span> 以表示裝置已開機,任何其他退出碼將標記裝置為關機。",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "新增埠",
|
||||
"device_ports_desc": "UpSnap 可以檢查指定的埠是否開啟",
|
||||
"device_ports_name": "名稱",
|
||||
"device_ports_number": "通訊埠編號",
|
||||
"device_ports": "埠",
|
||||
"device_require_confirmation": "再次確認",
|
||||
"device_shutdown_cmd": "關機指令",
|
||||
"device_shutdown_cron_desc": "就像設定排程來喚醒裝置一樣,您也可以設定一個排程來關閉這個裝置。",
|
||||
"device_shutdown_cron_enable": "啟用關機排程",
|
||||
"device_shutdown_cron": "關機排程",
|
||||
"device_shutdown_desc": "這個<strong>shell指令</strong>將在您的容器內運行(如果您使用docker),或者在您的主機上運行(如果您使用二進制)。為了驗證其正常工作,您可以先在容器內或主機的shell中運行這個指令。常見的指令有<span class=\"badge\">net rpc</span>用於Windows,<span class=\"badge\">sshpass</span>用於Linux,或者一般用於進行網絡請求的<span class=\"badge\">curl</span>。",
|
||||
"device_shutdown_examples_linux": "關閉遠端 Linux 主機:",
|
||||
"device_shutdown_examples_windows": "關閉遠端 Windows 主機:",
|
||||
"device_shutdown_examples": "範例:",
|
||||
"device_shutdown": "關機",
|
||||
"device_sol_authorization": "認證",
|
||||
"device_sol_desc1": "你可以使用 <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> 工具讓電腦睡眠。 Sleep-On-LAN (SOL) 是一个外部的工具,它在你想要進入睡眠的PC上執行並有RestAPI端口. 有關 Sleep-On-LAN 設定的說明, 請見文檔 <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a>",
|
||||
"device_sol_desc2": "SOL 已配置為使用 HTTP 發送請求,而不是 UDP以啟用授權並提高請求的可靠性。",
|
||||
"device_sol_desc3": "因此, 請確保在 <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL 配置</a> 的 <span class=\"badge\">Listeners</span> 部分中包含<span class=\"badge\">HTTP:<YOURPORT></span>",
|
||||
"device_sol_enable": "啟用 Sleep-On-LAN",
|
||||
"device_sol_password": "SOL 密碼",
|
||||
"device_sol_port": "SOL 通訊埠",
|
||||
"device_sol_user": "SOL 帳號",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "手動設定",
|
||||
"device_tabs.1": "網路掃描",
|
||||
"device_wake_cmd": "自定義唤醒指令",
|
||||
"device_wake_cron_enable": "啟用定時喚醒",
|
||||
"device_wake_cron": "唤醒排程",
|
||||
"device_wake_desc": "你可以透過排程来唤醒裝置。",
|
||||
"device_wake": "喚醒",
|
||||
"home_add_first_device": "添加你的第一台設備",
|
||||
"home_grant_permissions": "請聯絡系統管理員授權現有設備或創建新設備的權限",
|
||||
"home_no_devices": "尚無設備",
|
||||
"home_order_groups": "群組",
|
||||
"home_order_ip": "IP位址",
|
||||
"home_order_name": "名稱",
|
||||
"home_order_tooltip": "排序",
|
||||
"home_page_title": "首頁",
|
||||
"home_search_placeholder": "搜尋設備",
|
||||
"login_btn_login": "登入",
|
||||
"login_btn_more": "更多",
|
||||
"login_email_label": "電子郵件/使用者名稱:",
|
||||
"login_menu_title_auth_providers": "其他身份驗證提供者",
|
||||
"login_password_label": "密碼:",
|
||||
"login_welcome": "歡迎使用",
|
||||
"navbar_edit_account": "編輯帳號",
|
||||
"navbar_logout": "退出",
|
||||
"navbar_new": "新增",
|
||||
"navbar_theme": "主題",
|
||||
"settings_icon_desc": "設定一個自訂義圖標。支援的檔案類型:",
|
||||
"settings_icon_title": "圖標",
|
||||
"settings_invalid_cron": "「無效的 Cron 語法」",
|
||||
"settings_lazy_ping_desc": "當開關打開時, UpSnap 只會在有訪問者訪問網站時才對設備進行 ping 測試",
|
||||
"settings_lazy_ping_enable": "啟用",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "設定",
|
||||
"settings_ping_interval_desc1": "設定 ping 的間隔。留空使用預設值 <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "有關 cron 的更多資訊,請見<a class=\"link\" href=\"https://zh.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> 或參閱 <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">cron 文檔</a>.",
|
||||
"settings_ping_interval_title": "Ping 間隔",
|
||||
"settings_upsnap_version": "UpSnap 版本",
|
||||
"settings_website_title_desc": "設置網站的標題,同時顯示在瀏覽器的標籤中。",
|
||||
"settings_website_title_title": "網站標題",
|
||||
"toasts_admin_saved": "帳號資訊已儲存",
|
||||
"toasts_device_created": "已創建 {device}",
|
||||
"toasts_device_deleted": "已刪除 {device}",
|
||||
"toasts_device_updated": "已更新 {device}",
|
||||
"toasts_devices_created_multiple": "已創建 {count} 個設備",
|
||||
"toasts_group_created": "已創建群組 {group}",
|
||||
"toasts_group_deleted": "已創建群組 {group}",
|
||||
"toasts_no_permission": "你無權訪問 {url}",
|
||||
"toasts_password_changed": "密碼已修改,請重新登入。",
|
||||
"toasts_passwords_missmatch": "兩次輸入的密碼不相同",
|
||||
"toasts_permissions_created": "使用者 {username} 的權限已創建",
|
||||
"toasts_permissions_deleted": "使用者 {username} 的權限已刪除",
|
||||
"toasts_permissions_updated_personal": "你的權限已更新",
|
||||
"toasts_permissions_updated": "使用者 {username} 的權限已更新",
|
||||
"toasts_settings_saved": "設定已儲存",
|
||||
"toasts_user_created": "使用者 {username} 已創建",
|
||||
"toasts_user_deleted": "使用者 {username} 已刪除",
|
||||
"toasts_user_saved": "帳號資訊已儲存",
|
||||
"users_allow_create_devices": "允許 {username} 創建新裝置和修改群組",
|
||||
"users_confirm_delete_desc": "你確定要刪除 {username} 嗎?",
|
||||
"users_confirm_delete_title": "確認刪除",
|
||||
"users_create_new_device": "創建新裝置",
|
||||
"users_create_new_user": "新增使用者",
|
||||
"users_delete": "刪除",
|
||||
"users_device_permissions": "裝置權限",
|
||||
"users_page_title": "使用者",
|
||||
"users_password_confirm": "確認密碼",
|
||||
"users_password": "密碼",
|
||||
"users_power": "電源",
|
||||
"users_read": "查看",
|
||||
"users_required_field": "必填",
|
||||
"users_toggle": "全選",
|
||||
"users_update": "更新",
|
||||
"users_username": "使用者名稱",
|
||||
"welcome_not_expected_back": "返回",
|
||||
"welcome_not_expected_desc": "你已經完成設定,無需再次設定",
|
||||
"welcome_not_expected_title": "意料之外! 🧐",
|
||||
"welcome_progress_step1": "歡迎",
|
||||
"welcome_progress_step2": "創建帳號",
|
||||
"welcome_progress_step3": "完成",
|
||||
"welcome_step1_page_title": "歡迎使用 UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "下一步",
|
||||
"welcome_step1_setup_desc": "初次使用,請依下列指示完成步驟",
|
||||
"welcome_step2_btn_create": "創建",
|
||||
"welcome_step2_label_email": "電子郵件:",
|
||||
"welcome_step2_label_min_chars": "請輸入至少10个字元",
|
||||
"welcome_step2_label_password_confirm": "確認密碼:",
|
||||
"welcome_step2_label_password": "密碼:",
|
||||
"welcome_step2_page_title": "創建管理者帳號",
|
||||
"welcome_step3_btn_done": "開始使用!",
|
||||
"welcome_step3_page_desc": "繼續向您的儀表板新增裝置。",
|
||||
"welcome_step3_page_title": "一切就緒! 🎉"
|
||||
}
|
||||
192
frontend/messages/zh.json
Normal file
192
frontend/messages/zh.json
Normal file
@@ -0,0 +1,192 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/inlang-message-format",
|
||||
"account_account_type_admin": "管理员",
|
||||
"account_account_type_user": "普通用户",
|
||||
"account_avatar_title": "头像",
|
||||
"account_change_password_body": "更改密码后, 您需要重新登录.",
|
||||
"account_change_password_confirm": "确认密码",
|
||||
"account_change_password_label": "旧密码",
|
||||
"account_change_password_new": "新密码",
|
||||
"account_change_password_title": "更改密码",
|
||||
"account_language_title": "语言",
|
||||
"account_page_title": "账户信息",
|
||||
"buttons_add": "添加",
|
||||
"buttons_cancel": "取消",
|
||||
"buttons_change": "更改",
|
||||
"buttons_confirm": "确认",
|
||||
"buttons_delete": "删除",
|
||||
"buttons_reset": "重置",
|
||||
"buttons_save": "保存",
|
||||
"device_card_btn_more_edit": "编辑",
|
||||
"device_card_btn_more_reboot": "重启",
|
||||
"device_card_btn_more_sleep": "Sleep",
|
||||
"device_card_btn_more": "更多",
|
||||
"device_card_nic_tooltip_pending": "等待中...",
|
||||
"device_card_nic_tooltip_power_no_permission": "没有启动此设备的权限",
|
||||
"device_card_nic_tooltip_power": "启动",
|
||||
"device_card_nic_tooltip_shutdown_no_cmd": "未设置关机命令",
|
||||
"device_card_nic_tooltip_shutdown_no_permission": "没有关闭此设备的权限",
|
||||
"device_card_nic_tooltip_shutdown": "关机",
|
||||
"device_card_password": "密码",
|
||||
"device_card_tooltip_last_status_change": "最近状态更新",
|
||||
"device_card_tooltip_shutdown_cron": "关机计划",
|
||||
"device_card_tooltip_wake_cron": "唤醒计划",
|
||||
"device_card_tooltip_wake_password": "唤醒密码",
|
||||
"device_general_description_placeholder": "设备的一些说明",
|
||||
"device_general_description": "说明",
|
||||
"device_general_ip": "IP",
|
||||
"device_general_mac": "Mac",
|
||||
"device_general_name": "名称",
|
||||
"device_general_netmask": "子网掩码",
|
||||
"device_general_required_field": "必填字段",
|
||||
"device_general": "通用",
|
||||
"device_groups_desc": "您可以将设备添加到组, 以便在控制面板上按组对其进行排序.",
|
||||
"device_groups_placeholder": "例如: 'Basement' 或 'Office'",
|
||||
"device_groups": "分组",
|
||||
"device_link_desc": "为您的设备名设置一个可点击的链接.",
|
||||
"device_link_open_new_tab": "新标签",
|
||||
"device_link_open_no": "没有",
|
||||
"device_link_open_same_tab": "同一标签",
|
||||
"device_link_open": "自动打开链接",
|
||||
"device_link": "链接",
|
||||
"device_modal_confirm_shutdown_desc": "您确定要关闭 {device} 吗?",
|
||||
"device_modal_confirm_shutdown_title": "关闭 {device}?",
|
||||
"device_modal_confirm_wake_desc": "您确定要唤醒 {device} 吗?",
|
||||
"device_modal_confirm_wake_title": "唤醒 {device}?",
|
||||
"device_network_scan_add_all": "添加全部设备",
|
||||
"device_network_scan_desc": "自动扫描网络中的设备. 要实现这一点, 您需要以超级用户/管理员身份运行 UpSnap, 并在您的 $PATH 中安装和使用nmap(对于docker用户, 您不需要执行任何操作). 扫描可能需要一些时间.",
|
||||
"device_network_scan_include_unknown": "包括名称为 “Unknown” 的设备",
|
||||
"device_network_scan_ip_range": "IP 范围",
|
||||
"device_network_scan_ip": "IP:",
|
||||
"device_network_scan_mac_vendor": "Mac 供应商:",
|
||||
"device_network_scan_mac": "Mac:",
|
||||
"device_network_scan_netmask": "子网掩码:",
|
||||
"device_network_scan_new_netmask": "新子网掩码",
|
||||
"device_network_scan_no_range": "无扫描范围",
|
||||
"device_network_scan_range_saved": "扫描范围已保存",
|
||||
"device_network_scan_replace_netmask": "更换所有设备的子网掩码?",
|
||||
"device_network_scan_running": "扫描中",
|
||||
"device_network_scan_unsaved_changes": "未保存的更改",
|
||||
"device_network_scan": "扫描",
|
||||
"device_page_title": "新设备",
|
||||
"device_password_desc": "一些网卡允许为 magic packets 设置密码, 也可以称之为 <span class=\"badge\">SecureON</span>. 密码长度只能为0、4或6个字符.",
|
||||
"device_password": "密码",
|
||||
"device_ping_cmd": "自定义 ping 命令",
|
||||
"device_ping_desc": "您可以使用自定义 shell 命令来查看设备是否已接通电源。该命令应返回 <span class=\"badge\">0</span> 的退出代码,表示设备电源已打开,任何其他退出代码都将标记设备电源已关闭。",
|
||||
"device_ping": "Ping",
|
||||
"device_ports_add_new": "添加端口",
|
||||
"device_ports_desc": "UpSnap 可以检查设备端口是否正常.",
|
||||
"device_ports_name": "名称",
|
||||
"device_ports_number": "端口号",
|
||||
"device_ports": "端口",
|
||||
"device_require_confirmation": "二次确认",
|
||||
"device_shutdown_cmd": "关机命令",
|
||||
"device_shutdown_cron_desc": "就像设置计划任务来唤醒设备一样, 您也可以设置计划任务来关闭该设备.",
|
||||
"device_shutdown_cron_enable": "启用定时关机",
|
||||
"device_shutdown_cron": "关机计划任务",
|
||||
"device_shutdown_desc": "此 <strong>shell 命令</strong> 将在您的容器内运行 (如果使用的是Docker) 或在您的主机上运行. 要验证该命令是否有效, 您可以在容器内或主机上的shell中运行该命令. 通常在 Windows 上使用 <span class=\"badge\">net rpc</span>, Linux上使用 <span class=\"badge\">sshpass</span> 或者针对Web请求使用 <span class=\"badge\">curl</span>.",
|
||||
"device_shutdown_examples_linux": "关闭远程 Linux 主机:",
|
||||
"device_shutdown_examples_windows": "关闭远程 Windows 主机:",
|
||||
"device_shutdown_examples": "示例:",
|
||||
"device_shutdown": "关机",
|
||||
"device_sol_authorization": "认证",
|
||||
"device_sol_desc1": "您可以使用 <a class=\"link\" href=\"https://github.com/SR-G/sleep-on-lan\" target=\"_blank\">Sleep-On-LAN</a> 工具让计算机进入睡眠状态. Sleep-On-LAN (SOL) 是一个外部的工具/守护程序, 它在您想要进入休眠状态的PC上运行并提供RestApi接口. 有关 Sleep-On-LAN 设置的说明, 请参阅文档 <a href=\"https://github.com/SR-G/sleep-on-lan#usage\" class=\"link\" target=\"_blank\">Usage</a> 部分.",
|
||||
"device_sol_desc2": "SOL 配置为通过HTTP而不是UDP发送请求, 以启用认证功能并使请求更可靠",
|
||||
"device_sol_desc3": "因此, 请确保在 <a href=\"https://github.com/SR-G/sleep-on-lan#configuration\" class=\"link\" target=\"_blank\">SOL 配置</a> 的 <span class=\"badge\">Listeners</span> 部分中包含<span class=\"badge\">HTTP:<YOURPORT></span>",
|
||||
"device_sol_enable": "启用 Sleep-On-LAN",
|
||||
"device_sol_password": "SOL 密码",
|
||||
"device_sol_port": "SOL 端口",
|
||||
"device_sol_user": "SOL 账号",
|
||||
"device_sol": "Sleep-On-LAN",
|
||||
"device_tabs.0": "手动配置",
|
||||
"device_tabs.1": "网络扫描",
|
||||
"device_wake_cmd": "自定义唤醒命令",
|
||||
"device_wake_cron_enable": "启用定时唤醒",
|
||||
"device_wake_cron": "唤醒计划任务",
|
||||
"device_wake_desc": "您可以通过计划任务来唤醒设备.",
|
||||
"device_wake": "唤醒",
|
||||
"home_add_first_device": "添加您的第一台设备",
|
||||
"home_grant_permissions": "请联系管理员授予您相应权限.",
|
||||
"home_no_devices": "还没有任何设备",
|
||||
"home_order_groups": "分组",
|
||||
"home_order_ip": "IP地址",
|
||||
"home_order_name": "名称",
|
||||
"home_order_tooltip": "排序",
|
||||
"home_page_title": "首页",
|
||||
"home_search_placeholder": "搜索设备",
|
||||
"login_btn_login": "登录",
|
||||
"login_btn_more": "更多",
|
||||
"login_email_label": "邮箱/用户名:",
|
||||
"login_menu_title_auth_providers": "其他身份验证提供程序",
|
||||
"login_password_label": "密码:",
|
||||
"login_welcome": "欢迎使用",
|
||||
"navbar_edit_account": "编辑账户",
|
||||
"navbar_logout": "退出",
|
||||
"navbar_new": "新增",
|
||||
"navbar_theme": "主题",
|
||||
"settings_icon_desc": "设置一个自定义图标. 支持的文件类型:",
|
||||
"settings_icon_title": "图标",
|
||||
"settings_invalid_cron": "无效的 cron 语法",
|
||||
"settings_lazy_ping_desc": "当开关打开时, UpSnap 只会在用户访问网站期间进行 ping 操作.",
|
||||
"settings_lazy_ping_enable": "启用",
|
||||
"settings_lazy_ping_title": "Lazy ping",
|
||||
"settings_page_title": "设置",
|
||||
"settings_ping_interval_desc1": "设置 ping 的间隔。为空时使用默认值 <span class=\"badge\">@every 3s</span>.",
|
||||
"settings_ping_interval_desc2": "有关 cron 的更多信息, 请访问<a class=\"link\" href=\"https://zh.wikipedia.org/wiki/Cron\" target=\"_blank\">Wikipedia</a> 或参阅 <a class=\"link\" href=\"https://github.com/harrisiirak/cron-parser\" target=\"_blank\">cron 文档</a>.",
|
||||
"settings_ping_interval_title": "Ping 间隔",
|
||||
"settings_upsnap_version": "UpSnap 版本",
|
||||
"settings_website_title_desc": "设置在浏览器选项卡和网站中显示标题",
|
||||
"settings_website_title_title": "网站标题",
|
||||
"toasts_admin_saved": "账户信息已保存",
|
||||
"toasts_device_created": "已创建 {device}",
|
||||
"toasts_device_deleted": "已删除 {device}",
|
||||
"toasts_device_updated": "已更新 {device}",
|
||||
"toasts_devices_created_multiple": "已创建 {count} 个设备",
|
||||
"toasts_group_created": "已创建组 {group}",
|
||||
"toasts_group_deleted": "已删除组 {group}",
|
||||
"toasts_no_permission": "您没有权限访问 {url}",
|
||||
"toasts_password_changed": "密码已修改, 请重新登录.",
|
||||
"toasts_passwords_missmatch": "两次输入的密码不匹配",
|
||||
"toasts_permissions_created": "用户 {username} 的权限已创建",
|
||||
"toasts_permissions_deleted": "用户 {username} 的权限已删除",
|
||||
"toasts_permissions_updated_personal": "您的权限已更新",
|
||||
"toasts_permissions_updated": "用户 {username} 的权限已更新",
|
||||
"toasts_settings_saved": "设置已保存",
|
||||
"toasts_user_created": "用户 {username} 已创建",
|
||||
"toasts_user_deleted": "用户 {username} 已删除",
|
||||
"toasts_user_saved": "账户信息已保存",
|
||||
"users_allow_create_devices": "允许 {username} 创建新设备和编辑设备组",
|
||||
"users_confirm_delete_desc": "您确定要删除 {username} 吗?",
|
||||
"users_confirm_delete_title": "确认删除",
|
||||
"users_create_new_device": "创建新设备",
|
||||
"users_create_new_user": "新增用户",
|
||||
"users_delete": "删除",
|
||||
"users_device_permissions": "设备权限",
|
||||
"users_page_title": "用户",
|
||||
"users_password_confirm": "确认密码",
|
||||
"users_password": "密码",
|
||||
"users_power": "电源",
|
||||
"users_read": "查看",
|
||||
"users_required_field": "必填字段",
|
||||
"users_toggle": "全选",
|
||||
"users_update": "更新",
|
||||
"users_username": "用户名",
|
||||
"welcome_not_expected_back": "返回",
|
||||
"welcome_not_expected_desc": "您已经完成了设置, 无需再次设置",
|
||||
"welcome_not_expected_title": "意料之外! 🧐",
|
||||
"welcome_progress_step1": "欢迎",
|
||||
"welcome_progress_step2": "创建账号",
|
||||
"welcome_progress_step3": "完成",
|
||||
"welcome_step1_page_title": "欢迎使用 UpSnap 🥳",
|
||||
"welcome_step1_setup_btn_next": "下一步",
|
||||
"welcome_step1_setup_desc": "初次使用, 请依照指示完成下列步骤.",
|
||||
"welcome_step2_btn_create": "创建",
|
||||
"welcome_step2_label_email": "邮箱:",
|
||||
"welcome_step2_label_min_chars": "请输入至少10个字符",
|
||||
"welcome_step2_label_password_confirm": "确认密码:",
|
||||
"welcome_step2_label_password": "密码:",
|
||||
"welcome_step2_page_title": "创建管理员账号",
|
||||
"welcome_step3_btn_done": "开始使用!",
|
||||
"welcome_step3_page_desc": "继续向您的仪表板添加一些设备.",
|
||||
"welcome_step3_page_title": "一切就绪! 🎉"
|
||||
}
|
||||
@@ -3,7 +3,7 @@
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm-run-all --parallel vite typesafe-i18n",
|
||||
"dev": "vite dev",
|
||||
"vite": "vite dev",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
@@ -12,11 +12,13 @@
|
||||
"lint": "eslint --fix --cache .",
|
||||
"format": "prettier --write --cache --cache-strategy content --ignore-path ../.gitignore .",
|
||||
"prepare": "cd .. && husky frontend/.husky",
|
||||
"typesafe-i18n": "typesafe-i18n"
|
||||
"machine-translate": "inlang machine translate --project project.inlang"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/compat": "^1.2.7",
|
||||
"@eslint/js": "^9.21.0",
|
||||
"@inlang/cli": "^3.0.0",
|
||||
"@inlang/paraglide-js": "2.0.0-beta.26",
|
||||
"@sveltejs/adapter-static": "^3.0.8",
|
||||
"@sveltejs/kit": "^2.18.0",
|
||||
"@sveltejs/vite-plugin-svelte": "^5.0.3",
|
||||
@@ -47,13 +49,11 @@
|
||||
"@tailwindcss/postcss": "^4.0.9",
|
||||
"cron-parser": "^4.9.0",
|
||||
"date-fns": "^4.1.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"pocketbase": "^0.25.2",
|
||||
"postcss": "^8.5.3",
|
||||
"svelte-fa": "^4.0.3",
|
||||
"svelte-french-toast": "2.0.0-alpha.0",
|
||||
"theme-change": "^2.5.0",
|
||||
"typesafe-i18n": "^5.26.2"
|
||||
"theme-change": "^2.5.0"
|
||||
},
|
||||
"pnpm": {
|
||||
"onlyBuiltDependencies": [
|
||||
|
||||
1764
frontend/pnpm-lock.yaml
generated
1764
frontend/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
1
frontend/project.inlang/.gitignore
vendored
Normal file
1
frontend/project.inlang/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
cache
|
||||
1
frontend/project.inlang/project_id
Normal file
1
frontend/project.inlang/project_id
Normal file
@@ -0,0 +1 @@
|
||||
StfXY3tZWvr4FQntlM
|
||||
13
frontend/project.inlang/settings.json
Normal file
13
frontend/project.inlang/settings.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"$schema": "https://inlang.com/schema/project-settings",
|
||||
"baseLocale": "en",
|
||||
"locales": ["en", "de", "es", "fr", "id", "it", "ja", "nl", "pl", "pt", "zh-TW", "zh"],
|
||||
"modules": [
|
||||
"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@4/dist/index.js",
|
||||
"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@2/dist/index.js"
|
||||
],
|
||||
"plugin.inlang.messageFormat": {
|
||||
"pathPattern": "./messages/{locale}.json"
|
||||
},
|
||||
"telemetry": "off"
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<html lang="%lang%">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width" />
|
||||
|
||||
14
frontend/src/hooks.server.ts
Normal file
14
frontend/src/hooks.server.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
import { paraglideMiddleware } from '$lib/paraglide/server';
|
||||
import { localeStore } from '$lib/stores/locale';
|
||||
import type { Handle } from '@sveltejs/kit';
|
||||
|
||||
// creating a handle to use the paraglide middleware
|
||||
const paraglideHandle: Handle = ({ event, resolve }) =>
|
||||
paraglideMiddleware(event.request, ({ locale }) => {
|
||||
localeStore.set(locale);
|
||||
return resolve(event, {
|
||||
transformPageChunk: ({ html }) => html.replace('%lang%', locale)
|
||||
});
|
||||
});
|
||||
|
||||
export const handle: Handle = paraglideHandle;
|
||||
6
frontend/src/hooks.ts
Normal file
6
frontend/src/hooks.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
import { deLocalizeUrl } from '$lib/paraglide/runtime';
|
||||
import type { Reroute } from '@sveltejs/kit';
|
||||
|
||||
export const reroute: Reroute = (request) => {
|
||||
return deLocalizeUrl(request.url).pathname;
|
||||
};
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { parseCron } from '$lib/helpers/cron';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { dateFnsLocale } from '$lib/stores/locale';
|
||||
import { backendUrl, permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { type Device } from '$lib/types/device';
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
$: moreButtons = [
|
||||
{
|
||||
text: $LL.device.card_btn_more_sleep(),
|
||||
text: m.device_card_btn_more_sleep(),
|
||||
icon: faBed,
|
||||
onClick: () => sleep(),
|
||||
requires:
|
||||
@@ -34,7 +34,7 @@
|
||||
device.sol_enabled
|
||||
},
|
||||
{
|
||||
text: $LL.device.card_btn_more_reboot(),
|
||||
text: m.device_card_btn_more_reboot(),
|
||||
icon: faRotateLeft,
|
||||
onClick: () => askRebootConfirmation(),
|
||||
requires:
|
||||
@@ -43,7 +43,7 @@
|
||||
device.shutdown_cmd !== ''
|
||||
},
|
||||
{
|
||||
text: $LL.device.card_btn_more_edit(),
|
||||
text: m.device_card_btn_more_edit(),
|
||||
icon: faPen,
|
||||
onClick: () => goto(`/device/${device.id}`),
|
||||
requires: $pocketbase.authStore.isSuperuser || $permission.update?.includes(device.id)
|
||||
@@ -107,22 +107,22 @@
|
||||
{#if device.wake_cron_enabled || device.shutdown_cron_enabled || device.password}
|
||||
<div class="mt-1 flex flex-row flex-wrap gap-2">
|
||||
{#if device.wake_cron_enabled}
|
||||
<div class="tooltip" data-tip={$LL.device.card_tooltip_wake_cron()}>
|
||||
<div class="tooltip" data-tip={m.device_card_tooltip_wake_cron()}>
|
||||
<span class="badge badge-success gap-1 p-3"
|
||||
><Fa icon={faCircleArrowUp} />{parseCron(device.wake_cron, now)}</span
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
{#if device.shutdown_cron_enabled}
|
||||
<div class="tooltip" data-tip={$LL.device.card_tooltip_shutdown_cron()}>
|
||||
<div class="tooltip" data-tip={m.device_card_tooltip_shutdown_cron()}>
|
||||
<span class="badge badge-error gap-1 p-3"
|
||||
><Fa icon={faCircleArrowDown} />{parseCron(device.shutdown_cron, now)}</span
|
||||
>
|
||||
</div>
|
||||
{/if}
|
||||
{#if device.password}
|
||||
<div class="tooltip" data-tip={$LL.device.card_tooltip_wake_password()}>
|
||||
<span class="badge gap-1 p-3"><Fa icon={faLock} />{$LL.device.card_password()}</span>
|
||||
<div class="tooltip" data-tip={m.device_card_tooltip_wake_password()}>
|
||||
<span class="badge gap-1 p-3"><Fa icon={faLock} />{m.device_card_password()}</span>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
@@ -130,7 +130,7 @@
|
||||
<div class="card-actions mt-auto items-center">
|
||||
<span
|
||||
class="tooltip"
|
||||
data-tip="{$LL.device.card_tooltip_last_status_change()}: {device.updated}"
|
||||
data-tip="{m.device_card_tooltip_last_status_change()}: {device.updated}"
|
||||
>
|
||||
{formatDistance(parseISO(device.updated), now, {
|
||||
includeSeconds: true,
|
||||
@@ -158,13 +158,13 @@
|
||||
<dialog class="modal" bind:this={modalReboot}>
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">
|
||||
{$LL.device.modal_confirm_shutdown_title({ device: device.name })}
|
||||
{m.device_modal_confirm_shutdown_title({ device: device.name })}
|
||||
</h3>
|
||||
<p class="py-4">{$LL.device.modal_confirm_shutdown_desc({ device: device.name })}</p>
|
||||
<p class="py-4">{m.device_modal_confirm_shutdown_desc({ device: device.name })}</p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">{$LL.buttons.cancel()}</button>
|
||||
<button class="btn btn-success" on:click={reboot}>{$LL.buttons.confirm()}</button>
|
||||
<button class="btn">{m.buttons_cancel()}</button>
|
||||
<button class="btn btn-success" on:click={reboot}>{m.buttons_confirm()}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { backendUrl, permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device } from '$lib/types/device';
|
||||
import { faPowerOff } from '@fortawesome/free-solid-svg-icons';
|
||||
@@ -22,25 +22,25 @@
|
||||
$: seconds = timeout % 60;
|
||||
$: if (device.status === 'pending' || device.status === '') {
|
||||
disabled = true;
|
||||
hoverText = $LL.device.card_nic_tooltip_pending();
|
||||
hoverText = m.device_card_nic_tooltip_pending();
|
||||
} else if (device.status === 'online') {
|
||||
if (device.shutdown_cmd === '') {
|
||||
disabled = true;
|
||||
hoverText = $LL.device.card_nic_tooltip_shutdown_no_cmd();
|
||||
hoverText = m.device_card_nic_tooltip_shutdown_no_cmd();
|
||||
} else if (!$pocketbase.authStore.isSuperuser && !$permission.power?.includes(device.id)) {
|
||||
disabled = true;
|
||||
hoverText = $LL.device.card_nic_tooltip_shutdown_no_permission();
|
||||
hoverText = m.device_card_nic_tooltip_shutdown_no_permission();
|
||||
} else {
|
||||
disabled = false;
|
||||
hoverText = $LL.device.card_nic_tooltip_shutdown();
|
||||
hoverText = m.device_card_nic_tooltip_shutdown();
|
||||
}
|
||||
} else if (device.status === 'offline') {
|
||||
if (!$pocketbase.authStore.isSuperuser && !$permission.power?.includes(device.id)) {
|
||||
disabled = true;
|
||||
hoverText = $LL.device.card_nic_tooltip_power_no_permission();
|
||||
hoverText = m.device_card_nic_tooltip_power_no_permission();
|
||||
} else {
|
||||
disabled = false;
|
||||
hoverText = $LL.device.card_nic_tooltip_power();
|
||||
hoverText = m.device_card_nic_tooltip_power();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,7 +55,6 @@
|
||||
device = data as Device;
|
||||
await countdown(Date.parse(device.updated));
|
||||
if (device.status === 'online' && device.link && device.link_open !== '') {
|
||||
console.log('here');
|
||||
if (device.link_open === 'new_tab') {
|
||||
window.open(device.link, '_blank');
|
||||
} else {
|
||||
@@ -199,13 +198,13 @@
|
||||
<dialog class="modal" bind:this={modalWake}>
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">
|
||||
{$LL.device.modal_confirm_wake_title({ device: device.name })}
|
||||
{m.device_modal_confirm_wake_title({ device: device.name })}
|
||||
</h3>
|
||||
<p class="py-4">{$LL.device.modal_confirm_wake_desc({ device: device.name })}</p>
|
||||
<p class="py-4">{m.device_modal_confirm_wake_desc({ device: device.name })}</p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">{$LL.buttons.cancel()}</button>
|
||||
<button class="btn btn-success" on:click={wake}>{$LL.buttons.confirm()}</button>
|
||||
<button class="btn">{m.buttons_cancel()}</button>
|
||||
<button class="btn btn-success" on:click={wake}>{m.buttons_confirm()}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
@@ -214,13 +213,13 @@
|
||||
<dialog class="modal" bind:this={modalShutdown}>
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">
|
||||
{$LL.device.modal_confirm_shutdown_title({ device: device.name })}
|
||||
{m.device_modal_confirm_shutdown_title({ device: device.name })}
|
||||
</h3>
|
||||
<p class="py-4">{$LL.device.modal_confirm_shutdown_desc({ device: device.name })}</p>
|
||||
<p class="py-4">{m.device_modal_confirm_shutdown_desc({ device: device.name })}</p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">{$LL.buttons.cancel()}</button>
|
||||
<button class="btn btn-success" on:click={shutdown}>{$LL.buttons.confirm()}</button>
|
||||
<button class="btn">{m.buttons_cancel()}</button>
|
||||
<button class="btn btn-success" on:click={shutdown}>{m.buttons_confirm()}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { goto } from '$app/navigation';
|
||||
import DeviceFormPort from '$lib/components/DeviceFormPort.svelte';
|
||||
import { cronRegex, parseCron } from '$lib/helpers/cron';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device, Group, Port } from '$lib/types/device';
|
||||
import { faSave, faTrash, faX } from '@fortawesome/free-solid-svg-icons';
|
||||
@@ -28,7 +28,7 @@
|
||||
(!cronRegex.test(device.wake_cron) ||
|
||||
Object.keys(cronParser.parseString(device.wake_cron).errors).length > 0)
|
||||
) {
|
||||
toast.error($LL.settings.invalid_cron());
|
||||
toast.error(m.settings_invalid_cron());
|
||||
throw new Error('wake_cron not valid');
|
||||
}
|
||||
if (
|
||||
@@ -36,7 +36,7 @@
|
||||
(!cronRegex.test(device.shutdown_cron) ||
|
||||
Object.keys(cronParser.parseString(device.shutdown_cron).errors).length > 0)
|
||||
) {
|
||||
toast.error($LL.settings.invalid_cron());
|
||||
toast.error(m.settings_invalid_cron());
|
||||
throw new Error('shutdown_cron not valid');
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
.collection('devices')
|
||||
.update(device.id, device)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.device_updated({ device: device.name }));
|
||||
toast.success(m.toasts_device_updated({ device: device.name }));
|
||||
goto('/');
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -87,7 +87,7 @@
|
||||
.collection('devices')
|
||||
.create(device)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.device_created({ device: device.name }));
|
||||
toast.success(m.toasts_device_created({ device: device.name }));
|
||||
goto('/');
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -130,7 +130,7 @@
|
||||
.collection('devices')
|
||||
.delete(device.id)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.device_deleted({ device: device.name }));
|
||||
toast.success(m.toasts_device_deleted({ device: device.name }));
|
||||
goto('/');
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -161,7 +161,7 @@
|
||||
})
|
||||
.then((res) => {
|
||||
deviceGroups = [...deviceGroups, res as Group];
|
||||
toast.success($LL.toasts.group_created({ group: newGroup }));
|
||||
toast.success(m.toasts_group_created({ group: newGroup }));
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -179,7 +179,7 @@
|
||||
.delete(group.id)
|
||||
.then(async () => {
|
||||
await getGroups();
|
||||
toast.success($LL.toasts.group_deleted({ group: group.name }));
|
||||
toast.success(m.toasts_group_deleted({ group: group.name }));
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -200,14 +200,14 @@
|
||||
<form on:submit|preventDefault={save}>
|
||||
<div class="card bg-base-200 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.general()}</h2>
|
||||
<h2 class="card-title">{m.device_general()}</h2>
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-4">
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.general_name()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_general_name()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.general_name()}
|
||||
placeholder={m.device_general_name()}
|
||||
class="input"
|
||||
bind:value={device.name}
|
||||
required
|
||||
@@ -216,10 +216,10 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.general_ip()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_general_ip()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.general_ip()}
|
||||
placeholder={m.device_general_ip()}
|
||||
class="input"
|
||||
bind:value={device.ip}
|
||||
required
|
||||
@@ -228,10 +228,10 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.general_mac()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_general_mac()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.general_mac()}
|
||||
placeholder={m.device_general_mac()}
|
||||
class="input"
|
||||
bind:value={device.mac}
|
||||
required
|
||||
@@ -240,10 +240,10 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.general_netmask()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_general_netmask()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.general_netmask()}
|
||||
placeholder={m.device_general_netmask()}
|
||||
class="input"
|
||||
bind:value={device.netmask}
|
||||
required
|
||||
@@ -252,23 +252,23 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.general_description()}</span>
|
||||
<span>{m.device_general_description()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.general_description()}
|
||||
placeholder={m.device_general_description()}
|
||||
class="input"
|
||||
bind:value={device.description}
|
||||
/>
|
||||
</label>
|
||||
</fieldset>
|
||||
<span class="badge text-error self-center">* {$LL.device.general_required_field()}</span>
|
||||
<span class="badge text-error self-center">* {m.device_general_required_field()}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.ports()}</h2>
|
||||
<p>{$LL.device.ports_desc()}</p>
|
||||
<h2 class="card-title">{m.device_ports()}</h2>
|
||||
<p>{m.device_ports_desc()}</p>
|
||||
<div class="w-full">
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
|
||||
<!-- eslint-disable-next-line @typescript-eslint/no-unused-vars -->
|
||||
@@ -279,24 +279,24 @@
|
||||
<button
|
||||
class="btn max-w-xs {device.expand.ports.length > 0 ? 'mt-4' : ''}"
|
||||
on:click={() => createEmptyPort()}
|
||||
type="button">{$LL.device.ports_add_new()}</button
|
||||
type="button">{m.device_ports_add_new()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.link()}</h2>
|
||||
<h2 class="card-title">{m.device_link()}</h2>
|
||||
<p>
|
||||
{$LL.device.link_desc()}
|
||||
{m.device_link_desc()}
|
||||
</p>
|
||||
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4">
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.link()}</span>
|
||||
<span>{m.device_link()}</span>
|
||||
<input
|
||||
type="url"
|
||||
placeholder={$LL.device.link()}
|
||||
placeholder={m.device_link()}
|
||||
class="input"
|
||||
bind:value={device.link}
|
||||
/>
|
||||
@@ -304,11 +304,11 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.link_open()}</span>
|
||||
<span>{m.device_link_open()}</span>
|
||||
<select class="select" bind:value={device.link_open}>
|
||||
<option value="">{$LL.device.link_open_no()}</option>
|
||||
<option value="same_tab">{$LL.device.link_open_same_tab()}</option>
|
||||
<option value="new_tab">{$LL.device.link_open_new_tab()}</option>
|
||||
<option value="">{m.device_link_open_no()}</option>
|
||||
<option value="same_tab">{m.device_link_open_same_tab()}</option>
|
||||
<option value="new_tab">{m.device_link_open_new_tab()}</option>
|
||||
</select>
|
||||
</label>
|
||||
</fieldset>
|
||||
@@ -317,17 +317,17 @@
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.ping()}</h2>
|
||||
<h2 class="card-title">{m.device_ping()}</h2>
|
||||
<p>
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.device.ping_desc()}
|
||||
{@html m.device_ping_desc()}
|
||||
</p>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.ping_cmd()}</span>
|
||||
<span>{m.device_ping_cmd()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.ping_cmd()}
|
||||
placeholder={m.device_ping_cmd()}
|
||||
class="input"
|
||||
bind:value={device.ping_cmd}
|
||||
/>
|
||||
@@ -337,18 +337,18 @@
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.wake()}</h2>
|
||||
<h2 class="card-title">{m.device_wake()}</h2>
|
||||
<p>
|
||||
{$LL.device.wake_desc()}
|
||||
{m.device_wake_desc()}
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.settings.ping_interval_desc2()}
|
||||
{@html m.settings_ping_interval_desc2()}
|
||||
</p>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.wake_cmd()}</span>
|
||||
<span>{m.device_wake_cmd()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.wake_cmd()}
|
||||
placeholder={m.device_wake_cmd()}
|
||||
class="input"
|
||||
bind:value={device.wake_cmd}
|
||||
/>
|
||||
@@ -356,25 +356,25 @@
|
||||
</fieldset>
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.wake_cron_enable()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_wake_cron_enable()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={device.wake_cron_enabled}
|
||||
class="toggle toggle-success"
|
||||
/>
|
||||
{$LL.device.wake_cron_enable()}
|
||||
{m.device_wake_cron_enable()}
|
||||
</label>
|
||||
<label class="floating-label mt-2">
|
||||
<span
|
||||
>{$LL.device.wake_cron()}
|
||||
>{m.device_wake_cron()}
|
||||
{#if device.wake_cron_enabled}
|
||||
<span class="text-error">*</span>
|
||||
{/if}
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.wake_cron()}
|
||||
placeholder={m.device_wake_cron()}
|
||||
class="input"
|
||||
bind:value={device.wake_cron}
|
||||
disabled={!device.wake_cron_enabled}
|
||||
@@ -386,14 +386,14 @@
|
||||
</label>
|
||||
</fieldset>
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.require_confirmation()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_require_confirmation()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={device.wake_confirm}
|
||||
class="toggle toggle-success"
|
||||
/>
|
||||
{$LL.device.require_confirmation()}
|
||||
{m.device_require_confirmation()}
|
||||
</label>
|
||||
</fieldset>
|
||||
</div>
|
||||
@@ -405,29 +405,29 @@
|
||||
<h2 class="card-title">Sleep-On-LAN</h2>
|
||||
<p>
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.device.sol_desc1()}
|
||||
{@html m.device_sol_desc1()}
|
||||
</p>
|
||||
<p>
|
||||
{$LL.device.sol_desc2()}
|
||||
{m.device_sol_desc2()}
|
||||
</p>
|
||||
<p class="font-bold">
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.device.sol_desc3()}
|
||||
{@html m.device_sol_desc3()}
|
||||
</p>
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.sol_enable()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_sol_enable()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={device.sol_enabled}
|
||||
class="toggle toggle-success"
|
||||
/>
|
||||
{$LL.device.sol_enable()}
|
||||
{m.device_sol_enable()}
|
||||
</label>
|
||||
<label class="floating-label mt-2">
|
||||
<span
|
||||
>{$LL.device.sol_port()}
|
||||
>{m.device_sol_port()}
|
||||
{#if device.sol_enabled}
|
||||
<span class="text-error">*</span>
|
||||
{/if}
|
||||
@@ -437,7 +437,7 @@
|
||||
type="number"
|
||||
min="1"
|
||||
max="65535"
|
||||
placeholder={$LL.device.sol_port()}
|
||||
placeholder={m.device_sol_port()}
|
||||
bind:value={device.sol_port}
|
||||
disabled={!device.sol_enabled}
|
||||
required={device.sol_enabled}
|
||||
@@ -446,21 +446,21 @@
|
||||
</fieldset>
|
||||
{#if device.sol_enabled}
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.sol_authorization()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_sol_authorization()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input type="checkbox" bind:checked={device.sol_auth} class="toggle toggle-success" />
|
||||
{$LL.device.sol_authorization()}
|
||||
{m.device_sol_authorization()}
|
||||
</label>
|
||||
<label class="floating-label mt-2">
|
||||
<span
|
||||
>{$LL.device.sol_user()}
|
||||
>{m.device_sol_user()}
|
||||
{#if device.sol_auth}
|
||||
<span class="text-error">*</span>
|
||||
{/if}
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.sol_user()}
|
||||
placeholder={m.device_sol_user()}
|
||||
class="input"
|
||||
bind:value={device.sol_user}
|
||||
disabled={!device.sol_auth}
|
||||
@@ -469,14 +469,14 @@
|
||||
</label>
|
||||
<label class="floating-label mt-2">
|
||||
<span
|
||||
>{$LL.device.sol_password()}
|
||||
>{m.device_sol_password()}
|
||||
{#if device.sol_auth}
|
||||
<span class="text-error">*</span>
|
||||
{/if}
|
||||
</span>
|
||||
<input
|
||||
type="password"
|
||||
placeholder={$LL.device.sol_password()}
|
||||
placeholder={m.device_sol_password()}
|
||||
class="input"
|
||||
bind:value={device.sol_passwort}
|
||||
disabled={!device.sol_auth}
|
||||
@@ -491,61 +491,60 @@
|
||||
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.shutdown()}</h2>
|
||||
<h2 class="card-title">{m.device_shutdown()}</h2>
|
||||
<p>
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.device.shutdown_desc()}
|
||||
{@html m.device_shutdown_desc()}
|
||||
</p>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.shutdown_cmd()}</span>
|
||||
<span>{m.device_shutdown_cmd()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.shutdown_cmd()}
|
||||
placeholder={m.device_shutdown_cmd()}
|
||||
class="input"
|
||||
bind:value={device.shutdown_cmd}
|
||||
/>
|
||||
</label>
|
||||
</fieldset>
|
||||
<p class="font-bold">{$LL.device.shutdown_examples()}</p>
|
||||
<p class="font-bold">{m.device_shutdown_examples()}</p>
|
||||
<div class="mockup-code max-w-fit min-w-0 text-sm">
|
||||
<pre data-prefix="#" class="italic"><code>{$LL.device.shutdown_examples_windows()}</code
|
||||
<pre data-prefix="#" class="italic"><code>{m.device_shutdown_examples_windows()}</code
|
||||
></pre>
|
||||
<pre data-prefix="$" class="text-warning"><code
|
||||
>net rpc shutdown -I 192.168.1.13 -U "user%password"</code
|
||||
></pre>
|
||||
</div>
|
||||
<div class="mockup-code max-w-fit min-w-0 text-sm">
|
||||
<pre data-prefix="#" class="italic"><code>{$LL.device.shutdown_examples_linux()}</code
|
||||
></pre>
|
||||
<pre data-prefix="#" class="italic"><code>{m.device_shutdown_examples_linux()}</code></pre>
|
||||
<pre data-prefix="$" class="text-warning"><code
|
||||
>sshpass -p password ssh -o "StrictHostKeyChecking=no" user@192.168.1.13 "sudo poweroff"</code
|
||||
></pre>
|
||||
</div>
|
||||
<p>
|
||||
{$LL.device.shutdown_cron_desc()}
|
||||
{m.device_shutdown_cron_desc()}
|
||||
</p>
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.shutdown_cron_enable()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_shutdown_cron_enable()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={device.shutdown_cron_enabled}
|
||||
class="toggle toggle-success"
|
||||
/>
|
||||
{$LL.device.shutdown_cron_enable()}
|
||||
{m.device_shutdown_cron_enable()}
|
||||
</label>
|
||||
<label class="floating-label mt-2">
|
||||
<span
|
||||
>{$LL.device.shutdown_cron()}
|
||||
>{m.device_shutdown_cron()}
|
||||
{#if device.shutdown_cron_enabled}
|
||||
<span class="text-error">*</span>
|
||||
{/if}
|
||||
</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.shutdown_cron()}
|
||||
placeholder={m.device_shutdown_cron()}
|
||||
class="input validator"
|
||||
bind:value={device.shutdown_cron}
|
||||
disabled={!device.shutdown_cron_enabled}
|
||||
@@ -557,14 +556,14 @@
|
||||
</label>
|
||||
</fieldset>
|
||||
<fieldset class="fieldset bg-base-100 border-base-300 rounded-box w-64 border p-4">
|
||||
<legend class="fieldset-legend">{$LL.device.require_confirmation()}</legend>
|
||||
<legend class="fieldset-legend">{m.device_require_confirmation()}</legend>
|
||||
<label class="fieldset-label">
|
||||
<input
|
||||
type="checkbox"
|
||||
bind:checked={device.shutdown_confirm}
|
||||
class="toggle toggle-success"
|
||||
/>
|
||||
{$LL.device.require_confirmation()}
|
||||
{m.device_require_confirmation()}
|
||||
</label>
|
||||
</fieldset>
|
||||
</div>
|
||||
@@ -573,17 +572,17 @@
|
||||
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.password()}</h2>
|
||||
<h2 class="card-title">{m.device_password()}</h2>
|
||||
<p>
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.device.password_desc()}
|
||||
{@html m.device_password_desc()}
|
||||
</p>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label mt-2">
|
||||
<span>{$LL.device.password()}</span>
|
||||
<span>{m.device_password()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.password()}
|
||||
placeholder={m.device_password()}
|
||||
class="input"
|
||||
maxlength="6"
|
||||
bind:value={device.password}
|
||||
@@ -594,9 +593,9 @@
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.groups()}</h2>
|
||||
<h2 class="card-title">{m.device_groups()}</h2>
|
||||
<p>
|
||||
{$LL.device.groups_desc()}
|
||||
{m.device_groups_desc()}
|
||||
</p>
|
||||
<div class="flex flex-row flex-wrap gap-2">
|
||||
{#each deviceGroups as group}
|
||||
@@ -626,12 +625,12 @@
|
||||
<div class="join">
|
||||
<input
|
||||
class="input join-item"
|
||||
placeholder={$LL.device.groups_placeholder()}
|
||||
placeholder={m.device_groups_placeholder()}
|
||||
type="text"
|
||||
bind:value={newGroup}
|
||||
/>
|
||||
<button class="btn btn-neutral join-item" type="button" on:click={() => addGroup()}
|
||||
>{$LL.buttons.add()}</button
|
||||
>{m.buttons_add()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -639,21 +638,20 @@
|
||||
<div class="card-actions mt-6 justify-end gap-4">
|
||||
{#if $pocketbase.authStore.isSuperuser || $permission.delete?.includes(device.id)}
|
||||
<button class="btn btn-error" type="button" on:click={() => deleteModal.showModal()}
|
||||
><Fa icon={faTrash} />{$LL.buttons.delete()}</button
|
||||
><Fa icon={faTrash} />{m.buttons_delete()}</button
|
||||
>
|
||||
{/if}
|
||||
<button class="btn btn-success" type="submit"><Fa icon={faSave} />{$LL.buttons.save()}</button>
|
||||
<button class="btn btn-success" type="submit"><Fa icon={faSave} />{m.buttons_save()}</button>
|
||||
</div>
|
||||
</form>
|
||||
<dialog class="modal" bind:this={deleteModal}>
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">{$LL.users.confirm_delete_title()}</h3>
|
||||
<p class="py-4">{$LL.users.confirm_delete_desc({ username: device.name })}</p>
|
||||
<h3 class="text-lg font-bold">{m.users_confirm_delete_title()}</h3>
|
||||
<p class="py-4">{m.users_confirm_delete_desc({ username: device.name })}</p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">{$LL.buttons.cancel()}</button>
|
||||
<button class="btn btn-error" on:click={() => deleteDevice()}>{$LL.buttons.delete()}</button
|
||||
>
|
||||
<button class="btn">{m.buttons_cancel()}</button>
|
||||
<button class="btn btn-error" on:click={() => deleteDevice()}>{m.buttons_delete()}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device, Port } from '$lib/types/device';
|
||||
import { faTrash } from '@fortawesome/free-solid-svg-icons';
|
||||
@@ -32,10 +32,10 @@
|
||||
<div class="flex flex-row gap-2">
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label">
|
||||
<span>{$LL.device.ports_name()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_ports_name()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.ports_name()}
|
||||
placeholder={m.device_ports_name()}
|
||||
class="input"
|
||||
required
|
||||
bind:value={device.expand.ports[index].name}
|
||||
@@ -44,10 +44,10 @@
|
||||
</fieldset>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label">
|
||||
<span>{$LL.device.ports_number()} <span class="text-error">*</span></span>
|
||||
<span>{m.device_ports_number()} <span class="text-error">*</span></span>
|
||||
<input
|
||||
type="number"
|
||||
placeholder={$LL.device.ports_number()}
|
||||
placeholder={m.device_ports_number()}
|
||||
class="input"
|
||||
min="1"
|
||||
max="65535"
|
||||
@@ -59,10 +59,10 @@
|
||||
</div>
|
||||
<fieldset class="fieldset">
|
||||
<label class="floating-label">
|
||||
<span>{$LL.device.link()}</span>
|
||||
<span>{m.device_link()}</span>
|
||||
<input
|
||||
type="text"
|
||||
placeholder={$LL.device.link()}
|
||||
placeholder={m.device_link()}
|
||||
class="input"
|
||||
bind:value={device.expand.ports[index].link}
|
||||
/>
|
||||
@@ -71,7 +71,7 @@
|
||||
<button
|
||||
class="btn btn-error btn-xs btn-soft ms-auto"
|
||||
on:click={() => deletePort(device.expand.ports[index])}
|
||||
type="button"><Fa icon={faTrash} />{$LL.buttons.delete()}</button
|
||||
type="button"><Fa icon={faTrash} />{m.buttons_delete()}</button
|
||||
>
|
||||
</fieldset>
|
||||
{/if}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { backendUrl, permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPub } from '$lib/stores/settings';
|
||||
import {
|
||||
@@ -111,7 +111,7 @@
|
||||
{/if}
|
||||
<li>
|
||||
<a href="/" class="px-4 py-2" class:active={$page.url.pathname === '/'}
|
||||
><Fa icon={faHome} />{$LL.home.page_title()}</a
|
||||
><Fa icon={faHome} />{m.home_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
{#if $pocketbase.authStore.isSuperuser}
|
||||
@@ -120,7 +120,7 @@
|
||||
href="/users"
|
||||
class="px-4 py-2"
|
||||
class:active={$page.url.pathname.startsWith('/users')}
|
||||
><Fa icon={faUsersGear} />{$LL.users.page_title()}</a
|
||||
><Fa icon={faUsersGear} />{m.users_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
<li>
|
||||
@@ -128,7 +128,7 @@
|
||||
href="/settings/"
|
||||
class="px-4 py-2"
|
||||
class:active={$page.url.pathname.startsWith('/settings')}
|
||||
><Fa icon={faCog} />{$LL.settings.page_title()}</a
|
||||
><Fa icon={faCog} />{m.settings_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
{/if}
|
||||
@@ -186,13 +186,13 @@
|
||||
<ul class="menu menu-horizontal h-full gap-1 px-1">
|
||||
<li class="h-full">
|
||||
<a href="/" class="p-2" class:menu-active={$page.url.pathname === '/'}
|
||||
><Fa icon={faHome} />{$LL.home.page_title()}</a
|
||||
><Fa icon={faHome} />{m.home_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
{#if $pocketbase.authStore.isSuperuser}
|
||||
<li class="h-full">
|
||||
<a href="/users" class="p-2" class:menu-active={$page.url.pathname.startsWith('/users')}
|
||||
><Fa icon={faUsersGear} />{$LL.users.page_title()}</a
|
||||
><Fa icon={faUsersGear} />{m.users_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
<li class="h-full">
|
||||
@@ -200,14 +200,14 @@
|
||||
href="/settings/"
|
||||
class="p-2"
|
||||
class:menu-active={$page.url.pathname.startsWith('/settings')}
|
||||
><Fa icon={faCog} />{$LL.settings.page_title()}</a
|
||||
><Fa icon={faCog} />{m.settings_page_title()}</a
|
||||
>
|
||||
</li>
|
||||
{/if}
|
||||
<div class="dropdown dropdown-end">
|
||||
<button class="btn btn-ghost hover:bg-base-content/10 h-full border-0 p-2">
|
||||
<Fa icon={faSwatchbook} />
|
||||
<span class="font-normal">{$LL.navbar.theme()}</span>
|
||||
<span class="font-normal">{m.navbar_theme()}</span>
|
||||
<Fa icon={faChevronDown} />
|
||||
</button>
|
||||
<div class="dropdown-content bg-base-200 rounded-box z-1 mt-3 w-52 shadow-sm">
|
||||
@@ -244,7 +244,7 @@
|
||||
{#if $pocketbase.authStore.isSuperuser || $permission.create}
|
||||
<a class="btn btn-success me-4" href="/device/new">
|
||||
<Fa icon={faPlus} />
|
||||
{$LL.navbar.new()}
|
||||
{m.navbar_new()}
|
||||
</a>
|
||||
{/if}
|
||||
<div class="dropdown dropdown-end">
|
||||
@@ -263,11 +263,11 @@
|
||||
: $pocketbase.authStore.record?.username}
|
||||
</li>
|
||||
<li>
|
||||
<a href="/account"><Fa icon={faUserGear} />{$LL.navbar.edit_account()}</a>
|
||||
<a href="/account"><Fa icon={faUserGear} />{m.navbar_edit_account()}</a>
|
||||
</li>
|
||||
<li>
|
||||
<div on:click={async () => logout()} on:keydown={async () => logout()} role="none">
|
||||
<Fa icon={faDoorOpen} />{$LL.navbar.logout()}
|
||||
<Fa icon={faDoorOpen} />{m.navbar_logout()}
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import PageLoading from '$lib/components/PageLoading.svelte';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { backendUrl, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPriv } from '$lib/stores/settings';
|
||||
import type { Device } from '$lib/types/device';
|
||||
@@ -48,7 +48,7 @@
|
||||
})
|
||||
.then((res) => {
|
||||
settingsPriv.set(res as SettingsPrivate);
|
||||
toast.success($LL.device.network_scan_range_saved());
|
||||
toast.success(m.device_network_scan_range_saved());
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -90,7 +90,7 @@
|
||||
async function addSingle(device: ScannedDevice) {
|
||||
await createDevice(device)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.device_created({ device: device.name }));
|
||||
toast.success(m.toasts_device_created({ device: device.name }));
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -111,7 +111,7 @@
|
||||
});
|
||||
})
|
||||
);
|
||||
toast.success($LL.toasts.devices_created_multiple({ count: count }));
|
||||
toast.success(m.toasts_devices_created_multiple({ count: count }));
|
||||
goto('/');
|
||||
}
|
||||
</script>
|
||||
@@ -119,14 +119,14 @@
|
||||
{#if $settingsPriv}
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.device.tabs[1]()}</h2>
|
||||
<h2 class="card-title">{m['device_tabs.1']()}</h2>
|
||||
<p class="my-2">
|
||||
{$LL.device.network_scan_desc()}
|
||||
{m.device_network_scan_desc()}
|
||||
</p>
|
||||
<div class="flex flex-row flex-wrap items-end gap-4">
|
||||
<form on:submit|preventDefault={saveSettings}>
|
||||
<label class="label" for="scan-range">
|
||||
<span>{$LL.device.network_scan_ip_range()}</span>
|
||||
<span>{m.device_network_scan_ip_range()}</span>
|
||||
</label>
|
||||
<div class="join max-w-xs">
|
||||
<input
|
||||
@@ -136,7 +136,7 @@
|
||||
placeholder="192.168.1.0/24"
|
||||
bind:value={scanRange}
|
||||
/>
|
||||
<button class="btn btn-neutral join-item" type="submit">{$LL.buttons.save()}</button>
|
||||
<button class="btn btn-neutral join-item" type="submit">{m.buttons_save()}</button>
|
||||
</div>
|
||||
</form>
|
||||
<div>
|
||||
@@ -144,22 +144,22 @@
|
||||
{#if !$settingsPriv.scan_range}
|
||||
<button class="btn btn-error" disabled>
|
||||
<Fa icon={faX} />
|
||||
{$LL.device.network_scan_no_range()}
|
||||
{m.device_network_scan_no_range()}
|
||||
</button>
|
||||
{:else if scanRange !== $settingsPriv.scan_range}
|
||||
<button class="btn btn-error" disabled>
|
||||
<Fa icon={faX} />
|
||||
{$LL.device.network_scan_unsaved_changes()}
|
||||
{m.device_network_scan_unsaved_changes()}
|
||||
</button>
|
||||
{:else if scanRunning}
|
||||
<button class="btn no-animation">
|
||||
<span class="loading loading-spinner"></span>
|
||||
{$LL.device.network_scan_running()}
|
||||
{m.device_network_scan_running()}
|
||||
</button>
|
||||
{:else}
|
||||
<button class="btn btn-success" on:click={() => scan()}>
|
||||
<Fa icon={faMagnifyingGlass} />
|
||||
{$LL.device.network_scan()}
|
||||
{m.device_network_scan()}
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
@@ -175,20 +175,20 @@
|
||||
<div class="collapse-content">
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
<div>
|
||||
<strong>{$LL.device.network_scan_ip()}</strong><br />
|
||||
<strong>{m.device_network_scan_ip()}</strong><br />
|
||||
{device.ip}
|
||||
</div>
|
||||
<div>
|
||||
<strong>{$LL.device.network_scan_mac()}</strong><br />
|
||||
<strong>{m.device_network_scan_mac()}</strong><br />
|
||||
{device.mac}
|
||||
</div>
|
||||
<div>
|
||||
<strong>{$LL.device.network_scan_mac_vendor()}</strong><br />
|
||||
<strong>{m.device_network_scan_mac_vendor()}</strong><br />
|
||||
{device.mac_vendor}
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<strong>{$LL.device.network_scan_netmask()}</strong><br />
|
||||
<strong>{m.device_network_scan_netmask()}</strong><br />
|
||||
{scanResponse.netmask}
|
||||
</div>
|
||||
<div class="ms-auto">
|
||||
@@ -197,26 +197,25 @@
|
||||
on:click={(e) => {
|
||||
addSingle(device);
|
||||
e.currentTarget.disabled = true;
|
||||
}}><Fa icon={faPlus} />{$LL.buttons.add()}</button
|
||||
}}><Fa icon={faPlus} />{m.buttons_add()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
<h2 class="card-title mt-4">{$LL.device.network_scan_add_all()}</h2>
|
||||
<h2 class="card-title mt-4">{m.device_network_scan_add_all()}</h2>
|
||||
<div class="max-w-fit">
|
||||
<label class="label cursor-pointer">
|
||||
<input type="checkbox" class="checkbox" bind:checked={replaceNetmaskCheckbox} />
|
||||
<span class="ms-2 text-wrap break-words"
|
||||
>{$LL.device.network_scan_replace_netmask()}</span
|
||||
<span class="ms-2 text-wrap break-words">{m.device_network_scan_replace_netmask()}</span
|
||||
>
|
||||
</label>
|
||||
</div>
|
||||
{#if replaceNetmaskCheckbox}
|
||||
<div class="max-w-fit">
|
||||
<label class="label cursor-pointer" for="replaceNetmaskInput">
|
||||
<span class="ms-2">{$LL.device.network_scan_new_netmask()}</span>
|
||||
<span class="ms-2">{m.device_network_scan_new_netmask()}</span>
|
||||
</label>
|
||||
<input
|
||||
id="replaceNetmaskInput"
|
||||
@@ -232,7 +231,7 @@
|
||||
<label class="label cursor-pointer">
|
||||
<input type="checkbox" class="checkbox" bind:checked={addAllCheckbox} />
|
||||
<span class="ms-2 text-wrap break-words"
|
||||
>{$LL.device.network_scan_include_unknown()}</span
|
||||
>{m.device_network_scan_include_unknown()}</span
|
||||
>
|
||||
</label>
|
||||
{#if addAllCheckbox}
|
||||
@@ -242,7 +241,7 @@
|
||||
disabled={scanResponse.devices.length === 0}
|
||||
>
|
||||
<Fa icon={faPlus} />
|
||||
{$LL.device.network_scan_add_all()} ({scanResponse.devices.length})
|
||||
{m.device_network_scan_add_all()} ({scanResponse.devices.length})
|
||||
</button>
|
||||
{:else}
|
||||
<button
|
||||
@@ -251,7 +250,7 @@
|
||||
disabled={scanResponse.devices.filter((dev) => dev.name !== 'Unknown').length === 0}
|
||||
>
|
||||
<Fa icon={faPlus} />
|
||||
{$LL.device.network_scan_add_all()} ({scanResponse.devices.filter(
|
||||
{m.device_network_scan_add_all()} ({scanResponse.devices.filter(
|
||||
(dev) => dev.name !== 'Unknown'
|
||||
).length})
|
||||
</button>
|
||||
@@ -265,7 +264,7 @@
|
||||
disabled={scanResponse.devices.length === 0}
|
||||
>
|
||||
<Fa icon={faPlus} />
|
||||
{$LL.device.network_scan_add_all()} ({scanResponse.devices.length})
|
||||
{m.device_network_scan_add_all()} ({scanResponse.devices.length})
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { dateFnsLocale } from '$lib/stores/locale';
|
||||
import cronParser from 'cron-parser';
|
||||
import { formatDistanceStrict } from 'date-fns';
|
||||
import { formatDistanceStrict, type Locale } from 'date-fns';
|
||||
import { get } from 'svelte/store';
|
||||
|
||||
export const cronRegex = new RegExp(/((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){6})/);
|
||||
@@ -19,10 +19,10 @@ export function parseCron(expression: string, now: number) {
|
||||
const cron = cronParser.parseExpression(expression, {});
|
||||
|
||||
return formatDistanceStrict(cron.next().toISOString(), new Date(now), {
|
||||
locale: get(dateFnsLocale),
|
||||
locale: get(dateFnsLocale) as unknown as Locale,
|
||||
addSuffix: true
|
||||
});
|
||||
} catch {
|
||||
return get(LL).settings.invalid_cron();
|
||||
return m.settings_invalid_cron();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
import de from '../de';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const de_DE = {
|
||||
...(de as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default de_DE;
|
||||
@@ -1,233 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const de = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Home',
|
||||
order_groups: 'Gruppen',
|
||||
order_name: 'Name',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Sortieren',
|
||||
no_devices: 'Keine Geräte.',
|
||||
add_first_device: 'Füge dein erstes Gerät hinzu',
|
||||
grant_permissions:
|
||||
'Bitte frag den Administrator, dir Berechtigungen für bestehende Geräte zu erteilen oder neue Geräte zu erstellen.',
|
||||
search_placeholder: 'Suche nach Geräten'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Account',
|
||||
account_type_admin: 'Admin',
|
||||
account_type_user: 'Benutzer',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Sprache',
|
||||
language_option_auto: 'Automatisch',
|
||||
change_password_title: 'Passwort ändern',
|
||||
change_password_body: 'Nachdem das Passwort geändert wurde, musst du dich neu einloggen.',
|
||||
change_password_label: 'Altes Passwort',
|
||||
change_password_new: 'Neues Password',
|
||||
change_password_confirm: 'Password bestätigen'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Neues Gerät',
|
||||
tabs: ['Manuell', 'Netzwerkscan'],
|
||||
card_btn_more: 'Mehr',
|
||||
card_btn_more_edit: 'Bearbeiten',
|
||||
card_btn_more_sleep: 'Ruhezustand',
|
||||
card_btn_more_reboot: 'Neustart',
|
||||
card_tooltip_wake_cron: 'Einschalten Cron',
|
||||
card_tooltip_shutdown_cron: 'Ausschalten Cron',
|
||||
card_tooltip_wake_password: 'Einschalten Passwort',
|
||||
card_tooltip_last_status_change: 'Letzte Statusänderung',
|
||||
card_password: 'Passwort',
|
||||
card_nic_tooltip_pending: 'Warten',
|
||||
card_nic_tooltip_shutdown: 'Ausschalten',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Kein Ausschaltbefehl gesetzt',
|
||||
card_nic_tooltip_shutdown_no_permission: 'Keine Berechtigung zum ausschalten',
|
||||
card_nic_tooltip_power: 'Einschalten',
|
||||
card_nic_tooltip_power_no_permission: 'Keine Berechtigung zum einschalten',
|
||||
modal_confirm_wake_title: '{device} einschalten?',
|
||||
modal_confirm_wake_desc: 'Bitte bestätigen, um {device} einzuschalten.',
|
||||
modal_confirm_shutdown_title: '{device} herunterfahren?',
|
||||
modal_confirm_shutdown_desc: 'Bitte bestätigen, um {device} herunterzufahren.',
|
||||
general: 'Allgemein',
|
||||
general_name: 'Name',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Netmask',
|
||||
general_description: 'Beschreibung',
|
||||
general_description_placeholder: 'Eine Beschreibung des Geräts',
|
||||
general_required_field: 'Pflichtfeld',
|
||||
ports: 'Ports',
|
||||
ports_desc: 'UpSnap kann auch prüfen, ob bestimmte Ports offen sind.',
|
||||
ports_add_new: 'Port hinzufügen',
|
||||
ports_name: 'Name',
|
||||
ports_number: 'Nummer',
|
||||
link: 'Link',
|
||||
link_desc:
|
||||
'Macht Ihren Gerätenamen zu einem anklickbaren Link, ideal zum Beispiel für die Verknüpfung eines Dashboards.',
|
||||
link_open: 'Automatisch Link öffnen',
|
||||
link_open_no: 'Nein',
|
||||
link_open_same_tab: 'Selber Tab',
|
||||
link_open_new_tab: 'Neuer Tab',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Du kannst einen benutzerdefinierten Shell-Befehl verwenden, um festzustellen, ob das Gerät eingeschaltet ist. Der Befehl sollte einen Exit-Code von <span class="badge">0</span> zurückgeben, um anzuzeigen, dass das Gerät eingeschaltet ist. Jeder andere Exit-Code setzt den Status auf offline.',
|
||||
ping_cmd: 'Eigener Ping-Befehl',
|
||||
wake: 'Einschalten',
|
||||
wake_desc: 'Du kannst das Gerät mit einem Cron-Job einschalten.',
|
||||
wake_cmd: 'Eigener Einschalt-Befehl',
|
||||
wake_cron: 'Cron',
|
||||
wake_cron_enable: 'Aktivieren',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Du kannst Computer mithilfe des Tools <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> in den Ruhezustand versetzen. Sleep-On-LAN (SOL) ist ein externes Tool/Daemon, das auf den PCs arbeitet, die du in den Ruhezustand versetzen möchtest, und stellt einen REST-Endpunkt bereit. Für Anweisungen zur Einrichtung von Sleep-On-LAN verweise bitte auf den Abschnitt <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a>.',
|
||||
sol_desc2:
|
||||
'SOL ist so konfiguriert, dass es Anfragen über HTTP statt über UDP sendet, um eine Autorisierung zu ermöglichen und die Zuverlässigkeit der Anfragen zu erhöhen.',
|
||||
sol_desc3:
|
||||
'Daher stell bitte sicher, dass du <span class="badge">HTTP:<DEINPORT></span> im Abschnitt <span class="badge">Listener</span> der <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL-Konfiguration</a> hinzufügst.',
|
||||
sol_enable: 'Sleep-On-LAN aktivieren',
|
||||
sol_port: 'SOL Port',
|
||||
sol_authorization: 'Authorisierung',
|
||||
sol_user: 'SOL Benutzer',
|
||||
sol_password: 'SOL Passwort',
|
||||
shutdown: 'Ausschalten',
|
||||
shutdown_desc:
|
||||
'Dieser <strong>Shell-Befehl</strong> wird in deinem Container ausgeführt (wenn du Docker verwendest) oder auf deinem Host (wenn du die Binärdatei verwendest). Um zu überprüfen, ob das funktioniert, kannst du den Befehl zuerst im Container oder auf deiner Host-Shell ausführen. Übliche Befehle sind <span class="badge">net rpc</span> für Windows, <span class="badge">sshpass</span> für Linux oder <span class="badge">curl</span> im Allgemeinen, um Webanfragen durchzuführen.',
|
||||
shutdown_examples: 'Beispiele:',
|
||||
shutdown_examples_windows: 'Entfernten Windows PC ausschalten:',
|
||||
shutdown_examples_linux: 'Entfernten Linux PC ausschalten:',
|
||||
shutdown_cmd: 'Befehl zum ausschalten',
|
||||
shutdown_cron_desc:
|
||||
'Genau wie das Einrichten eines Cron-Jobs, um das Gerät aufzuwecken, kannst du auch einen Cron-Job planen, um dieses Gerät herunterzufahren.',
|
||||
shutdown_cron: 'Cron',
|
||||
shutdown_cron_enable: 'Aktivieren',
|
||||
password: 'Password',
|
||||
password_desc:
|
||||
'Einige Netzwerkkarten bieten die Möglichkeit, ein Passwort für Magic Packets zu setzen, auch <span class="badge">SecureON</span> genannt. Das Passwort kann nur 0, 4 oder 6 Zeichen lang sein.',
|
||||
groups: 'Gruppen',
|
||||
groups_desc:
|
||||
'Du kannst Geräte einer Gruppe hinzufügen, um sie auf dem Dashboard nach Gruppen sortiert anzuzeigen.',
|
||||
groups_placeholder: "z.B. 'Keller' or 'Büro'",
|
||||
network_scan_range_saved: 'Scan-Bereich gespeichert',
|
||||
network_scan_desc:
|
||||
'Automatisches Scannen deines Netzwerks nach Geräten. Damit dies funktioniert, musst du UpSnap als Administrator/root ausführen und nmap installiert und im $PATH verfügbar haben (Für Docker-Benutzer ist das bereits der Fall, und du musst nichts weiter tun). Das Scannen kann einige Sekunden dauern.',
|
||||
network_scan_ip_range: 'IP-Bereich',
|
||||
network_scan_no_range: 'Kein Scan-Bereich',
|
||||
network_scan_unsaved_changes: 'Ungespeicherte Änderungen',
|
||||
network_scan_running: 'Scan läuft',
|
||||
network_scan: 'Scan',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac Hersteller:',
|
||||
network_scan_netmask: 'Netmask:',
|
||||
network_scan_add_all: 'Alle Geräte hinzufügen',
|
||||
network_scan_replace_netmask: 'Netmask für alle Geräte ändern?',
|
||||
network_scan_new_netmask: 'Neue Netmask',
|
||||
network_scan_include_unknown: 'Schließe Geräte ein, bei denen der Name "Unknown" ist.',
|
||||
require_confirmation: 'Bestätigung erforderlich'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Willkommen',
|
||||
email_label: 'Email oder Nutzername:',
|
||||
password_label: 'Passwort:',
|
||||
btn_more: 'Mehr',
|
||||
menu_title_auth_providers: 'Andere Login Provider',
|
||||
btn_login: 'Login'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Einstellungen',
|
||||
ping_interval_title: 'Ping Intervall',
|
||||
ping_interval_desc1:
|
||||
'Legt den Intervall fest, in dem Geräte gepingt werden. Leer lassen um den Standardwert von <span class="badge">@every 3s</span> zu verwenden.',
|
||||
ping_interval_desc2:
|
||||
'Lerne mehr über die korrekte Cron Syntax auf <a class="link" href="https://de.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> oder sieh dir die <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">Paketdokumentation</a> an.',
|
||||
lazy_ping_title: 'Lazy Ping',
|
||||
lazy_ping_desc:
|
||||
'Wenn Lazy Ping aktiviert ist, pingt UpSnap die Geräte nur an, wenn ein aktiver Benutzer die Website besucht. Wenn es ausgeschaltet ist, pingt UpSnap die Geräte immer an.',
|
||||
lazy_ping_enable: 'Aktivieren',
|
||||
website_title_title: 'Seitentitel',
|
||||
website_title_desc: 'Setzt den Seiten- und den Tabtitel.',
|
||||
icon_title: 'Icon',
|
||||
icon_desc: 'Eigenes Favicon nutzen. Unterstützte Dateitypen sind:',
|
||||
upsnap_version: 'UpSnap Version',
|
||||
invalid_cron: 'Ungültige cron Syntax'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Benutzer',
|
||||
allow_create_devices:
|
||||
'{username} erlauben neue Geräte zu erstellen und Gerätegruppen zu bearbeiten',
|
||||
device_permissions: 'Geräteberechtigungen',
|
||||
create_new_device: 'Neues Gerät erstellen',
|
||||
read: 'Lesen',
|
||||
update: 'Ändern',
|
||||
delete: 'Löschen',
|
||||
power: 'Power',
|
||||
toggle: 'Toggle',
|
||||
confirm_delete_title: 'Löschen bestätigen',
|
||||
confirm_delete_desc: 'Soll {username} wirklich gelöscht werden?',
|
||||
create_new_user: 'Neuen Benutzer erstellen',
|
||||
username: 'Benutzername',
|
||||
password: 'Passwort',
|
||||
password_confirm: 'Passwort bestätigen',
|
||||
required_field: 'Pflichtfeld'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Speichern',
|
||||
delete: 'Löschen',
|
||||
change: 'Ändern',
|
||||
reset: 'Zurücksetzen',
|
||||
cancel: 'Abbrechen',
|
||||
add: 'Hinzufügen',
|
||||
confirm: 'Bestätigen'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Willkommen bei UpSnap 🥳',
|
||||
step1_setup_desc:
|
||||
'Bitte schließe die nachfolgenden Schritte ab, um die Einrichtung abzuschließen.',
|
||||
step1_setup_btn_next: 'Weiter',
|
||||
step2_page_title: 'Erstelle einen Admin Account',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Passwort:',
|
||||
step2_label_min_chars: 'min. 10 Zeichen',
|
||||
step2_label_password_confirm: 'Passwort bestätigen:',
|
||||
step2_btn_create: 'Erstellen',
|
||||
step3_page_title: 'Du bist fertig! 🎉',
|
||||
step3_page_desc: 'Füge Geräte zu deinem Dashboard hinzu.',
|
||||
step3_btn_done: 'Lets go!',
|
||||
not_expected_title: 'Ich hab dich hier nicht erwartet! 🧐',
|
||||
not_expected_desc: 'Du hast die Einrichtung bereits abgeschlossen! Hier gibts nichts zu tun.',
|
||||
not_expected_back: 'Bring mich zurück',
|
||||
progress_step1: 'Willkommen',
|
||||
progress_step2: 'Account erstellen',
|
||||
progress_step3: 'Fertig'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Admin gespeichert',
|
||||
user_saved: 'Benutzer gespeichert',
|
||||
user_created: 'Benutzer {username} erstellt',
|
||||
user_deleted: 'Benutzer {username} gelöscht',
|
||||
settings_saved: 'Einstellungen gespeichert',
|
||||
password_changed: 'Passwort geändert. Bitte neu einloggen.',
|
||||
passwords_missmatch: 'Passwörter stimmen nicht überein',
|
||||
permissions_created: 'Berechtigungen für {username} erstellt',
|
||||
permissions_deleted: 'Berechtigungen für {username} gelöscht',
|
||||
permissions_updated: 'Berechtigungen für {username} geändert',
|
||||
permissions_updated_personal: 'Deine Berechtigungen wurden geupdated',
|
||||
no_permission: 'Du hast keine Berechtigung für {url}',
|
||||
device_created: '{device} erstellt',
|
||||
devices_created_multiple: '{count|int} Geräte erstellt',
|
||||
device_updated: '{device} geändert',
|
||||
device_deleted: '{device} gelöscht',
|
||||
group_created: 'Gruppe {group} erstellt',
|
||||
group_deleted: 'Gruppe {group} gelöscht'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Theme',
|
||||
new: 'Neu',
|
||||
edit_account: 'Account bearbeiten',
|
||||
logout: 'Abmelden'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default de;
|
||||
@@ -1,8 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const en_US = {
|
||||
...(en as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default en_US;
|
||||
@@ -1,228 +0,0 @@
|
||||
import type { BaseTranslation } from '../i18n-types';
|
||||
|
||||
const en = {
|
||||
home: {
|
||||
page_title: 'Home',
|
||||
order_groups: 'Groups',
|
||||
order_name: 'Name',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Order',
|
||||
no_devices: 'No devices here.',
|
||||
add_first_device: 'Add your first device',
|
||||
grant_permissions:
|
||||
'Please ask the admin to grant you permissions to existing devices or to create new ones.',
|
||||
search_placeholder: 'Search for devices'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Account',
|
||||
account_type_admin: 'Admin',
|
||||
account_type_user: 'User',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Language',
|
||||
language_option_auto: 'Automatic',
|
||||
change_password_title: 'Change password',
|
||||
change_password_body: 'After the password has been changed, you will need to log in again.',
|
||||
change_password_label: 'Old password',
|
||||
change_password_new: 'New password',
|
||||
change_password_confirm: 'Confirm password'
|
||||
},
|
||||
device: {
|
||||
page_title: 'New device',
|
||||
tabs: ['Manual', 'Network Scan'],
|
||||
card_btn_more: 'More',
|
||||
card_btn_more_edit: 'Edit',
|
||||
card_btn_more_sleep: 'Sleep',
|
||||
card_btn_more_reboot: 'Reboot',
|
||||
card_tooltip_wake_cron: 'Wake cron',
|
||||
card_tooltip_shutdown_cron: 'Shutdown cron',
|
||||
card_tooltip_wake_password: 'Wake password',
|
||||
card_tooltip_last_status_change: 'Last status change',
|
||||
card_password: 'Password',
|
||||
card_nic_tooltip_pending: 'Pending',
|
||||
card_nic_tooltip_shutdown: 'Shut down',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'No shutdown command set',
|
||||
card_nic_tooltip_shutdown_no_permission: 'No permission to shut down this device',
|
||||
card_nic_tooltip_power: 'Power on',
|
||||
card_nic_tooltip_power_no_permission: 'No permission to power on this device',
|
||||
modal_confirm_wake_title: 'Wake {device}?',
|
||||
modal_confirm_wake_desc: 'Please confirm to wake {device}.',
|
||||
modal_confirm_shutdown_title: 'Shutdown {device}?',
|
||||
modal_confirm_shutdown_desc: 'Please confirm to shutdown {device}.',
|
||||
general: 'General',
|
||||
general_name: 'Name',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Netmask',
|
||||
general_description: 'Description',
|
||||
general_description_placeholder: 'Some description of the device',
|
||||
general_required_field: 'required field',
|
||||
ports: 'Ports',
|
||||
ports_desc: 'UpSnap can also check if given ports are open.',
|
||||
ports_add_new: 'Add new port',
|
||||
ports_name: 'Name',
|
||||
ports_number: 'Number',
|
||||
link: 'Link',
|
||||
link_desc:
|
||||
'Makes your device name a clickable link, perfect for linking a dashboard for example.',
|
||||
link_open: 'Automatically open link',
|
||||
link_open_no: 'No',
|
||||
link_open_same_tab: 'Same tab',
|
||||
link_open_new_tab: 'New tab',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'You can use a custom shell command to see if the device is powered on. The command should return an exit code of <span class="badge">0</span> to indicate that the device is powered on, any other exit code will mark the device as powered off.',
|
||||
ping_cmd: 'Custom ping command',
|
||||
wake: 'Wake',
|
||||
wake_desc: 'You can power this device using a scheduled cron job.',
|
||||
wake_cmd: 'Custom wake command',
|
||||
wake_cron: 'Wake cron',
|
||||
wake_cron_enable: 'Enable wake cron',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'You can put computers to sleep using the <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> tool. Sleep-On-LAN (SOL) is an external tool/daemon that operates on the PCs you want to put to sleep, providing a REST endpoint. For instructions on setting up Sleep-On-LAN, please refer to the <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a> section.',
|
||||
sol_desc2:
|
||||
'SOL is configured to send requests over HTTP instead of UDP to enable authorization and make requests more reliable.',
|
||||
sol_desc3:
|
||||
'Therefore, please ensure that you include <span class="badge">HTTP:<YOURPORT></span> in the <span class="badge">Listeners</span> section of the <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL configuration</a>.',
|
||||
sol_enable: 'Enable Sleep-On-LAN',
|
||||
sol_port: 'SOL Port',
|
||||
sol_authorization: 'Authorization',
|
||||
sol_user: 'SOL User',
|
||||
sol_password: 'SOL Password',
|
||||
shutdown: 'Shutdown',
|
||||
shutdown_desc:
|
||||
'This <strong>shell command</strong> will run inside your container (if you use docker) or on your host (if you use the binary). To verify that it works, you can run the command inside the container or on your host shell first. Common commands are <span class="badge">net rpc</span> for windows, <span class="badge">sshpass</span> for linux or <span class="badge">curl</span> in general to make web requests.',
|
||||
shutdown_examples: 'Examples:',
|
||||
shutdown_examples_windows: 'Shutdown remote windows machine:',
|
||||
shutdown_examples_linux: 'Shutdown remote linux machine:',
|
||||
shutdown_cmd: 'Shutdown command',
|
||||
shutdown_cron_desc:
|
||||
'Just like setting a cron to wake the device, you can also schedule a cron job to shut down this device.',
|
||||
shutdown_cron: 'Shutdown cron',
|
||||
shutdown_cron_enable: 'Enable shutdown cron',
|
||||
password: 'Password',
|
||||
password_desc:
|
||||
'Some network cards have the option to set a password for magic packets, also called <span class="badge">SecureON</span>. Password can only be 0, 4 or 6 characters in length.',
|
||||
groups: 'Groups',
|
||||
groups_desc: 'You can add devices to a group to have them sorted by group on the dashboard.',
|
||||
groups_placeholder: "e.g. 'Basement' or 'Office'",
|
||||
network_scan_range_saved: 'Scan range saved',
|
||||
network_scan_desc:
|
||||
"Automatically scan your network for devices. For this to work, you need to run UpSnap as root/admin and have nmap installed and available in your $PATH (For docker users, thats already the case and you don't need to do anything). Scanning might take some seconds.",
|
||||
network_scan_ip_range: 'IP range',
|
||||
network_scan_no_range: 'No scan range',
|
||||
network_scan_unsaved_changes: 'Unsaved changes',
|
||||
network_scan_running: 'Scan running',
|
||||
network_scan: 'Scan',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac vendor:',
|
||||
network_scan_netmask: 'Netmask:',
|
||||
network_scan_add_all: 'Add all devices',
|
||||
network_scan_replace_netmask: 'Replace netmask for all devices?',
|
||||
network_scan_new_netmask: 'New netmask',
|
||||
network_scan_include_unknown: 'Include devices where name is "Unknown"',
|
||||
require_confirmation: 'Require Confirmation'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Welcome',
|
||||
email_label: 'Email or Username:',
|
||||
password_label: 'Password:',
|
||||
btn_more: 'More',
|
||||
menu_title_auth_providers: 'Other Auth Providers',
|
||||
btn_login: 'Login'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Settings',
|
||||
ping_interval_title: 'Ping interval',
|
||||
ping_interval_desc1:
|
||||
'Sets the interval in which the devices are pinged. Leave blank to use default value of <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Learn more about the correct syntax for cron on <a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> or refer to the <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">package documentation</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc:
|
||||
"When lazy ping is turned on, UpSnap will only ping devices if there is an active user visiting the website. If it's turned off, UpSnap will always ping devices.",
|
||||
lazy_ping_enable: 'Enable',
|
||||
website_title_title: 'Website title',
|
||||
website_title_desc: 'Sets the title of the website and in the browser tab.',
|
||||
icon_title: 'Icon',
|
||||
icon_desc: 'Set a custom favicon. Supported file types are:',
|
||||
upsnap_version: 'UpSnap version',
|
||||
invalid_cron: 'Invalid cron syntax'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Users',
|
||||
allow_create_devices: 'Allow {username} to create new devices and edit device groups',
|
||||
device_permissions: 'Device permissions',
|
||||
create_new_device: 'Create new device',
|
||||
read: 'Read',
|
||||
update: 'Update',
|
||||
delete: 'Delete',
|
||||
power: 'Power',
|
||||
toggle: 'Toggle',
|
||||
confirm_delete_title: 'Confirm delete',
|
||||
confirm_delete_desc: 'Are you sure you want to delete {username}?',
|
||||
create_new_user: 'Create new user',
|
||||
username: 'Username',
|
||||
password: 'Password',
|
||||
password_confirm: 'Password confirm',
|
||||
required_field: 'required field'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Save',
|
||||
delete: 'Delete',
|
||||
change: 'Change',
|
||||
reset: 'Reset',
|
||||
cancel: 'Cancel',
|
||||
add: 'Add',
|
||||
confirm: 'Confirm'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Welcome to UpSnap 🥳',
|
||||
step1_setup_desc: 'Please complete the following steps to finish the setup.',
|
||||
step1_setup_btn_next: 'Next',
|
||||
step2_page_title: 'Create an admin account',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Password:',
|
||||
step2_label_min_chars: 'min. 10 characters',
|
||||
step2_label_password_confirm: 'Password confirm:',
|
||||
step2_btn_create: 'Create',
|
||||
step3_page_title: 'You are all set! 🎉',
|
||||
step3_page_desc: 'Go ahead and add some devices to your dashboard.',
|
||||
step3_btn_done: 'Lets go!',
|
||||
not_expected_title: "I didn't expect you here! 🧐",
|
||||
not_expected_desc: 'You are already done with the setup! Nothing to do.',
|
||||
not_expected_back: 'Take me back',
|
||||
progress_step1: 'Welcome',
|
||||
progress_step2: 'Create account',
|
||||
progress_step3: 'Done'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Admin saved',
|
||||
user_saved: 'User saved',
|
||||
user_created: 'User {username} created',
|
||||
user_deleted: 'User {username} deleted',
|
||||
settings_saved: 'Saved settings',
|
||||
password_changed: 'Password changed. Please login again.',
|
||||
passwords_missmatch: "Passwords don't match",
|
||||
permissions_created: 'Permissions for {username} created',
|
||||
permissions_deleted: 'Permissions for {username} deleted',
|
||||
permissions_updated: 'Permissions for {username} updated',
|
||||
permissions_updated_personal: 'Your permissions have been updated',
|
||||
no_permission: "You don't have permission to visit {url}",
|
||||
device_created: 'Created {device}',
|
||||
devices_created_multiple: 'Created {count|int} devices',
|
||||
device_updated: 'Updated {device}',
|
||||
device_deleted: 'Deleted {device}',
|
||||
group_created: 'Created group {group}',
|
||||
group_deleted: 'Deleted group {group}'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Theme',
|
||||
new: 'New',
|
||||
edit_account: 'Edit account',
|
||||
logout: 'Logout'
|
||||
}
|
||||
} satisfies BaseTranslation;
|
||||
|
||||
export default en;
|
||||
@@ -1,8 +0,0 @@
|
||||
import es from '../es';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const es_ES = {
|
||||
...(es as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default es_ES;
|
||||
@@ -1,231 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const es = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Inicio',
|
||||
order_groups: 'Grupos',
|
||||
order_name: 'Nombre',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Orden',
|
||||
no_devices: 'Sin dispositivos.',
|
||||
add_first_device: 'Añade tu primer dispositivo',
|
||||
grant_permissions:
|
||||
'Pídale al administrador que le otorgue permisos para los dispositivos existentes o que cree otros nuevos..',
|
||||
search_placeholder: 'Buscar dispositivos'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Cuenta',
|
||||
account_type_admin: 'Admin',
|
||||
account_type_user: 'Usuario',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Idioma',
|
||||
language_option_auto: 'Automático',
|
||||
change_password_title: 'Cambiar contraseña',
|
||||
change_password_body: 'Después de cambiar la contraseña, deberá iniciar sesión nuevamente.',
|
||||
change_password_label: 'Antigua contraseña',
|
||||
change_password_new: 'Nueva contraseña',
|
||||
change_password_confirm: 'Confirmar contraseña'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Nuevo dispositivo',
|
||||
tabs: ['Manual', 'búsqueda de red'],
|
||||
card_btn_more: 'Más',
|
||||
card_btn_more_edit: 'Editar',
|
||||
card_btn_more_sleep: 'Suspender',
|
||||
card_btn_more_reboot: 'Reiniciar',
|
||||
card_tooltip_wake_cron: 'Wake cron',
|
||||
card_tooltip_shutdown_cron: 'Shutdown cron',
|
||||
card_tooltip_wake_password: 'Wake password',
|
||||
card_tooltip_last_status_change: 'Último cambio de estado',
|
||||
card_password: 'Contraseña',
|
||||
card_nic_tooltip_pending: 'Pendiente',
|
||||
card_nic_tooltip_shutdown: 'Apagar',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'El comando de apagado no está definido',
|
||||
card_nic_tooltip_shutdown_no_permission: 'No tienes permiso para apagar este dispositivo',
|
||||
card_nic_tooltip_power: 'Encender',
|
||||
card_nic_tooltip_power_no_permission: 'No tienes permiso para encender este dispositivo',
|
||||
modal_confirm_wake_title: 'Activar {device}?',
|
||||
modal_confirm_wake_desc: 'Confirme para activar {device}.',
|
||||
modal_confirm_shutdown_title: 'Apagar {device}?',
|
||||
modal_confirm_shutdown_desc: 'Por favor confirme para apagar {device}.',
|
||||
general: 'General',
|
||||
general_name: 'Nombre',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Máscara de red',
|
||||
general_description: 'Descripción',
|
||||
general_description_placeholder: 'Descripción del dispositivo',
|
||||
general_required_field: 'Campo obligatorio',
|
||||
ports: 'Puertos',
|
||||
ports_desc: 'UpSnap puede comprobar si ciertos puertos están abiertos.',
|
||||
ports_add_new: 'Añadir nuevo puerto',
|
||||
ports_name: 'Nombre',
|
||||
ports_number: 'Número',
|
||||
link: 'Link',
|
||||
link_desc:
|
||||
'Permite que el nombre de su dispositivo sea un enlace. Perfecto para dashboard, por ejemplo.',
|
||||
link_open: 'Abrir enlace automáticamente',
|
||||
link_open_no: 'No',
|
||||
link_open_same_tab: 'Misma pestaña',
|
||||
link_open_new_tab: 'Nueva pestaña',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Puede utilizar un comando de shell personalizado para ver si el dispositivo está conectado. El comando debe devolver un código de salida de <span class="badge">0</span> para indicar que el dispositivo está encendido; cualquier otro código de salida marcará el dispositivo como apagado.',
|
||||
ping_cmd: 'Comando ping personalizado',
|
||||
wake: 'Encender',
|
||||
wake_desc: 'Podrá encender este dispositivo utilizando un scheduled cron job.',
|
||||
wake_cmd: 'Comando de encendido personalizado',
|
||||
wake_cron: 'Encender cron',
|
||||
wake_cron_enable: 'Activar wake cron',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Puedes poner las computadoras en modo de suspensión usando <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a > herramienta. Sleep-On-LAN (SOL) es una herramienta/daemon externo que opera en las PC que desea poner en suspensión y proporciona un punto final REST. Para obtener instrucciones sobre cómo configurar Sleep-On-LAN, consulte <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank" >Uso</a> sección.',
|
||||
sol_desc2:
|
||||
'SOL está configurado para enviar solicitudes a través de HTTP en lugar de UDP para permitir la autorización y hacer que las solicitudes sean más confiables.',
|
||||
sol_desc3:
|
||||
'Por lo tanto, asegúrese de incluir <span class="badge">HTTP:<YOURPORT></span> en la sección <span class="badge">Oyentes</span> de <a href="https ://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">configuración SOL</a>.',
|
||||
sol_enable: 'Activar Sleep-On-LAN',
|
||||
sol_port: 'Puerto SOL',
|
||||
sol_authorization: 'Autorización',
|
||||
sol_user: 'Usuario SOL',
|
||||
sol_password: 'Contraseña SOL',
|
||||
shutdown: 'Apagar',
|
||||
shutdown_desc:
|
||||
'Este <strong>comando de shell</strong> se ejecutará dentro de su contenedor (si usa Docker) o en su host (si usa el binario). Para verificar que funciona, primero puede ejecutar el comando dentro del contenedor o en el shell de su host. Los comandos comunes son <span class="badge">net rpc</span> para Windows, <span class="badge">sshpass</span> para Linux o <span class="badge">curl</span> en general para realizar solicitudes web.',
|
||||
shutdown_examples: 'Ejemplos:',
|
||||
shutdown_examples_windows: 'Apagar el dispositivo Windows remoto:',
|
||||
shutdown_examples_linux: 'Apagar el dispositivo Linux remoto:',
|
||||
shutdown_cmd: 'Comando para Apagar',
|
||||
shutdown_cron_desc:
|
||||
'Al igual que configurar un cron para encender el dispositivo, también puede programar un cron job para apagar este dispositivo.',
|
||||
shutdown_cron: 'Apagar cron',
|
||||
shutdown_cron_enable: 'Activar apagado de cron',
|
||||
password: 'Contraseña',
|
||||
password_desc:
|
||||
'Algunos adaptadores de red tienen la opción de definir una contraseña para magic pockets, también conocidos como <span class="badge">SecureON</span>. la contraseña sólo podrá contener 0, 4 o 6 caracteres.',
|
||||
groups: 'Grupos',
|
||||
groups_desc: 'Puede agregar dispositivos a un grupo para ordenarlos por grupo en el dashboard.',
|
||||
groups_placeholder: "e.g. 'Basement' o 'Office'",
|
||||
network_scan_range_saved: 'Rango de escaneo guardado',
|
||||
network_scan_desc:
|
||||
'Escanee automáticamente su red en busca de dispositivos. Para que esto funcione, necesita ejecutar UpSnap como root/admin y tener nmap instalado y disponible en su $PATH (para los usuarios de Docker, ese ya es el caso y no necesitan hacer nada). El escaneo puede tardar algunos segundos.',
|
||||
network_scan_ip_range: 'Rango IP',
|
||||
network_scan_no_range: 'Sin rango de escaneo',
|
||||
network_scan_unsaved_changes: 'Cambios sin guardar',
|
||||
network_scan_running: 'Escaneo en curso',
|
||||
network_scan: 'Escaneo',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Proveedor Mac:',
|
||||
network_scan_netmask: 'Máscara de red:',
|
||||
network_scan_add_all: 'Añadir todos los dispositivos',
|
||||
network_scan_replace_netmask: 'Reemplazar máscara de red para todos los dispositivos?',
|
||||
network_scan_new_netmask: 'Nueva mascara de red',
|
||||
network_scan_include_unknown: 'Incluir dispositivos donde este el nombre "Unknown"',
|
||||
require_confirmation: 'Requiere confirmación'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Bienvenido',
|
||||
email_label: 'Email o Nombre de usuario:',
|
||||
password_label: 'Contraseña:',
|
||||
btn_more: 'Más',
|
||||
menu_title_auth_providers: 'Otros proveedores de autenticación',
|
||||
btn_login: 'Entrar'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Ajustes',
|
||||
ping_interval_title: 'Intervalo ping',
|
||||
ping_interval_desc1:
|
||||
'Establece el intervalo en el que se realiza el ping. Déjelo en blanco para usar el valor predeterminado de <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Puedes ver la sintaxis correcta para cron en <a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> o en <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">documentación cron</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc:
|
||||
'Cuando el ping diferido está activado, UpSnap solo hará ping a los dispositivos si hay un usuario activo visitando el sitio web. Si está desactivado, UpSnap siempre hará ping a los dispositivos.',
|
||||
lazy_ping_enable: 'Activar',
|
||||
website_title_title: 'Titulo de la página',
|
||||
website_title_desc: 'Establece el título del sitio web y en la pestaña del navegador.',
|
||||
icon_title: 'Icon',
|
||||
icon_desc: 'Establece un favicon personalizado. Los tipos de archivos admitidos son:',
|
||||
upsnap_version: 'Version UpSnap',
|
||||
invalid_cron: 'Sintaxis cron no válida'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Usuarios',
|
||||
allow_create_devices:
|
||||
'Permitir a {username} para crear nuevos dispositivos y editar grupos de dispositivos',
|
||||
device_permissions: 'Permisos del dispositivo',
|
||||
create_new_device: 'Añadir dispositivo',
|
||||
read: 'Leer',
|
||||
update: 'Editar',
|
||||
delete: 'Eliminar',
|
||||
power: 'Energía',
|
||||
toggle: 'Alternar',
|
||||
confirm_delete_title: 'Confirmar',
|
||||
confirm_delete_desc: 'Estas seguro que quieres borrarlo {username}?',
|
||||
create_new_user: 'Crear nuevo usuario',
|
||||
username: 'Usuario',
|
||||
password: 'Contraseña',
|
||||
password_confirm: 'Confirmar contraseña',
|
||||
required_field: 'Campo obligatorio'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Guardar',
|
||||
delete: 'Eliminar',
|
||||
change: 'Alterar',
|
||||
reset: 'Reiniciar',
|
||||
cancel: 'Cancelar',
|
||||
add: 'Añadir',
|
||||
confirm: 'Confirmar'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Bienvenido a UpSnap 🥳',
|
||||
step1_setup_desc: 'Por favor complete los siguientes pasos para terminar la configuración.',
|
||||
step1_setup_btn_next: 'Siguiente',
|
||||
step2_page_title: 'Crear cuenta de administrador',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Contraseña:',
|
||||
step2_label_min_chars: 'min. 10 caracteres',
|
||||
step2_label_password_confirm: 'Confirmar contraseña:',
|
||||
step2_btn_create: 'Crear',
|
||||
step3_page_title: 'Ya está hecho! 🎉',
|
||||
step3_page_desc: 'Añada algún dispositivo a su dashboard.',
|
||||
step3_btn_done: 'Vamos!',
|
||||
not_expected_title: 'No te esperaba por aquí! 🧐',
|
||||
not_expected_desc: 'Ya has terminado con la configuración! Nada que hacer!.',
|
||||
not_expected_back: 'Llévame de vuelta',
|
||||
progress_step1: 'Bienvenido',
|
||||
progress_step2: 'Crear cuenta',
|
||||
progress_step3: 'Terminado'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Administrador guardado',
|
||||
user_saved: 'Usuario actualizado',
|
||||
user_created: 'Usuario {username} creado',
|
||||
user_deleted: 'Usuario {username} eliminado',
|
||||
settings_saved: 'Configuraciones guardadas',
|
||||
password_changed: 'Contraseña cambiada. Por favor acceda otra vez',
|
||||
passwords_missmatch: 'Las contraseñas no coinciden',
|
||||
permissions_created: 'Permisos creados para {username}',
|
||||
permissions_deleted: 'Permisos para {username} eliminados',
|
||||
permissions_updated: 'Permisos para {username} actualizados',
|
||||
permissions_updated_personal: 'Tus permisos han sido actualizados',
|
||||
no_permission: 'Tu no tienes permiso para visitar {url}',
|
||||
device_created: 'Creado {device}',
|
||||
devices_created_multiple: 'Añadidos {count|int} dispositivos',
|
||||
device_updated: '{device} actualizado',
|
||||
device_deleted: '{device} apagado',
|
||||
group_created: 'Grupo {group} creado',
|
||||
group_deleted: 'Grupo {group} eliminado'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Tema',
|
||||
new: 'Nuevo',
|
||||
edit_account: 'Editar cuenta',
|
||||
logout: 'Salir'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default es;
|
||||
@@ -1,11 +0,0 @@
|
||||
import type { FormattersInitializer } from 'typesafe-i18n';
|
||||
import type { Locales, Formatters } from './i18n-types';
|
||||
|
||||
// export const initFormatters: FormattersInitializer<Locales, Formatters> = (locale: Locales) => {
|
||||
export const initFormatters: FormattersInitializer<Locales, Formatters> = () => {
|
||||
const formatters: Formatters = {
|
||||
// add your formatter functions here
|
||||
};
|
||||
|
||||
return formatters;
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
import fr from '../fr';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const fr_FR = {
|
||||
...(fr as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default fr_FR;
|
||||
@@ -1,234 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const fr = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Accueil',
|
||||
order_groups: 'Groupes',
|
||||
order_name: 'Nom',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Tri',
|
||||
no_devices: 'Aucun appareil ici.',
|
||||
add_first_device: 'Ajoutez votre premier appareil',
|
||||
grant_permissions:
|
||||
'Veuillez demander à votre administrateur les permissions aux appareils existants ou créez-en de nouveaux.',
|
||||
search_placeholder: 'Recherche de dispositifs'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Compte',
|
||||
account_type_admin: 'Administrateur',
|
||||
account_type_user: 'Utilisateur',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Langue',
|
||||
language_option_auto: 'Automatique',
|
||||
change_password_title: 'Modification du mot de passe',
|
||||
change_password_body: 'Après la modification du mot de passe, vous devrez vous reconnecter.',
|
||||
change_password_label: 'Ancien mot de passe',
|
||||
change_password_new: 'Nouveau mot de passe',
|
||||
change_password_confirm: 'Confirmation du mot de passe'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Nouvel appareil',
|
||||
tabs: ['Manuel', 'Analyse du réseau'],
|
||||
card_btn_more: 'Plus',
|
||||
card_btn_more_edit: 'Modifier',
|
||||
card_btn_more_sleep: 'Veille',
|
||||
card_btn_more_reboot: 'Redémarrer',
|
||||
card_tooltip_wake_cron: 'Réveil avec cron',
|
||||
card_tooltip_shutdown_cron: 'Arrêt avec cron',
|
||||
card_tooltip_wake_password: 'Mot de passe de réveil',
|
||||
card_tooltip_last_status_change: 'Dernier changement de statut',
|
||||
card_password: 'Mot de passe',
|
||||
card_nic_tooltip_pending: 'En attente',
|
||||
card_nic_tooltip_shutdown: 'Éteindre',
|
||||
card_nic_tooltip_shutdown_no_cmd: "Aucune commande d'arrêt n'est définie",
|
||||
card_nic_tooltip_shutdown_no_permission:
|
||||
"Vous n'avez pas la permission pour éteindre cet appareil",
|
||||
card_nic_tooltip_power: 'Allumer',
|
||||
card_nic_tooltip_power_no_permission: "Vous n'avez pas la permission pour allumer cet appareil",
|
||||
modal_confirm_wake_title: 'Réveiller {device} ?',
|
||||
modal_confirm_wake_desc: 'Veuillez confirmer le réveil de {device}.',
|
||||
modal_confirm_shutdown_title: 'Arrêter {device} ?',
|
||||
modal_confirm_shutdown_desc: "Veuillez confirmer l'arrêt du {device}.",
|
||||
general: 'Général',
|
||||
general_name: 'Nom',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Masque réseau',
|
||||
general_description: 'Description',
|
||||
general_description_placeholder: "Description de l'appareil",
|
||||
general_required_field: 'champ requis',
|
||||
ports: 'Ports',
|
||||
ports_desc: 'UpSnap peut aussi vérifier si certains ports sont ouverts.',
|
||||
ports_add_new: 'Ajouter un nouveau port',
|
||||
ports_name: 'Nom',
|
||||
ports_number: 'Numéro',
|
||||
link: 'Lien',
|
||||
link_desc:
|
||||
'Rend le nom de votre appareil cliquable, parfait pour y lier un tableau de bord par exemple.',
|
||||
link_open: 'Ouvrir automatiquement un lien',
|
||||
link_open_no: 'No',
|
||||
link_open_same_tab: 'Même onglet',
|
||||
link_open_new_tab: 'Nouvel onglet',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
"Vous pouvez utiliser une commande shell personnalisée pour vérifier si l'appareil est sous tension. La commande doit renvoyer un code de sortie de <span class='badge'>0</span> pour indiquer que l'appareil est sous tension, tout autre code de sortie indiquera que l'appareil est hors tension.",
|
||||
ping_cmd: 'Commande ping personnalisée',
|
||||
wake: 'Réveil',
|
||||
wake_desc: 'Vous pouvez allumer cet appareil en utilisant un job cron planifié.',
|
||||
wake_cmd: 'Commande de réveil personnalisée',
|
||||
wake_cron: 'Réveil avec cron',
|
||||
wake_cron_enable: 'Activer le réveil avec cron',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Vous pouvez mettre les ordinateurs en veille à l\'aide de l\'outil <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) est un outil/daemon externe qui fonctionne sur les PC que vous souhaitez mettre en veille, fournissant un point de terminaison REST. Pour obtenir des instructions sur la configuration de Sleep-On-LAN, veuillez vous référer à la section <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a>.',
|
||||
sol_desc2:
|
||||
"SOL est configuré pour envoyer des requêtes avec le protocole HTTP au lieu d'UDP pour activer l'autorisation et faire des requêtes plus fiables.",
|
||||
sol_desc3:
|
||||
'Par conséquent, veuillez vous assurer que vous incluez <span class="badge">HTTP:<VOTREPORT></span> dans la section <span class="badge">Listeners</span> de la <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">configuration SOL</a>.',
|
||||
sol_enable: 'Activer Sleep-On-LAN',
|
||||
sol_port: 'Port SOL',
|
||||
sol_authorization: 'Autorisation',
|
||||
sol_user: 'Utilisateur SOL',
|
||||
sol_password: 'Mot de passe SOL',
|
||||
shutdown: 'Arrêt',
|
||||
shutdown_desc:
|
||||
'Cette <strong>commande shell</strong> va s\'exécuter au sein de votre conteneur (si vous utilisez Docker) ou sur votre hôte (si vous utilisez l\'exécutable). Pour vérifier que cela fonctionne, vous pouvez d\'abord exécuter la commande à l\'intérieur du conteneur ou sur le shell de l\'hôte. Les commandes courantes sont <span class="badge">net rpc</span> pour Windows, <span class="badge">sshpass</span> pour Linux ou <span class="badge">curl</span> en général pour faire des requêtes web.',
|
||||
shutdown_examples: 'Exemples :',
|
||||
shutdown_examples_windows: 'Arrêter une machine Windows distante :',
|
||||
shutdown_examples_linux: 'Arrêter une machine Linux distante :',
|
||||
shutdown_cmd: "Commande d'arrêt",
|
||||
shutdown_cron_desc:
|
||||
"Exactement comme configurer cron pour réveiller l'appareil, vous pouvez aussi planifier un job cron pour arrêter cet appareil.",
|
||||
shutdown_cron: 'Arrêt avec cron',
|
||||
shutdown_cron_enable: "Activer l'arrêt avec cron",
|
||||
password: 'Mot de passe',
|
||||
password_desc:
|
||||
'Certaines cartes réseau ont l\'option pour définir un mot de passe pour les paquets magiques, aussi appelée <span class="badge">SecureON</span>. Le mot de passe ne peut être que de 0, 4 ou 6 caractères.',
|
||||
groups: 'Groupes',
|
||||
groups_desc:
|
||||
'Vous pouvez ajouter des appareils à un groupe pour pouvoir les trier sur le tableau de bord.',
|
||||
groups_placeholder: 'par ex. « Bureau »', // I had to strink because the original English text in French gives a too long text
|
||||
network_scan_range_saved: "Plage d'analyse sauvegardée",
|
||||
network_scan_desc:
|
||||
"Analyser automatiquement votre réseau pour trouver des appareils. Pour que cela fonctionne, vous devez exécuter UpSnap en tant que root/administrateur et avoir nmap installé et disponible dans votre $PATH (pour les utilisateurs Docker, cela est déjà le cas et vous n'avez besoin de rien faire). L'analyse peut prendre quelques secondes.",
|
||||
network_scan_ip_range: 'Plage IP',
|
||||
network_scan_no_range: "Aucune plage d'analyse",
|
||||
network_scan_unsaved_changes: 'Modifications non sauvegardées',
|
||||
network_scan_running: 'Analyse en cours',
|
||||
network_scan: 'Analyser',
|
||||
network_scan_ip: 'IP :',
|
||||
network_scan_mac: 'Mac :',
|
||||
network_scan_mac_vendor: "Fabricant ayant l'adresse Mac :",
|
||||
network_scan_netmask: 'Masque réseau :',
|
||||
network_scan_add_all: 'Ajouter tous les appareils',
|
||||
network_scan_replace_netmask: 'Remplacer le masque réseau pour tous les appareils ?',
|
||||
network_scan_new_netmask: 'Nouveau masque réseau',
|
||||
network_scan_include_unknown: 'Inclure les appareils dont nom est « Inconnu »',
|
||||
require_confirmation: 'Demande de confirmation'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Bienvenue',
|
||||
email_label: "Courriel ou nom d'utilisateur :",
|
||||
password_label: 'Mot de passe :',
|
||||
btn_more: 'Plus',
|
||||
menu_title_auth_providers: "Autres fournisseurs d'authentification",
|
||||
btn_login: 'Connexion'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Paramètres',
|
||||
ping_interval_title: 'Intervalle de ping',
|
||||
ping_interval_desc1:
|
||||
'Définit l\'intervalle dans lequel les appareils reçoivent une requête ping. Laissez vide pour utiliser la valeur par défaut de <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Pour écrire une syntaxe correcte pour l\'utilitaire cron, consultez <a class="link" href="https://fr.wikipedia.org/wiki/Cron" target="_blank">Wikipédia</a> ou référez-vous à la <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">documentation du paquet</a>.',
|
||||
lazy_ping_title: 'Ping fainéant',
|
||||
lazy_ping_desc:
|
||||
"Lorsque le mode ping fainéant est activé, UpSnap ne va effectuer des requêtes de ping sur les appareils que lorsqu'un utilisateur actif visite le site. Si vous désactivez cette fonction, UpSnap exécutera toujours ces requêtes.",
|
||||
lazy_ping_enable: 'Activer',
|
||||
website_title_title: 'Titre du site',
|
||||
website_title_desc:
|
||||
"Définit le titre du site ainsi que le texte affiché dans l'onglet du navigateur.",
|
||||
icon_title: 'Icône',
|
||||
icon_desc: 'Définit un favicon personnalisé. Les types de fichier compatibles sont :',
|
||||
upsnap_version: 'Version de UpSnap ',
|
||||
invalid_cron: 'Syntaxe cron invalide'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Utilisateurs',
|
||||
allow_create_devices:
|
||||
"Autoriser {username} à créer de nouveaux appareils et à modifier les groupes d'appareils",
|
||||
device_permissions: 'Permissions des appareils',
|
||||
create_new_device: 'Créer un nouvel appareil',
|
||||
read: 'Lire',
|
||||
update: 'Mettre à jour',
|
||||
delete: 'Supprimer',
|
||||
power: 'Allumer',
|
||||
toggle: 'Inverser',
|
||||
confirm_delete_title: 'Confirmation de la suppression',
|
||||
confirm_delete_desc: 'Voulez-vous vraiment supprimer {username} ?',
|
||||
create_new_user: "Création d'un nouvel utilisateur",
|
||||
username: "Nom d'utilisateur",
|
||||
password: 'Mot de passe',
|
||||
password_confirm: 'Confirmation du mot de passe',
|
||||
required_field: 'champ requis'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Sauvegarder',
|
||||
delete: 'Supprimer',
|
||||
change: 'Modifier',
|
||||
reset: 'Réinitialiser',
|
||||
cancel: 'Annuler',
|
||||
add: 'Ajouter',
|
||||
confirm: 'Confirmer'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Bienvenue sur UpSnap 🥳',
|
||||
step1_setup_desc: "Veuillez suivre les étapes suivantes pour terminer l'installation.",
|
||||
step1_setup_btn_next: 'Suivant',
|
||||
step2_page_title: 'Création du compte administrateur',
|
||||
step2_label_email: 'Courriel :',
|
||||
step2_label_password: 'Mot de passe :',
|
||||
step2_label_min_chars: 'min. 10 caractères',
|
||||
step2_label_password_confirm: 'Confirmation du mot de passe :',
|
||||
step2_btn_create: 'Créer',
|
||||
step3_page_title: 'Vous êtes tout bon ! 🎉',
|
||||
step3_page_desc: 'Allez-y et ajoutez quelques appareils à votre tableau de bord.',
|
||||
step3_btn_done: "C'est parti !",
|
||||
not_expected_title: 'Je ne vous attendais pas ici ! 🧐',
|
||||
not_expected_desc: "Vous avez déjà terminé l'installation ! Il n'y a plus rien à faire.",
|
||||
not_expected_back: 'Ramène-moi',
|
||||
progress_step1: 'Bienvenue',
|
||||
progress_step2: 'Créer un compte',
|
||||
progress_step3: 'Fin'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Administrateur sauvegardé',
|
||||
user_saved: 'Utilisateur sauvegardé',
|
||||
user_created: 'Utilisateur {username} créé',
|
||||
user_deleted: 'Utilisateur {username} supprimé',
|
||||
settings_saved: 'Paramètres sauvegardés',
|
||||
password_changed: 'Mot de passe modifié. Veuillez vous reconnecter.',
|
||||
passwords_missmatch: 'Les mots de passe ne correspondent pas',
|
||||
permissions_created: 'Permissions pour {username} créées',
|
||||
permissions_deleted: 'Permissions pour {username} supprimées',
|
||||
permissions_updated: 'Permissions pour {username} mises à jour',
|
||||
permissions_updated_personal: 'Vos permissions ont été mises à jour',
|
||||
no_permission: "Vous n'avez pas la permission de visiter {url}",
|
||||
device_created: '{device} créé',
|
||||
devices_created_multiple: '{count|int} appareils créés',
|
||||
device_updated: '{device} mis à jour',
|
||||
device_deleted: '{device} supprimé',
|
||||
group_created: 'Groupe {group} créé',
|
||||
group_deleted: 'Groupe {group} supprimé'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Thème',
|
||||
new: 'Nouveau',
|
||||
edit_account: 'Modifier le compte',
|
||||
logout: 'Déconnexion'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default fr;
|
||||
@@ -1,16 +0,0 @@
|
||||
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
|
||||
|
||||
import { initI18nSvelte } from 'typesafe-i18n/svelte';
|
||||
import type { Formatters, Locales, TranslationFunctions, Translations } from './i18n-types';
|
||||
import { loadedFormatters, loadedLocales } from './i18n-util';
|
||||
|
||||
const { locale, LL, setLocale } = initI18nSvelte<
|
||||
Locales,
|
||||
Translations,
|
||||
TranslationFunctions,
|
||||
Formatters
|
||||
>(loadedLocales, loadedFormatters);
|
||||
|
||||
export { locale, LL, setLocale };
|
||||
|
||||
export default LL;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,47 +0,0 @@
|
||||
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
|
||||
|
||||
import { initFormatters } from './formatters';
|
||||
import type { Locales, Translations } from './i18n-types';
|
||||
import { loadedFormatters, loadedLocales, locales } from './i18n-util';
|
||||
|
||||
const localeTranslationLoaders = {
|
||||
de: () => import('./de'),
|
||||
'de-DE': () => import('./de-DE'),
|
||||
en: () => import('./en'),
|
||||
'en-US': () => import('./en-US'),
|
||||
es: () => import('./es'),
|
||||
'es-ES': () => import('./es-ES'),
|
||||
fr: () => import('./fr'),
|
||||
'fr-FR': () => import('./fr-FR'),
|
||||
id: () => import('./id'),
|
||||
'id-ID': () => import('./id-ID'),
|
||||
it: () => import('./it'),
|
||||
'it-IT': () => import('./it-IT'),
|
||||
ja: () => import('./ja'),
|
||||
'ja-JP': () => import('./ja-JP'),
|
||||
nl: () => import('./nl'),
|
||||
'nl-NL': () => import('./nl-NL'),
|
||||
pl: () => import('./pl'),
|
||||
'pl-PL': () => import('./pl-PL'),
|
||||
pt: () => import('./pt'),
|
||||
'pt-PT': () => import('./pt-PT'),
|
||||
zh: () => import('./zh'),
|
||||
'zh-CN': () => import('./zh-CN'),
|
||||
'zh-TW': () => import('./zh-TW')
|
||||
};
|
||||
|
||||
const updateDictionary = (locale: Locales, dictionary: Partial<Translations>): Translations =>
|
||||
(loadedLocales[locale] = { ...loadedLocales[locale], ...dictionary });
|
||||
|
||||
export const importLocaleAsync = async (locale: Locales): Promise<Translations> =>
|
||||
(await localeTranslationLoaders[locale]()).default as unknown as Translations;
|
||||
|
||||
export const loadLocaleAsync = async (locale: Locales): Promise<void> => {
|
||||
updateDictionary(locale, await importLocaleAsync(locale));
|
||||
loadFormatters(locale);
|
||||
};
|
||||
|
||||
export const loadAllLocalesAsync = (): Promise<void[]> => Promise.all(locales.map(loadLocaleAsync));
|
||||
|
||||
export const loadFormatters = (locale: Locales): void =>
|
||||
void (loadedFormatters[locale] = initFormatters(locale));
|
||||
@@ -1,67 +0,0 @@
|
||||
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
|
||||
|
||||
import { initFormatters } from './formatters';
|
||||
import type { Locales, Translations } from './i18n-types';
|
||||
import { loadedFormatters, loadedLocales, locales } from './i18n-util';
|
||||
|
||||
import de from './de';
|
||||
import de_DE from './de-DE';
|
||||
import en from './en';
|
||||
import en_US from './en-US';
|
||||
import es from './es';
|
||||
import es_ES from './es-ES';
|
||||
import fr from './fr';
|
||||
import fr_FR from './fr-FR';
|
||||
import id from './id';
|
||||
import id_ID from './id-ID';
|
||||
import it from './it';
|
||||
import it_IT from './it-IT';
|
||||
import ja from './ja';
|
||||
import ja_JP from './ja-JP';
|
||||
import nl from './nl';
|
||||
import nl_NL from './nl-NL';
|
||||
import pl from './pl';
|
||||
import pl_PL from './pl-PL';
|
||||
import pt from './pt';
|
||||
import pt_PT from './pt-PT';
|
||||
import zh from './zh';
|
||||
import zh_CN from './zh-CN';
|
||||
import zh_TW from './zh-TW';
|
||||
|
||||
const localeTranslations = {
|
||||
de,
|
||||
'de-DE': de_DE,
|
||||
en,
|
||||
'en-US': en_US,
|
||||
es,
|
||||
'es-ES': es_ES,
|
||||
fr,
|
||||
'fr-FR': fr_FR,
|
||||
id,
|
||||
'id-ID': id_ID,
|
||||
it,
|
||||
'it-IT': it_IT,
|
||||
ja,
|
||||
'ja-JP': ja_JP,
|
||||
nl,
|
||||
'nl-NL': nl_NL,
|
||||
pl,
|
||||
'pl-PL': pl_PL,
|
||||
pt,
|
||||
'pt-PT': pt_PT,
|
||||
zh,
|
||||
'zh-CN': zh_CN,
|
||||
'zh-TW': zh_TW
|
||||
};
|
||||
|
||||
export const loadLocale = (locale: Locales): void => {
|
||||
if (loadedLocales[locale]) return;
|
||||
|
||||
loadedLocales[locale] = localeTranslations[locale] as unknown as Translations;
|
||||
loadFormatters(locale);
|
||||
};
|
||||
|
||||
export const loadAllLocales = (): void => locales.forEach(loadLocale);
|
||||
|
||||
export const loadFormatters = (locale: Locales): void =>
|
||||
void (loadedFormatters[locale] = initFormatters(locale));
|
||||
@@ -1,67 +0,0 @@
|
||||
// This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten.
|
||||
|
||||
import {
|
||||
i18n as initI18n,
|
||||
i18nObject as initI18nObject,
|
||||
i18nString as initI18nString
|
||||
} from 'typesafe-i18n';
|
||||
import type { LocaleDetector } from 'typesafe-i18n/detectors';
|
||||
import type { LocaleTranslationFunctions, TranslateByString } from 'typesafe-i18n';
|
||||
import { detectLocale as detectLocaleFn } from 'typesafe-i18n/detectors';
|
||||
import { initExtendDictionary } from 'typesafe-i18n/utils';
|
||||
import type { Formatters, Locales, Translations, TranslationFunctions } from './i18n-types';
|
||||
|
||||
export const baseLocale: Locales = 'en';
|
||||
|
||||
export const locales: Locales[] = [
|
||||
'de',
|
||||
'de-DE',
|
||||
'en',
|
||||
'en-US',
|
||||
'es',
|
||||
'es-ES',
|
||||
'fr',
|
||||
'fr-FR',
|
||||
'id',
|
||||
'id-ID',
|
||||
'it',
|
||||
'it-IT',
|
||||
'ja',
|
||||
'ja-JP',
|
||||
'nl',
|
||||
'nl-NL',
|
||||
'pl',
|
||||
'pl-PL',
|
||||
'pt',
|
||||
'pt-PT',
|
||||
'zh',
|
||||
'zh-CN',
|
||||
'zh-TW'
|
||||
];
|
||||
|
||||
export const isLocale = (locale: string): locale is Locales => locales.includes(locale as Locales);
|
||||
|
||||
export const loadedLocales: Record<Locales, Translations> = {} as Record<Locales, Translations>;
|
||||
|
||||
export const loadedFormatters: Record<Locales, Formatters> = {} as Record<Locales, Formatters>;
|
||||
|
||||
export const extendDictionary = initExtendDictionary<Translations>();
|
||||
|
||||
export const i18nString = (locale: Locales): TranslateByString =>
|
||||
initI18nString<Locales, Formatters>(locale, loadedFormatters[locale]);
|
||||
|
||||
export const i18nObject = (locale: Locales): TranslationFunctions =>
|
||||
initI18nObject<Locales, Translations, TranslationFunctions, Formatters>(
|
||||
locale,
|
||||
loadedLocales[locale],
|
||||
loadedFormatters[locale]
|
||||
);
|
||||
|
||||
export const i18n = (): LocaleTranslationFunctions<Locales, Translations, TranslationFunctions> =>
|
||||
initI18n<Locales, Translations, TranslationFunctions, Formatters>(
|
||||
loadedLocales,
|
||||
loadedFormatters
|
||||
);
|
||||
|
||||
export const detectLocale = (...detectors: LocaleDetector[]): Locales =>
|
||||
detectLocaleFn<Locales>(baseLocale, locales, ...detectors);
|
||||
@@ -1,8 +0,0 @@
|
||||
import id from '../id';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const id_ID = {
|
||||
...(id as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default id_ID;
|
||||
@@ -1,232 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const id = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Beranda',
|
||||
order_groups: 'Grup',
|
||||
order_name: 'Nama',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Urutan',
|
||||
no_devices: 'Tidak ada perangkat terdeteksi.',
|
||||
add_first_device: 'Tambahkan perangkat pertama Anda',
|
||||
grant_permissions:
|
||||
'Mohon minta admin untuk memberikan izin ke perangkat yang sudah ada atau membuat perangkat baru.',
|
||||
search_placeholder: 'Mencari perangkat'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Akun',
|
||||
account_type_admin: 'Admin',
|
||||
account_type_user: 'Pengguna',
|
||||
avatar_title: 'Personifikasi',
|
||||
language_title: 'Bahasa',
|
||||
language_option_auto: 'Otomatis',
|
||||
change_password_title: 'Ubah kata sandi',
|
||||
change_password_body: 'Setelah kata sandi diubah, Anda harus masuk kembali.',
|
||||
change_password_label: 'Kata sandi lama',
|
||||
change_password_new: 'Kata sandi baru',
|
||||
change_password_confirm: 'Konfirmasi kata sandi'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Perangkat Baru',
|
||||
tabs: ['Manual', 'Pindai Jaringan'],
|
||||
card_btn_more: 'Lainnya',
|
||||
card_btn_more_edit: 'Ubah',
|
||||
card_btn_more_sleep: 'Tidur',
|
||||
card_btn_more_reboot: 'Mulai ulang',
|
||||
card_tooltip_wake_cron: 'Jadwal Bangun',
|
||||
card_tooltip_shutdown_cron: 'Jadwal Mati',
|
||||
card_tooltip_wake_password: 'Kata sandi bangun',
|
||||
card_tooltip_last_status_change: 'Status perubahan terakhir',
|
||||
card_password: 'Kata Sandi',
|
||||
card_nic_tooltip_pending: 'Tertunda',
|
||||
card_nic_tooltip_shutdown: 'Matikan',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Tidak ada perintah mematikan yang diatur',
|
||||
card_nic_tooltip_shutdown_no_permission: 'Tidak ada izin untuk mematikan perangkat ini',
|
||||
card_nic_tooltip_power: 'Nyalakan',
|
||||
card_nic_tooltip_power_no_permission: 'Tidak ada izin untuk menyalakan perangkat ini',
|
||||
modal_confirm_wake_title: 'Bangunkan {device}?',
|
||||
modal_confirm_wake_desc: 'Harap konfirmasi untuk membangunkan {device}.',
|
||||
modal_confirm_shutdown_title: 'Matikan {device}?',
|
||||
modal_confirm_shutdown_desc: 'Harap konfirmasi untuk mematikan {device}.',
|
||||
general: 'Umum',
|
||||
general_name: 'Nama',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Netmask',
|
||||
general_description: 'Deskripsi',
|
||||
general_description_placeholder: 'Deskripsi perangkat ini',
|
||||
general_required_field: 'wajib diisi',
|
||||
ports: 'Port',
|
||||
ports_desc: 'UpSnap juga dapat memeriksa apakah port tertentu terbuka.',
|
||||
ports_add_new: 'Tambahkan port baru',
|
||||
ports_name: 'Nama',
|
||||
ports_number: 'Nomor',
|
||||
link: 'Tautan',
|
||||
link_desc:
|
||||
'Membuat nama perangkat Anda menjadi tautan yang dapat diklik, contohnya untuk menghubungkan ke dasbor.',
|
||||
link_open: 'Buka tautan secara otomatis',
|
||||
link_open_no: 'Tidak',
|
||||
link_open_same_tab: 'Tab yang sama',
|
||||
link_open_new_tab: 'Tab baru',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Anda dapat menggunakan perintah shell khusus untuk melihat apakah perangkat menyala. Perintah harus mengembalikan kode keluar <span class="badge">0</span> untuk menunjukkan bahwa perangkat menyala, Selain kode tadi menandakan bahwa perangkat mati.',
|
||||
ping_cmd: 'Perintah ping khusus',
|
||||
wake: 'Bangunkan',
|
||||
wake_desc: 'Anda dapat menyalakan perangkat ini menggunakan tugas penjadwalan.',
|
||||
wake_cmd: 'Perintah bangunkan khusus',
|
||||
wake_cron: 'Jadwal Bangun',
|
||||
wake_cron_enable: 'Aktifkan jadwal bangun',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Anda dapat membuat tidur komputer menggunakan alat <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) merupakan alat/daemon eksternal yang berjalan di PC yang ingin Anda tidurkan, dengan menyediakan REST endpoint. Untuk instruksi pemasangan Sleep-On-LAN, silakan merujuk ke bagian <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Penggunaan</a>.',
|
||||
sol_desc2:
|
||||
'SOL dikonfigurasi untuk mengirim permintaan melalui HTTP, bukan UDP, guna memungkinkan otorisasi dan membuat permintaan lebih andal.',
|
||||
sol_desc3:
|
||||
'Oleh karena itu, pastikan Anda menyertakan <span class="badge">HTTP:<YOURPORT></span> dalam bagian <span class="badge">Listeners</span> dari <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL configuration</a>.',
|
||||
sol_enable: 'Aktifkan Sleep-On-LAN',
|
||||
sol_port: 'Port SOL',
|
||||
sol_authorization: 'Otorisasi',
|
||||
sol_user: 'Pengguna SOL',
|
||||
sol_password: 'Kata sandi SOL',
|
||||
shutdown: 'Matikan',
|
||||
shutdown_desc:
|
||||
'Perintah <strong>shell command</strong> ini akan berjalan dalam kontainer (jika menggunakan doker) atau di host Anda (jika menggunakan binary). Untuk memastikan ini berfungsi, Anda dapat menjalankan perintah di dalam kontainer atau di shell host terlebih dahulu. Perintah umum meliputi <span class="badge">net rpc</span> untuk windows, <span class="badge">sshpass</span> untuk linux atau <span class="badge">curl</span> untuk permintaan web secara umum.',
|
||||
shutdown_examples: 'Contoh:',
|
||||
shutdown_examples_windows: 'Mematikan Windows jarak jauh:',
|
||||
shutdown_examples_linux: 'Mematikan Linux jarak jauh:',
|
||||
shutdown_cmd: 'Perintah mematikan',
|
||||
shutdown_cron_desc:
|
||||
'Sama seperti mengatur penjadwalan untuk menyalakan perangkat, Anda juga dapat mengatur tugas penjadwal untuk mematikan perangkat ini.',
|
||||
shutdown_cron: 'Mematikan tugas penjadwalan',
|
||||
shutdown_cron_enable: 'Menyalakan tugas penjadwalan',
|
||||
password: 'Kata sandi',
|
||||
password_desc:
|
||||
'Beberapa kartu jaringan memiliki opsi untuk mengatur kata sandi untuk paket ajaib, juga disebut <span class="badge">SecureON</span>. Kata sandi hanya dapat memiliki panjang 0, 4, atau 6 karakter.',
|
||||
groups: 'Grup',
|
||||
groups_desc:
|
||||
'Anda dapat menambahkan perangkat ke dalam grup agar ditampilkan secara terorganisir di dasbor.',
|
||||
groups_placeholder: "Contoh: 'Ruang Bawah Tanah' atau 'Kantor'",
|
||||
network_scan_range_saved: 'Rentang pemindaian disimpan',
|
||||
network_scan_desc:
|
||||
'Pindai jaringan Anda secara otomatis untuk menemukan perangkat. Agar ini berfungsi, Anda perlu menjalankan UpSnap sebagai root/admin dan memastikan nmap sudah terinstal serta tersedia di $PATH Anda (Untuk pengguna Docker, ini sudah diatur secara otomatis). Pemindaian mungkin memerlukan beberapa detik.',
|
||||
network_scan_ip_range: 'Rentang IP',
|
||||
network_scan_no_range: 'Tidak ada rentang pemindaian',
|
||||
network_scan_unsaved_changes: 'Perubahan belum disimpan',
|
||||
network_scan_running: 'Pemindaian sedang berjalan',
|
||||
network_scan: 'Pindai',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Vendor Mac:',
|
||||
network_scan_netmask: 'Netmask:',
|
||||
network_scan_add_all: 'Tambahkan semua perangkat',
|
||||
network_scan_replace_netmask: 'Ganti netmask untuk semua perangkat?',
|
||||
network_scan_new_netmask: 'Netmask baru',
|
||||
network_scan_include_unknown: 'Sertakan perangkat dengan nama "Tidak Diketahui"',
|
||||
require_confirmation: 'Memerlukan Konfirmasi'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Selamat Datang',
|
||||
email_label: 'Email atau Nama Pengguna:',
|
||||
password_label: 'Kata Sandi:',
|
||||
btn_more: 'Lainnya',
|
||||
menu_title_auth_providers: 'Penyedia Autentikasi Lainnya',
|
||||
btn_login: 'Masuk'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Pengaturan',
|
||||
ping_interval_title: 'Interval Ping',
|
||||
ping_interval_desc1:
|
||||
'Menetapkan interval waktu di mana perangkat akan diping. Biarkan kosong untuk menggunakan nilai default <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Pelajari lebih lanjut tentang sintaks tugas penjadwalan yang benar di <a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> atau lihat <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">dokumentasi paket</a>.',
|
||||
lazy_ping_title: 'Ping Santai',
|
||||
lazy_ping_desc:
|
||||
'Saat Ping Santai diaktifkan, UpSnap hanya akan memping perangkat jika ada pengguna yang mengakses situs web. Jika dinonaktifkan, UpSnap akan selalu memping perangkat.',
|
||||
lazy_ping_enable: 'Aktifkan',
|
||||
website_title_title: 'Judul Situs Web',
|
||||
website_title_desc: 'Mengatur judul situs web dan tab di browser.',
|
||||
icon_title: 'Ikon',
|
||||
icon_desc: 'Atur favicon khusus. Jenis file yang didukung:',
|
||||
upsnap_version: 'Versi UpSnap',
|
||||
invalid_cron: 'Sintaks tugas penjadwalan tidak valid'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Pengguna',
|
||||
allow_create_devices:
|
||||
'Izinkan {username} untuk membuat perangkat baru dan mengedit grup perangkat',
|
||||
device_permissions: 'Izin Perangkat',
|
||||
create_new_device: 'Buat perangkat baru',
|
||||
read: 'Baca',
|
||||
update: 'Perbarui',
|
||||
delete: 'Hapus',
|
||||
power: 'Daya',
|
||||
toggle: 'Alihkan',
|
||||
confirm_delete_title: 'Konfirmasi Penghapusan',
|
||||
confirm_delete_desc: 'Apakah Anda yakin ingin menghapus {username}?',
|
||||
create_new_user: 'Buat pengguna baru',
|
||||
username: 'Nama Pengguna',
|
||||
password: 'Kata Sandi',
|
||||
password_confirm: 'Konfirmasi Kata Sandi',
|
||||
required_field: 'Kolom wajib diisi'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Simpan',
|
||||
delete: 'Hapus',
|
||||
change: 'Ubah',
|
||||
reset: 'Atur Ulang',
|
||||
cancel: 'Batal',
|
||||
add: 'Tambah',
|
||||
confirm: 'Konfirmasi'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Selamat Datang di UpSnap 🥳',
|
||||
step1_setup_desc: 'Silakan selesaikan langkah-langkah berikut untuk menyelesaikan pengaturan.',
|
||||
step1_setup_btn_next: 'Lanjut',
|
||||
step2_page_title: 'Buat Akun Admin',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Kata Sandi:',
|
||||
step2_label_min_chars: 'minimal 10 karakter',
|
||||
step2_label_password_confirm: 'Konfirmasi Kata Sandi:',
|
||||
step2_btn_create: 'Buat',
|
||||
step3_page_title: 'Semua sudah siap! 🎉',
|
||||
step3_page_desc: 'Silakan tambahkan beberapa perangkat ke dasbor Anda.',
|
||||
step3_btn_done: 'Ayo mulai!',
|
||||
not_expected_title: 'Saya tidak mengira Anda akan berada di sini! 🧐',
|
||||
not_expected_desc: 'Anda sudah menyelesaikan pengaturan! Tidak ada yang perlu dilakukan.',
|
||||
not_expected_back: 'Kembali ke halaman utama',
|
||||
progress_step1: 'Selamat Datang',
|
||||
progress_step2: 'Buat Akun',
|
||||
progress_step3: 'Selesai'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Admin disimpan',
|
||||
user_saved: 'Pengguna disimpan',
|
||||
user_created: 'Pengguna {username} dibuat',
|
||||
user_deleted: 'Pengguna {username} dihapus',
|
||||
settings_saved: 'Pengaturan disimpan',
|
||||
password_changed: 'Kata sandi diubah. Silakan masuk kembali.',
|
||||
passwords_missmatch: 'Kata sandi tidak cocok',
|
||||
permissions_created: 'Izin untuk {username} dibuat',
|
||||
permissions_deleted: 'Izin untuk {username} dihapus',
|
||||
permissions_updated: 'Izin untuk {username} diperbarui',
|
||||
permissions_updated_personal: 'Izin Anda telah diperbarui',
|
||||
no_permission: 'Anda tidak memiliki izin untuk mengakses {url}',
|
||||
device_created: 'Membuat {device}',
|
||||
devices_created_multiple: 'Membuat {count|int} perangkat',
|
||||
device_updated: 'Memperbarui {device}',
|
||||
device_deleted: 'Menghapus {device}',
|
||||
group_created: 'Membuat grup {group}',
|
||||
group_deleted: 'Menghapus grup {group}'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Tema',
|
||||
new: 'Baru',
|
||||
edit_account: 'Ubah akun',
|
||||
logout: 'Keluar'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default id;
|
||||
@@ -1,8 +0,0 @@
|
||||
import it from '../it';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const it_IT = {
|
||||
...(it as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default it_IT;
|
||||
@@ -1,233 +0,0 @@
|
||||
import type { BaseTranslation } from '../i18n-types';
|
||||
|
||||
const it = {
|
||||
home: {
|
||||
page_title: 'Home',
|
||||
order_groups: 'Gruppi',
|
||||
order_name: 'Nome',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Ordine',
|
||||
no_devices: 'Nessun dispositivo qui.',
|
||||
add_first_device: 'Aggiungi il tuo primo dispositivo',
|
||||
grant_permissions:
|
||||
"Per favore chiedi all' amministratore di darti i permessi necessari per aggiungere un nuovo dispositivo.",
|
||||
search_placeholder: 'Ricerca di dispositivi'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Account',
|
||||
account_type_admin: 'Amministratore',
|
||||
account_type_user: 'Utente',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Lingua',
|
||||
language_option_auto: 'Automatico',
|
||||
change_password_title: 'Cambia password',
|
||||
change_password_body: 'Dopo aver cambiato la password, dovrai effettuare di nuovo il login.',
|
||||
change_password_label: 'Vecchia password',
|
||||
change_password_new: 'Nuova password',
|
||||
change_password_confirm: 'Conferma la password'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Nuovo dispositivo',
|
||||
tabs: ['Manuale', 'Scansiona la rete'],
|
||||
card_btn_more: '...',
|
||||
card_btn_more_edit: 'Modifica',
|
||||
card_btn_more_sleep: 'Dormi',
|
||||
card_btn_more_reboot: 'Riavvia',
|
||||
card_tooltip_wake_cron: 'Sveglia programmata',
|
||||
card_tooltip_shutdown_cron: 'Spegnimento programmato',
|
||||
card_tooltip_wake_password: 'Password sveglia',
|
||||
card_tooltip_last_status_change: 'Ultimo cambiamento di stato',
|
||||
card_password: 'Password',
|
||||
card_nic_tooltip_pending: 'In attesa',
|
||||
card_nic_tooltip_shutdown: 'Spegni',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Nessun comando di spegnimento impostato',
|
||||
card_nic_tooltip_shutdown_no_permission:
|
||||
'Non hai i permessi necessari per spegnere questo dispositivo',
|
||||
card_nic_tooltip_power: 'Accendi',
|
||||
card_nic_tooltip_power_no_permission:
|
||||
'Non hai i permessi necessari per accendere questo dispositivo',
|
||||
modal_confirm_wake_title: 'Accendere {device}?',
|
||||
modal_confirm_wake_desc: 'Sicuro di voler accendere {device}.',
|
||||
modal_confirm_shutdown_title: 'Spegnere {device}?',
|
||||
modal_confirm_shutdown_desc: 'Sicuro di voler spegnere {device}.',
|
||||
general: 'Generale',
|
||||
general_name: 'Nome',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Maschera di rete',
|
||||
general_description: 'Descrizione',
|
||||
general_description_placeholder: 'Descrizione del dispositivo',
|
||||
general_required_field: 'Campo obbligatorio',
|
||||
ports: 'Porte',
|
||||
ports_desc: "UpSnap puo' anche controllare che le porte siano aperte.",
|
||||
ports_add_new: 'Aggiungi nuova porta',
|
||||
ports_name: 'Nome',
|
||||
ports_number: 'Numero',
|
||||
link: 'Collegamento',
|
||||
link_desc:
|
||||
'Rende il nome del tuo dispositivo un collegamento, perfetto per collegare ad esempio un sito.',
|
||||
link_open: 'Aprire automaticamente il link',
|
||||
link_open_no: 'No',
|
||||
link_open_same_tab: 'Stessa scheda',
|
||||
link_open_new_tab: 'Nuova scheda',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Puoi usare un comando personalizzato per controllare che il dispositivo sia acceso. Il comando deve ritornare un codice uguale a <span class="badge">0</span> per confermare che il dispositivo sia acceso, mentre qualunque altro codice indica che il dispositivo e\' spento.',
|
||||
ping_cmd: 'Comando ping personalizzato',
|
||||
wake: 'Accendi',
|
||||
wake_desc: 'Puoi accendere questo dispositivo con una sveglia programmata.',
|
||||
wake_cmd: 'Comando di accensione personalizzato',
|
||||
wake_cron: 'Sveglia programmata',
|
||||
wake_cron_enable: 'Abilita sveglia programmata',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Puoi spegnere il tuo dispositivo usando lo strumento <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) e\' uno strumento esterno che opera sul dispositivo che vuoi spegnere, il quale rende disponibile un endpoint REST. Puoi riferirti al link <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Uso</a> (in inglese) per le istruzioni.',
|
||||
sol_desc2:
|
||||
"Lo strumento SOL e' configurato per mandare richieste con il protocollo HTTP invece che UDP per abilitare l' autorizzazione e rendere le richieste piu' affidabili",
|
||||
sol_desc3:
|
||||
'Pertanto, assicuratevi di includere <span class="badge">HTTP:<LA-TUA-PORTA></span> nella sezione <span class="badge">Listeners</span> della <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">configurazione di SOL</a>.',
|
||||
sol_enable: 'Abilita Sleep-On-LAN',
|
||||
sol_port: 'Porta SOL',
|
||||
sol_authorization: 'Autorizzazione',
|
||||
sol_user: 'Utente SOL',
|
||||
sol_password: 'Password SOL',
|
||||
shutdown: 'Spegni',
|
||||
shutdown_desc:
|
||||
'Questo <strong>prompt dei comandi</strong> girera\' nel tuo container (se usi docker) o direttamente sul tuo host (se usi i file di installazione). Per verificare che funzioni correttamente, puoi eseguire i comandi direttamente nel container o nel tuo sistema host. Alcuni comandi comuni sono <span class="badge">net rpc</span> per windows, <span class="badge">sshpass</span> per linux oppure <span class="badge">curl</span> in generale per fare richieste con HTTP.',
|
||||
shutdown_examples: 'Esempi:',
|
||||
shutdown_examples_windows: 'Spegni macchina windows remota:',
|
||||
shutdown_examples_linux: 'Spegni macchina linux remota:',
|
||||
shutdown_cmd: 'Comando di spegnimento',
|
||||
shutdown_cron_desc:
|
||||
'Settando i parametri esattamente come fareste con cron su linux, potrete cosi anche impostare un azione di spegnimento su questo dispositivo.',
|
||||
shutdown_cron: 'Parametri di spegnimento per cron',
|
||||
shutdown_cron_enable: 'Abilita lo spegnimento tramite cron',
|
||||
password: 'Password',
|
||||
password_desc:
|
||||
'Alcune schede di rete hanno una opzione per settare una password per i magic packets, chiamata anche <span class="badge">SecureON</span>. La lunghezza della password puo\' essere solo di 0, 4 o 6 caratteri.',
|
||||
groups: 'Gruppi',
|
||||
groups_desc:
|
||||
'Puoi aggiungere un dispositivo ad un gruppo per averli raggruppati nel schermata principale.',
|
||||
groups_placeholder: "per esempio 'Cantina' o 'Ufficio'",
|
||||
network_scan_range_saved: 'Intervallo di scansione salvato',
|
||||
network_scan_desc:
|
||||
"Scansiona automaticamente la tua rete per i dispositivi disponibili. Affinche' funzioni, devi eseguire UpSnap come root/admin ed avere nmap installato e disponibile nella variabile d'ambiente $PATH (per gli utenti docker, questo e' gia' il caso e non devi cambiare niente). La scansione puo' richiedere alcuni secondi.",
|
||||
network_scan_ip_range: 'Intervallo IP',
|
||||
network_scan_no_range: 'Nessuno intervallo di scansione',
|
||||
network_scan_unsaved_changes: 'Modifiche non salvate',
|
||||
network_scan_running: 'Scansione in corso',
|
||||
network_scan: 'Scansiona',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Fornitore Mac:',
|
||||
network_scan_netmask: 'Maschera di rete:',
|
||||
network_scan_add_all: 'Aggiungi tutti i dispositivi',
|
||||
network_scan_replace_netmask: 'Modificare la maschera di rete per tutti i dispositivi?',
|
||||
network_scan_new_netmask: 'Nuova mascheda di rete',
|
||||
network_scan_include_unknown: 'Includi i dispositivi il cui nome e\' "Unknown" o "Sconosciuto"',
|
||||
require_confirmation: 'Chiedi conferma'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Benvenuti',
|
||||
email_label: 'Email o nome utente:',
|
||||
password_label: 'Password:',
|
||||
btn_more: 'Di piu...',
|
||||
menu_title_auth_providers: 'Altri gestori di autenticazione',
|
||||
btn_login: 'Login'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Opzioni',
|
||||
ping_interval_title: 'Intervallo di ping',
|
||||
ping_interval_desc1:
|
||||
'Imposta l\'intervallo nel quale i dispositivi vengono testati con ping. Lasciare in bianco per lasciare il valore predefinito <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Per ulteriori dettagli circa la sintassi corretta di cron, fare riferimento a <a class="link" href="https://it.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> oppure a <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">questa documentazione</a> (in inglese).',
|
||||
lazy_ping_title: 'Ping pigro',
|
||||
lazy_ping_desc:
|
||||
"Quando il ping pigro e' abilitato, UpSnap effettuera' i ping verso di dispositivi solamente quando un utente effettivamente visita il sito. Se e' spento, allora UpSnap continuera' con il ping sempre.",
|
||||
lazy_ping_enable: 'Abilita',
|
||||
website_title_title: 'Nome del sito',
|
||||
website_title_desc: 'Imposta il nome del sito.',
|
||||
icon_title: 'Icona',
|
||||
icon_desc: 'Imposta una icona personalizzata. I tipi di file supportati sono:',
|
||||
upsnap_version: 'Versione UpSnap',
|
||||
invalid_cron: 'Sintassi cron non valida'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Utenti',
|
||||
allow_create_devices:
|
||||
'Permetti a {username} di creare nuovo dispositivi e gestire i gruppi di dispositivi.',
|
||||
device_permissions: 'Permessi dispositivo',
|
||||
create_new_device: 'Crea un nuovo dispositivo',
|
||||
read: 'Leggi',
|
||||
update: 'Modifica',
|
||||
delete: 'Cancella',
|
||||
power: 'Accendi',
|
||||
toggle: 'Inverti',
|
||||
confirm_delete_title: 'Conferma rimozione',
|
||||
confirm_delete_desc: 'Sei sicuro di voler rimuovere {username}?',
|
||||
create_new_user: 'Crea nuovo utente',
|
||||
username: 'Nome utente',
|
||||
password: 'Password',
|
||||
password_confirm: 'Conferma la password',
|
||||
required_field: 'Campo obbligatorio'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Salva',
|
||||
delete: 'Cancella',
|
||||
change: 'Cambia',
|
||||
reset: 'Resetta',
|
||||
cancel: 'Annulla',
|
||||
add: 'Aggiungi',
|
||||
confirm: 'Conferma'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Benvenuti ad UpSnap 🥳',
|
||||
step1_setup_desc: "Per favore, completate i seguenti passi per terminare l'installazione.",
|
||||
step1_setup_btn_next: 'Avanti',
|
||||
step2_page_title: 'Creare un account amministratore',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Password:',
|
||||
step2_label_min_chars: 'Min. 10 caratteri',
|
||||
step2_label_password_confirm: 'Conferma la password:',
|
||||
step2_btn_create: 'Crea',
|
||||
step3_page_title: 'Abbiamo finito! 🎉',
|
||||
step3_page_desc: 'Prosegui adesso per aggiungere dispositivi alla tua lista.',
|
||||
step3_btn_done: 'Andiamo!',
|
||||
not_expected_title: 'Non mi aspettavo di vederti qui! 🧐',
|
||||
not_expected_desc:
|
||||
"L' installazione e' gia' terminata! Non ci sono operazioni da svolgere qui.",
|
||||
not_expected_back: 'Indietro',
|
||||
progress_step1: 'Benvenuti',
|
||||
progress_step2: 'Creare un account',
|
||||
progress_step3: 'Fatto'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Account amministratore salvato',
|
||||
user_saved: 'Account utente salvato',
|
||||
user_created: 'Utente {username} creato',
|
||||
user_deleted: 'Utente {username} cancellato',
|
||||
settings_saved: 'Impostazioni salvate',
|
||||
password_changed: 'Password cambiata. Per favore, effettuate di nuovo il login.',
|
||||
passwords_missmatch: 'Le password non corrispondono',
|
||||
permissions_created: 'I permessi per {username} sono stati creati',
|
||||
permissions_deleted: 'I permessi per {username} sono stati cancellati',
|
||||
permissions_updated: 'I permessi per {username} sono stati aggiornati',
|
||||
permissions_updated_personal: 'I tuoi permessi sono stati aggiornati',
|
||||
no_permission: 'Non hai i permessi necessari per visitare {url}',
|
||||
device_created: 'Creato dispositivo {device}',
|
||||
devices_created_multiple: 'Creato/i {count|int} dispositivi',
|
||||
device_updated: '{device} aggiornato',
|
||||
device_deleted: '{device} cancellato',
|
||||
group_created: 'Gruppo {group} creato',
|
||||
group_deleted: 'Gruppo {group} cancellato'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Tema',
|
||||
new: 'Nuovo',
|
||||
edit_account: 'Modifica accont',
|
||||
logout: 'Esci'
|
||||
}
|
||||
} satisfies BaseTranslation;
|
||||
|
||||
export default it;
|
||||
@@ -1,8 +0,0 @@
|
||||
import type { Translation } from '../i18n-types';
|
||||
import ja from '../ja';
|
||||
|
||||
const ja_JP = {
|
||||
...(ja as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default ja_JP;
|
||||
@@ -1,230 +0,0 @@
|
||||
import type { BaseTranslation } from '../i18n-types';
|
||||
|
||||
const ja = {
|
||||
home: {
|
||||
page_title: 'ホーム',
|
||||
order_groups: 'グループ',
|
||||
order_name: '名前',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: '順序',
|
||||
no_devices: 'デバイスがありません',
|
||||
add_first_device: '最初のデバイスを追加してください',
|
||||
grant_permissions:
|
||||
'既存のデバイスへの権限を付与するか、新しいデバイスを作成するために管理者に依頼してください。',
|
||||
search_placeholder: 'デバイスの検索'
|
||||
},
|
||||
account: {
|
||||
page_title: 'アカウント',
|
||||
account_type_admin: '管理者',
|
||||
account_type_user: 'ユーザー',
|
||||
avatar_title: 'アバター',
|
||||
language_title: '言語',
|
||||
language_option_auto: '自動',
|
||||
change_password_title: 'パスワード変更',
|
||||
change_password_body: 'パスワードを変更すると、再度ログインする必要があります。',
|
||||
change_password_label: '現在のパスワード',
|
||||
change_password_new: '新しいパスワード',
|
||||
change_password_confirm: 'パスワードの確認'
|
||||
},
|
||||
device: {
|
||||
page_title: '新しいデバイス',
|
||||
tabs: ['手動', 'ネットワークスキャン'],
|
||||
card_btn_more: '詳細',
|
||||
card_btn_more_edit: '編集',
|
||||
card_btn_more_sleep: 'スリープ',
|
||||
card_btn_more_reboot: '再起動',
|
||||
card_tooltip_wake_cron: '起動スケジュール',
|
||||
card_tooltip_shutdown_cron: 'シャットダウンスケジュール',
|
||||
card_tooltip_wake_password: '起動パスワード',
|
||||
card_tooltip_last_status_change: '最終ステータス変更',
|
||||
card_password: 'パスワード',
|
||||
card_nic_tooltip_pending: '保留中',
|
||||
card_nic_tooltip_shutdown: 'シャットダウン済み',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'シャットダウンコマンドが設定されていません',
|
||||
card_nic_tooltip_shutdown_no_permission: 'このデバイスをシャットダウンする権限がありません',
|
||||
card_nic_tooltip_power: '電源オン',
|
||||
card_nic_tooltip_power_no_permission: 'このデバイスの電源をオンにする権限がありません',
|
||||
modal_confirm_wake_title: '{device} を起動しますか?',
|
||||
modal_confirm_wake_desc: '{device} を起動することを確認してください。',
|
||||
modal_confirm_shutdown_title: '{device} をシャットダウンしますか?',
|
||||
modal_confirm_shutdown_desc: '{device} をシャットダウンすることを確認してください。',
|
||||
general: '一般',
|
||||
general_name: '名前',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'ネットマスク',
|
||||
general_description: '説明',
|
||||
general_description_placeholder: '装置の説明',
|
||||
general_required_field: '必須項目',
|
||||
ports: 'ポート',
|
||||
ports_desc: 'UpSnap は指定されたポートが開いているか確認することもできます。',
|
||||
ports_add_new: '新しいポートを追加',
|
||||
ports_name: '名前',
|
||||
ports_number: '番号',
|
||||
link: 'リンク',
|
||||
link_desc:
|
||||
'デバイス名をクリック可能なリンクにします。たとえばダッシュボードへのリンクに最適です。',
|
||||
link_open: '自動的にリンクを開く',
|
||||
link_open_no: 'いいえ',
|
||||
link_open_same_tab: '同じタブ',
|
||||
link_open_new_tab: '新しいタブ',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'デバイスがオンになっているか確認するためにカスタムシェルコマンドを使用できます。このコマンドは、デバイスがオンであることを示すには終了コード <span class="badge">0</span> を返す必要があります。その他の終了コードはオフとして扱われます。',
|
||||
ping_cmd: 'カスタム Ping コマンド',
|
||||
wake: '起動',
|
||||
wake_desc: 'スケジュールされた cron ジョブを使用してこのデバイスを起動できます。',
|
||||
wake_cmd: 'カスタム起動コマンド',
|
||||
wake_cron: '起動スケジュール',
|
||||
wake_cron_enable: '起動スケジュールを有効化',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'<a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> ツールを使用してコンピュータをスリープ状態にすることができます。Sleep-On-LAN(SOL)は、スリープ状態にしたい PC で動作する外部ツール/デーモンで、REST エンドポイントを提供します。Sleep-On-LAN のセットアップ方法については、<a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a> セクションを参照してください。',
|
||||
sol_desc2:
|
||||
'SOL は、認証を有効にし、要求をより信頼性の高いものにするために、UDP の代わりに HTTP を使用してリクエストを送信するように構成されています。',
|
||||
sol_desc3:
|
||||
'したがって、<a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL 構成</a>の <span class="badge">Listeners</span> セクションに <span class="badge">HTTP:<YOURPORT></span> を含めるようにしてください。',
|
||||
sol_enable: 'Sleep-On-LAN を有効化',
|
||||
sol_port: 'SOL ポート',
|
||||
sol_authorization: '認証',
|
||||
sol_user: 'SOL ユーザー',
|
||||
sol_password: 'SOL パスワード',
|
||||
shutdown: 'シャットダウン',
|
||||
shutdown_desc:
|
||||
'この <strong>シェルコマンド</strong> は、コンテナ内(Docker を使用している場合)またはホスト(バイナリを使用している場合)で実行されます。機能を確認するには、まずコマンドをコンテナ内またはホストのシェルで実行してください。一般的なコマンドには、Windows 用の <span class="badge">net rpc</span>、Linux 用の <span class="badge">sshpass</span>、またはウェブリクエストを行うための <span class="badge">curl</span> などがあります。',
|
||||
shutdown_examples: '例:',
|
||||
shutdown_examples_windows: 'リモート Windows マシンのシャットダウン:',
|
||||
shutdown_examples_linux: 'リモート Linux マシンのシャットダウン:',
|
||||
shutdown_cmd: 'シャットダウンコマンド',
|
||||
shutdown_cron_desc:
|
||||
'デバイスを起動するために cron を設定するのと同様に、このデバイスをシャットダウンするための cron ジョブをスケジュールすることもできます。',
|
||||
shutdown_cron: 'シャットダウンスケジュール',
|
||||
shutdown_cron_enable: 'シャットダウンスケジュールを有効化',
|
||||
password: 'パスワード',
|
||||
password_desc:
|
||||
'一部のネットワークカードには、マジックパケット用のパスワード(<span class="badge">SecureON</span> とも呼ばれる)を設定するオプションがあります。パスワードは 0、4、または 6 文字のみの長さである必要があります。',
|
||||
groups: 'グループ',
|
||||
groups_desc:
|
||||
'デバイスをグループに追加することで、ダッシュボード上でグループごとに並べ替えることができます。',
|
||||
groups_placeholder: "例: '自宅' や 'オフィス' など",
|
||||
network_scan_range_saved: 'スキャン範囲が保存されました',
|
||||
network_scan_desc:
|
||||
'ネットワーク上のデバイスを自動的にスキャンします。この機能を使用するには、UpSnap を root/admin 権限で実行し、nmap が $PATH にインストールされて利用可能である必要があります(Docker ユーザーの場合、すでに設定済みで何もする必要はありません)。スキャンには数秒かかる場合があります。',
|
||||
network_scan_ip_range: 'IP 範囲',
|
||||
network_scan_no_range: 'スキャン範囲なし',
|
||||
network_scan_unsaved_changes: '未保存の変更',
|
||||
network_scan_running: 'スキャン実行中',
|
||||
network_scan: 'スキャン',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac ベンダー:',
|
||||
network_scan_netmask: 'ネットマスク:',
|
||||
network_scan_add_all: 'すべてのデバイスを追加',
|
||||
network_scan_replace_netmask: 'すべてのデバイスのネットマスクを置き換えますか?',
|
||||
network_scan_new_netmask: '新しいネットマスク',
|
||||
network_scan_include_unknown: '名前が「Unknown」のデバイスを含める',
|
||||
require_confirmation: '確認を要求'
|
||||
},
|
||||
login: {
|
||||
welcome: 'ようこそ',
|
||||
email_label: 'メールアドレスまたはユーザー名:',
|
||||
password_label: 'パスワード:',
|
||||
btn_more: '詳細',
|
||||
menu_title_auth_providers: '他の認証プロバイダー',
|
||||
btn_login: 'ログイン'
|
||||
},
|
||||
settings: {
|
||||
page_title: '設定',
|
||||
ping_interval_title: 'Ping 間隔',
|
||||
ping_interval_desc1:
|
||||
'デバイスが ping される間隔を設定します。空白の場合、デフォルト値 <span class="badge">@every 3s</span> が使用されます。',
|
||||
ping_interval_desc2:
|
||||
'cron の正しい構文については、<a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> または <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">パッケージドキュメント</a> を参照してください。',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc:
|
||||
'Lazy ping をオンにすると、UpSnap はアクティブなユーザーがウェブサイトを訪れている場合にのみデバイスを ping します。オフの場合、UpSnap は常にデバイスを ping します。',
|
||||
lazy_ping_enable: '有効化',
|
||||
website_title_title: 'ウェブサイトタイトル',
|
||||
website_title_desc: 'ウェブサイトおよびブラウザタブのタイトルを設定します。',
|
||||
icon_title: 'アイコン',
|
||||
icon_desc: 'カスタムファビコンを設定します。サポートされているファイルタイプ:',
|
||||
upsnap_version: 'UpSnap バージョン',
|
||||
invalid_cron: '無効なcron構文'
|
||||
},
|
||||
users: {
|
||||
page_title: 'ユーザー',
|
||||
allow_create_devices:
|
||||
'{username} が新しいデバイスを作成し、デバイスグループを編集できるようにする',
|
||||
device_permissions: 'デバイスの権限',
|
||||
create_new_device: '新しいデバイスを作成',
|
||||
read: '読み取り',
|
||||
update: '更新',
|
||||
delete: '削除',
|
||||
power: '電源',
|
||||
toggle: '切り替え',
|
||||
confirm_delete_title: '削除の確認',
|
||||
confirm_delete_desc: '{username} を削除してもよろしいですか?',
|
||||
create_new_user: '新しいユーザーを作成',
|
||||
username: 'ユーザー名',
|
||||
password: 'パスワード',
|
||||
password_confirm: 'パスワードの確認',
|
||||
required_field: '必須項目'
|
||||
},
|
||||
buttons: {
|
||||
save: '保存',
|
||||
delete: '削除',
|
||||
change: '変更',
|
||||
reset: 'リセット',
|
||||
cancel: 'キャンセル',
|
||||
add: '追加',
|
||||
confirm: '確認'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'UpSnap へようこそ 🥳',
|
||||
step1_setup_desc: 'セットアップを完了するには、以下の手順を完了してください。',
|
||||
step1_setup_btn_next: '次へ',
|
||||
step2_page_title: '管理者アカウントを作成',
|
||||
step2_label_email: 'メールアドレス:',
|
||||
step2_label_password: 'パスワード:',
|
||||
step2_label_min_chars: '最小 10 文字',
|
||||
step2_label_password_confirm: 'パスワードの確認:',
|
||||
step2_btn_create: '作成',
|
||||
step3_page_title: '準備完了です! 🎉',
|
||||
step3_page_desc: 'ダッシュボードにデバイスを追加してください。',
|
||||
step3_btn_done: '始めましょう!',
|
||||
not_expected_title: 'ここにいるとは思いませんでした! 🧐',
|
||||
not_expected_desc: 'セットアップはすでに完了しています!やるべきことはありません。',
|
||||
not_expected_back: '戻る',
|
||||
progress_step1: 'ようこそ',
|
||||
progress_step2: 'アカウント作成',
|
||||
progress_step3: '完了'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: '管理者を保存しました',
|
||||
user_saved: 'ユーザーを保存しました',
|
||||
user_created: 'ユーザー {username} を作成しました',
|
||||
user_deleted: 'ユーザー {username} を削除しました',
|
||||
settings_saved: '設定を保存しました',
|
||||
password_changed: 'パスワードが変更されました。再度ログインしてください。',
|
||||
passwords_missmatch: 'パスワードが一致しません',
|
||||
permissions_created: '{username} の権限を作成しました',
|
||||
permissions_deleted: '{username} の権限を削除しました',
|
||||
permissions_updated: '{username} の権限を更新しました',
|
||||
permissions_updated_personal: 'あなたの権限が更新されました',
|
||||
no_permission: '{url} へのアクセス権がありません',
|
||||
device_created: '{device} を作成しました',
|
||||
devices_created_multiple: '{count|int} 台のデバイスを作成しました',
|
||||
device_updated: '{device} を更新しました',
|
||||
device_deleted: '{device} を削除しました',
|
||||
group_created: 'グループ {group} を作成しました',
|
||||
group_deleted: 'グループ {group} を削除しました'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'テーマ',
|
||||
new: '新規',
|
||||
edit_account: 'アカウント編集',
|
||||
logout: 'ログアウト'
|
||||
}
|
||||
} satisfies BaseTranslation;
|
||||
|
||||
export default ja;
|
||||
@@ -1,8 +0,0 @@
|
||||
import nl from '../nl';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const nl_NL = {
|
||||
...(nl as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default nl_NL;
|
||||
@@ -1,232 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const nl = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Home',
|
||||
order_groups: 'Groepen',
|
||||
order_name: 'Naam',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Sorteren',
|
||||
no_devices: 'Geen apparaten gevonden.',
|
||||
add_first_device: 'Voeg je eerste apparaat toe',
|
||||
grant_permissions:
|
||||
'Vraag de admin om je toestemming te geven voor bestaande apparaten of om nieuwe te creëren.',
|
||||
search_placeholder: 'Apparaten zoeken'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Account',
|
||||
account_type_admin: 'Beheerder',
|
||||
account_type_user: 'Gebruiker',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Taal',
|
||||
language_option_auto: 'Automatisch',
|
||||
change_password_title: 'Wachtwoord wijzigen',
|
||||
change_password_body: 'Na het wijzigen van het wachtwoord moet je opnieuw inloggen.',
|
||||
change_password_label: 'Oud wachtwoord',
|
||||
change_password_new: 'Nieuw wachtwoord',
|
||||
change_password_confirm: 'Bevestig wachtwoord'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Nieuw apparaat',
|
||||
tabs: ['Handmatig', 'Netwerkscan'],
|
||||
card_btn_more: 'Meer',
|
||||
card_btn_more_edit: 'Bewerken',
|
||||
card_btn_more_sleep: 'Slaapstand',
|
||||
card_btn_more_reboot: 'Herstarten',
|
||||
card_tooltip_wake_cron: 'Wek cron',
|
||||
card_tooltip_shutdown_cron: 'Afsluiten cron',
|
||||
card_tooltip_wake_password: 'Wek wachtwoord',
|
||||
card_tooltip_last_status_change: 'Laatste statuswijziging',
|
||||
card_password: 'Wachtwoord',
|
||||
card_nic_tooltip_pending: 'In behandeling',
|
||||
card_nic_tooltip_shutdown: 'Afsluiten',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Geen uitschakel-opdracht ingesteld',
|
||||
card_nic_tooltip_shutdown_no_permission: 'Geen toestemming om dit apparaat uit te schakelen',
|
||||
card_nic_tooltip_power: 'Aanzetten',
|
||||
card_nic_tooltip_power_no_permission: 'Geen toestemming om dit apparaat aan te zetten',
|
||||
modal_confirm_wake_title: 'Wek {device}?',
|
||||
modal_confirm_wake_desc: 'Bevestig om {device} te wekken.',
|
||||
modal_confirm_shutdown_title: 'Afsluiten {device}?',
|
||||
modal_confirm_shutdown_desc: 'Bevestig om {device} af te sluiten.',
|
||||
general: 'Algemeen',
|
||||
general_name: 'Naam',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Subnetmask',
|
||||
general_description: 'Beschrijving',
|
||||
general_description_placeholder: 'Enige beschrijving van het apparaat',
|
||||
general_required_field: 'vereist veld',
|
||||
ports: 'Poorten',
|
||||
ports_desc: 'UpSnap kan ook controleren of gegeven poorten open zijn.',
|
||||
ports_add_new: 'Voeg nieuwe poort toe',
|
||||
ports_name: 'Naam',
|
||||
ports_number: 'Nummer',
|
||||
link: 'Link',
|
||||
link_desc:
|
||||
'Maakt de apparaatsnaam een klikbare link, ideaal om bijvoorbeeld een dashboard te linken.',
|
||||
link_open: 'Link automatisch openen',
|
||||
link_open_no: 'Nee',
|
||||
link_open_same_tab: 'Zelfde tab',
|
||||
link_open_new_tab: 'Nieuw tabblad',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Je kunt een aangepaste shell-opdracht gebruiken om te zien of het apparaat aan staat. De opdracht moet een exitcode van <span class="badge">0</span> retourneren om aan te geven dat het apparaat aan is, elke andere exitcode markeert het apparaat als uitgeschakeld.',
|
||||
ping_cmd: 'Aangepaste ping-opdracht',
|
||||
wake: 'Wek',
|
||||
wake_desc: 'Je kunt dit apparaat inschakelen met een geplande cron-taak.',
|
||||
wake_cmd: 'Aangepaste wek-opdracht',
|
||||
wake_cron: 'Wek cron',
|
||||
wake_cron_enable: 'Wek cron inschakelen',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Je kunt computers in de slaapstand zetten met de <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> tool. Sleep-On-LAN (SOL) is een externe tool/daemon die op de PC\'s werkt die je in de slaapstand wilt zetten en biedt een REST-endpoint. Voor instructies over het instellen van Sleep-On-LAN, zie de <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Gebruik</a> sectie.',
|
||||
sol_desc2:
|
||||
'SOL is geconfigureerd om verzoeken over HTTP in plaats van UDP te verzenden om autorisatie mogelijk te maken en verzoeken betrouwbaarder te maken.',
|
||||
sol_desc3:
|
||||
'Zorg er daarom voor dat je <span class="badge">HTTP:<JOUWPOORT></span> opneemt in de <span class="badge">Listeners</span> sectie van de <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL-configuratie</a>.',
|
||||
sol_enable: 'Sleep-On-LAN inschakelen',
|
||||
sol_port: 'SOL Poort',
|
||||
sol_authorization: 'Autorisatie',
|
||||
sol_user: 'SOL Gebruiker',
|
||||
sol_password: 'SOL Wachtwoord',
|
||||
shutdown: 'Afsluiten',
|
||||
shutdown_desc:
|
||||
'Deze <strong>shell-opdracht</strong> wordt uitgevoerd binnen de container (als je docker gebruikt) of op jouw host (als je de binaire versie gebruikt). Om te verifiëren dat het werkt, kun je de opdracht eerst binnen de container of op jouw host-shell uitvoeren. Veelvoorkomende opdrachten zijn <span class="badge">net rpc</span> voor Windows, <span class="badge">sshpass</span> voor Linux of <span class="badge">curl</span> in het algemeen om webverzoeken te doen.',
|
||||
shutdown_examples: 'Voorbeelden:',
|
||||
shutdown_examples_windows: 'Afsluiten van een externe Windows-machine:',
|
||||
shutdown_examples_linux: 'Afsluiten van een externe Linux-machine:',
|
||||
shutdown_cmd: 'Afsluitopdracht',
|
||||
shutdown_cron_desc:
|
||||
'Net als het instellen van een cron om het apparaat te wekken, kun je ook een cron-taak plannen om dit apparaat af te sluiten.',
|
||||
shutdown_cron: 'Afsluitcron',
|
||||
shutdown_cron_enable: 'Afsluitcron inschakelen',
|
||||
password: 'Wachtwoord',
|
||||
password_desc:
|
||||
'Sommige netwerkkaarten hebben de optie om een wachtwoord voor magic packets in te stellen, ook wel <span class="badge">SecureON</span> genoemd. Het wachtwoord kan alleen 0, 4 of 6 tekens lang zijn.',
|
||||
groups: 'Groepen',
|
||||
groups_desc:
|
||||
'Je kunt apparaten aan een groep toevoegen om ze op het dashboard per groep te sorteren.',
|
||||
groups_placeholder: "bijv. 'Kelder' of 'Kantoor'",
|
||||
network_scan_range_saved: 'Scanbereik opgeslagen',
|
||||
network_scan_desc:
|
||||
'Automatisch jouw netwerk scannen op apparaten. Voor dit te laten werken, moet je UpSnap als root/admin uitvoeren en moet nmap geïnstalleerd en beschikbaar zijn in jouw $PATH (Voor docker-gebruikers is dit al het geval en hoef je niets meer te doen). Scannen kan enkele seconden duren.',
|
||||
network_scan_ip_range: 'IP-bereik',
|
||||
network_scan_no_range: 'Geen scanbereik',
|
||||
network_scan_unsaved_changes: 'Niet-opgeslagen wijzigingen',
|
||||
network_scan_running: 'Scan loopt',
|
||||
network_scan: 'Scannen',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac leverancier:',
|
||||
network_scan_netmask: 'Subnetmasker:',
|
||||
network_scan_add_all: 'Alle apparaten toevoegen',
|
||||
network_scan_replace_netmask: 'Subnetmasker voor alle apparaten vervangen?',
|
||||
network_scan_new_netmask: 'Nieuw subnetmasker',
|
||||
network_scan_include_unknown: 'Voeg apparaten toe waarvan de naam "Onbekend" is',
|
||||
require_confirmation: 'Bevestiging vereist'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Welkom',
|
||||
email_label: 'E-mail of gebruikersnaam:',
|
||||
password_label: 'Wachtwoord:',
|
||||
btn_more: 'Meer',
|
||||
menu_title_auth_providers: 'Andere auth-providers',
|
||||
btn_login: 'Inloggen'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Instellingen',
|
||||
ping_interval_title: 'Ping-interval',
|
||||
ping_interval_desc1:
|
||||
'Stelt de interval in waarin de apparaten worden gepingt. Laat leeg om de standaardwaarde van <span class="badge">@every 3s</span> te gebruiken.',
|
||||
ping_interval_desc2:
|
||||
'Leer meer over de juiste syntax voor cron op <a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> of raadpleeg de <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">pakketdocumentatie</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc:
|
||||
'Wanneer lazy ping is ingeschakeld, pingt UpSnap alleen apparaten als er een actieve gebruiker de website bezoekt. Als het is uitgeschakeld, pingt UpSnap altijd apparaten.',
|
||||
lazy_ping_enable: 'Inschakelen',
|
||||
website_title_title: 'Website titel',
|
||||
website_title_desc: 'Stelt de titel van de website en in het browsertabblad in.',
|
||||
icon_title: 'Icoon',
|
||||
icon_desc: 'Stel een aangepast favicon in. Ondersteunde bestandstypen zijn:',
|
||||
upsnap_version: 'UpSnap versie',
|
||||
invalid_cron: 'Ongeldige cron syntaxis'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Gebruikers',
|
||||
allow_create_devices:
|
||||
'Sta {username} toe om nieuwe apparaten te maken en apparaatgroepen te bewerken',
|
||||
device_permissions: 'Apparaattoestemmingen',
|
||||
create_new_device: 'Nieuw apparaat maken',
|
||||
read: 'Lezen',
|
||||
update: 'Bijwerken',
|
||||
delete: 'Verwijderen',
|
||||
power: 'Aanzetten',
|
||||
toggle: 'Wisselen',
|
||||
confirm_delete_title: 'Bevestig verwijderen',
|
||||
confirm_delete_desc: 'Weet je zeker dat je {username} wilt verwijderen?',
|
||||
create_new_user: 'Nieuwe gebruiker aanmaken',
|
||||
username: 'Gebruikersnaam',
|
||||
password: 'Wachtwoord',
|
||||
password_confirm: 'Bevestig wachtwoord',
|
||||
required_field: 'vereist veld'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Opslaan',
|
||||
delete: 'Verwijderen',
|
||||
change: 'Wijzigen',
|
||||
reset: 'Resetten',
|
||||
cancel: 'Annuleren',
|
||||
add: 'Toevoegen',
|
||||
confirm: 'Bevestigen'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Welkom bij UpSnap 🥳',
|
||||
step1_setup_desc: 'Voltooi de volgende stappen om de installatie te voltooien.',
|
||||
step1_setup_btn_next: 'Volgende',
|
||||
step2_page_title: 'Maak een beheerdersaccount aan',
|
||||
step2_label_email: 'E-mail:',
|
||||
step2_label_password: 'Wachtwoord:',
|
||||
step2_label_min_chars: 'min. 10 tekens',
|
||||
step2_label_password_confirm: 'Bevestig wachtwoord:',
|
||||
step2_btn_create: 'Aanmaken',
|
||||
step3_page_title: 'Je bent helemaal klaar! 🎉',
|
||||
step3_page_desc: 'Ga je gang en voeg enkele apparaten toe aan je dashboard.',
|
||||
step3_btn_done: 'Laten we beginnen!',
|
||||
not_expected_title: 'Ik zag je hier niet aankomen! 🧐',
|
||||
not_expected_desc: 'Je bent al klaar met de installatie! Er is niets meer te doen.',
|
||||
not_expected_back: 'Breng me terug',
|
||||
progress_step1: 'Welkom',
|
||||
progress_step2: 'Account aanmaken',
|
||||
progress_step3: 'Klaar'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Beheerder opgeslagen',
|
||||
user_saved: 'Gebruiker opgeslagen',
|
||||
user_created: 'Gebruiker {username} aangemaakt',
|
||||
user_deleted: 'Gebruiker {username} verwijderd',
|
||||
settings_saved: 'Instellingen opgeslagen',
|
||||
password_changed: 'Wachtwoord gewijzigd. Log alsjeblieft opnieuw in.',
|
||||
passwords_missmatch: 'Wachtwoorden komen niet overeen',
|
||||
permissions_created: 'Rechten voor {username} aangemaakt',
|
||||
permissions_deleted: 'Rechten voor {username} verwijderd',
|
||||
permissions_updated: 'Rechten voor {username} bijgewerkt',
|
||||
permissions_updated_personal: 'Jouw rechten zijn bijgewerkt',
|
||||
no_permission: 'Je hebt geen toestemming om {url} te bezoeken',
|
||||
device_created: 'Aangemaakt {device}',
|
||||
devices_created_multiple: 'Aangemaakt {count|int} apparaten',
|
||||
device_updated: 'Bijgewerkt {device}',
|
||||
device_deleted: 'Verwijderd {device}',
|
||||
group_created: 'Groep {group} aangemaakt',
|
||||
group_deleted: 'Groep {group} verwijderd'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Thema',
|
||||
new: 'Nieuw',
|
||||
edit_account: 'Account bewerken',
|
||||
logout: 'Uitloggen'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default nl;
|
||||
@@ -1,8 +0,0 @@
|
||||
import pl from '../pl';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const pl_PL = {
|
||||
...(pl as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default pl_PL;
|
||||
@@ -1,229 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const pl = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Strona Główna',
|
||||
order_groups: 'Grupowanie',
|
||||
order_name: 'Nazwa',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Kolejność',
|
||||
no_devices: 'Brak urządzeń.',
|
||||
add_first_device: 'Utwórz pierwsze urządzenie',
|
||||
grant_permissions:
|
||||
'Poproś administratora o przyznanie uprawnień do istniejących urządzeń lub do tworzenia nowych.',
|
||||
search_placeholder: 'Wyszukiwanie urządzeń'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Konto',
|
||||
account_type_admin: 'Administrator',
|
||||
account_type_user: 'Użytkownik',
|
||||
avatar_title: 'Awatar',
|
||||
language_title: 'Język',
|
||||
language_option_auto: 'Automatyczny',
|
||||
change_password_title: 'Zmiana hasła',
|
||||
change_password_body: 'Po zmianie hasła, będzie konieczne ponowne zalogowanie.',
|
||||
change_password_label: 'Stare hasło',
|
||||
change_password_new: 'Nowe hasło',
|
||||
change_password_confirm: 'Potwierdź hasło'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Nowe urządzenie',
|
||||
tabs: ['Ręcznie', 'Skanuj sieć'],
|
||||
card_btn_more: 'Więcej',
|
||||
card_btn_more_edit: 'Edytuj',
|
||||
card_btn_more_sleep: 'Wyłącz',
|
||||
card_btn_more_reboot: 'Zrestartuj',
|
||||
card_tooltip_wake_cron: 'Cron do włączania',
|
||||
card_tooltip_shutdown_cron: 'Cron do wyłączania',
|
||||
card_tooltip_wake_password: 'Hasło do włączania',
|
||||
card_tooltip_last_status_change: 'Ostatnia zmiana statusu',
|
||||
card_password: 'Hasło',
|
||||
card_nic_tooltip_pending: 'Oczekiwanie',
|
||||
card_nic_tooltip_shutdown: 'Wyłącz',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Brak ustawionej polecenia do wyłączania',
|
||||
card_nic_tooltip_shutdown_no_permission: 'Brak uprawnień do wyłączania tego urządzenia',
|
||||
card_nic_tooltip_power: 'Włącz',
|
||||
card_nic_tooltip_power_no_permission: 'Brak uprawnień do włączania tego urządzenia',
|
||||
modal_confirm_wake_title: 'Włączyć {device}?',
|
||||
modal_confirm_wake_desc: 'Potwierdź włączenie {device}.',
|
||||
modal_confirm_shutdown_title: 'Wyłączyć {device}?',
|
||||
modal_confirm_shutdown_desc: 'Potwierdź wyłączenie {device}.',
|
||||
general: 'Ogólne',
|
||||
general_name: 'Nazwa',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'MAC',
|
||||
general_netmask: 'Maska sieci',
|
||||
general_description: 'Opis',
|
||||
general_description_placeholder: 'Przykładowy opis urządzenia',
|
||||
general_required_field: 'pole wymagane',
|
||||
ports: 'Porty',
|
||||
ports_desc: 'UpSnap może sprawdzić czy podane porty są otwarte.',
|
||||
ports_add_new: 'Dodaj nowy port',
|
||||
ports_name: 'Nazwa',
|
||||
ports_number: 'Numer',
|
||||
link: 'Link',
|
||||
link_desc: 'Twoje urządzenie może być klikalnym łączem. Świetne do linkowania np. pulpitów.',
|
||||
link_open: 'Otwórz link automatycznie',
|
||||
link_open_no: 'Nie',
|
||||
link_open_same_tab: 'W tej samej karcie',
|
||||
link_open_new_tab: 'W nowej karcie',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Możesz wykorzystać niestandardowe polecenie powłoki, aby sprawdzić, czy urządzenie jest włączone. Polecenie powinno zwrócić kod zakończenia <span class="badge">0</span> aby wskazać, że urządzenie jest włączone. Dowolny inny kod zakończenia poskutkuje oznaczeniem urządzenia jako wyłączone.',
|
||||
ping_cmd: 'Niestandardowe polecenie ping',
|
||||
wake: 'Włączanie',
|
||||
wake_desc: 'Możesz włączyć to urządzenie za pomocą zaplanowanego zadania cron.',
|
||||
wake_cmd: 'Niestandardowe polecenie do włączania',
|
||||
wake_cron: 'Cron do włączania',
|
||||
wake_cron_enable: 'Włącz cron do włączania',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Możesz wyłączać urządzenia za pomocą narzędzia <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) jest zewnętrznym narzędziem/demonem, działającym na urządzeniach które chcesz wyłączać. Tworzy on endpoint REST. Aby dowiedzieć się jak skonfigurować SOL, zapoznaj się z <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">instrukcją użytkownika</a>.',
|
||||
sol_desc2:
|
||||
'SOL przyjmuje żądania za pomocą HTTP zamiast UDP, aby zwiększyć niezawodność i umożliwić autoryzację.',
|
||||
sol_desc3:
|
||||
'W związku z tym, uwzględnij <span class="badge">HTTP:<TWÓJPORT></span> w sekcji <span class="badge">Listeners</span> twojej <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">konfiguracji SOL</a>.',
|
||||
sol_enable: 'Włącz Sleep-On-LAN',
|
||||
sol_port: 'Port SOL',
|
||||
sol_authorization: 'Autoryzacja',
|
||||
sol_user: 'Użytkownik SOL',
|
||||
sol_password: 'Hasło SOL',
|
||||
shutdown: 'Wyłącz',
|
||||
shutdown_desc:
|
||||
'To <strong>polecenie powłoki</strong> zostanie wywołane w Twoim kontenerze (jeżeli używasz Dockera) lub na Twoim hoście (jeżeli używasz pliku binarnego). Aby zweryfikować jego działanie, możesz je najpierw uruchomić wewnątrz kontenera lub na hoście. Powszechne polecenia to <span class="badge">net rpc</span> dla Windowsa, <span class="badge">sshpass</span> dla Linuxa lub <span class="badge">curl</span> do wykonywania żądań internetowych.',
|
||||
shutdown_examples: 'Przykłady:',
|
||||
shutdown_examples_windows: 'Wyłącz zdalną maszynę Windows:',
|
||||
shutdown_examples_linux: 'Wyłącz zdalną maszynę Linux:',
|
||||
shutdown_cmd: 'Polecenie do wyłączania',
|
||||
shutdown_cron_desc:
|
||||
'Podobnie jak możesz harmonogramować zadanie cron do włączania urządzenia, możesz robić to również do jego wyłączania.',
|
||||
shutdown_cron: 'Cron do wyłączania',
|
||||
shutdown_cron_enable: 'Włącz cron do wyłączania',
|
||||
password: 'Hasło',
|
||||
password_desc:
|
||||
'Niektóre karty sieciowe mają możliwość ustawienia hasła dla magicznych pakietów, znanych również jako <span class="badge">SecureON</span>. Hasło może mieć 0, 4 lub 6 znaków długości.',
|
||||
groups: 'Grupy',
|
||||
groups_desc: 'Możesz dodać urządzenie do grup, aby sortować je według grup na pulpicie',
|
||||
groups_placeholder: "np. 'Piwnica' lub 'Biuro'",
|
||||
network_scan_range_saved: 'Zapisano zakres skanowania',
|
||||
network_scan_desc:
|
||||
'Automatycznie skanuj sieć w poszukiwaniu urządzeń. Aby to zadziałało, musisz uruchomić UpSnap jako root/admin i mieć nmap zainstalowany oraz dostępny w $PATH (preinstalowany w obrazach dockerowych). Skanowanie może chwilę potrwać.',
|
||||
network_scan_ip_range: 'Zakres IP',
|
||||
network_scan_no_range: 'Brak zakresu skanowania',
|
||||
network_scan_unsaved_changes: 'Niezapisane zmiany',
|
||||
network_scan_running: 'Skanowanie w toku',
|
||||
network_scan: 'Skanuj',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'MAC:',
|
||||
network_scan_mac_vendor: 'Dostawca MAC:',
|
||||
network_scan_netmask: 'Maska sieci:',
|
||||
network_scan_add_all: 'Dodaj wszystkie urządzenia',
|
||||
network_scan_replace_netmask: 'Zastąpić maskę sieci dla wszystkich urządzeń?',
|
||||
network_scan_new_netmask: 'Nowa maska sieci',
|
||||
network_scan_include_unknown: 'Uwzględnij urządzenia, których nazwa to "Unknown"',
|
||||
require_confirmation: 'Wymagaj potwierdzenia'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Witaj',
|
||||
email_label: 'Email lub nazwa użytkownika:',
|
||||
password_label: 'Hasło:',
|
||||
btn_more: 'Więcej',
|
||||
menu_title_auth_providers: 'Inni dostawcy autoryzacji',
|
||||
btn_login: 'Zaloguj'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Ustawienia',
|
||||
ping_interval_title: 'Interwał pingowania',
|
||||
ping_interval_desc1:
|
||||
'Ustawia interwał, w którym urządzenia są pingowane. Pozostaw puste aby użyć domyślnej wartości <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Dowiedz się więcej na temat składni cron na <a class="link" href="https://pl.wikipedia.org/wiki/Cron" target="_blank">Wikipedii</a> lub w <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">dokumentacji pakietu cron</a>.',
|
||||
lazy_ping_title: 'Leniwe pingowanie',
|
||||
lazy_ping_desc:
|
||||
'Gdy leniwe pingowanie jest włączone, UpSnap będzie pingować urządzenia tylko wtedy, gdy użytkownicy odwiedzają stronę. Gdy ta opcja jest wyłączona, UpSnap będzie pingować urządzenia nieustannie.',
|
||||
lazy_ping_enable: 'Włącz',
|
||||
website_title_title: 'Tytuł strony',
|
||||
website_title_desc: 'Ustawia tytuł strony internetowej i na karcie przeglądarki.',
|
||||
icon_title: 'Ikona',
|
||||
icon_desc: 'Ustaw niestandardowy favicon. Obsługiwane są typy plików:',
|
||||
upsnap_version: 'Wersja UpSnap',
|
||||
invalid_cron: 'Nieprawidłowa składnia cron'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Użytkownicy',
|
||||
allow_create_devices: 'Pozwól {username} tworzyć nowe urządzenia i edytować grupy urządzeń',
|
||||
device_permissions: 'Uprawnienia do urządzeń',
|
||||
create_new_device: 'Utwórz nowe urządzenie',
|
||||
read: 'Odczyt',
|
||||
update: 'Aktualizacja',
|
||||
delete: 'Usuwanie',
|
||||
power: 'Włączanie',
|
||||
toggle: 'Przełącz',
|
||||
confirm_delete_title: 'Potwierdź usunięcie',
|
||||
confirm_delete_desc: 'Czy na pewno chcesz usunąć {username}?',
|
||||
create_new_user: 'Utwórz użytkownika',
|
||||
username: 'Nazwa użytkownika',
|
||||
password: 'Hasło',
|
||||
password_confirm: 'Potwierdź hasło',
|
||||
required_field: 'pole wymagane'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Zapisz',
|
||||
delete: 'Usuń',
|
||||
change: 'Zmień',
|
||||
reset: 'Resetuj',
|
||||
cancel: 'Anuluj',
|
||||
add: 'Nowy',
|
||||
confirm: 'Potwierdź'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Witaj w UpSnap 🥳',
|
||||
step1_setup_desc: 'Wykonaj następujące kroki, aby dokończyć konfigurację.',
|
||||
step1_setup_btn_next: 'Dalej',
|
||||
step2_page_title: 'Utwórz konto administratora',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Hasło:',
|
||||
step2_label_min_chars: 'min. 10 znaków',
|
||||
step2_label_password_confirm: 'Potwierdź hasło:',
|
||||
step2_btn_create: 'Utwórz',
|
||||
step3_page_title: 'Wszystko gotowe! 🎉',
|
||||
step3_page_desc: 'A teraz dodaj kilka urządzeń do Twojego pulpitu.',
|
||||
step3_btn_done: 'Lecimy!',
|
||||
not_expected_title: 'Stało się coś niespodziewanego! 🧐',
|
||||
not_expected_desc: 'Konfiguracja zakończona! Nie musisz nic więcej robić.',
|
||||
not_expected_back: 'Powrót',
|
||||
progress_step1: 'Witaj',
|
||||
progress_step2: 'Utwórz konto',
|
||||
progress_step3: 'Gotowe'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Administrator zapisany',
|
||||
user_saved: 'Użytkownik zapisany',
|
||||
user_created: 'Użytkownik {username} utworzony',
|
||||
user_deleted: 'Użytkownik {username} usunięty',
|
||||
settings_saved: 'Zapisano ustawienia',
|
||||
password_changed: 'Hasło zostało zmienione. Zaloguj się ponownie.',
|
||||
passwords_missmatch: 'Hasła się różnią',
|
||||
permissions_created: 'Uprawnienia dla {username} zostały utworzone',
|
||||
permissions_deleted: 'Uprawnienia dla {username} zostały usunięte',
|
||||
permissions_updated: 'Uprawnienia dla {username} zostały zaktualizowane',
|
||||
permissions_updated_personal: 'Twoje uprawnienia zostały zaktualizowane',
|
||||
no_permission: 'Nie masz uprawnień aby odwiedzić {url}',
|
||||
device_created: 'Utworzono {device}',
|
||||
devices_created_multiple: 'Utworzono {count|int} urządzeń',
|
||||
device_updated: 'Zaktualizowano {device}',
|
||||
device_deleted: 'Usunięto {device}',
|
||||
group_created: 'Utworzono grupę {group}',
|
||||
group_deleted: 'Usunięto grupę {group}'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Motyw',
|
||||
new: 'Utwórz',
|
||||
edit_account: 'Edytuj konto',
|
||||
logout: 'Wyloguj'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default pl;
|
||||
@@ -1,8 +0,0 @@
|
||||
import pt from '../pt';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const pt_PT = {
|
||||
...(pt as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default pt_PT;
|
||||
@@ -1,231 +0,0 @@
|
||||
import en from '../en';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const pt = {
|
||||
...(en as unknown as Translation),
|
||||
home: {
|
||||
page_title: 'Início',
|
||||
order_groups: 'Grupos',
|
||||
order_name: 'Nome',
|
||||
order_ip: 'IP',
|
||||
order_tooltip: 'Ordem',
|
||||
no_devices: 'Sem dispositivos.',
|
||||
add_first_device: 'Adicione o seu primeiro dispositivo',
|
||||
grant_permissions:
|
||||
'Peça ao administrador para alterar as suas permissões para dispositivos existentes ou para criar novos.',
|
||||
search_placeholder: 'Procurar dispositivos'
|
||||
},
|
||||
account: {
|
||||
page_title: 'Conta',
|
||||
account_type_admin: 'Admin',
|
||||
account_type_user: 'Utilizador',
|
||||
avatar_title: 'Avatar',
|
||||
language_title: 'Idioma',
|
||||
language_option_auto: 'Automático',
|
||||
change_password_title: 'Alterar password',
|
||||
change_password_body: 'Terá de voltar a entrar após alterar a sua password.',
|
||||
change_password_label: 'Antiga password',
|
||||
change_password_new: 'Nova password',
|
||||
change_password_confirm: 'Confirmar password'
|
||||
},
|
||||
device: {
|
||||
page_title: 'Novo dispositivo',
|
||||
tabs: ['Manual', 'Pesquisa de rede'],
|
||||
card_btn_more: 'Mais',
|
||||
card_btn_more_edit: 'Editar',
|
||||
card_btn_more_sleep: 'Suspender',
|
||||
card_btn_more_reboot: 'Reiniciar',
|
||||
card_tooltip_wake_cron: 'Wake cron',
|
||||
card_tooltip_shutdown_cron: 'Shutdown cron',
|
||||
card_tooltip_wake_password: 'Wake password',
|
||||
card_tooltip_last_status_change: 'Última alteração de estado',
|
||||
card_password: 'Password',
|
||||
card_nic_tooltip_pending: 'Pendente',
|
||||
card_nic_tooltip_shutdown: 'Desligar',
|
||||
card_nic_tooltip_shutdown_no_cmd: 'Comando para desligar não está definido',
|
||||
card_nic_tooltip_shutdown_no_permission: 'Não tem permissão para desligar este dispositivo',
|
||||
card_nic_tooltip_power: 'Ligar',
|
||||
card_nic_tooltip_power_no_permission: 'Não tem permissão para ligar este dispositivo',
|
||||
modal_confirm_wake_title: 'Despertar {device}?',
|
||||
modal_confirm_wake_desc: 'Confirme para ativar {device}.',
|
||||
modal_confirm_shutdown_title: 'Desligar {device}?',
|
||||
modal_confirm_shutdown_desc: 'Confirme o encerramento do {device}.',
|
||||
general: 'Geral',
|
||||
general_name: 'Nome',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: 'Máscara de rede',
|
||||
general_description: 'Descrição',
|
||||
general_description_placeholder: 'Alguma descrição do dispositivo',
|
||||
general_required_field: 'campo obrigatório',
|
||||
ports: 'Portos',
|
||||
ports_desc: 'UpSnap pode verificar se certos portos estão abertos.',
|
||||
ports_add_new: 'Adicionar novo porto',
|
||||
ports_name: 'Nome',
|
||||
ports_number: 'Número',
|
||||
link: 'Link',
|
||||
link_desc:
|
||||
'Permite que o nome do seu dispositivo seja um link. Perfeito para dashboard, por exemplo.',
|
||||
link_open: 'Abrir automaticamente a ligação',
|
||||
link_open_no: 'Não',
|
||||
link_open_same_tab: 'O mesmo separador',
|
||||
link_open_new_tab: 'Novo separador',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'Pode utilizar um comando shell personalizado para ver se o dispositivo está ligado. O comando deve devolver um código de saída de <span class="badge">0</span> para indicar que o dispositivo está ligado, qualquer outro código de saída marcará o dispositivo como desligado.',
|
||||
ping_cmd: 'Comando ping personalizado',
|
||||
wake: 'Ligar',
|
||||
wake_desc: 'Poderá ligar este dispositivo através dum cron job agendado.',
|
||||
wake_cmd: 'Comando de despertar personalizado',
|
||||
wake_cron: 'Wake cron',
|
||||
wake_cron_enable: 'Ativar wake cron',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'Poderá suspender o seu dispositivo usando a ferramenta <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a>. Sleep-On-LAN (SOL) é uma ferramenta externa que terá de ser executada no dispositivo que quer suspender, facilitando um REST endpoint. Para instruções em como configurar Sleep-On-LAN, veja a secção <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a>.',
|
||||
sol_desc2:
|
||||
'SOL envia pedidos através de HTTP em vez de UDP para permitir autenticação e tornar os pedidos mais seguros.',
|
||||
sol_desc3:
|
||||
'Portanto, tenha a certeza que inclui <span class="badge">HTTP:<SEU_PORTO></span> na secção <span class="badge">Listeners</span> de <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">configuração SOL</a>.',
|
||||
sol_enable: 'Ativar Sleep-On-LAN',
|
||||
sol_port: 'Porto SOL',
|
||||
sol_authorization: 'Autenticação',
|
||||
sol_user: 'Utilizador SOL',
|
||||
sol_password: 'Password SOL',
|
||||
shutdown: 'Desligar',
|
||||
shutdown_desc:
|
||||
'Este <strong>comando shell</strong> irá correr dentro do teu container (no caso de usar docker) ou no seu host (na versão standalone). Para verificar que funciona, pode executar o comando primeiro no seu container/host. Comandos comuns são <span class="badge">net rpc</span> para windows, <span class="badge">sshpass</span> para linux ou <span class="badge">curl</span> em geral para enviar pedidos web.',
|
||||
shutdown_examples: 'Exemplos:',
|
||||
shutdown_examples_windows: 'Desligar dispositivo windows remoto:',
|
||||
shutdown_examples_linux: 'Desligar dispositivo linux remoto:',
|
||||
shutdown_cmd: 'Comando para desligar',
|
||||
shutdown_cron_desc:
|
||||
'Assim como pode ter um cron job para ligar o seu dispositivo, pode também usar para desligar.',
|
||||
shutdown_cron: 'Shutdown cron',
|
||||
shutdown_cron_enable: 'Ativar shutdown cron',
|
||||
password: 'Password',
|
||||
password_desc:
|
||||
'Alguns adaptadores de rede têm a opção de definir uma password para magic packets, também conhecido como <span class="badge">SecureON</span>. A password só poderá conter 0, 4 ou 6 caracteres.',
|
||||
groups: 'Grupos',
|
||||
groups_desc: 'Pode adicionar dispositivos a grupos para ordenar na dashboard.',
|
||||
groups_placeholder: "e.g. 'Cave' ou 'Escritório'",
|
||||
network_scan_range_saved: 'Intervalo de pesquisa guardado',
|
||||
network_scan_desc:
|
||||
'Procurar automaticamente na sua rede por dispositivos. Terá de executar o UpSnap como root/admin e ter o nmap instalado e disponível no seu $PATH (No caso de usar docker, não tem de fazer nada). Poderá demorar alguns segundos.',
|
||||
network_scan_ip_range: 'Intervalo IP',
|
||||
network_scan_no_range: 'Sem intervalo de IP',
|
||||
network_scan_unsaved_changes: 'Alterações por guardar',
|
||||
network_scan_running: 'Pesquisa em curso',
|
||||
network_scan: 'Pesquisar',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Fornecedor Mac:',
|
||||
network_scan_netmask: 'Máscara de rede:',
|
||||
network_scan_add_all: 'Adicionar todos os dispositivos',
|
||||
network_scan_replace_netmask: 'Substituir máscara de rede para todos os dispositivos?',
|
||||
network_scan_new_netmask: 'Nova máscara de rede',
|
||||
network_scan_include_unknown: 'Incluir dispositivos em que o nome é "Unknown"',
|
||||
require_confirmation: 'Exigir confirmação'
|
||||
},
|
||||
login: {
|
||||
welcome: 'Bem-vindo',
|
||||
email_label: 'Email ou Utilizador:',
|
||||
password_label: 'Password:',
|
||||
btn_more: 'Mais',
|
||||
menu_title_auth_providers: 'Outros provedores de autenticação',
|
||||
btn_login: 'Entrar'
|
||||
},
|
||||
settings: {
|
||||
page_title: 'Definições',
|
||||
ping_interval_title: 'Intervalo ping',
|
||||
ping_interval_desc1:
|
||||
'Define o intervalo em que o ping é executado. Deixe em branco para usar o valor por defeito de <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'Poderá ver a sintaxe correta para cron em <a class="link" href="https://en.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> ou em <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">documentação cron</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc:
|
||||
'Quando o lazy ping está activo, o UpSnap irá apenas executar o ping se existir um utilizador ativo no website. Se desligado, o UpSnap irá executar sempre o ping.',
|
||||
lazy_ping_enable: 'Activar',
|
||||
website_title_title: 'Título do website',
|
||||
website_title_desc: 'Define o título do website.',
|
||||
icon_title: 'Ícone',
|
||||
icon_desc: 'Define um favicon personalizado. Tipos de ficheiros suportados são:',
|
||||
upsnap_version: 'Versão UpSnap',
|
||||
invalid_cron: 'Sintaxe inválida do cron'
|
||||
},
|
||||
users: {
|
||||
page_title: 'Utilizadores',
|
||||
allow_create_devices:
|
||||
'Permitir a {username} adicionar novos dispositivos e editar grupos de dispositivos',
|
||||
device_permissions: 'Permissões de dispositivos',
|
||||
create_new_device: 'Adicionar dispositivo',
|
||||
read: 'Ver',
|
||||
update: 'Editar',
|
||||
delete: 'Apagar',
|
||||
power: 'Ligar/desligar',
|
||||
toggle: 'Alternar',
|
||||
confirm_delete_title: 'Confirmar',
|
||||
confirm_delete_desc: 'Tem a certeza que quer apagar {username}?',
|
||||
create_new_user: 'Criar novo utilizador',
|
||||
username: 'Utilizador',
|
||||
password: 'Password',
|
||||
password_confirm: 'Confirmar password',
|
||||
required_field: 'campo obrigatório'
|
||||
},
|
||||
buttons: {
|
||||
save: 'Guardar',
|
||||
delete: 'Apagar',
|
||||
change: 'Alterar',
|
||||
reset: 'Repor',
|
||||
cancel: 'Cancelar',
|
||||
add: 'Adicionar',
|
||||
confirm: 'Confirmar'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: 'Bem-vindo ao UpSnap 🥳',
|
||||
step1_setup_desc: 'Complete os próximos passos para terminar a configuração.',
|
||||
step1_setup_btn_next: 'Seguinte',
|
||||
step2_page_title: 'Criar conta de administrador',
|
||||
step2_label_email: 'Email:',
|
||||
step2_label_password: 'Password:',
|
||||
step2_label_min_chars: 'min. 10 caracteres',
|
||||
step2_label_password_confirm: 'Confirmar password:',
|
||||
step2_btn_create: 'Criar',
|
||||
step3_page_title: 'Concluído! 🎉',
|
||||
step3_page_desc: 'Adicione alguns dispositivos à sua dashboard.',
|
||||
step3_btn_done: 'Vamos!',
|
||||
not_expected_title: 'Não esperava ver aqui alguém! 🧐',
|
||||
not_expected_desc: 'A configuração está concluída. Nada a fazer aqui.',
|
||||
not_expected_back: 'Voltar',
|
||||
progress_step1: 'Bem-vindo',
|
||||
progress_step2: 'Criar conta',
|
||||
progress_step3: 'Concluído'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: 'Administrador atualizado',
|
||||
user_saved: 'Utilizador atualizado',
|
||||
user_created: 'Utilizador {username} criado',
|
||||
user_deleted: 'Utilizador {username} apagado',
|
||||
settings_saved: 'Definições guardadas',
|
||||
password_changed: 'Password alterada. Terá de entrar novamente.',
|
||||
passwords_missmatch: 'As passwords não correspondem',
|
||||
permissions_created: 'Permissões criadas para {username}',
|
||||
permissions_deleted: 'Permissões apagadas para {username}',
|
||||
permissions_updated: 'Permissões atualizadas para {username}',
|
||||
permissions_updated_personal: 'As suas permissões foram atualizadas',
|
||||
no_permission: 'Não tem permissão para visitar {url}',
|
||||
device_created: 'Adicionado dispositivo {device}',
|
||||
devices_created_multiple: 'Adicionados {count|int} dispositivos',
|
||||
device_updated: '{device} atualizado',
|
||||
device_deleted: '{device} apagado',
|
||||
group_created: 'Grupo {group} criado',
|
||||
group_deleted: 'Grupo {group} apagado'
|
||||
},
|
||||
navbar: {
|
||||
theme: 'Tema',
|
||||
new: 'Novo',
|
||||
edit_account: 'Editar conta',
|
||||
logout: 'Sair'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default pt;
|
||||
@@ -1,8 +0,0 @@
|
||||
import zh from '../zh';
|
||||
import type { Translation } from '../i18n-types';
|
||||
|
||||
const zh_CN = {
|
||||
...(zh as unknown as Translation)
|
||||
} satisfies Translation;
|
||||
|
||||
export default zh_CN;
|
||||
@@ -1,224 +0,0 @@
|
||||
import type { Translation } from '../i18n-types';
|
||||
import zh from '../zh';
|
||||
|
||||
const zh_TW = {
|
||||
...(zh as unknown as Translation),
|
||||
home: {
|
||||
page_title: '首頁',
|
||||
order_groups: '群組',
|
||||
order_name: '名稱',
|
||||
order_ip: 'IP位址',
|
||||
order_tooltip: '排序',
|
||||
no_devices: '尚無設備',
|
||||
add_first_device: '添加你的第一台設備',
|
||||
grant_permissions: '請聯絡系統管理員授權現有設備或創建新設備的權限',
|
||||
search_placeholder: '搜尋設備'
|
||||
},
|
||||
account: {
|
||||
page_title: '帳號資訊',
|
||||
account_type_admin: '管理員',
|
||||
account_type_user: '普通使用者',
|
||||
avatar_title: '頭像',
|
||||
language_title: '語言',
|
||||
language_option_auto: '自動',
|
||||
change_password_title: '更改密碼',
|
||||
change_password_body: '更改密碼後,將需重新登入',
|
||||
change_password_label: '舊密碼',
|
||||
change_password_new: '新密碼',
|
||||
change_password_confirm: '確認密碼'
|
||||
},
|
||||
device: {
|
||||
page_title: '新裝置',
|
||||
tabs: ['手動設定', '網路掃描'],
|
||||
card_btn_more: '更多',
|
||||
card_btn_more_edit: '編輯',
|
||||
card_btn_more_sleep: '睡眠',
|
||||
card_btn_more_reboot: '重新啟動',
|
||||
card_tooltip_wake_cron: '喚醒排程',
|
||||
card_tooltip_shutdown_cron: '關機排程',
|
||||
card_tooltip_wake_password: '喚醒密碼',
|
||||
card_tooltip_last_status_change: '最後狀態更新',
|
||||
card_password: '密碼',
|
||||
card_nic_tooltip_pending: '等待中...',
|
||||
card_nic_tooltip_shutdown: '關機',
|
||||
card_nic_tooltip_shutdown_no_cmd: '未設定關機指令',
|
||||
card_nic_tooltip_shutdown_no_permission: '無關閉此裝置之權限',
|
||||
card_nic_tooltip_power: '開機',
|
||||
card_nic_tooltip_power_no_permission: '無開啟此裝置之權限',
|
||||
modal_confirm_wake_title: '喚醒 {device}?',
|
||||
modal_confirm_wake_desc: '你確定要喚醒 {device} 嗎?',
|
||||
modal_confirm_shutdown_title: '關閉 {device}?',
|
||||
modal_confirm_shutdown_desc: '你確定要關閉 {device} 嗎?',
|
||||
general: '通用',
|
||||
general_name: '名稱',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: '子網域遮罩',
|
||||
general_description: '描述',
|
||||
general_description_placeholder: '關於這个裝置的描述',
|
||||
general_required_field: '必填',
|
||||
ports: '埠',
|
||||
ports_desc: 'UpSnap 可以檢查指定的埠是否開啟',
|
||||
ports_add_new: '新增埠',
|
||||
ports_name: '名稱',
|
||||
ports_number: '通訊埠編號',
|
||||
link: '連結',
|
||||
link_desc: '讓您的裝置名稱成為可點擊的連結,非常適合用來連結儀表板等。',
|
||||
link_open: '自動開啟連結',
|
||||
link_open_no: '毋',
|
||||
link_open_same_tab: '同一個標籤',
|
||||
link_open_new_tab: '新標籤',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'你可以使用自定義的指令來檢查裝置是否開機。該指令應返回退出碼 <span class="badge">0</span> 以表示裝置已開機,任何其他退出碼將標記裝置為關機。',
|
||||
ping_cmd: '自定義 ping 指令',
|
||||
wake: '喚醒',
|
||||
wake_desc: '你可以透過排程来唤醒裝置。',
|
||||
wake_cmd: '自定義唤醒指令',
|
||||
wake_cron: '唤醒排程',
|
||||
wake_cron_enable: '啟用定時喚醒',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'你可以使用 <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> 工具讓電腦睡眠。 Sleep-On-LAN (SOL) 是一个外部的工具,它在你想要進入睡眠的PC上執行並有RestAPI端口. 有關 Sleep-On-LAN 設定的說明, 請見文檔 <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a>',
|
||||
sol_desc2: 'SOL 已配置為使用 HTTP 發送請求,而不是 UDP以啟用授權並提高請求的可靠性。',
|
||||
sol_desc3:
|
||||
'因此, 請確保在 <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL 配置</a> 的 <span class="badge">Listeners</span> 部分中包含<span class="badge">HTTP:<YOURPORT></span>',
|
||||
sol_enable: '啟用 Sleep-On-LAN',
|
||||
sol_port: 'SOL 通訊埠',
|
||||
sol_authorization: '認證',
|
||||
sol_user: 'SOL 帳號',
|
||||
sol_password: 'SOL 密碼',
|
||||
shutdown: '關機',
|
||||
shutdown_desc:
|
||||
'這個<strong>shell指令</strong>將在您的容器內運行(如果您使用docker),或者在您的主機上運行(如果您使用二進制)。為了驗證其正常工作,您可以先在容器內或主機的shell中運行這個指令。常見的指令有<span class="badge">net rpc</span>用於Windows,<span class="badge">sshpass</span>用於Linux,或者一般用於進行網絡請求的<span class="badge">curl</span>。',
|
||||
shutdown_examples: '範例:',
|
||||
shutdown_examples_windows: '關閉遠端 Windows 主機:',
|
||||
shutdown_examples_linux: '關閉遠端 Linux 主機:',
|
||||
shutdown_cmd: '關機指令',
|
||||
shutdown_cron_desc: '就像設定排程來喚醒裝置一樣,您也可以設定一個排程來關閉這個裝置。',
|
||||
shutdown_cron: '關機排程',
|
||||
shutdown_cron_enable: '啟用關機排程',
|
||||
password: '密碼',
|
||||
password_desc:
|
||||
'一些網路介面卡能給 magic packets 設密碼, 也可稱作 <span class="badge">SecureON</span>. 密碼長度只能為0、4或6個字。',
|
||||
groups: '群組',
|
||||
groups_desc: '你可以將裝置加到群組, 以便在控制面板上依群組排序。',
|
||||
groups_placeholder: "例如: 'Basement' 或 'Office'",
|
||||
network_scan_range_saved: '掃瞄範圍已儲存',
|
||||
network_scan_desc:
|
||||
'自動掃描網路上的設備,要使用這個功能,你需要以root/系統管理員權限執行 UpSnap, 並在你的 $PATH 中安裝nmap(使用docker安裝者不需執行任何操作),掃描可能需一段時間。',
|
||||
network_scan_ip_range: 'IP 範圍',
|
||||
network_scan_no_range: '無掃瞄範圍',
|
||||
network_scan_unsaved_changes: '未儲存的更改',
|
||||
network_scan_running: '掃描中',
|
||||
network_scan: '掃描',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac 供應商:',
|
||||
network_scan_netmask: '子網域遮罩:',
|
||||
network_scan_add_all: '新增全部裝置',
|
||||
network_scan_replace_netmask: '替換所有設備的子網域遮罩?',
|
||||
network_scan_new_netmask: '新子網域遮罩',
|
||||
network_scan_include_unknown: '包括名稱為 “Unknown” 的裝置',
|
||||
require_confirmation: '再次確認'
|
||||
},
|
||||
login: {
|
||||
welcome: '歡迎使用',
|
||||
email_label: '電子郵件/使用者名稱:',
|
||||
password_label: '密碼:',
|
||||
btn_more: '更多',
|
||||
menu_title_auth_providers: '其他身份驗證提供者',
|
||||
btn_login: '登入'
|
||||
},
|
||||
settings: {
|
||||
page_title: '設定',
|
||||
ping_interval_title: 'Ping 間隔',
|
||||
ping_interval_desc1: '設定 ping 的間隔。留空使用預設值 <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'有關 cron 的更多資訊,請見<a class="link" href="https://zh.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> 或參閱 <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">cron 文檔</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc: '當開關打開時, UpSnap 只會在有訪問者訪問網站時才對設備進行 ping 測試',
|
||||
lazy_ping_enable: '啟用',
|
||||
website_title_title: '網站標題',
|
||||
website_title_desc: '設置網站的標題,同時顯示在瀏覽器的標籤中。',
|
||||
icon_title: '圖標',
|
||||
icon_desc: '設定一個自訂義圖標。支援的檔案類型:',
|
||||
upsnap_version: 'UpSnap 版本',
|
||||
invalid_cron: '「無效的 Cron 語法」'
|
||||
},
|
||||
users: {
|
||||
page_title: '使用者',
|
||||
allow_create_devices: '允許 {username} 創建新裝置和修改群組',
|
||||
device_permissions: '裝置權限',
|
||||
create_new_device: '創建新裝置',
|
||||
read: '查看',
|
||||
update: '更新',
|
||||
delete: '刪除',
|
||||
power: '電源',
|
||||
toggle: '全選',
|
||||
confirm_delete_title: '確認刪除',
|
||||
confirm_delete_desc: '你確定要刪除 {username} 嗎?',
|
||||
create_new_user: '新增使用者',
|
||||
username: '使用者名稱',
|
||||
password: '密碼',
|
||||
password_confirm: '確認密碼',
|
||||
required_field: '必填'
|
||||
},
|
||||
buttons: {
|
||||
save: '保存',
|
||||
delete: '刪除',
|
||||
change: '更改',
|
||||
reset: '重設',
|
||||
cancel: '取消',
|
||||
add: '新增',
|
||||
confirm: '確認'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: '歡迎使用 UpSnap 🥳',
|
||||
step1_setup_desc: '初次使用,請依下列指示完成步驟',
|
||||
step1_setup_btn_next: '下一步',
|
||||
step2_page_title: '創建管理者帳號',
|
||||
step2_label_email: '電子郵件:',
|
||||
step2_label_password: '密碼:',
|
||||
step2_label_min_chars: '請輸入至少10个字元',
|
||||
step2_label_password_confirm: '確認密碼:',
|
||||
step2_btn_create: '創建',
|
||||
step3_page_title: '一切就緒! 🎉',
|
||||
step3_page_desc: '繼續向您的儀表板新增裝置。',
|
||||
step3_btn_done: '開始使用!',
|
||||
not_expected_title: '意料之外! 🧐',
|
||||
not_expected_desc: '你已經完成設定,無需再次設定',
|
||||
not_expected_back: '返回',
|
||||
progress_step1: '歡迎',
|
||||
progress_step2: '創建帳號',
|
||||
progress_step3: '完成'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: '帳號資訊已儲存',
|
||||
user_saved: '帳號資訊已儲存',
|
||||
user_created: '使用者 {username} 已創建',
|
||||
user_deleted: '使用者 {username} 已刪除',
|
||||
settings_saved: '設定已儲存',
|
||||
password_changed: '密碼已修改,請重新登入。',
|
||||
passwords_missmatch: '兩次輸入的密碼不相同',
|
||||
permissions_created: '使用者 {username} 的權限已創建',
|
||||
permissions_deleted: '使用者 {username} 的權限已刪除',
|
||||
permissions_updated: '使用者 {username} 的權限已更新',
|
||||
permissions_updated_personal: '你的權限已更新',
|
||||
no_permission: '你無權訪問 {url}',
|
||||
device_created: '已創建 {device}',
|
||||
devices_created_multiple: '已創建 {count|int} 個設備',
|
||||
device_updated: '已更新 {device}',
|
||||
device_deleted: '已刪除 {device}',
|
||||
group_created: '已創建群組 {group}',
|
||||
group_deleted: '已創建群組 {group}'
|
||||
},
|
||||
navbar: {
|
||||
theme: '主題',
|
||||
new: '新增',
|
||||
edit_account: '編輯帳號',
|
||||
logout: '退出'
|
||||
}
|
||||
} satisfies Translation;
|
||||
|
||||
export default zh_TW;
|
||||
@@ -1,222 +0,0 @@
|
||||
import type { BaseTranslation } from '../i18n-types';
|
||||
|
||||
const zh = {
|
||||
home: {
|
||||
page_title: '首页',
|
||||
order_groups: '分组',
|
||||
order_name: '名称',
|
||||
order_ip: 'IP地址',
|
||||
order_tooltip: '排序',
|
||||
no_devices: '还没有任何设备',
|
||||
add_first_device: '添加您的第一台设备',
|
||||
grant_permissions: '请联系管理员授予您相应权限.',
|
||||
search_placeholder: '搜索设备'
|
||||
},
|
||||
account: {
|
||||
page_title: '账户信息',
|
||||
account_type_admin: '管理员',
|
||||
account_type_user: '普通用户',
|
||||
avatar_title: '头像',
|
||||
language_title: '语言',
|
||||
language_option_auto: '自动',
|
||||
change_password_title: '更改密码',
|
||||
change_password_body: '更改密码后, 您需要重新登录.',
|
||||
change_password_label: '旧密码',
|
||||
change_password_new: '新密码',
|
||||
change_password_confirm: '确认密码'
|
||||
},
|
||||
device: {
|
||||
page_title: '新设备',
|
||||
tabs: ['手动配置', '网络扫描'],
|
||||
card_btn_more: '更多',
|
||||
card_btn_more_edit: '编辑',
|
||||
card_btn_more_sleep: 'Sleep',
|
||||
card_btn_more_reboot: '重启',
|
||||
card_tooltip_wake_cron: '唤醒计划',
|
||||
card_tooltip_shutdown_cron: '关机计划',
|
||||
card_tooltip_wake_password: '唤醒密码',
|
||||
card_tooltip_last_status_change: '最近状态更新',
|
||||
card_password: '密码',
|
||||
card_nic_tooltip_pending: '等待中...',
|
||||
card_nic_tooltip_shutdown: '关机',
|
||||
card_nic_tooltip_shutdown_no_cmd: '未设置关机命令',
|
||||
card_nic_tooltip_shutdown_no_permission: '没有关闭此设备的权限',
|
||||
card_nic_tooltip_power: '启动',
|
||||
card_nic_tooltip_power_no_permission: '没有启动此设备的权限',
|
||||
modal_confirm_wake_title: '唤醒 {device}?',
|
||||
modal_confirm_wake_desc: '您确定要唤醒 {device} 吗?',
|
||||
modal_confirm_shutdown_title: '关闭 {device}?',
|
||||
modal_confirm_shutdown_desc: '您确定要关闭 {device} 吗?',
|
||||
general: '通用',
|
||||
general_name: '名称',
|
||||
general_ip: 'IP',
|
||||
general_mac: 'Mac',
|
||||
general_netmask: '子网掩码',
|
||||
general_description: '说明',
|
||||
general_description_placeholder: '设备的一些说明',
|
||||
general_required_field: '必填字段',
|
||||
ports: '端口',
|
||||
ports_desc: 'UpSnap 可以检查设备端口是否正常.',
|
||||
ports_add_new: '添加端口',
|
||||
ports_name: '名称',
|
||||
ports_number: '端口号',
|
||||
link: '链接',
|
||||
link_desc: '为您的设备名设置一个可点击的链接.',
|
||||
link_open: '自动打开链接',
|
||||
link_open_no: '没有',
|
||||
link_open_same_tab: '同一标签',
|
||||
link_open_new_tab: '新标签',
|
||||
ping: 'Ping',
|
||||
ping_desc:
|
||||
'您可以使用自定义 shell 命令来查看设备是否已接通电源。该命令应返回 <span class="badge">0</span> 的退出代码,表示设备电源已打开,任何其他退出代码都将标记设备电源已关闭。',
|
||||
ping_cmd: '自定义 ping 命令',
|
||||
wake: '唤醒',
|
||||
wake_desc: '您可以通过计划任务来唤醒设备.',
|
||||
wake_cmd: '自定义唤醒命令',
|
||||
wake_cron: '唤醒计划任务',
|
||||
wake_cron_enable: '启用定时唤醒',
|
||||
sol: 'Sleep-On-LAN',
|
||||
sol_desc1:
|
||||
'您可以使用 <a class="link" href="https://github.com/SR-G/sleep-on-lan" target="_blank">Sleep-On-LAN</a> 工具让计算机进入睡眠状态. Sleep-On-LAN (SOL) 是一个外部的工具/守护程序, 它在您想要进入休眠状态的PC上运行并提供RestApi接口. 有关 Sleep-On-LAN 设置的说明, 请参阅文档 <a href="https://github.com/SR-G/sleep-on-lan#usage" class="link" target="_blank">Usage</a> 部分.',
|
||||
sol_desc2: 'SOL 配置为通过HTTP而不是UDP发送请求, 以启用认证功能并使请求更可靠',
|
||||
sol_desc3:
|
||||
'因此, 请确保在 <a href="https://github.com/SR-G/sleep-on-lan#configuration" class="link" target="_blank">SOL 配置</a> 的 <span class="badge">Listeners</span> 部分中包含<span class="badge">HTTP:<YOURPORT></span>',
|
||||
sol_enable: '启用 Sleep-On-LAN',
|
||||
sol_port: 'SOL 端口',
|
||||
sol_authorization: '认证',
|
||||
sol_user: 'SOL 账号',
|
||||
sol_password: 'SOL 密码',
|
||||
shutdown: '关机',
|
||||
shutdown_desc:
|
||||
'此 <strong>shell 命令</strong> 将在您的容器内运行 (如果使用的是Docker) 或在您的主机上运行. 要验证该命令是否有效, 您可以在容器内或主机上的shell中运行该命令. 通常在 Windows 上使用 <span class="badge">net rpc</span>, Linux上使用 <span class="badge">sshpass</span> 或者针对Web请求使用 <span class="badge">curl</span>.',
|
||||
shutdown_examples: '示例:',
|
||||
shutdown_examples_windows: '关闭远程 Windows 主机:',
|
||||
shutdown_examples_linux: '关闭远程 Linux 主机:',
|
||||
shutdown_cmd: '关机命令',
|
||||
shutdown_cron_desc: '就像设置计划任务来唤醒设备一样, 您也可以设置计划任务来关闭该设备.',
|
||||
shutdown_cron: '关机计划任务',
|
||||
shutdown_cron_enable: '启用定时关机',
|
||||
password: '密码',
|
||||
password_desc:
|
||||
'一些网卡允许为 magic packets 设置密码, 也可以称之为 <span class="badge">SecureON</span>. 密码长度只能为0、4或6个字符.',
|
||||
groups: '分组',
|
||||
groups_desc: '您可以将设备添加到组, 以便在控制面板上按组对其进行排序.',
|
||||
groups_placeholder: "例如: 'Basement' 或 'Office'",
|
||||
network_scan_range_saved: '扫描范围已保存',
|
||||
network_scan_desc:
|
||||
'自动扫描网络中的设备. 要实现这一点, 您需要以超级用户/管理员身份运行 UpSnap, 并在您的 $PATH 中安装和使用nmap(对于docker用户, 您不需要执行任何操作). 扫描可能需要一些时间.',
|
||||
network_scan_ip_range: 'IP 范围',
|
||||
network_scan_no_range: '无扫描范围',
|
||||
network_scan_unsaved_changes: '未保存的更改',
|
||||
network_scan_running: '扫描中',
|
||||
network_scan: '扫描',
|
||||
network_scan_ip: 'IP:',
|
||||
network_scan_mac: 'Mac:',
|
||||
network_scan_mac_vendor: 'Mac 供应商:',
|
||||
network_scan_netmask: '子网掩码:',
|
||||
network_scan_add_all: '添加全部设备',
|
||||
network_scan_replace_netmask: '更换所有设备的子网掩码?',
|
||||
network_scan_new_netmask: '新子网掩码',
|
||||
network_scan_include_unknown: '包括名称为 “Unknown” 的设备',
|
||||
require_confirmation: '二次确认'
|
||||
},
|
||||
login: {
|
||||
welcome: '欢迎使用',
|
||||
email_label: '邮箱/用户名:',
|
||||
password_label: '密码:',
|
||||
btn_more: '更多',
|
||||
menu_title_auth_providers: '其他身份验证提供程序',
|
||||
btn_login: '登录'
|
||||
},
|
||||
settings: {
|
||||
page_title: '设置',
|
||||
ping_interval_title: 'Ping 间隔',
|
||||
ping_interval_desc1: '设置 ping 的间隔。为空时使用默认值 <span class="badge">@every 3s</span>.',
|
||||
ping_interval_desc2:
|
||||
'有关 cron 的更多信息, 请访问<a class="link" href="https://zh.wikipedia.org/wiki/Cron" target="_blank">Wikipedia</a> 或参阅 <a class="link" href="https://github.com/harrisiirak/cron-parser" target="_blank">cron 文档</a>.',
|
||||
lazy_ping_title: 'Lazy ping',
|
||||
lazy_ping_desc: '当开关打开时, UpSnap 只会在用户访问网站期间进行 ping 操作.',
|
||||
lazy_ping_enable: '启用',
|
||||
website_title_title: '网站标题',
|
||||
website_title_desc: '设置在浏览器选项卡和网站中显示标题',
|
||||
icon_title: '图标',
|
||||
icon_desc: '设置一个自定义图标. 支持的文件类型:',
|
||||
upsnap_version: 'UpSnap 版本',
|
||||
invalid_cron: '无效的 cron 语法'
|
||||
},
|
||||
users: {
|
||||
page_title: '用户',
|
||||
allow_create_devices: '允许 {username} 创建新设备和编辑设备组',
|
||||
device_permissions: '设备权限',
|
||||
create_new_device: '创建新设备',
|
||||
read: '查看',
|
||||
update: '更新',
|
||||
delete: '删除',
|
||||
power: '电源',
|
||||
toggle: '全选',
|
||||
confirm_delete_title: '确认删除',
|
||||
confirm_delete_desc: '您确定要删除 {username} 吗?',
|
||||
create_new_user: '新增用户',
|
||||
username: '用户名',
|
||||
password: '密码',
|
||||
password_confirm: '确认密码',
|
||||
required_field: '必填字段'
|
||||
},
|
||||
buttons: {
|
||||
save: '保存',
|
||||
delete: '删除',
|
||||
change: '更改',
|
||||
reset: '重置',
|
||||
cancel: '取消',
|
||||
add: '添加',
|
||||
confirm: '确认'
|
||||
},
|
||||
welcome: {
|
||||
step1_page_title: '欢迎使用 UpSnap 🥳',
|
||||
step1_setup_desc: '初次使用, 请依照指示完成下列步骤.',
|
||||
step1_setup_btn_next: '下一步',
|
||||
step2_page_title: '创建管理员账号',
|
||||
step2_label_email: '邮箱:',
|
||||
step2_label_password: '密码:',
|
||||
step2_label_min_chars: '请输入至少10个字符',
|
||||
step2_label_password_confirm: '确认密码:',
|
||||
step2_btn_create: '创建',
|
||||
step3_page_title: '一切就绪! 🎉',
|
||||
step3_page_desc: '继续向您的仪表板添加一些设备.',
|
||||
step3_btn_done: '开始使用!',
|
||||
not_expected_title: '意料之外! 🧐',
|
||||
not_expected_desc: '您已经完成了设置, 无需再次设置',
|
||||
not_expected_back: '返回',
|
||||
progress_step1: '欢迎',
|
||||
progress_step2: '创建账号',
|
||||
progress_step3: '完成'
|
||||
},
|
||||
toasts: {
|
||||
admin_saved: '账户信息已保存',
|
||||
user_saved: '账户信息已保存',
|
||||
user_created: '用户 {username} 已创建',
|
||||
user_deleted: '用户 {username} 已删除',
|
||||
settings_saved: '设置已保存',
|
||||
password_changed: '密码已修改, 请重新登录.',
|
||||
passwords_missmatch: '两次输入的密码不匹配',
|
||||
permissions_created: '用户 {username} 的权限已创建',
|
||||
permissions_deleted: '用户 {username} 的权限已删除',
|
||||
permissions_updated: '用户 {username} 的权限已更新',
|
||||
permissions_updated_personal: '您的权限已更新',
|
||||
no_permission: '您没有权限访问 {url}',
|
||||
device_created: '已创建 {device}',
|
||||
devices_created_multiple: '已创建 {count|int} 个设备',
|
||||
device_updated: '已更新 {device}',
|
||||
device_deleted: '已删除 {device}',
|
||||
group_created: '已创建组 {group}',
|
||||
group_deleted: '已删除组 {group}'
|
||||
},
|
||||
navbar: {
|
||||
theme: '主题',
|
||||
new: '新增',
|
||||
edit_account: '编辑账户',
|
||||
logout: '退出'
|
||||
}
|
||||
} satisfies BaseTranslation;
|
||||
|
||||
export default zh;
|
||||
@@ -1,4 +1,4 @@
|
||||
import { locale } from '$lib/i18n/i18n-svelte';
|
||||
import { getLocale } from '$lib/paraglide/runtime';
|
||||
import type { Locale } from 'date-fns';
|
||||
import { id } from 'date-fns/locale';
|
||||
import { de } from 'date-fns/locale/de';
|
||||
@@ -15,54 +15,42 @@ import { zhTW } from 'date-fns/locale/zh-TW';
|
||||
|
||||
import { writable, type Writable } from 'svelte/store';
|
||||
|
||||
// dynamically import locales
|
||||
// it's ugly but the only working solution i found in ~ 3 hours
|
||||
export const localeStore = writable(getLocale());
|
||||
export const dateFnsLocale: Writable<Locale> = writable(enUS);
|
||||
|
||||
locale.subscribe((l) => {
|
||||
localeStore.subscribe((l: string) => {
|
||||
switch (l) {
|
||||
case 'de':
|
||||
case 'de-DE':
|
||||
dateFnsLocale.set(de);
|
||||
break;
|
||||
case 'en':
|
||||
case 'en-US':
|
||||
dateFnsLocale.set(enUS);
|
||||
break;
|
||||
case 'es':
|
||||
case 'es-ES':
|
||||
dateFnsLocale.set(es);
|
||||
break;
|
||||
case 'fr':
|
||||
case 'fr-FR':
|
||||
dateFnsLocale.set(fr);
|
||||
break;
|
||||
case 'id':
|
||||
case 'id-ID':
|
||||
dateFnsLocale.set(id);
|
||||
break;
|
||||
case 'it':
|
||||
case 'it-IT':
|
||||
dateFnsLocale.set(it);
|
||||
break;
|
||||
case 'ja':
|
||||
case 'ja-JP':
|
||||
dateFnsLocale.set(ja);
|
||||
break;
|
||||
case 'nl':
|
||||
case 'nl-NL':
|
||||
dateFnsLocale.set(nl);
|
||||
break;
|
||||
case 'pl':
|
||||
case 'pl-PL':
|
||||
dateFnsLocale.set(pl);
|
||||
break;
|
||||
case 'pt':
|
||||
case 'pt-PT':
|
||||
dateFnsLocale.set(pt);
|
||||
break;
|
||||
case 'zh':
|
||||
case 'zh-CN':
|
||||
dateFnsLocale.set(zhCN);
|
||||
break;
|
||||
case 'zh-TW':
|
||||
|
||||
@@ -3,18 +3,15 @@
|
||||
import { page } from '$app/state';
|
||||
import Navbar from '$lib/components/Navbar.svelte';
|
||||
import Transition from '$lib/components/Transition.svelte';
|
||||
import LL, { setLocale } from '$lib/i18n/i18n-svelte';
|
||||
import { baseLocale, locales } from '$lib/i18n/i18n-util';
|
||||
import { loadLocaleAsync } from '$lib/i18n/i18n-util.async';
|
||||
import { m } from '$lib/paraglide/messages.js';
|
||||
import { locales, localizeHref } from '$lib/paraglide/runtime';
|
||||
import { backendUrl, permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPub } from '$lib/stores/settings';
|
||||
import type { Permission } from '$lib/types/permission';
|
||||
import type { SettingsPublic } from '$lib/types/settings';
|
||||
import { onMount } from 'svelte';
|
||||
import toast, { Toaster, type ToastOptions } from 'svelte-french-toast';
|
||||
import { detectLocale, localStorageDetector, navigatorDetector } from 'typesafe-i18n/detectors';
|
||||
import '../app.css';
|
||||
|
||||
const toastOptions: ToastOptions = {
|
||||
duration: 5000
|
||||
};
|
||||
@@ -22,16 +19,6 @@
|
||||
let authIsValid = false;
|
||||
|
||||
onMount(async () => {
|
||||
// load locale
|
||||
const detectedLocale = detectLocale(
|
||||
baseLocale,
|
||||
locales,
|
||||
localStorageDetector,
|
||||
navigatorDetector
|
||||
);
|
||||
await loadLocaleAsync(detectedLocale);
|
||||
setLocale(detectedLocale);
|
||||
|
||||
$pocketbase.authStore.onChange(() => {
|
||||
authIsValid = $pocketbase.authStore.isValid;
|
||||
|
||||
@@ -49,7 +36,7 @@
|
||||
|
||||
$pocketbase.collection('permissions').subscribe('*', (event) => {
|
||||
permission.set(event.record as Permission);
|
||||
toast.success($LL.toasts.permissions_updated_personal());
|
||||
toast.success(m.toasts_permissions_updated_personal());
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -113,3 +100,9 @@
|
||||
<slot />
|
||||
</div>
|
||||
</Transition>
|
||||
|
||||
<div class="hidden">
|
||||
{#each locales as locale}
|
||||
<a href={localizeHref(page.url.pathname, { locale })}>{locale}</a>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import DeviceCard from '$lib/components/DeviceCard.svelte';
|
||||
import PageLoading from '$lib/components/PageLoading.svelte';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device, Group } from '$lib/types/device';
|
||||
import {
|
||||
@@ -10,7 +10,7 @@
|
||||
faPlus,
|
||||
faWarning
|
||||
} from '@fortawesome/free-solid-svg-icons';
|
||||
import { onDestroy, onMount } from 'svelte';
|
||||
import { onMount } from 'svelte';
|
||||
import Fa from 'svelte-fa';
|
||||
import toast from 'svelte-french-toast';
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
let orderByGroups = true;
|
||||
let searchQuery = '';
|
||||
let searchInput: HTMLInputElement;
|
||||
let isMac = false;
|
||||
let isMac = /Mac|iPhone|iPad/.test(navigator.userAgent);
|
||||
|
||||
const gridClass = 'grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 2xl:grid-cols-4 gap-4';
|
||||
|
||||
@@ -65,9 +65,6 @@
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
isMac = /Mac|iPhone|iPad/.test(navigator.userAgent);
|
||||
document.addEventListener('keydown', handleShortcut);
|
||||
|
||||
orderBy = (localStorage.getItem('orderBy') as 'name' | 'ip') || 'name';
|
||||
orderByGroups = localStorage.getItem('orderByGroups') !== 'false';
|
||||
getAllDevices();
|
||||
@@ -75,12 +72,10 @@
|
||||
$pocketbase.collection(collection).subscribe('*', getAllDevices)
|
||||
);
|
||||
});
|
||||
|
||||
onDestroy(() => {
|
||||
document.removeEventListener('keydown', handleShortcut);
|
||||
});
|
||||
</script>
|
||||
|
||||
<svelte:document on:keydown={handleShortcut} />
|
||||
|
||||
{#if loading}
|
||||
<PageLoading />
|
||||
{:else if devices.length > 0}
|
||||
@@ -99,7 +94,7 @@
|
||||
<input
|
||||
type="search"
|
||||
class="grow"
|
||||
placeholder={$LL.home.search_placeholder()}
|
||||
placeholder={m.home_search_placeholder()}
|
||||
bind:value={searchQuery}
|
||||
bind:this={searchInput}
|
||||
/>
|
||||
@@ -109,14 +104,14 @@
|
||||
<div class="join ms-auto">
|
||||
{#if orderExpanded}
|
||||
<button class="btn join-item" on:click={() => (orderByGroups = !orderByGroups)}>
|
||||
{$LL.home.order_groups()}
|
||||
{m.home_order_groups()}
|
||||
<input type="checkbox" class="checkbox" checked={orderByGroups} />
|
||||
</button>
|
||||
<input
|
||||
class="btn join-item"
|
||||
type="radio"
|
||||
name="order"
|
||||
aria-label={$LL.home.order_name()}
|
||||
aria-label={m.home_order_name()}
|
||||
bind:group={orderBy}
|
||||
value="name"
|
||||
/>
|
||||
@@ -124,14 +119,14 @@
|
||||
class="btn join-item"
|
||||
type="radio"
|
||||
name="order"
|
||||
aria-label={$LL.home.order_ip()}
|
||||
aria-label={m.home_order_ip()}
|
||||
bind:group={orderBy}
|
||||
value="ip"
|
||||
/>
|
||||
{/if}
|
||||
<button
|
||||
class="btn join-item tooltip {orderExpanded ? '' : 'rounded-field'}"
|
||||
data-tip={$LL.home.order_tooltip()}
|
||||
data-tip={m.home_order_tooltip()}
|
||||
on:click={() => (orderExpanded = !orderExpanded)}
|
||||
>
|
||||
<Fa icon={orderExpanded ? faChevronCircleRight : faChevronCircleLeft} size="lg" />
|
||||
@@ -172,15 +167,13 @@
|
||||
<Fa icon={faWarning} size="lg" />
|
||||
{#if $pocketbase.authStore.isSuperuser || $permission.create}
|
||||
<div>
|
||||
<h3 class="font-bold">{$LL.home.no_devices()}</h3>
|
||||
<div class="text-xs">{$LL.home.add_first_device()}</div>
|
||||
<h3 class="font-bold">{m.home_no_devices()}</h3>
|
||||
<div class="text-xs">{m.home_add_first_device()}</div>
|
||||
</div>
|
||||
<a href="/device/new" class="btn btn-sm"
|
||||
><Fa icon={faPlus} />{$LL.home.add_first_device()}</a
|
||||
>
|
||||
<a href="/device/new" class="btn btn-sm"><Fa icon={faPlus} />{m.home_add_first_device()}</a>
|
||||
{:else}
|
||||
<span>
|
||||
{$LL.home.grant_permissions()}
|
||||
{m.home_grant_permissions()}
|
||||
</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -1,47 +1,34 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import LL, { setLocale } from '$lib/i18n/i18n-svelte';
|
||||
import type { Locales } from '$lib/i18n/i18n-types';
|
||||
import { baseLocale, locales } from '$lib/i18n/i18n-util';
|
||||
import { loadLocaleAsync } from '$lib/i18n/i18n-util.async';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import type { Locale } from '$lib/paraglide/runtime';
|
||||
import { getLocale, locales, setLocale } from '$lib/paraglide/runtime';
|
||||
import { localeStore } from '$lib/stores/locale';
|
||||
import { backendUrl, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { faSave } from '@fortawesome/free-solid-svg-icons';
|
||||
import { onMount } from 'svelte';
|
||||
import Fa from 'svelte-fa';
|
||||
import toast from 'svelte-french-toast';
|
||||
import { detectLocale, navigatorDetector } from 'typesafe-i18n/detectors';
|
||||
|
||||
let newAvatar: number;
|
||||
|
||||
let selectedLang: Locale;
|
||||
|
||||
// locales
|
||||
const languageEmojis = {
|
||||
de: '🇩🇪',
|
||||
'de-DE': '🇩🇪',
|
||||
en: '🇺🇸',
|
||||
'en-US': '🇺🇸',
|
||||
de: '🇩🇪',
|
||||
es: '🇪🇸',
|
||||
'es-ES': '🇪🇸',
|
||||
fr: '🇫🇷',
|
||||
'fr-FR': '🇫🇷',
|
||||
id: '🇮🇩',
|
||||
'id-ID': '🇮🇩',
|
||||
it: '🇮🇹',
|
||||
'it-IT': '🇮🇹',
|
||||
ja: '🇯🇵',
|
||||
'ja-JP': '🇯🇵',
|
||||
nl: '🇳🇱',
|
||||
'nl-NL': '🇳🇱',
|
||||
pl: '🇵🇱',
|
||||
'pl-PL': '🇵🇱',
|
||||
pt: '🇵🇹',
|
||||
'pt-PT': '🇵🇹',
|
||||
zh: '🇨🇳',
|
||||
'zh-CN': '🇨🇳',
|
||||
'zh-TW': '🇹🇼'
|
||||
'zh-TW': '🇹🇼',
|
||||
zh: '🇨🇳'
|
||||
};
|
||||
let localStorageLang: Locales | 'auto' = 'auto';
|
||||
let selectedLanguage: Locales | 'auto' = localStorageLang;
|
||||
$: selectedLanguage = localStorageLang as Locales;
|
||||
|
||||
// password change
|
||||
let newPassword = {
|
||||
@@ -60,19 +47,11 @@
|
||||
});
|
||||
|
||||
onMount(() => {
|
||||
localStorageLang = (localStorage.getItem('lang') as Locales) || 'auto';
|
||||
selectedLang = getLocale();
|
||||
});
|
||||
|
||||
async function saveUser() {
|
||||
let newLang = selectedLanguage;
|
||||
if (newLang === 'auto') {
|
||||
localStorage.removeItem('lang');
|
||||
newLang = detectLocale(baseLocale, locales, navigatorDetector);
|
||||
} else {
|
||||
localStorage.setItem('lang', newLang);
|
||||
}
|
||||
await loadLocaleAsync(newLang);
|
||||
setLocale(newLang);
|
||||
setLocale(selectedLang);
|
||||
|
||||
if ($pocketbase.authStore.isSuperuser) {
|
||||
if (!$pocketbase.authStore.record?.id) return;
|
||||
@@ -80,7 +59,7 @@
|
||||
.collection('_superusers')
|
||||
.update($pocketbase.authStore.record.id, { avatar: newAvatar })
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.admin_saved());
|
||||
toast.success(m.toasts_admin_saved());
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -91,7 +70,7 @@
|
||||
.collection('users')
|
||||
.update($pocketbase.authStore.record.id, { avatar: newAvatar })
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.user_saved());
|
||||
toast.success(m.toasts_user_saved());
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -115,7 +94,7 @@
|
||||
)
|
||||
.then(async (data) => {
|
||||
if (data.ok) {
|
||||
toast.success($LL.toasts.password_changed());
|
||||
toast.success(m.toasts_password_changed());
|
||||
$pocketbase.authStore.clear();
|
||||
goto('/login');
|
||||
} else {
|
||||
@@ -123,7 +102,7 @@
|
||||
if (j?.data?.password?.message) {
|
||||
toast.error(j?.data?.password?.message);
|
||||
} else if (j?.data?.passwordConfirm?.message) {
|
||||
toast.error($LL.toasts.passwords_missmatch());
|
||||
toast.error(m.toasts_passwords_missmatch());
|
||||
} else if (j.data?.oldPassword?.message) {
|
||||
toast.error(j.data.oldPassword.message);
|
||||
} else {
|
||||
@@ -136,13 +115,13 @@
|
||||
});
|
||||
}
|
||||
|
||||
function localeToFullName(lang: Locales) {
|
||||
function localeToFullName(lang: Locale) {
|
||||
const languageNames = new Intl.DisplayNames([lang], { type: 'language' });
|
||||
return languageNames.of(lang) ?? '';
|
||||
}
|
||||
</script>
|
||||
|
||||
<h1 class="mb-8 text-3xl font-bold">{$LL.account.page_title()}</h1>
|
||||
<h1 class="mb-8 text-3xl font-bold">{m.account_page_title()}</h1>
|
||||
<div class="card bg-base-200 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<div class="flex flex-row items-center gap-4">
|
||||
@@ -164,13 +143,13 @@
|
||||
</h2>
|
||||
<h3>
|
||||
{$pocketbase.authStore.isSuperuser
|
||||
? $LL.account.account_type_admin()
|
||||
: $LL.account.account_type_user()}
|
||||
? m.account_account_type_admin()
|
||||
: m.account_account_type_user()}
|
||||
</h3>
|
||||
</div>
|
||||
</div>
|
||||
<form on:submit|preventDefault={saveUser}>
|
||||
<h2 class="card-title mt-4 mb-2">{$LL.account.avatar_title()}</h2>
|
||||
<h2 class="card-title mt-4 mb-2">{m.account_avatar_title()}</h2>
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
{#each [...Array(10).keys()] as i}
|
||||
<div class="avatar">
|
||||
@@ -192,19 +171,16 @@
|
||||
role="none"
|
||||
>
|
||||
{#if $pocketbase.authStore.record?.id}
|
||||
<img src="/avatars/avatar{i}.svg" alt="{$LL.account.avatar_title()} {i}" />
|
||||
<img src="/avatars/avatar{i}.svg" alt="{m.account_avatar_title()} {i}" />
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
<h2 class="card-title mt-4 mb-2">{$LL.account.language_title()}</h2>
|
||||
<select class="select w-full max-w-xs" bind:value={selectedLanguage}>
|
||||
<option value="auto" selected={localStorageLang === null}
|
||||
>🌐 {$LL.account.language_option_auto()}</option
|
||||
>
|
||||
{#each locales.sort( (a, b) => a.localeCompare( b, undefined, { sensitivity: 'base' } ) ) as lang}
|
||||
<option value={lang} selected={localStorageLang === lang}>
|
||||
<h2 class="card-title mt-4 mb-2">{m.account_language_title()}</h2>
|
||||
<select class="select w-full max-w-xs" bind:value={selectedLang}>
|
||||
{#each [...locales].sort( (a, b) => a.localeCompare( b, undefined, { sensitivity: 'base' } ) ) as lang}
|
||||
<option value={lang} selected={$localeStore === lang}>
|
||||
{languageEmojis[lang]}
|
||||
{localeToFullName(lang)} [{lang}]
|
||||
</option>
|
||||
@@ -212,7 +188,7 @@
|
||||
</select>
|
||||
<div class="mt-2">
|
||||
<button type="submit" class="btn btn-success mt-2"
|
||||
><Fa icon={faSave} />{$LL.buttons.save()}</button
|
||||
><Fa icon={faSave} />{m.buttons_save()}</button
|
||||
>
|
||||
</div>
|
||||
</form>
|
||||
@@ -220,18 +196,18 @@
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.account.change_password_title()}</h2>
|
||||
<p>{$LL.account.change_password_body()}</p>
|
||||
<h2 class="card-title">{m.account_change_password_title()}</h2>
|
||||
<p>{m.account_change_password_body()}</p>
|
||||
<form on:submit|preventDefault={changePassword}>
|
||||
<div class="w-full max-w-xs">
|
||||
{#if !$pocketbase.authStore.isSuperuser}
|
||||
<label class="label" for="password-old">
|
||||
<span>{$LL.account.change_password_label()}</span>
|
||||
<span>{m.account_change_password_label()}</span>
|
||||
</label>
|
||||
<input
|
||||
id="password-old"
|
||||
type="password"
|
||||
placeholder={$LL.account.change_password_label()}
|
||||
placeholder={m.account_change_password_label()}
|
||||
class="input w-full max-w-xs"
|
||||
minlength="5"
|
||||
maxlength="72"
|
||||
@@ -240,12 +216,12 @@
|
||||
/>
|
||||
{/if}
|
||||
<label class="label" for="password-new">
|
||||
<span>{$LL.account.change_password_new()}</span>
|
||||
<span>{m.account_change_password_new()}</span>
|
||||
</label>
|
||||
<input
|
||||
id="password-new"
|
||||
type="password"
|
||||
placeholder={$LL.account.change_password_new()}
|
||||
placeholder={m.account_change_password_new()}
|
||||
class="input w-full max-w-xs"
|
||||
minlength={$pocketbase.authStore.isSuperuser ? 10 : 5}
|
||||
maxlength="72"
|
||||
@@ -255,12 +231,12 @@
|
||||
</div>
|
||||
<div class="w-full max-w-xs">
|
||||
<label class="label" for="password-confirm">
|
||||
<span>{$LL.account.change_password_confirm()}</span>
|
||||
<span>{m.account_change_password_confirm()}</span>
|
||||
</label>
|
||||
<input
|
||||
id="password-confirm"
|
||||
type="password"
|
||||
placeholder={$LL.account.change_password_confirm()}
|
||||
placeholder={m.account_change_password_confirm()}
|
||||
class="input w-full max-w-xs"
|
||||
minlength={$pocketbase.authStore.isSuperuser ? 10 : 5}
|
||||
maxlength="72"
|
||||
@@ -270,7 +246,7 @@
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<button type="submit" class="btn btn-success mt-2"
|
||||
><Fa icon={faSave} />{$LL.buttons.change()}</button
|
||||
><Fa icon={faSave} />{m.buttons_change()}</button
|
||||
>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
import { page } from '$app/state';
|
||||
import DeviceForm from '$lib/components/DeviceForm.svelte';
|
||||
import PageLoading from '$lib/components/PageLoading.svelte';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device, Port } from '$lib/types/device';
|
||||
import type { Device, Group, Port } from '$lib/types/device';
|
||||
import toast from 'svelte-french-toast';
|
||||
|
||||
$: if (Object.hasOwn($permission, 'update')) {
|
||||
if (!$pocketbase.authStore.isSuperuser && !$permission.update.includes($page.params.id)) {
|
||||
toast($LL.toasts.no_permission({ url: $page.url.pathname }), {
|
||||
if (!$pocketbase.authStore.isSuperuser && !$permission.update.includes(page.params.id)) {
|
||||
toast(m.toasts_no_permission({ url: page.url.pathname }), {
|
||||
icon: '⛔'
|
||||
});
|
||||
goto('/');
|
||||
@@ -20,11 +20,15 @@
|
||||
async function getDevice(): Promise<Device> {
|
||||
const resp = await $pocketbase
|
||||
.collection('devices')
|
||||
.getOne($page.params.id, { expand: 'ports,groups' });
|
||||
.getOne(page.params.id, { expand: 'ports,groups' });
|
||||
|
||||
let device = resp as Device;
|
||||
|
||||
if (!device.expand) device.expand = {};
|
||||
if (!device.expand)
|
||||
device.expand = {} as {
|
||||
ports: Port[];
|
||||
groups: Group[];
|
||||
};
|
||||
|
||||
if (!device.expand.ports) {
|
||||
device.expand.ports = [] as Port[];
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { page } from '$app/stores';
|
||||
import DeviceForm from '$lib/components/DeviceForm.svelte';
|
||||
import NetworkScan from '$lib/components/NetworkScan.svelte';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { permission, pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device, Port } from '$lib/types/device';
|
||||
import { faBinoculars, faWrench } from '@fortawesome/free-solid-svg-icons';
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
$: if (Object.hasOwn($permission, 'create')) {
|
||||
if (!$pocketbase.authStore.isSuperuser && !$permission.create) {
|
||||
toast($LL.toasts.no_permission({ url: $page.url.pathname }), {
|
||||
toast(m.toasts_no_permission({ url: $page.url.pathname }), {
|
||||
icon: '⛔'
|
||||
});
|
||||
goto('/');
|
||||
@@ -29,13 +29,13 @@
|
||||
let tabs = [
|
||||
{
|
||||
name: 'manual',
|
||||
ll_name: $LL.device.tabs[0](),
|
||||
ll_name: m['device_tabs.0'](),
|
||||
icon: faWrench,
|
||||
show: true
|
||||
},
|
||||
{
|
||||
name: 'scan',
|
||||
ll_name: $LL.device.tabs[1](),
|
||||
ll_name: m['device_tabs.1'](),
|
||||
icon: faBinoculars,
|
||||
show: $pocketbase.authStore.isSuperuser
|
||||
}
|
||||
@@ -43,7 +43,7 @@
|
||||
let activeTab = 'manual';
|
||||
</script>
|
||||
|
||||
<h1 class="mb-8 text-3xl font-bold">{$LL.device.page_title()}</h1>
|
||||
<h1 class="mb-8 text-3xl font-bold">{m.device_page_title()}</h1>
|
||||
<div class="mb-6 flex justify-center">
|
||||
<ul class="menu menu-horizontal rounded-box bg-base-200 gap-1">
|
||||
{#each tabs as tab}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { toggleVisibility } from '$lib/helpers/forms';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { backendUrl, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPub } from '$lib/stores/settings';
|
||||
import { faEye, faLockOpen, faQuestionCircle } from '@fortawesome/free-solid-svg-icons';
|
||||
@@ -71,15 +71,15 @@
|
||||
alt={$settingsPub?.website_title ? $settingsPub?.website_title : 'Gopher'}
|
||||
/>
|
||||
</figure>
|
||||
<h2 class="card-title">{$LL.login.welcome()}</h2>
|
||||
<h2 class="card-title">{m.login_welcome()}</h2>
|
||||
</div>
|
||||
<form class="w-full" on:submit|preventDefault={tryAdminThenUser}>
|
||||
<label class="label" for="email">
|
||||
<span>{$LL.login.email_label()}</span>
|
||||
<span>{m.login_email_label()}</span>
|
||||
</label>
|
||||
<input id="email" type="text" class="input w-full" required bind:value={form.email} />
|
||||
<label class="label" for="password">
|
||||
<span>{$LL.login.password_label()}</span>
|
||||
<span>{m.login_password_label()}</span>
|
||||
</label>
|
||||
<label class="relative block">
|
||||
<div
|
||||
@@ -102,14 +102,14 @@
|
||||
</label>
|
||||
<div class="card-actions mt-4">
|
||||
<div class="dropdown">
|
||||
<label tabindex="-1" class="btn" for="other-providers">{$LL.login.btn_more()}</label>
|
||||
<label tabindex="-1" class="btn" for="other-providers">{m.login_btn_more()}</label>
|
||||
<ul
|
||||
id="other-providers"
|
||||
tabindex="-1"
|
||||
class="menu dropdown-content rounded-box bg-base-200 z-1 w-56 p-2 shadow-sm"
|
||||
>
|
||||
<li class="menu-title flex flex-row items-center gap-2">
|
||||
{$LL.login.menu_title_auth_providers()}
|
||||
{m.login_menu_title_auth_providers()}
|
||||
<a href="https://github.com/seriousm4x/UpSnap/wiki/Auth-providers" target="_blank"
|
||||
><Fa icon={faQuestionCircle} /></a
|
||||
>
|
||||
@@ -128,7 +128,7 @@
|
||||
</ul>
|
||||
</div>
|
||||
<button class="btn btn-success ms-auto" type="submit"
|
||||
>{$LL.login.btn_login()} <Fa icon={faLockOpen} /></button
|
||||
>{m.login_btn_login()} <Fa icon={faLockOpen} /></button
|
||||
>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { PUBLIC_VERSION } from '$env/static/public';
|
||||
import PageLoading from '$lib/components/PageLoading.svelte';
|
||||
import { cronRegex, parseCron } from '$lib/helpers/cron';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { backendUrl, pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPriv, settingsPub } from '$lib/stores/settings';
|
||||
import type { SettingsPrivate, SettingsPublic } from '$lib/types/settings';
|
||||
@@ -30,7 +30,7 @@
|
||||
|
||||
onMount(() => {
|
||||
if (!$pocketbase.authStore.isSuperuser) {
|
||||
toast($LL.toasts.no_permission({ url: page.url.pathname }), {
|
||||
toast(m.toasts_no_permission({ url: page.url.pathname }), {
|
||||
icon: '⛔'
|
||||
});
|
||||
goto('/');
|
||||
@@ -74,7 +74,7 @@
|
||||
!cronRegex.test(settingsPrivClone.interval) ||
|
||||
Object.keys(cronParser.parseString(settingsPrivClone.interval).errors).length > 0
|
||||
) {
|
||||
toast.error($LL.settings.invalid_cron());
|
||||
toast.error(m.settings_invalid_cron());
|
||||
throw new Error('ping_interval not valid');
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
.collection('settings_private')
|
||||
.update(settingsPrivClone.id, settingsPrivClone)
|
||||
.then((res) => {
|
||||
toast.success($LL.toasts.settings_saved());
|
||||
toast.success(m.toasts_settings_saved());
|
||||
settingsPriv.set(res as SettingsPrivate);
|
||||
goto('/');
|
||||
})
|
||||
@@ -110,21 +110,21 @@
|
||||
{#if settingsPubClone === undefined || settingsPrivClone === undefined}
|
||||
<PageLoading />
|
||||
{:else}
|
||||
<h1 class="mb-8 text-3xl font-bold">{$LL.settings.page_title()}</h1>
|
||||
<h1 class="mb-8 text-3xl font-bold">{m.settings_page_title()}</h1>
|
||||
<form on:submit|preventDefault={save}>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.settings.ping_interval_title()}</h2>
|
||||
<h2 class="card-title">{m.settings_ping_interval_title()}</h2>
|
||||
<p class="mt-2">
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.settings.ping_interval_desc1()}
|
||||
{@html m.settings_ping_interval_desc1()}
|
||||
</p>
|
||||
<p>
|
||||
<!-- Usage of @html is not a nice way to do this, but it's safe in this case. If someones finds
|
||||
a good solution to avoid @html but still be able to use multiple links in a single sentence,
|
||||
please create a pr/issue. -->
|
||||
<!-- eslint-disable svelte/no-at-html-tags -->
|
||||
{@html $LL.settings.ping_interval_desc2()}
|
||||
{@html m.settings_ping_interval_desc2()}
|
||||
</p>
|
||||
<div class="mt-2 w-full">
|
||||
<input
|
||||
@@ -136,22 +136,22 @@
|
||||
</div>
|
||||
<p class="fieldset-label">{parseCron(settingsPrivClone.interval, now)}</p>
|
||||
|
||||
<h2 class="card-title mt-2">{$LL.settings.lazy_ping_title()}</h2>
|
||||
<h2 class="card-title mt-2">{m.settings_lazy_ping_title()}</h2>
|
||||
<p class="mt-2">
|
||||
{$LL.settings.lazy_ping_desc()}
|
||||
{m.settings_lazy_ping_desc()}
|
||||
</p>
|
||||
<div class="w-fit">
|
||||
<label class="label cursor-pointer gap-2">
|
||||
<input type="checkbox" class="checkbox" bind:checked={settingsPrivClone.lazy_ping} />
|
||||
<span>{$LL.settings.lazy_ping_enable()}</span>
|
||||
<span>{m.settings_lazy_ping_enable()}</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.settings.website_title_title()}</h2>
|
||||
<p class="my-2">{$LL.settings.website_title_desc()}</p>
|
||||
<h2 class="card-title">{m.settings_website_title_title()}</h2>
|
||||
<p class="my-2">{m.settings_website_title_desc()}</p>
|
||||
<div class="w-full">
|
||||
<input
|
||||
type="text"
|
||||
@@ -164,9 +164,9 @@
|
||||
</div>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.settings.icon_title()}</h2>
|
||||
<h2 class="card-title">{m.settings_icon_title()}</h2>
|
||||
<p class="my-2">
|
||||
{$LL.settings.icon_desc()}
|
||||
{m.settings_icon_desc()}
|
||||
<span class="badge">.ico</span> <span class="badge">.png</span>
|
||||
<span class="badge">.svg</span> <span class="badge">.gif</span>
|
||||
<span class="badge">.jpg/.jpeg</span>
|
||||
@@ -191,21 +191,20 @@
|
||||
<button
|
||||
class="btn btn-error"
|
||||
on:click={() => resetFavicon()}
|
||||
on:keydown={() => resetFavicon()}>{$LL.buttons.reset()}</button
|
||||
on:keydown={() => resetFavicon()}>{m.buttons_reset()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-actions mt-6 justify-end">
|
||||
<button class="btn btn-success" type="submit"><Fa icon={faSave} />{$LL.buttons.save()}</button
|
||||
>
|
||||
<button class="btn btn-success" type="submit"><Fa icon={faSave} />{m.buttons_save()}</button>
|
||||
</div>
|
||||
</form>
|
||||
<div class="container mx-auto mt-6 text-center">
|
||||
{#if PUBLIC_VERSION === ''}
|
||||
{$LL.settings.upsnap_version()}: (untracked)
|
||||
{m.settings_upsnap_version()}: (untracked)
|
||||
{:else}
|
||||
{$LL.settings.upsnap_version()}:
|
||||
{m.settings_upsnap_version()}:
|
||||
<a href="https://github.com/seriousm4x/UpSnap/releases/tag/{PUBLIC_VERSION}" class="link"
|
||||
>{PUBLIC_VERSION}</a
|
||||
>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { goto } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
import PageLoading from '$lib/components/PageLoading.svelte';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages';
|
||||
import { pocketbase } from '$lib/stores/pocketbase';
|
||||
import type { Device } from '$lib/types/device';
|
||||
import type { Permission } from '$lib/types/permission';
|
||||
@@ -34,7 +34,7 @@
|
||||
|
||||
onMount(() => {
|
||||
if (!$pocketbase.authStore.isSuperuser) {
|
||||
toast($LL.toasts.no_permission({ url: $page.url.pathname }), {
|
||||
toast(m.toasts_no_permission({ url: $page.url.pathname }), {
|
||||
icon: '⛔'
|
||||
});
|
||||
goto('/');
|
||||
@@ -59,7 +59,7 @@
|
||||
.collection('users')
|
||||
.create(newUser)
|
||||
.then((data) => {
|
||||
toast.success($LL.toasts.user_created({ username: data.username }));
|
||||
toast.success(m.toasts_user_created({ username: data.username }));
|
||||
newUser.username = '';
|
||||
newUser.password = '';
|
||||
newUser.passwordConfirm = '';
|
||||
@@ -77,7 +77,7 @@
|
||||
.collection('permissions')
|
||||
.delete(permission.id)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.permissions_deleted({ username: user.username }));
|
||||
toast.success(m.toasts_permissions_deleted({ username: user.username }));
|
||||
})
|
||||
.catch((err) => {
|
||||
toast.error(err.message);
|
||||
@@ -88,7 +88,7 @@
|
||||
.collection('users')
|
||||
.delete(user.id)
|
||||
.then(async () => {
|
||||
toast.success($LL.toasts.user_deleted({ username: user.username }));
|
||||
toast.success(m.toasts_user_deleted({ username: user.username }));
|
||||
reload();
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -132,7 +132,7 @@
|
||||
// if (i > -1) {
|
||||
// permissions[i] = data as Permission;
|
||||
// }
|
||||
toast.success($LL.toasts.permissions_created({ username: user.username }));
|
||||
toast.success(m.toasts_permissions_created({ username: user.username }));
|
||||
reload();
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -144,7 +144,7 @@
|
||||
.collection('permissions')
|
||||
.update(permission.id, permission)
|
||||
.then(() => {
|
||||
toast.success($LL.toasts.permissions_updated({ username: user.username }));
|
||||
toast.success(m.toasts_permissions_updated({ username: user.username }));
|
||||
reload();
|
||||
})
|
||||
.catch((err) => {
|
||||
@@ -181,7 +181,7 @@
|
||||
{#await Promise.all([getUsersPromise, getPermissionsPromise, getDevicesPromise])}
|
||||
<PageLoading />
|
||||
{:then}
|
||||
<h1 class="mb-8 text-3xl font-bold">{$LL.users.page_title()}</h1>
|
||||
<h1 class="mb-8 text-3xl font-bold">{m.users_page_title()}</h1>
|
||||
{#each users as user, index}
|
||||
<form on:submit|preventDefault={() => save(user)}>
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
@@ -198,25 +198,25 @@
|
||||
<div class="w-fit">
|
||||
<label class="label cursor-pointer gap-2 text-wrap">
|
||||
<input type="checkbox" bind:checked={permission.create} class="checkbox" />
|
||||
{$LL.users.allow_create_devices({ username: user.username })}
|
||||
{m.users_allow_create_devices({ username: user.username })}
|
||||
</label>
|
||||
</div>
|
||||
{/each}
|
||||
<div class="collapse-arrow bg-base-200 collapse">
|
||||
<input type="checkbox" />
|
||||
<div class="collapse-title text-xl font-medium">{$LL.users.device_permissions()}</div>
|
||||
<div class="collapse-title text-xl font-medium">{m.users_device_permissions()}</div>
|
||||
<div class="collapse-content">
|
||||
{#if devices.length === 0}
|
||||
<p>
|
||||
{$LL.home.no_devices()}
|
||||
<a href="/device/new" class="link">{$LL.users.create_new_device()}</a>
|
||||
{m.home_no_devices()}
|
||||
<a href="/device/new" class="link">{m.users_create_new_device()}</a>
|
||||
</p>
|
||||
{:else}
|
||||
<div class="grid grid-cols-4 justify-items-center gap-4 md:grid-cols-5">
|
||||
<div class="font-bold md:col-start-2">{$LL.users.read()}</div>
|
||||
<div class="font-bold">{$LL.users.update()}</div>
|
||||
<div class="font-bold">{$LL.users.delete()}</div>
|
||||
<div class="font-bold">{$LL.users.power()}</div>
|
||||
<div class="font-bold md:col-start-2">{m.users_read()}</div>
|
||||
<div class="font-bold">{m.users_update()}</div>
|
||||
<div class="font-bold">{m.users_delete()}</div>
|
||||
<div class="font-bold">{m.users_power()}</div>
|
||||
{#each devices as device}
|
||||
<hr class="border-neutral col-span-full w-full border-b-1 opacity-30" />
|
||||
{#each permissions.filter((perm) => perm.user === user.id) as permission}
|
||||
@@ -258,7 +258,7 @@
|
||||
on:click={() => {
|
||||
toggleAllPermissions(user, 'read');
|
||||
}}
|
||||
><span class="hidden md:block">{$LL.users.toggle()}</span><Fa
|
||||
><span class="hidden md:block">{m.users_toggle()}</span><Fa
|
||||
icon={faRetweet}
|
||||
size="1.5x"
|
||||
/></button
|
||||
@@ -269,7 +269,7 @@
|
||||
on:click={() => {
|
||||
toggleAllPermissions(user, 'update');
|
||||
}}
|
||||
><span class="hidden md:block">{$LL.users.toggle()}</span><Fa
|
||||
><span class="hidden md:block">{m.users_toggle()}</span><Fa
|
||||
icon={faRetweet}
|
||||
size="1.5x"
|
||||
/></button
|
||||
@@ -280,7 +280,7 @@
|
||||
on:click={() => {
|
||||
toggleAllPermissions(user, 'delete');
|
||||
}}
|
||||
><span class="hidden md:block">{$LL.users.toggle()}</span><Fa
|
||||
><span class="hidden md:block">{m.users_toggle()}</span><Fa
|
||||
icon={faRetweet}
|
||||
size="1.5x"
|
||||
/></button
|
||||
@@ -291,7 +291,7 @@
|
||||
on:click={() => {
|
||||
toggleAllPermissions(user, 'power');
|
||||
}}
|
||||
><span class="hidden md:block">{$LL.users.toggle()}</span><Fa
|
||||
><span class="hidden md:block">{m.users_toggle()}</span><Fa
|
||||
icon={faRetweet}
|
||||
size="1.5x"
|
||||
/></button
|
||||
@@ -306,10 +306,10 @@
|
||||
class="btn btn-error join-item"
|
||||
type="button"
|
||||
on:click={() => deleteModal[index].showModal()}
|
||||
><Fa icon={faTrash} />{$LL.buttons.delete()}</button
|
||||
><Fa icon={faTrash} />{m.buttons_delete()}</button
|
||||
>
|
||||
<button class="btn btn-success join-item" type="submit"
|
||||
><Fa icon={faSave} />{$LL.buttons.save()}</button
|
||||
><Fa icon={faSave} />{m.buttons_save()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -317,13 +317,13 @@
|
||||
</form>
|
||||
<dialog class="modal" bind:this={deleteModal[index]}>
|
||||
<div class="modal-box">
|
||||
<h3 class="text-lg font-bold">{$LL.users.confirm_delete_title()}</h3>
|
||||
<p class="py-4">{$LL.users.confirm_delete_desc({ username: user.username })}</p>
|
||||
<h3 class="text-lg font-bold">{m.users_confirm_delete_title()}</h3>
|
||||
<p class="py-4">{m.users_confirm_delete_desc({ username: user.username })}</p>
|
||||
<div class="modal-action">
|
||||
<form method="dialog">
|
||||
<button class="btn">{$LL.buttons.cancel()}</button>
|
||||
<button class="btn">{m.buttons_cancel()}</button>
|
||||
<button class="btn btn-error" on:click={() => deleteUser(user)}
|
||||
>{$LL.buttons.delete()}</button
|
||||
>{m.buttons_delete()}</button
|
||||
>
|
||||
</form>
|
||||
</div>
|
||||
@@ -332,20 +332,20 @@
|
||||
{/each}
|
||||
<div class="card bg-base-200 mt-6 w-full shadow-sm">
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.users.create_new_user()}</h2>
|
||||
<h2 class="card-title">{m.users_create_new_user()}</h2>
|
||||
<form on:submit|preventDefault={createUser}>
|
||||
<div class="flex flex-row flex-wrap gap-4">
|
||||
<div class="w-full max-w-xs">
|
||||
<label class="label" for="username">
|
||||
<div>
|
||||
<span>{$LL.users.username()}</span>
|
||||
<span>{m.users_username()}</span>
|
||||
<span class="text-error">*</span>
|
||||
</div>
|
||||
</label>
|
||||
<input
|
||||
id="username"
|
||||
type="text"
|
||||
placeholder={$LL.users.username()}
|
||||
placeholder={m.users_username()}
|
||||
class="input w-full max-w-xs"
|
||||
required
|
||||
bind:value={newUser.username}
|
||||
@@ -354,14 +354,14 @@
|
||||
<div class="w-full max-w-xs">
|
||||
<label class="label" for="password">
|
||||
<div>
|
||||
<span>{$LL.users.password()}</span>
|
||||
<span>{m.users_password()}</span>
|
||||
<span class="text-error">*</span>
|
||||
</div>
|
||||
</label>
|
||||
<input
|
||||
id="password"
|
||||
type="password"
|
||||
placeholder={$LL.users.password()}
|
||||
placeholder={m.users_password()}
|
||||
class="input w-full max-w-xs"
|
||||
minlength="5"
|
||||
maxlength="72"
|
||||
@@ -372,14 +372,14 @@
|
||||
<div class="w-full max-w-xs">
|
||||
<label class="label" for="passwordConfirm">
|
||||
<div>
|
||||
<span>{$LL.users.password_confirm()}</span>
|
||||
<span>{m.users_password_confirm()}</span>
|
||||
<span class="text-error">*</span>
|
||||
</div>
|
||||
</label>
|
||||
<input
|
||||
id="passwordConfirm"
|
||||
type="password"
|
||||
placeholder={$LL.users.password_confirm()}
|
||||
placeholder={m.users_password_confirm()}
|
||||
class="input w-full max-w-xs"
|
||||
minlength="5"
|
||||
maxlength="72"
|
||||
@@ -388,10 +388,10 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<span class="badge text-error mt-4 self-center">* {$LL.users.required_field()}</span>
|
||||
<span class="badge text-error mt-4 self-center">* {m.users_required_field()}</span>
|
||||
<div class="card-actions justify-end">
|
||||
<button type="submit" class="btn btn-success mt-2"
|
||||
><Fa icon={faPlus} />{$LL.buttons.add()}</button
|
||||
><Fa icon={faPlus} />{m.buttons_add()}</button
|
||||
>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<script lang="ts">
|
||||
import { goto } from '$app/navigation';
|
||||
import { toggleVisibility } from '$lib/helpers/forms';
|
||||
import LL from '$lib/i18n/i18n-svelte';
|
||||
import { m } from '$lib/paraglide/messages.js';
|
||||
import { pocketbase } from '$lib/stores/pocketbase';
|
||||
import { settingsPub } from '$lib/stores/settings';
|
||||
import type { SettingsPublic } from '$lib/types/settings';
|
||||
@@ -57,7 +57,7 @@
|
||||
})
|
||||
.catch((err) => {
|
||||
if (err.data?.data?.passwordConfirm?.message) {
|
||||
toast.error($LL.toasts.passwords_missmatch());
|
||||
toast.error(m.toasts_passwords_missmatch());
|
||||
} else if (err.data?.data?.email?.message) {
|
||||
toast.error(err.data.data.email.message);
|
||||
} else {
|
||||
@@ -73,22 +73,22 @@
|
||||
{#if stepsCompleted === 0 && $settingsPub?.setup_completed}
|
||||
<figure class="mx-auto w-72 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.welcome.not_expected_title()}</h2>
|
||||
<p>{$LL.welcome.not_expected_desc()}</p>
|
||||
<h2 class="card-title">{m.welcome_not_expected_title()}</h2>
|
||||
<p>{m.welcome_not_expected_desc()}</p>
|
||||
<div class="card-actions justify-end">
|
||||
<button class="btn btn-success" on:click={() => goto('/')}
|
||||
>{$LL.welcome.not_expected_back()}</button
|
||||
>{m.welcome_not_expected_back()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
{:else if stepsCompleted === 0}
|
||||
<figure class="mx-auto w-44 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.welcome.step1_page_title()}</h2>
|
||||
<p>{$LL.welcome.step1_setup_desc()}</p>
|
||||
<h2 class="card-title">{m.welcome_step1_page_title()}</h2>
|
||||
<p>{m.welcome_step1_setup_desc()}</p>
|
||||
<div class="card-actions justify-end">
|
||||
<button class="btn btn-success" on:click={() => (stepsCompleted = 1)}
|
||||
>{$LL.welcome.step1_setup_btn_next()} <Fa icon={faArrowRight} /></button
|
||||
>{m.welcome_step1_setup_btn_next()} <Fa icon={faArrowRight} /></button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -96,16 +96,16 @@
|
||||
<div class="card-body">
|
||||
<div class="flex flex-row gap-4">
|
||||
<figure class="w-16"><img src="/gopher.svg" alt="Gopher" /></figure>
|
||||
<h2 class="card-title">{$LL.welcome.step2_page_title()}</h2>
|
||||
<h2 class="card-title">{m.welcome_step2_page_title()}</h2>
|
||||
</div>
|
||||
<form class="w-full" on:submit|preventDefault={register}>
|
||||
<label class="label" for="email">
|
||||
<span>{$LL.welcome.step2_label_email()}</span>
|
||||
<span>{m.welcome_step2_label_email()}</span>
|
||||
</label>
|
||||
<input id="email" type="email" class="input w-full" required bind:value={form.email} />
|
||||
<label class="label" for="password">
|
||||
<span>{$LL.welcome.step2_label_password()}</span>
|
||||
<span>{$LL.welcome.step2_label_min_chars()}</span>
|
||||
<span>{m.welcome_step2_label_password()}</span>
|
||||
<span>{m.welcome_step2_label_min_chars()}</span>
|
||||
</label>
|
||||
<label class="relative block">
|
||||
<div
|
||||
@@ -128,7 +128,7 @@
|
||||
/>
|
||||
</label>
|
||||
<label class="label" for="passwordConfirm">
|
||||
<span>{$LL.welcome.step2_label_password_confirm()}</span>
|
||||
<span>{m.welcome_step2_label_password_confirm()}</span>
|
||||
</label>
|
||||
<label class="relative block">
|
||||
<div
|
||||
@@ -152,7 +152,7 @@
|
||||
</label>
|
||||
<div class="card-actions mt-4 justify-end">
|
||||
<button class="btn btn-success" type="submit"
|
||||
>{$LL.welcome.step2_btn_create()} <Fa icon={faArrowRight} /></button
|
||||
>{m.welcome_step2_btn_create()} <Fa icon={faArrowRight} /></button
|
||||
>
|
||||
</div>
|
||||
</form>
|
||||
@@ -160,11 +160,11 @@
|
||||
{:else if stepsCompleted === 2}
|
||||
<figure class="mx-auto w-72 pt-6"><img src="/gopher.svg" alt="Gopher" /></figure>
|
||||
<div class="card-body">
|
||||
<h2 class="card-title">{$LL.welcome.step3_page_title()}</h2>
|
||||
<p>{$LL.welcome.step3_page_desc()}</p>
|
||||
<h2 class="card-title">{m.welcome_step3_page_title()}</h2>
|
||||
<p>{m.welcome_step3_page_desc()}</p>
|
||||
<div class="card-actions justify-end">
|
||||
<button class="btn btn-success" on:click={() => goto('/')}
|
||||
>{$LL.welcome.step3_btn_done()}</button
|
||||
>{m.welcome_step3_btn_done()}</button
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
@@ -172,9 +172,9 @@
|
||||
</div>
|
||||
{#if $settingsPub && !$settingsPub.setup_completed}
|
||||
<ul class="steps steps-horizontal">
|
||||
<li class="step step-success">{$LL.welcome.progress_step1()}</li>
|
||||
<li class="step" class:step-success={stepsCompleted > 0}>{$LL.welcome.progress_step2()}</li>
|
||||
<li class="step" class:step-success={stepsCompleted > 1}>{$LL.welcome.progress_step3()}</li>
|
||||
<li class="step step-success">{m.welcome_progress_step1()}</li>
|
||||
<li class="step" class:step-success={stepsCompleted > 0}>{m.welcome_progress_step2()}</li>
|
||||
<li class="step" class:step-success={stepsCompleted > 1}>{m.welcome_progress_step3()}</li>
|
||||
</ul>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
import { paraglideVitePlugin } from '@inlang/paraglide-js';
|
||||
import { sveltekit } from '@sveltejs/kit/vite';
|
||||
import { defineConfig } from 'vite';
|
||||
|
||||
export default defineConfig({
|
||||
plugins: [sveltekit()]
|
||||
plugins: [
|
||||
paraglideVitePlugin({ project: './project.inlang', outdir: './src/lib/paraglide' }),
|
||||
sveltekit()
|
||||
]
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user