Added shutdown group (#1732)

This commit is contained in:
Mohamed Abbas
2026-04-27 15:15:41 +03:00
committed by GitHub
parent 24e218b334
commit cc605acc83
24 changed files with 145 additions and 2 deletions

View File

@@ -202,6 +202,40 @@ func HandlerWakeGroup(e *core.RequestEvent) error {
return e.JSON(http.StatusOK, records)
}
func HandlerShutdownGroup(e *core.RequestEvent) error {
records, err := e.App.FindRecordsByFilter("devices", "groups.id = {:grpId} && status = 'online'", "", 0, 0,
dbx.Params{"grpId": e.Request.PathValue("id")},
)
if err != nil {
return apis.NewNotFoundError("No devices in group", err)
}
for _, record := range records {
go func() {
record.Set("status", "pending")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
if err := networking.ShutdownDevice(record); err != nil {
logger.Error.Println(err)
record.Set("status", "online")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
return
}
record.Set("status", "offline")
if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err)
}
}()
}
return e.JSON(http.StatusOK, records)
}
type Nmaprun struct {
Host []struct {
Address []struct {

View File

@@ -74,6 +74,7 @@ func StartPocketBase(distDirFS fs.FS) {
se.Router.GET("/api/upsnap/sleep/{id}", HandlerSleep).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/reboot/{id}", HandlerReboot).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/shutdown/{id}", HandlerShutdown).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/shutdowngroup/{id}", HandlerShutdownGroup).Bind(RequireUpSnapPermission())
se.Router.GET("/api/upsnap/scan", HandlerScan).Bind(RequireScanDevicesPermission())
se.Router.POST("/api/upsnap/init-superuser", HandlerInitSuperuser) // https://github.com/pocketbase/pocketbase/discussions/6198
se.Router.POST("/api/upsnap/validate-cron", HandlerValidateCron)

View File

@@ -25,6 +25,8 @@
let orderByGroups = $state(true);
let searchQuery = $state('');
let searchInput: HTMLInputElement | undefined = $state();
let modalShutdownGroup: HTMLDialogElement | undefined = $state();
let pendingShutdownGroup: Group | null = $state(null);
let filteredDevices: Device[] = $derived([]);
let devicesWithoutGroups: Device[] = $derived([]);
let devicesWithGroup: {
@@ -111,6 +113,23 @@
});
}
function askShutdownGroupConfirmation(group: Group) {
pendingShutdownGroup = group;
modalShutdownGroup?.showModal();
}
function executeShutdownGroup() {
if (pendingShutdownGroup) {
fetch(`${backendUrl}api/upsnap/shutdowngroup/${pendingShutdownGroup.id}`, {
headers: {
Authorization: $pocketbase.authStore.token
}
}).catch((err) => {
toast.error(err.message);
});
}
}
onMount(() => {
orderBy = (localStorage.getItem('orderBy') as 'name' | 'ip') || 'name';
orderByGroups = localStorage.getItem('orderByGroups') !== 'false';
@@ -191,13 +210,18 @@
{/if}
{#each devicesWithGroup.sort( (a, b) => (a.group?.name ?? '').localeCompare( b.group?.name ?? '', $localeStore, { numeric: true } ) ) as { group, devices } (group?.id)}
<div>
<h1 class="mb-3 text-2xl font-bold">
{group?.name ?? 'Unknown group name'}
<h1 class="mb-3 flex flex-wrap items-center gap-3 text-2xl font-bold">
<span>{group?.name ?? 'Unknown group name'}</span>
<button
class="btn btn-sm btn-success btn-soft"
onclick={() => wakeGroup(group?.id ?? '')}
><Fa icon={faPowerOff} /> {m.home_wake_group()}</button
>
<button
class="btn btn-sm btn-error btn-soft"
onclick={() => group && askShutdownGroupConfirmation(group)}
><Fa icon={faPowerOff} /> {m.home_shutdown_group()}</button
>
</h1>
<div class={gridClass}>
{#each devices as device, i (device.id)}
@@ -237,3 +261,20 @@
</div>
</div>
{/if}
<dialog class="modal" bind:this={modalShutdownGroup}>
<div class="modal-box">
<h3 class="text-lg font-bold">
{m.home_modal_confirm_shutdown_group_title({ group: pendingShutdownGroup?.name ?? '' })}
</h3>
<p class="py-4">
{m.home_modal_confirm_shutdown_group_desc({ group: pendingShutdownGroup?.name ?? '' })}
</p>
<div class="modal-action">
<form method="dialog">
<button class="btn">{m.buttons_cancel()}</button>
<button class="btn btn-error" onclick={executeShutdownGroup}>{m.buttons_confirm()}</button>
</form>
</div>
</div>
</dialog>

View File

@@ -51,6 +51,8 @@
"device_link": "الرابط",
"device_modal_confirm_shutdown_desc": "يرجى التأكيد لإيقاف {device}.",
"device_modal_confirm_shutdown_title": "إيقاف {device}؟",
"home_modal_confirm_shutdown_group_desc": "يرجى التأكيد لإيقاف جميع الأجهزة في {group}.",
"home_modal_confirm_shutdown_group_title": "إيقاف {group}؟",
"device_modal_confirm_wake_desc": "يرجى التأكيد لتشغيل {device}.",
"device_modal_confirm_wake_title": "تشغيل {device}؟",
"device_network_scan_add_all": "إضافة جميع الأجهزة",
@@ -117,6 +119,7 @@
"home_page_title": "الرئيسية",
"home_search_placeholder": "البحث عن الأجهزة",
"home_wake_group": "تشغيل المجموعة",
"home_shutdown_group": "إيقاف المجموعة",
"login_btn_login": "تسجيل الدخول",
"login_btn_more": "المزيد",
"login_email_label": "البريد الإلكتروني أو اسم المستخدم:",

View File

@@ -51,6 +51,8 @@
"device_link": "Връзка",
"device_modal_confirm_shutdown_desc": "Моля, потвърдете изключването на {device}.",
"device_modal_confirm_shutdown_title": "Изключване на {device}?",
"home_modal_confirm_shutdown_group_desc": "Моля, потвърдете изключването на всички устройства в {group}.",
"home_modal_confirm_shutdown_group_title": "Изключване на {group}?",
"device_modal_confirm_wake_desc": "Моля, потвърдете събуждането на {device}.",
"device_modal_confirm_wake_title": "Събуждане на {device}?",
"device_network_scan_add_all": "Добавяне на всички устройства",
@@ -117,6 +119,7 @@
"home_page_title": "Начало",
"home_search_placeholder": "Търсене на устройства",
"home_wake_group": "Събуждане на група",
"home_shutdown_group": "Изключване на група",
"login_btn_login": "Влизане",
"login_btn_more": "...",
"login_email_label": "Имейл или потребителско име:",

View File

@@ -51,6 +51,8 @@
"device_link": "Odkaz",
"device_modal_confirm_shutdown_desc": "Prosím potvrďte vypnutí zařízení {device}.",
"device_modal_confirm_shutdown_title": "Vypnout {device}?",
"home_modal_confirm_shutdown_group_desc": "Potvrďte vypnutí všech zařízení ve skupině {group}.",
"home_modal_confirm_shutdown_group_title": "Vypnout {group}?",
"device_modal_confirm_wake_desc": "Prosím potvrďte probuzení zařízení {device}.",
"device_modal_confirm_wake_title": "Probudit {device}?",
"device_network_scan_add_all": "Přidat všechna zařízení",
@@ -117,6 +119,7 @@
"home_page_title": "Domů",
"home_search_placeholder": "Vyhledat zařízení",
"home_wake_group": "Skupiny pro probuzení",
"home_shutdown_group": "Skupiny vypnutí",
"login_btn_login": "Přihlásit se",
"login_btn_more": "Více",
"login_email_label": "E-mailová adresa nebo uživatelské jméno:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Bitte bestätigen, um {device} herunterzufahren.",
"device_modal_confirm_shutdown_title": "{device} herunterfahren?",
"home_modal_confirm_shutdown_group_desc": "Bitte bestätigen, um alle Geräte in {group} herunterzufahren.",
"home_modal_confirm_shutdown_group_title": "{group} 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",
@@ -117,6 +119,7 @@
"home_page_title": "Home",
"home_search_placeholder": "Suche nach Geräten",
"home_wake_group": "Gruppe wecken",
"home_shutdown_group": "Gruppe herunterfahren",
"login_btn_login": "Login",
"login_btn_more": "Mehr",
"login_email_label": "Email oder Nutzername:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Please confirm to shutdown {device}.",
"device_modal_confirm_shutdown_title": "Shutdown {device}?",
"home_modal_confirm_shutdown_group_desc": "Please confirm to shutdown all devices in {group}.",
"home_modal_confirm_shutdown_group_title": "Shutdown {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Home",
"home_search_placeholder": "Search for devices",
"home_wake_group": "Wake group",
"home_shutdown_group": "Shutdown group",
"login_btn_login": "Login",
"login_btn_more": "More",
"login_email_label": "Email or Username:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Por favor confirme para apagar {device}.",
"device_modal_confirm_shutdown_title": "{device} apagar?",
"home_modal_confirm_shutdown_group_desc": "Por favor confirme para apagar todos los dispositivos en {group}.",
"home_modal_confirm_shutdown_group_title": "Apagar {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Inicio",
"home_search_placeholder": "Buscar dispositivos",
"home_wake_group": "Grupo Wake",
"home_shutdown_group": "Grupo apagar",
"login_btn_login": "Entrar",
"login_btn_more": "Más",
"login_email_label": "Email o Nombre de usuario:",

View File

@@ -51,6 +51,8 @@
"device_link": "Lien",
"device_modal_confirm_shutdown_desc": "Veuillez confirmer l'arrêt de {device}.",
"device_modal_confirm_shutdown_title": "Arrêter {device} ?",
"home_modal_confirm_shutdown_group_desc": "Veuillez confirmer l'arrêt de tous les appareils dans {group}.",
"home_modal_confirm_shutdown_group_title": "Arrêter {group} ?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Accueil",
"home_search_placeholder": "Recherche de dispositifs",
"home_wake_group": "Groupe de réveil",
"home_shutdown_group": "Groupe éteindre",
"login_btn_login": "Connexion",
"login_btn_more": "Plus",
"login_email_label": "Courriel ou nom d'utilisateur :",

View File

@@ -51,6 +51,10 @@
"device_link": "लिंक",
"device_modal_confirm_shutdown_desc": "कृपया {device} को बंद करने की पुष्टि करें।",
"device_modal_confirm_shutdown_title": "{device} को बंद करें?",
"home_modal_confirm_shutdown_group_desc": "कृपया {group} में सभी उपकरणों को बंद करने की पुष्टि करें।",
"home_modal_confirm_shutdown_group_title": "{group} को बंद करें?",
"home_modal_confirm_shutdown_group_desc": "कृपया {group} में सभी उपकरणों को बंद करने की पुष्टि करें।",
"home_modal_confirm_shutdown_group_title": "{group} को बंद करें?",
"device_modal_confirm_wake_desc": "कृपया {device} को जगाने की पुष्टि करें।",
"device_modal_confirm_wake_title": "{device} को जगाएँ?",
"device_network_scan_add_all": "सभी डिवाइस जोड़ें",
@@ -117,6 +121,7 @@
"home_page_title": "होम",
"home_search_placeholder": "डिवाइस खोजें",
"home_wake_group": "समूह जगाएँ",
"home_shutdown_group": "समूह बंद करें",
"login_btn_login": "लॉगिन",
"login_btn_more": "अधिक",
"login_email_label": "ईमेल या उपयोगकर्ता नाम:",

View File

@@ -51,6 +51,10 @@
"device_link": "Tautan",
"device_modal_confirm_shutdown_desc": "Harap konfirmasi untuk mematikan {device}.",
"device_modal_confirm_shutdown_title": "Matikan {device}?",
"home_modal_confirm_shutdown_group_desc": "Harap konfirmasi untuk mematikan semua perangkat di {group}.",
"home_modal_confirm_shutdown_group_title": "Matikan {group}?",
"home_modal_confirm_shutdown_group_desc": "Harap konfirmasi untuk mematikan semua perangkat di {group}.",
"home_modal_confirm_shutdown_group_title": "Matikan {group}?",
"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",
@@ -117,6 +121,7 @@
"home_page_title": "Beranda",
"home_search_placeholder": "Mencari perangkat",
"home_wake_group": "Kelompok bangun",
"home_shutdown_group": "Kelompok matikan",
"login_btn_login": "Masuk",
"login_btn_more": "Lainnya",
"login_email_label": "Email atau Nama Pengguna:",

View File

@@ -51,6 +51,8 @@
"device_link": "Collegamento",
"device_modal_confirm_shutdown_desc": "Sicuro di voler spegnere {device}.",
"device_modal_confirm_shutdown_title": "Spegnere {device}?",
"home_modal_confirm_shutdown_group_desc": "Sicuro di voler spegnere tutti i dispositivi in {group}.",
"home_modal_confirm_shutdown_group_title": "Spegnere {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Home",
"home_search_placeholder": "Ricerca di dispositivi",
"home_wake_group": "Gruppo Wake",
"home_shutdown_group": "Gruppo spegni",
"login_btn_login": "Login",
"login_btn_more": "Di più...",
"login_email_label": "Email o nome utente:",

View File

@@ -51,6 +51,8 @@
"device_link": "リンク",
"device_modal_confirm_shutdown_desc": "{device} をシャットダウンすることを確認してください。",
"device_modal_confirm_shutdown_title": "{device} をシャットダウンしますか?",
"home_modal_confirm_shutdown_group_desc": "{group} のすべてのデバイスをシャットダウンすることを確認してください。",
"home_modal_confirm_shutdown_group_title": "{group} をシャットダウンしますか?",
"device_modal_confirm_wake_desc": "{device} を起動することを確認してください。",
"device_modal_confirm_wake_title": "{device} を起動しますか?",
"device_network_scan_add_all": "すべてのデバイスを追加",
@@ -117,6 +119,7 @@
"home_page_title": "ホーム",
"home_search_placeholder": "デバイスの検索",
"home_wake_group": "ウェークグループ",
"home_shutdown_group": "グループ終了",
"login_btn_login": "ログイン",
"login_btn_more": "詳細",
"login_email_label": "メールアドレスまたはユーザー名:",

View File

@@ -51,6 +51,8 @@
"device_link": "링크",
"device_modal_confirm_shutdown_desc": "정말 {device}를 종료할까요?",
"device_modal_confirm_shutdown_title": "{device}를 종료할까요?",
"home_modal_confirm_shutdown_group_desc": "{group}의 모든 장치 종료를 확인하세요.",
"home_modal_confirm_shutdown_group_title": "{group} 종료?",
"device_modal_confirm_wake_desc": "{device}를 시작하시려면 예를 눌러주세요.",
"device_modal_confirm_wake_title": "{device}를 시작할까요?",
"device_network_scan_add_all": "모든 기기 추가하기",
@@ -117,6 +119,7 @@
"home_page_title": "홈",
"home_search_placeholder": "기기 검색",
"home_wake_group": "깨우기 그룹",
"home_shutdown_group": "그룹 종료",
"login_btn_login": "로그인",
"login_btn_more": "더보기",
"login_email_label": "이메일 또는 사용자명",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Bekreft å slå av {device}.",
"device_modal_confirm_shutdown_title": "Slå av {device}?",
"home_modal_confirm_shutdown_group_desc": "Bekreft å slå av alle enheter i {group}.",
"home_modal_confirm_shutdown_group_title": "Slå av {group}?",
"device_modal_confirm_wake_desc": "Vennligst bekreft for å vekke {device}.",
"device_modal_confirm_wake_title": "Vekk {device}?",
"device_network_scan_add_all": "Legg til alle enheter",
@@ -117,6 +119,7 @@
"home_page_title": "Hjem",
"home_search_placeholder": "Søk etter enheter",
"home_wake_group": "Vekkegruppe",
"home_shutdown_group": "Slå av gruppe",
"login_btn_login": "Logg inn",
"login_btn_more": "Mer",
"login_email_label": "E-post eller brukernavn:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Bevestig om {device} af te sluiten.",
"device_modal_confirm_shutdown_title": "Afsluiten {device}?",
"home_modal_confirm_shutdown_group_desc": "Bevestig om alle apparaten in {group} af te sluiten.",
"home_modal_confirm_shutdown_group_title": "Afsluiten {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Home",
"home_search_placeholder": "Apparaten zoeken",
"home_wake_group": "Wake groep",
"home_shutdown_group": "Groep afsluiten",
"login_btn_login": "Inloggen",
"login_btn_more": "Meer",
"login_email_label": "E-mail of gebruikersnaam:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Potwierdź wyłączenie {device}.",
"device_modal_confirm_shutdown_title": "Wyłączyć {device}?",
"home_modal_confirm_shutdown_group_desc": "Potwierdź wyłączenie wszystkich urządzeń w {group}.",
"home_modal_confirm_shutdown_group_title": "Wyłączyć {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Strona Główna",
"home_search_placeholder": "Wyszukiwanie urządzeń",
"home_wake_group": "Grupa Wake",
"home_shutdown_group": "Grupa zamknięcia",
"login_btn_login": "Zaloguj",
"login_btn_more": "Więcej",
"login_email_label": "Email lub nazwa użytkownika:",

View File

@@ -51,6 +51,8 @@
"device_link": "Link",
"device_modal_confirm_shutdown_desc": "Confirme o encerramento do {device}.",
"device_modal_confirm_shutdown_title": "Desligar {device}?",
"home_modal_confirm_shutdown_group_desc": "Confirme o encerramento de todos os dispositivos em {group}.",
"home_modal_confirm_shutdown_group_title": "Desligar {group}?",
"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",
@@ -117,6 +119,7 @@
"home_page_title": "Início",
"home_search_placeholder": "Procurar dispositivos",
"home_wake_group": "Grupo de despertar",
"home_shutdown_group": "Grupo desligar",
"login_btn_login": "Entrar",
"login_btn_more": "Mais",
"login_email_label": "Email ou Utilizador:",

View File

@@ -51,6 +51,8 @@
"device_link": "Ссылка",
"device_modal_confirm_shutdown_desc": "Пожалуйста подтвердите для выключения {device}.",
"device_modal_confirm_shutdown_title": "Выключить {device}?",
"home_modal_confirm_shutdown_group_desc": "Пожалуйста, подтвердите выключение всех устройств в {group}.",
"home_modal_confirm_shutdown_group_title": "Выключить {group}?",
"device_modal_confirm_wake_desc": "Пожалуйста подтвердите для пробуждения {device}.",
"device_modal_confirm_wake_title": "Пробудить {device}?",
"device_network_scan_add_all": "Добавить все устройства",
@@ -117,6 +119,7 @@
"home_page_title": "Home",
"home_search_placeholder": "Поиск устройств",
"home_wake_group": "Группа пробуждения",
"home_shutdown_group": "Группа выключения",
"login_btn_login": "Войти",
"login_btn_more": "Больше",
"login_email_label": "Email или имя пользователя:",

View File

@@ -51,6 +51,8 @@
"device_link": "Посилання",
"device_modal_confirm_shutdown_desc": "Підтвердьте, щоб вимкнути {device}.",
"device_modal_confirm_shutdown_title": "Вимкнути {device}?",
"home_modal_confirm_shutdown_group_desc": "Будь ласка, підтвердіть вимкнення всіх пристроїв у {group}.",
"home_modal_confirm_shutdown_group_title": "Вимкнути {group}?",
"device_modal_confirm_wake_desc": "Будь ласка, підтвердьте, щоб розбудити {device}.",
"device_modal_confirm_wake_title": "Розбудити {device}?",
"device_network_scan_add_all": "Додайте всі пристрої",
@@ -117,6 +119,7 @@
"home_page_title": "Головна",
"home_search_placeholder": "Пошук пристроїв",
"home_wake_group": "Пробудження групи",
"home_shutdown_group": "Вимкнення групи",
"login_btn_login": "Увійти",
"login_btn_more": "Додатково",
"login_email_label": "Електронна пошта або ім'я користувача:",

View File

@@ -51,6 +51,8 @@
"device_link": "Liên kết",
"device_modal_confirm_shutdown_desc": "Vui lòng xác nhận tắt {device}.",
"device_modal_confirm_shutdown_title": "Tắt {device}?",
"home_modal_confirm_shutdown_group_desc": "Vui lòng xác nhận tắt tất cả thiết bị trong {group}.",
"home_modal_confirm_shutdown_group_title": "Tắt {group}?",
"device_modal_confirm_wake_desc": "Vui lòng xác nhận bật {device}.",
"device_modal_confirm_wake_title": "Bật {device}?",
"device_network_scan_add_all": "Thêm tất cả thiết bị",
@@ -117,6 +119,7 @@
"home_page_title": "Trang chủ",
"home_search_placeholder": "Tìm kiếm thiết bị",
"home_wake_group": "Bật nhóm",
"home_shutdown_group": "Tắt nhóm",
"login_btn_login": "Đăng nhập",
"login_btn_more": "Thêm",
"login_email_label": "Email hoặc Tên đăng nhập:",

View File

@@ -51,6 +51,8 @@
"device_link": "链接",
"device_modal_confirm_shutdown_desc": "您确定要关闭 {device} 吗?",
"device_modal_confirm_shutdown_title": "关闭 {device}?",
"home_modal_confirm_shutdown_group_desc": "请确认关闭 {group} 中的所有设备。",
"home_modal_confirm_shutdown_group_title": "关闭 {group}?",
"device_modal_confirm_wake_desc": "您确定要唤醒 {device} 吗?",
"device_modal_confirm_wake_title": "唤醒 {device}?",
"device_network_scan_add_all": "添加全部设备",
@@ -117,6 +119,7 @@
"home_page_title": "首页",
"home_search_placeholder": "搜索设备",
"home_wake_group": "唤醒小组",
"home_shutdown_group": "关闭小组",
"login_btn_login": "登录",
"login_btn_more": "更多",
"login_email_label": "邮箱/用户名:",

View File

@@ -51,6 +51,8 @@
"device_link": "連結",
"device_modal_confirm_shutdown_desc": "您確定要關閉 {device} 嗎?",
"device_modal_confirm_shutdown_title": "關閉 {device}?",
"home_modal_confirm_shutdown_group_desc": "請確認關閉 {group} 中的所有裝置。",
"home_modal_confirm_shutdown_group_title": "關閉 {group}?",
"device_modal_confirm_wake_desc": "您確定要喚醒 {device} 嗎?",
"device_modal_confirm_wake_title": "喚醒 {device}?",
"device_network_scan_add_all": "新增全部裝置",
@@ -117,6 +119,7 @@
"home_page_title": "首頁",
"home_search_placeholder": "搜尋裝置",
"home_wake_group": "群組喚醒",
"home_shutdown_group": "關閉群組",
"login_btn_login": "登入",
"login_btn_more": "更多",
"login_email_label": "電子郵件/使用者名稱:",