diff --git a/frontend/src/lib/i18n/de-DE/index.ts b/frontend/src/lib/i18n/de-DE/index.ts index 2dabe542..82fb8636 100644 --- a/frontend/src/lib/i18n/de-DE/index.ts +++ b/frontend/src/lib/i18n/de-DE/index.ts @@ -2,7 +2,7 @@ import en_US from '../en-US'; import type { Translation } from '../i18n-types'; const de_DE = { - ...(en_US as Translation), + ...(en_US as unknown as Translation), home: { order_groups: 'Gruppen', order_name: 'Name', @@ -24,15 +24,97 @@ const de_DE = { 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', - toast_admin_saved: 'Admin gespeichert', - toast_user_saved: 'Benutzer gespeichert', - toast_password_changed: 'Passwort geändert. Bitte neu einloggen.', - toast_passwords_missmatch: 'Passwörter stimmen nicht überein' + change_password_confirm: 'Password bestätigen' + }, + device: { + page_title: 'Neues Gerät', + tabs: ['Manuell', 'Netzwerkscan'] + }, + 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: { + settings_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 @every 3s zu verwenden.', + ping_interval_desc2: + 'Lerne mehr über die korrekte Cron Syntax auf Wikipedia oder sieh dir die Paketdokumentation 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' + }, + 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', - change: 'Ändern' + delete: 'Löschen', + change: 'Ändern', + reset: 'Zurücksetzen', + cancle: 'Abbrechen', + add: 'Hinzufügen' + }, + 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', + no_permission: 'Du hast keine Berechtigung für {url}' } } satisfies Translation; diff --git a/frontend/src/lib/i18n/en-US/index.ts b/frontend/src/lib/i18n/en-US/index.ts index bdbc3269..33c129c2 100644 --- a/frontend/src/lib/i18n/en-US/index.ts +++ b/frontend/src/lib/i18n/en-US/index.ts @@ -22,15 +22,95 @@ const en_US = { 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', - toast_admin_saved: 'Admin saved', - toast_user_saved: 'User saved', - toast_password_changed: 'Password changed. Please login again.', - toast_passwords_missmatch: "Passwords don't match" + change_password_confirm: 'Confirm password' + }, + device: { + page_title: 'New device', + tabs: ['Manual', 'Network Scan'] + }, + 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: { + settings_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 @every 3s.', + ping_interval_desc2: + 'Learn more about the correct syntax for cron on Wikipedia or refer to the package documentation.', + 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' + }, + 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', - change: 'Change' + delete: 'Delete', + change: 'Change', + reset: 'Reset', + cancle: 'Cancle', + add: 'Add' + }, + 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', + no_permission: "You don't have permission to visit {url}" } } satisfies BaseTranslation; diff --git a/frontend/src/lib/i18n/i18n-types.ts b/frontend/src/lib/i18n/i18n-types.ts index b21e6c23..a8d737c3 100644 --- a/frontend/src/lib/i18n/i18n-types.ts +++ b/frontend/src/lib/i18n/i18n-types.ts @@ -1,6 +1,6 @@ // This file was auto-generated by 'typesafe-i18n'. Any manual changes will be overwritten. /* eslint-disable */ -import type { BaseTranslation as BaseTranslationType, LocalizedString } from 'typesafe-i18n' +import type { BaseTranslation as BaseTranslationType, LocalizedString, RequiredParams } from 'typesafe-i18n' export type BaseTranslation = BaseTranslationType export type BaseLocale = 'en-US' @@ -89,32 +89,318 @@ type RootTranslation = { * Confirm password */ change_password_confirm: string + } + device: { /** - * Admin saved + * New device */ - toast_admin_saved: string + page_title: string + tabs: { + /** + * Manual + */ + '0': string + /** + * Network Scan + */ + '1': string + } + } + login: { /** - * User saved + * Welcome */ - toast_user_saved: string + welcome: string /** - * Password changed. Please login again. + * Email or Username: */ - toast_password_changed: string + email_label: string /** - * Passwords don't match + * Password: */ - toast_passwords_missmatch: string + password_label: string + /** + * More + */ + btn_more: string + /** + * Other Auth Providers + */ + menu_title_auth_providers: string + /** + * Login + */ + btn_login: string + } + settings: { + /** + * Settings + */ + settings_title: string + /** + * Ping interval + */ + ping_interval_title: string + /** + * Sets the interval in which the devices are pinged. Leave blank to use default value of <span class="badge">@every 3s</span>. + */ + ping_interval_desc1: string + /** + * 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://pkg.go.dev/github.com/robfig/cron/v3" target="_blank">package documentation</a>. + */ + ping_interval_desc2: string + /** + * Lazy ping + */ + lazy_ping_title: string + /** + * 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_desc: string + /** + * Enable + */ + lazy_ping_enable: string + /** + * Website title + */ + website_title_title: string + /** + * Sets the title of the website and in the browser tab. + */ + website_title_desc: string + /** + * Icon + */ + icon_title: string + /** + * Set a custom favicon. Supported file types are: + */ + icon_desc: string + /** + * UpSnap version + */ + upsnap_version: string + } + users: { + /** + * Users + */ + page_title: string + /** + * Allow {username} to create new devices and edit device groups + * @param {unknown} username + */ + allow_create_devices: RequiredParams<'username'> + /** + * Device permissions + */ + device_permissions: string + /** + * Create new device + */ + create_new_device: string + /** + * Read + */ + read: string + /** + * Update + */ + update: string + /** + * Delete + */ + 'delete': string + /** + * Power + */ + power: string + /** + * Toggle + */ + toggle: string + /** + * Confirm delete + */ + confirm_delete_title: string + /** + * Are you sure you want to delete {username}? + * @param {unknown} username + */ + confirm_delete_desc: RequiredParams<'username'> + /** + * Create new user + */ + create_new_user: string + /** + * Username + */ + username: string + /** + * Password + */ + password: string + /** + * Password confirm + */ + password_confirm: string + /** + * required field + */ + required_field: string } buttons: { /** * Save */ save: string + /** + * Delete + */ + 'delete': string /** * Change */ change: string + /** + * Reset + */ + reset: string + /** + * Cancle + */ + cancle: string + /** + * Add + */ + add: string + } + welcome: { + /** + * Welcome to UpSnap �� + */ + step1_page_title: string + /** + * Please complete the following steps to finish the setup. + */ + step1_setup_desc: string + /** + * Next + */ + step1_setup_btn_next: string + /** + * Create an admin account + */ + step2_page_title: string + /** + * Email: + */ + step2_label_email: string + /** + * Password: + */ + step2_label_password: string + /** + * min. 10 characters + */ + step2_label_min_chars: string + /** + * Password confirm: + */ + step2_label_password_confirm: string + /** + * Create + */ + step2_btn_create: string + /** + * You are all set! �� + */ + step3_page_title: string + /** + * Go ahead and add some devices to your dashboard. + */ + step3_page_desc: string + /** + * Lets go! + */ + step3_btn_done: string + /** + * I didn't expect you here! �� + */ + not_expected_title: string + /** + * You are already done with the setup! Nothing to do. + */ + not_expected_desc: string + /** + * Take me back + */ + not_expected_back: string + /** + * Welcome + */ + progress_step1: string + /** + * Create account + */ + progress_step2: string + /** + * Done + */ + progress_step3: string + } + toasts: { + /** + * Admin saved + */ + admin_saved: string + /** + * User saved + */ + user_saved: string + /** + * User {username} created + * @param {unknown} username + */ + user_created: RequiredParams<'username'> + /** + * User {username} deleted + * @param {unknown} username + */ + user_deleted: RequiredParams<'username'> + /** + * Saved settings + */ + settings_saved: string + /** + * Password changed. Please login again. + */ + password_changed: string + /** + * Passwords don't match + */ + passwords_missmatch: string + /** + * Permissions for {username} created + * @param {unknown} username + */ + permissions_created: RequiredParams<'username'> + /** + * Permissions for {username} deleted + * @param {unknown} username + */ + permissions_deleted: RequiredParams<'username'> + /** + * Permissions for {username} updated + * @param {unknown} username + */ + permissions_updated: RequiredParams<'username'> + /** + * You don't have permission to visit {url} + * @param {unknown} url + */ + no_permission: RequiredParams<'url'> } } @@ -194,32 +480,310 @@ export type TranslationFunctions = { * Confirm password */ change_password_confirm: () => LocalizedString + } + device: { /** - * Admin saved + * New device */ - toast_admin_saved: () => LocalizedString + page_title: () => LocalizedString + tabs: { + /** + * Manual + */ + '0': () => LocalizedString + /** + * Network Scan + */ + '1': () => LocalizedString + } + } + login: { /** - * User saved + * Welcome */ - toast_user_saved: () => LocalizedString + welcome: () => LocalizedString /** - * Password changed. Please login again. + * Email or Username: */ - toast_password_changed: () => LocalizedString + email_label: () => LocalizedString /** - * Passwords don't match + * Password: */ - toast_passwords_missmatch: () => LocalizedString + password_label: () => LocalizedString + /** + * More + */ + btn_more: () => LocalizedString + /** + * Other Auth Providers + */ + menu_title_auth_providers: () => LocalizedString + /** + * Login + */ + btn_login: () => LocalizedString + } + settings: { + /** + * Settings + */ + settings_title: () => LocalizedString + /** + * Ping interval + */ + ping_interval_title: () => LocalizedString + /** + * Sets the interval in which the devices are pinged. Leave blank to use default value of @every 3s. + */ + ping_interval_desc1: () => LocalizedString + /** + * Learn more about the correct syntax for cron on Wikipedia or refer to the package documentation. + */ + ping_interval_desc2: () => LocalizedString + /** + * Lazy ping + */ + lazy_ping_title: () => LocalizedString + /** + * 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_desc: () => LocalizedString + /** + * Enable + */ + lazy_ping_enable: () => LocalizedString + /** + * Website title + */ + website_title_title: () => LocalizedString + /** + * Sets the title of the website and in the browser tab. + */ + website_title_desc: () => LocalizedString + /** + * Icon + */ + icon_title: () => LocalizedString + /** + * Set a custom favicon. Supported file types are: + */ + icon_desc: () => LocalizedString + /** + * UpSnap version + */ + upsnap_version: () => LocalizedString + } + users: { + /** + * Users + */ + page_title: () => LocalizedString + /** + * Allow {username} to create new devices and edit device groups + */ + allow_create_devices: (arg: { username: unknown }) => LocalizedString + /** + * Device permissions + */ + device_permissions: () => LocalizedString + /** + * Create new device + */ + create_new_device: () => LocalizedString + /** + * Read + */ + read: () => LocalizedString + /** + * Update + */ + update: () => LocalizedString + /** + * Delete + */ + 'delete': () => LocalizedString + /** + * Power + */ + power: () => LocalizedString + /** + * Toggle + */ + toggle: () => LocalizedString + /** + * Confirm delete + */ + confirm_delete_title: () => LocalizedString + /** + * Are you sure you want to delete {username}? + */ + confirm_delete_desc: (arg: { username: unknown }) => LocalizedString + /** + * Create new user + */ + create_new_user: () => LocalizedString + /** + * Username + */ + username: () => LocalizedString + /** + * Password + */ + password: () => LocalizedString + /** + * Password confirm + */ + password_confirm: () => LocalizedString + /** + * required field + */ + required_field: () => LocalizedString } buttons: { /** * Save */ save: () => LocalizedString + /** + * Delete + */ + 'delete': () => LocalizedString /** * Change */ change: () => LocalizedString + /** + * Reset + */ + reset: () => LocalizedString + /** + * Cancle + */ + cancle: () => LocalizedString + /** + * Add + */ + add: () => LocalizedString + } + welcome: { + /** + * Welcome to UpSnap 🥳 + */ + step1_page_title: () => LocalizedString + /** + * Please complete the following steps to finish the setup. + */ + step1_setup_desc: () => LocalizedString + /** + * Next + */ + step1_setup_btn_next: () => LocalizedString + /** + * Create an admin account + */ + step2_page_title: () => LocalizedString + /** + * Email: + */ + step2_label_email: () => LocalizedString + /** + * Password: + */ + step2_label_password: () => LocalizedString + /** + * min. 10 characters + */ + step2_label_min_chars: () => LocalizedString + /** + * Password confirm: + */ + step2_label_password_confirm: () => LocalizedString + /** + * Create + */ + step2_btn_create: () => LocalizedString + /** + * You are all set! 🎉 + */ + step3_page_title: () => LocalizedString + /** + * Go ahead and add some devices to your dashboard. + */ + step3_page_desc: () => LocalizedString + /** + * Lets go! + */ + step3_btn_done: () => LocalizedString + /** + * I didn't expect you here! 🧐 + */ + not_expected_title: () => LocalizedString + /** + * You are already done with the setup! Nothing to do. + */ + not_expected_desc: () => LocalizedString + /** + * Take me back + */ + not_expected_back: () => LocalizedString + /** + * Welcome + */ + progress_step1: () => LocalizedString + /** + * Create account + */ + progress_step2: () => LocalizedString + /** + * Done + */ + progress_step3: () => LocalizedString + } + toasts: { + /** + * Admin saved + */ + admin_saved: () => LocalizedString + /** + * User saved + */ + user_saved: () => LocalizedString + /** + * User {username} created + */ + user_created: (arg: { username: unknown }) => LocalizedString + /** + * User {username} deleted + */ + user_deleted: (arg: { username: unknown }) => LocalizedString + /** + * Saved settings + */ + settings_saved: () => LocalizedString + /** + * Password changed. Please login again. + */ + password_changed: () => LocalizedString + /** + * Passwords don't match + */ + passwords_missmatch: () => LocalizedString + /** + * Permissions for {username} created + */ + permissions_created: (arg: { username: unknown }) => LocalizedString + /** + * Permissions for {username} deleted + */ + permissions_deleted: (arg: { username: unknown }) => LocalizedString + /** + * Permissions for {username} updated + */ + permissions_updated: (arg: { username: unknown }) => LocalizedString + /** + * You don't have permission to visit {url} + */ + no_permission: (arg: { url: unknown }) => LocalizedString } } diff --git a/frontend/src/routes/account/+page.svelte b/frontend/src/routes/account/+page.svelte index 82670411..c7210e92 100644 --- a/frontend/src/routes/account/+page.svelte +++ b/frontend/src/routes/account/+page.svelte @@ -58,7 +58,7 @@ $pocketbase.admins .update($pocketbase.authStore.model.id, { avatar: newAvatar }) .then(() => { - toast.success($LL.account.toast_admin_saved()); + toast.success($LL.toasts.admin_saved()); }) .catch((err) => { toast.error(err.message); @@ -69,7 +69,7 @@ .collection('users') .update($pocketbase.authStore.model.id, { avatar: newAvatar }) .then(() => { - toast.success($LL.account.toast_user_saved()); + toast.success($LL.toasts.user_saved()); }) .catch((err) => { toast.error(err.message); @@ -93,7 +93,7 @@ ) .then(async (data) => { if (data.ok) { - toast.success($LL.account.toast_password_changed()); + toast.success($LL.toasts.password_changed()); $pocketbase.authStore.clear(); goto('/login'); } else { @@ -101,7 +101,7 @@ if (j?.data?.password?.message) { toast.error(j?.data?.password?.message); } else if (j?.data?.passwordConfirm?.message) { - toast.error($LL.account.toast_passwords_missmatch()); + toast.error($LL.toasts.passwords_missmatch()); } else if (j.data?.oldPassword?.message) { toast.error(j.data.oldPassword.message); } else { diff --git a/frontend/src/routes/device/[id]/+page.svelte b/frontend/src/routes/device/[id]/+page.svelte index 5b99700f..d3a4805f 100644 --- a/frontend/src/routes/device/[id]/+page.svelte +++ b/frontend/src/routes/device/[id]/+page.svelte @@ -3,13 +3,14 @@ import { page } from '$app/stores'; import DeviceForm from '$lib/components/DeviceForm.svelte'; import PageLoading from '$lib/components/PageLoading.svelte'; + import LL from '$lib/i18n/i18n-svelte'; import { permission, pocketbase } from '$lib/stores/pocketbase'; import type { Device, Port } from '$lib/types/device'; import toast from 'svelte-french-toast'; $: if (Object.hasOwn($permission, 'update')) { if (!$pocketbase.authStore.isAdmin && !$permission.update.includes($page.params.id)) { - toast(`You don't have permission to visit ${$page.url.pathname}`, { + toast($LL.toasts.no_permission({ url: $page.url.pathname }), { icon: '⛔' }); goto('/'); diff --git a/frontend/src/routes/device/new/+page.svelte b/frontend/src/routes/device/new/+page.svelte index d22a2608..1415b20d 100644 --- a/frontend/src/routes/device/new/+page.svelte +++ b/frontend/src/routes/device/new/+page.svelte @@ -3,6 +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 { permission, pocketbase } from '$lib/stores/pocketbase'; import type { Device, Port } from '$lib/types/device'; import { faBinoculars, faWrench } from '@fortawesome/free-solid-svg-icons'; @@ -18,7 +19,7 @@ $: if (Object.hasOwn($permission, 'create')) { if (!$pocketbase.authStore.isAdmin && !$permission.create) { - toast(`You don't have permission to visit ${$page.url.pathname}`, { + toast($LL.toasts.no_permission({ url: $page.url.pathname }), { icon: '⛔' }); goto('/'); @@ -28,11 +29,13 @@ let tabs = [ { name: 'manual', + ll_name: $LL.device.tabs[0](), icon: faWrench, show: true }, { - name: 'network scan', + name: 'scan', + ll_name: $LL.device.tabs[1](), icon: faBinoculars, show: $pocketbase.authStore.isAdmin } @@ -40,17 +43,14 @@ let activeTab = 'manual'; -