From 6b708106e134d42567a67d7d86fc6258b98922a5 Mon Sep 17 00:00:00 2001 From: Luke Gustafson <88517757+LukeGus@users.noreply.github.com> Date: Sun, 4 Oct 2026 15:11:41 -0500 Subject: [PATCH 1/3] release-2.9.1 (#1557) * fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin: in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR --- RELEASE_NOTES.md | 119 ++--- package-lock.json | 4 +- package.json | 2 +- packages/plugin-sdk/src/backend.ts | 16 +- packages/plugin-sdk/src/frontend.ts | 8 +- packaging/build/after-pack.cjs | 24 +- plugins/acme-ssl/locales/en.json | 3 + .../acme-ssl/locales/translated/af_ZA.json | 3 + .../acme-ssl/locales/translated/ar_SA.json | 3 + .../acme-ssl/locales/translated/bg_BG.json | 3 + .../acme-ssl/locales/translated/bn_BD.json | 3 + .../acme-ssl/locales/translated/ca_ES.json | 3 + .../acme-ssl/locales/translated/cs_CZ.json | 3 + .../acme-ssl/locales/translated/da_DK.json | 3 + .../acme-ssl/locales/translated/de_DE.json | 3 + .../acme-ssl/locales/translated/el_GR.json | 3 + .../acme-ssl/locales/translated/es_ES.json | 3 + .../acme-ssl/locales/translated/fi_FI.json | 3 + .../acme-ssl/locales/translated/fr_FR.json | 3 + .../acme-ssl/locales/translated/he_IL.json | 3 + .../acme-ssl/locales/translated/hi_IN.json | 3 + .../acme-ssl/locales/translated/hu_HU.json | 3 + .../acme-ssl/locales/translated/id_ID.json | 3 + .../acme-ssl/locales/translated/it_IT.json | 3 + .../acme-ssl/locales/translated/ja_JP.json | 3 + .../acme-ssl/locales/translated/ko_KR.json | 3 + .../acme-ssl/locales/translated/nl_NL.json | 3 + .../acme-ssl/locales/translated/no_NO.json | 3 + .../acme-ssl/locales/translated/pl_PL.json | 3 + .../acme-ssl/locales/translated/pt_BR.json | 3 + .../acme-ssl/locales/translated/pt_PT.json | 3 + .../acme-ssl/locales/translated/ro_RO.json | 3 + .../acme-ssl/locales/translated/ru_RU.json | 3 + .../acme-ssl/locales/translated/sr_SP.json | 3 + .../acme-ssl/locales/translated/sv_SE.json | 3 + .../acme-ssl/locales/translated/th_TH.json | 3 + .../acme-ssl/locales/translated/tr_TR.json | 3 + .../acme-ssl/locales/translated/uk_UA.json | 3 + .../acme-ssl/locales/translated/vi_VN.json | 3 + .../acme-ssl/locales/translated/zh_CN.json | 3 + .../acme-ssl/locales/translated/zh_TW.json | 3 + plugins/ai/locales/en.json | 3 + plugins/ai/locales/translated/af_ZA.json | 3 + plugins/ai/locales/translated/ar_SA.json | 3 + plugins/ai/locales/translated/bg_BG.json | 3 + plugins/ai/locales/translated/bn_BD.json | 3 + plugins/ai/locales/translated/ca_ES.json | 3 + plugins/ai/locales/translated/cs_CZ.json | 3 + plugins/ai/locales/translated/da_DK.json | 3 + plugins/ai/locales/translated/de_DE.json | 3 + plugins/ai/locales/translated/el_GR.json | 3 + plugins/ai/locales/translated/es_ES.json | 3 + plugins/ai/locales/translated/fi_FI.json | 3 + plugins/ai/locales/translated/fr_FR.json | 3 + plugins/ai/locales/translated/he_IL.json | 3 + plugins/ai/locales/translated/hi_IN.json | 3 + plugins/ai/locales/translated/hu_HU.json | 3 + plugins/ai/locales/translated/id_ID.json | 3 + plugins/ai/locales/translated/it_IT.json | 3 + plugins/ai/locales/translated/ja_JP.json | 3 + plugins/ai/locales/translated/ko_KR.json | 3 + plugins/ai/locales/translated/nl_NL.json | 3 + plugins/ai/locales/translated/no_NO.json | 3 + plugins/ai/locales/translated/pl_PL.json | 3 + plugins/ai/locales/translated/pt_BR.json | 3 + plugins/ai/locales/translated/pt_PT.json | 3 + plugins/ai/locales/translated/ro_RO.json | 3 + plugins/ai/locales/translated/ru_RU.json | 3 + plugins/ai/locales/translated/sr_SP.json | 3 + plugins/ai/locales/translated/sv_SE.json | 3 + plugins/ai/locales/translated/th_TH.json | 3 + plugins/ai/locales/translated/tr_TR.json | 3 + plugins/ai/locales/translated/uk_UA.json | 3 + plugins/ai/locales/translated/vi_VN.json | 3 + plugins/ai/locales/translated/zh_CN.json | 3 + plugins/ai/locales/translated/zh_TW.json | 3 + plugins/alerts/locales/en.json | 3 + plugins/alerts/locales/translated/af_ZA.json | 3 + plugins/alerts/locales/translated/ar_SA.json | 3 + plugins/alerts/locales/translated/bg_BG.json | 3 + plugins/alerts/locales/translated/bn_BD.json | 3 + plugins/alerts/locales/translated/ca_ES.json | 3 + plugins/alerts/locales/translated/cs_CZ.json | 3 + plugins/alerts/locales/translated/da_DK.json | 3 + plugins/alerts/locales/translated/de_DE.json | 3 + plugins/alerts/locales/translated/el_GR.json | 3 + plugins/alerts/locales/translated/es_ES.json | 3 + plugins/alerts/locales/translated/fi_FI.json | 3 + plugins/alerts/locales/translated/fr_FR.json | 3 + plugins/alerts/locales/translated/he_IL.json | 3 + plugins/alerts/locales/translated/hi_IN.json | 3 + plugins/alerts/locales/translated/hu_HU.json | 3 + plugins/alerts/locales/translated/id_ID.json | 3 + plugins/alerts/locales/translated/it_IT.json | 3 + plugins/alerts/locales/translated/ja_JP.json | 3 + plugins/alerts/locales/translated/ko_KR.json | 3 + plugins/alerts/locales/translated/nl_NL.json | 3 + plugins/alerts/locales/translated/no_NO.json | 3 + plugins/alerts/locales/translated/pl_PL.json | 3 + plugins/alerts/locales/translated/pt_BR.json | 3 + plugins/alerts/locales/translated/pt_PT.json | 3 + plugins/alerts/locales/translated/ro_RO.json | 3 + plugins/alerts/locales/translated/ru_RU.json | 3 + plugins/alerts/locales/translated/sr_SP.json | 3 + plugins/alerts/locales/translated/sv_SE.json | 3 + plugins/alerts/locales/translated/th_TH.json | 3 + plugins/alerts/locales/translated/tr_TR.json | 3 + plugins/alerts/locales/translated/uk_UA.json | 3 + plugins/alerts/locales/translated/vi_VN.json | 3 + plugins/alerts/locales/translated/zh_CN.json | 3 + plugins/alerts/locales/translated/zh_TW.json | 3 + plugins/alerts/src/backend/repository.ts | 4 +- plugins/automations/locales/en.json | 14 + .../automations/locales/translated/af_ZA.json | 14 + .../automations/locales/translated/ar_SA.json | 14 + .../automations/locales/translated/bg_BG.json | 14 + .../automations/locales/translated/bn_BD.json | 14 + .../automations/locales/translated/ca_ES.json | 14 + .../automations/locales/translated/cs_CZ.json | 14 + .../automations/locales/translated/da_DK.json | 14 + .../automations/locales/translated/de_DE.json | 14 + .../automations/locales/translated/el_GR.json | 14 + .../automations/locales/translated/es_ES.json | 14 + .../automations/locales/translated/fi_FI.json | 14 + .../automations/locales/translated/fr_FR.json | 14 + .../automations/locales/translated/he_IL.json | 14 + .../automations/locales/translated/hi_IN.json | 14 + .../automations/locales/translated/hu_HU.json | 14 + .../automations/locales/translated/id_ID.json | 14 + .../automations/locales/translated/it_IT.json | 14 + .../automations/locales/translated/ja_JP.json | 14 + .../automations/locales/translated/ko_KR.json | 14 + .../automations/locales/translated/nl_NL.json | 14 + .../automations/locales/translated/no_NO.json | 14 + .../automations/locales/translated/pl_PL.json | 14 + .../automations/locales/translated/pt_BR.json | 14 + .../automations/locales/translated/pt_PT.json | 14 + .../automations/locales/translated/ro_RO.json | 14 + .../automations/locales/translated/ru_RU.json | 14 + .../automations/locales/translated/sr_SP.json | 14 + .../automations/locales/translated/sv_SE.json | 14 + .../automations/locales/translated/th_TH.json | 14 + .../automations/locales/translated/tr_TR.json | 14 + .../automations/locales/translated/uk_UA.json | 14 + .../automations/locales/translated/vi_VN.json | 14 + .../automations/locales/translated/zh_CN.json | 14 + .../automations/locales/translated/zh_TW.json | 14 + plugins/automations/manifest.json | 1 + plugins/automations/src/backend/repository.ts | 4 +- .../src/frontend/automations/StepBlock.tsx | 8 +- .../src/frontend/automations/TriggerCard.tsx | 16 +- .../tests/backend/maintenance.test.ts | 2 +- .../tests/backend/sudo-capability.test.ts | 17 + plugins/docker/src/backend/connect.ts | 8 +- plugins/docker/src/backend/routes.ts | 12 +- plugins/docker/tests/backend/routes.test.ts | 45 +- plugins/file-manager/locales/en.json | 18 +- .../locales/translated/af_ZA.json | 18 +- .../locales/translated/ar_SA.json | 18 +- .../locales/translated/bg_BG.json | 18 +- .../locales/translated/bn_BD.json | 18 +- .../locales/translated/ca_ES.json | 18 +- .../locales/translated/cs_CZ.json | 18 +- .../locales/translated/da_DK.json | 18 +- .../locales/translated/de_DE.json | 18 +- .../locales/translated/el_GR.json | 18 +- .../locales/translated/es_ES.json | 18 +- .../locales/translated/fi_FI.json | 18 +- .../locales/translated/fr_FR.json | 18 +- .../locales/translated/he_IL.json | 18 +- .../locales/translated/hi_IN.json | 18 +- .../locales/translated/hu_HU.json | 18 +- .../locales/translated/id_ID.json | 18 +- .../locales/translated/it_IT.json | 18 +- .../locales/translated/ja_JP.json | 18 +- .../locales/translated/ko_KR.json | 18 +- .../locales/translated/nl_NL.json | 18 +- .../locales/translated/no_NO.json | 18 +- .../locales/translated/pl_PL.json | 18 +- .../locales/translated/pt_BR.json | 18 +- .../locales/translated/pt_PT.json | 18 +- .../locales/translated/ro_RO.json | 18 +- .../locales/translated/ru_RU.json | 18 +- .../locales/translated/sr_SP.json | 18 +- .../locales/translated/sv_SE.json | 18 +- .../locales/translated/th_TH.json | 18 +- .../locales/translated/tr_TR.json | 18 +- .../locales/translated/uk_UA.json | 18 +- .../locales/translated/vi_VN.json | 18 +- .../locales/translated/zh_CN.json | 18 +- .../locales/translated/zh_TW.json | 18 +- .../src/backend/operation-routes.ts | 22 +- .../file-manager/src/backend/trash-service.ts | 29 +- .../file-manager/src/frontend/FileManager.tsx | 12 +- .../src/frontend/components/DiffViewer.tsx | 3 +- .../components/DownloadProgressToast.tsx | 5 +- .../src/frontend/components/FileViewer.tsx | 46 +- .../src/frontend/components/FileWindow.tsx | 3 +- .../src/frontend/components/ImagePreview.tsx | 4 +- .../components/LocalTransferProgressToast.tsx | 5 +- .../components/TransferProgressToast.tsx | 5 +- .../src/frontend/hooks/useLocalTransfers.ts | 1 + .../src/frontend/transferProgressMonitor.tsx | 6 + .../tests/backend/download-stream.test.ts | 10 +- .../tests/backend/trash-service.test.ts | 95 ++++ .../frontend/progress-toast-context.test.tsx | 54 +++ plugins/fleets/manifest.json | 1 + plugins/fleets/src/backend/routes.ts | 8 +- .../tests/backend/sudo-capability.test.ts | 17 + plugins/homepage/locales/en.json | 137 +++++- .../homepage/locales/translated/af_ZA.json | 137 +++++- .../homepage/locales/translated/ar_SA.json | 137 +++++- .../homepage/locales/translated/bg_BG.json | 137 +++++- .../homepage/locales/translated/bn_BD.json | 137 +++++- .../homepage/locales/translated/ca_ES.json | 137 +++++- .../homepage/locales/translated/cs_CZ.json | 137 +++++- .../homepage/locales/translated/da_DK.json | 137 +++++- .../homepage/locales/translated/de_DE.json | 137 +++++- .../homepage/locales/translated/el_GR.json | 137 +++++- .../homepage/locales/translated/es_ES.json | 137 +++++- .../homepage/locales/translated/fi_FI.json | 137 +++++- .../homepage/locales/translated/fr_FR.json | 137 +++++- .../homepage/locales/translated/he_IL.json | 137 +++++- .../homepage/locales/translated/hi_IN.json | 137 +++++- .../homepage/locales/translated/hu_HU.json | 137 +++++- .../homepage/locales/translated/id_ID.json | 137 +++++- .../homepage/locales/translated/it_IT.json | 137 +++++- .../homepage/locales/translated/ja_JP.json | 137 +++++- .../homepage/locales/translated/ko_KR.json | 137 +++++- .../homepage/locales/translated/nl_NL.json | 137 +++++- .../homepage/locales/translated/no_NO.json | 137 +++++- .../homepage/locales/translated/pl_PL.json | 137 +++++- .../homepage/locales/translated/pt_BR.json | 137 +++++- .../homepage/locales/translated/pt_PT.json | 137 +++++- .../homepage/locales/translated/ro_RO.json | 137 +++++- .../homepage/locales/translated/ru_RU.json | 137 +++++- .../homepage/locales/translated/sr_SP.json | 137 +++++- .../homepage/locales/translated/sv_SE.json | 137 +++++- .../homepage/locales/translated/th_TH.json | 137 +++++- .../homepage/locales/translated/tr_TR.json | 137 +++++- .../homepage/locales/translated/uk_UA.json | 137 +++++- .../homepage/locales/translated/vi_VN.json | 137 +++++- .../homepage/locales/translated/zh_CN.json | 137 +++++- .../homepage/locales/translated/zh_TW.json | 137 +++++- .../src/frontend/dialogs/AddWidgetMenu.tsx | 8 +- .../src/frontend/dialogs/ClockEditForm.tsx | 2 +- .../src/frontend/dialogs/NotesEditForm.tsx | 2 +- .../src/frontend/dialogs/WeatherEditForm.tsx | 2 +- .../src/frontend/widgets/HostGridWidget.tsx | 8 +- .../src/frontend/widgets/HostStatusWidget.tsx | 17 +- .../src/frontend/widgets/NotesWidget.tsx | 6 +- .../src/frontend/widgets/WeatherWidget.tsx | 6 +- .../tests/frontend/ClockTimezone.test.tsx | 4 +- .../frontend/WidgetEditDialogClock.test.tsx | 4 +- plugins/host-metrics/locales/en.json | 3 + .../locales/translated/af_ZA.json | 3 + .../locales/translated/ar_SA.json | 3 + .../locales/translated/bg_BG.json | 3 + .../locales/translated/bn_BD.json | 3 + .../locales/translated/ca_ES.json | 3 + .../locales/translated/cs_CZ.json | 3 + .../locales/translated/da_DK.json | 3 + .../locales/translated/de_DE.json | 3 + .../locales/translated/el_GR.json | 3 + .../locales/translated/es_ES.json | 3 + .../locales/translated/fi_FI.json | 3 + .../locales/translated/fr_FR.json | 3 + .../locales/translated/he_IL.json | 3 + .../locales/translated/hi_IN.json | 3 + .../locales/translated/hu_HU.json | 3 + .../locales/translated/id_ID.json | 3 + .../locales/translated/it_IT.json | 3 + .../locales/translated/ja_JP.json | 3 + .../locales/translated/ko_KR.json | 3 + .../locales/translated/nl_NL.json | 3 + .../locales/translated/no_NO.json | 3 + .../locales/translated/pl_PL.json | 3 + .../locales/translated/pt_BR.json | 3 + .../locales/translated/pt_PT.json | 3 + .../locales/translated/ro_RO.json | 3 + .../locales/translated/ru_RU.json | 3 + .../locales/translated/sr_SP.json | 3 + .../locales/translated/sv_SE.json | 3 + .../locales/translated/th_TH.json | 3 + .../locales/translated/tr_TR.json | 3 + .../locales/translated/uk_UA.json | 3 + .../locales/translated/vi_VN.json | 3 + .../locales/translated/zh_CN.json | 3 + .../locales/translated/zh_TW.json | 3 + plugins/host-metrics/src/backend/index.ts | 16 +- plugins/host-metrics/src/backend/poller.ts | 13 +- .../host-metrics/src/backend/repository.ts | 2 +- plugins/host-metrics/src/backend/state.ts | 5 +- .../tests/backend/activate.test.ts | 22 +- .../host-metrics/tests/backend/poller.test.ts | 16 +- .../host-metrics/tests/backend/state.test.ts | 1 - plugins/ldap/locales/en.json | 10 + plugins/ldap/locales/translated/af_ZA.json | 10 + plugins/ldap/locales/translated/ar_SA.json | 10 + plugins/ldap/locales/translated/bg_BG.json | 10 + plugins/ldap/locales/translated/bn_BD.json | 10 + plugins/ldap/locales/translated/ca_ES.json | 10 + plugins/ldap/locales/translated/cs_CZ.json | 10 + plugins/ldap/locales/translated/da_DK.json | 10 + plugins/ldap/locales/translated/de_DE.json | 10 + plugins/ldap/locales/translated/el_GR.json | 10 + plugins/ldap/locales/translated/es_ES.json | 10 + plugins/ldap/locales/translated/fi_FI.json | 10 + plugins/ldap/locales/translated/fr_FR.json | 10 + plugins/ldap/locales/translated/he_IL.json | 10 + plugins/ldap/locales/translated/hi_IN.json | 10 + plugins/ldap/locales/translated/hu_HU.json | 10 + plugins/ldap/locales/translated/id_ID.json | 10 + plugins/ldap/locales/translated/it_IT.json | 10 + plugins/ldap/locales/translated/ja_JP.json | 10 + plugins/ldap/locales/translated/ko_KR.json | 10 + plugins/ldap/locales/translated/nl_NL.json | 10 + plugins/ldap/locales/translated/no_NO.json | 10 + plugins/ldap/locales/translated/pl_PL.json | 10 + plugins/ldap/locales/translated/pt_BR.json | 10 + plugins/ldap/locales/translated/pt_PT.json | 10 + plugins/ldap/locales/translated/ro_RO.json | 10 + plugins/ldap/locales/translated/ru_RU.json | 10 + plugins/ldap/locales/translated/sr_SP.json | 10 + plugins/ldap/locales/translated/sv_SE.json | 10 + plugins/ldap/locales/translated/th_TH.json | 10 + plugins/ldap/locales/translated/tr_TR.json | 10 + plugins/ldap/locales/translated/uk_UA.json | 10 + plugins/ldap/locales/translated/vi_VN.json | 10 + plugins/ldap/locales/translated/zh_CN.json | 10 + plugins/ldap/locales/translated/zh_TW.json | 10 + .../ldap/src/frontend/ProvidersSetting.tsx | 321 +++++++------- .../src/frontend/NetworkGraphCard.tsx | 4 +- plugins/opkssh/locales/en.json | 3 + plugins/opkssh/locales/translated/af_ZA.json | 3 + plugins/opkssh/locales/translated/ar_SA.json | 3 + plugins/opkssh/locales/translated/bg_BG.json | 3 + plugins/opkssh/locales/translated/bn_BD.json | 3 + plugins/opkssh/locales/translated/ca_ES.json | 3 + plugins/opkssh/locales/translated/cs_CZ.json | 3 + plugins/opkssh/locales/translated/da_DK.json | 3 + plugins/opkssh/locales/translated/de_DE.json | 3 + plugins/opkssh/locales/translated/el_GR.json | 3 + plugins/opkssh/locales/translated/es_ES.json | 3 + plugins/opkssh/locales/translated/fi_FI.json | 3 + plugins/opkssh/locales/translated/fr_FR.json | 3 + plugins/opkssh/locales/translated/he_IL.json | 3 + plugins/opkssh/locales/translated/hi_IN.json | 3 + plugins/opkssh/locales/translated/hu_HU.json | 3 + plugins/opkssh/locales/translated/id_ID.json | 3 + plugins/opkssh/locales/translated/it_IT.json | 3 + plugins/opkssh/locales/translated/ja_JP.json | 3 + plugins/opkssh/locales/translated/ko_KR.json | 3 + plugins/opkssh/locales/translated/nl_NL.json | 3 + plugins/opkssh/locales/translated/no_NO.json | 3 + plugins/opkssh/locales/translated/pl_PL.json | 3 + plugins/opkssh/locales/translated/pt_BR.json | 3 + plugins/opkssh/locales/translated/pt_PT.json | 3 + plugins/opkssh/locales/translated/ro_RO.json | 3 + plugins/opkssh/locales/translated/ru_RU.json | 3 + plugins/opkssh/locales/translated/sr_SP.json | 3 + plugins/opkssh/locales/translated/sv_SE.json | 3 + plugins/opkssh/locales/translated/th_TH.json | 3 + plugins/opkssh/locales/translated/tr_TR.json | 3 + plugins/opkssh/locales/translated/uk_UA.json | 3 + plugins/opkssh/locales/translated/vi_VN.json | 3 + plugins/opkssh/locales/translated/zh_CN.json | 3 + plugins/opkssh/locales/translated/zh_TW.json | 3 + plugins/proxmox/manifest.json | 1 + .../proxmox-node-history-repository.ts | 4 +- plugins/proxmox/src/backend/routes.ts | 8 +- .../tests/backend/sudo-capability.test.ts | 17 + plugins/remote-desktop/locales/en.json | 26 +- .../locales/translated/af_ZA.json | 26 +- .../locales/translated/ar_SA.json | 26 +- .../locales/translated/bg_BG.json | 26 +- .../locales/translated/bn_BD.json | 26 +- .../locales/translated/ca_ES.json | 26 +- .../locales/translated/cs_CZ.json | 26 +- .../locales/translated/da_DK.json | 26 +- .../locales/translated/de_DE.json | 26 +- .../locales/translated/el_GR.json | 26 +- .../locales/translated/es_ES.json | 26 +- .../locales/translated/fi_FI.json | 26 +- .../locales/translated/fr_FR.json | 26 +- .../locales/translated/he_IL.json | 26 +- .../locales/translated/hi_IN.json | 26 +- .../locales/translated/hu_HU.json | 26 +- .../locales/translated/id_ID.json | 26 +- .../locales/translated/it_IT.json | 26 +- .../locales/translated/ja_JP.json | 26 +- .../locales/translated/ko_KR.json | 26 +- .../locales/translated/nl_NL.json | 26 +- .../locales/translated/no_NO.json | 26 +- .../locales/translated/pl_PL.json | 26 +- .../locales/translated/pt_BR.json | 26 +- .../locales/translated/pt_PT.json | 26 +- .../locales/translated/ro_RO.json | 26 +- .../locales/translated/ru_RU.json | 26 +- .../locales/translated/sr_SP.json | 26 +- .../locales/translated/sv_SE.json | 26 +- .../locales/translated/th_TH.json | 26 +- .../locales/translated/tr_TR.json | 26 +- .../locales/translated/uk_UA.json | 26 +- .../locales/translated/vi_VN.json | 26 +- .../locales/translated/zh_CN.json | 26 +- .../locales/translated/zh_TW.json | 26 +- .../src/frontend/GuacamoleDisplay.tsx | 6 +- .../src/frontend/HostEditorGuacamoleTabs.tsx | 102 +++-- .../tests/backend/sessions.test.ts | 20 + plugins/secret-sources/locales/en.json | 3 + .../locales/translated/af_ZA.json | 3 + .../locales/translated/ar_SA.json | 3 + .../locales/translated/bg_BG.json | 3 + .../locales/translated/bn_BD.json | 3 + .../locales/translated/ca_ES.json | 3 + .../locales/translated/cs_CZ.json | 3 + .../locales/translated/da_DK.json | 3 + .../locales/translated/de_DE.json | 3 + .../locales/translated/el_GR.json | 3 + .../locales/translated/es_ES.json | 3 + .../locales/translated/fi_FI.json | 3 + .../locales/translated/fr_FR.json | 3 + .../locales/translated/he_IL.json | 3 + .../locales/translated/hi_IN.json | 3 + .../locales/translated/hu_HU.json | 3 + .../locales/translated/id_ID.json | 3 + .../locales/translated/it_IT.json | 3 + .../locales/translated/ja_JP.json | 3 + .../locales/translated/ko_KR.json | 3 + .../locales/translated/nl_NL.json | 3 + .../locales/translated/no_NO.json | 3 + .../locales/translated/pl_PL.json | 3 + .../locales/translated/pt_BR.json | 3 + .../locales/translated/pt_PT.json | 3 + .../locales/translated/ro_RO.json | 3 + .../locales/translated/ru_RU.json | 3 + .../locales/translated/sr_SP.json | 3 + .../locales/translated/sv_SE.json | 3 + .../locales/translated/th_TH.json | 3 + .../locales/translated/tr_TR.json | 3 + .../locales/translated/uk_UA.json | 3 + .../locales/translated/vi_VN.json | 3 + .../locales/translated/zh_CN.json | 3 + .../locales/translated/zh_TW.json | 3 + plugins/session-recording/locales/en.json | 3 + .../locales/translated/af_ZA.json | 3 + .../locales/translated/ar_SA.json | 3 + .../locales/translated/bg_BG.json | 3 + .../locales/translated/bn_BD.json | 3 + .../locales/translated/ca_ES.json | 3 + .../locales/translated/cs_CZ.json | 3 + .../locales/translated/da_DK.json | 3 + .../locales/translated/de_DE.json | 3 + .../locales/translated/el_GR.json | 3 + .../locales/translated/es_ES.json | 3 + .../locales/translated/fi_FI.json | 3 + .../locales/translated/fr_FR.json | 3 + .../locales/translated/he_IL.json | 3 + .../locales/translated/hi_IN.json | 3 + .../locales/translated/hu_HU.json | 3 + .../locales/translated/id_ID.json | 3 + .../locales/translated/it_IT.json | 3 + .../locales/translated/ja_JP.json | 3 + .../locales/translated/ko_KR.json | 3 + .../locales/translated/nl_NL.json | 3 + .../locales/translated/no_NO.json | 3 + .../locales/translated/pl_PL.json | 3 + .../locales/translated/pt_BR.json | 3 + .../locales/translated/pt_PT.json | 3 + .../locales/translated/ro_RO.json | 3 + .../locales/translated/ru_RU.json | 3 + .../locales/translated/sr_SP.json | 3 + .../locales/translated/sv_SE.json | 3 + .../locales/translated/th_TH.json | 3 + .../locales/translated/tr_TR.json | 3 + .../locales/translated/uk_UA.json | 3 + .../locales/translated/vi_VN.json | 3 + .../locales/translated/zh_CN.json | 3 + .../locales/translated/zh_TW.json | 3 + plugins/session-sharing/locales/en.json | 3 + .../locales/translated/af_ZA.json | 3 + .../locales/translated/ar_SA.json | 3 + .../locales/translated/bg_BG.json | 3 + .../locales/translated/bn_BD.json | 3 + .../locales/translated/ca_ES.json | 3 + .../locales/translated/cs_CZ.json | 3 + .../locales/translated/da_DK.json | 3 + .../locales/translated/de_DE.json | 3 + .../locales/translated/el_GR.json | 3 + .../locales/translated/es_ES.json | 3 + .../locales/translated/fi_FI.json | 3 + .../locales/translated/fr_FR.json | 3 + .../locales/translated/he_IL.json | 3 + .../locales/translated/hi_IN.json | 3 + .../locales/translated/hu_HU.json | 3 + .../locales/translated/id_ID.json | 3 + .../locales/translated/it_IT.json | 3 + .../locales/translated/ja_JP.json | 3 + .../locales/translated/ko_KR.json | 3 + .../locales/translated/nl_NL.json | 3 + .../locales/translated/no_NO.json | 3 + .../locales/translated/pl_PL.json | 3 + .../locales/translated/pt_BR.json | 3 + .../locales/translated/pt_PT.json | 3 + .../locales/translated/ro_RO.json | 3 + .../locales/translated/ru_RU.json | 3 + .../locales/translated/sr_SP.json | 3 + .../locales/translated/sv_SE.json | 3 + .../locales/translated/th_TH.json | 3 + .../locales/translated/tr_TR.json | 3 + .../locales/translated/uk_UA.json | 3 + .../locales/translated/vi_VN.json | 3 + .../locales/translated/zh_CN.json | 3 + .../locales/translated/zh_TW.json | 3 + plugins/snippets/locales/en.json | 5 +- .../snippets/locales/translated/af_ZA.json | 5 +- .../snippets/locales/translated/ar_SA.json | 5 +- .../snippets/locales/translated/bg_BG.json | 5 +- .../snippets/locales/translated/bn_BD.json | 5 +- .../snippets/locales/translated/ca_ES.json | 5 +- .../snippets/locales/translated/cs_CZ.json | 5 +- .../snippets/locales/translated/da_DK.json | 5 +- .../snippets/locales/translated/de_DE.json | 5 +- .../snippets/locales/translated/el_GR.json | 5 +- .../snippets/locales/translated/es_ES.json | 5 +- .../snippets/locales/translated/fi_FI.json | 5 +- .../snippets/locales/translated/fr_FR.json | 5 +- .../snippets/locales/translated/he_IL.json | 5 +- .../snippets/locales/translated/hi_IN.json | 5 +- .../snippets/locales/translated/hu_HU.json | 5 +- .../snippets/locales/translated/id_ID.json | 5 +- .../snippets/locales/translated/it_IT.json | 5 +- .../snippets/locales/translated/ja_JP.json | 5 +- .../snippets/locales/translated/ko_KR.json | 5 +- .../snippets/locales/translated/nl_NL.json | 5 +- .../snippets/locales/translated/no_NO.json | 5 +- .../snippets/locales/translated/pl_PL.json | 5 +- .../snippets/locales/translated/pt_BR.json | 5 +- .../snippets/locales/translated/pt_PT.json | 5 +- .../snippets/locales/translated/ro_RO.json | 5 +- .../snippets/locales/translated/ru_RU.json | 5 +- .../snippets/locales/translated/sr_SP.json | 5 +- .../snippets/locales/translated/sv_SE.json | 5 +- .../snippets/locales/translated/th_TH.json | 5 +- .../snippets/locales/translated/tr_TR.json | 5 +- .../snippets/locales/translated/uk_UA.json | 5 +- .../snippets/locales/translated/vi_VN.json | 5 +- .../snippets/locales/translated/zh_CN.json | 5 +- .../snippets/locales/translated/zh_TW.json | 5 +- plugins/ssh-terminal/locales/en.json | 3 + .../locales/translated/af_ZA.json | 3 + .../locales/translated/ar_SA.json | 3 + .../locales/translated/bg_BG.json | 3 + .../locales/translated/bn_BD.json | 3 + .../locales/translated/ca_ES.json | 3 + .../locales/translated/cs_CZ.json | 3 + .../locales/translated/da_DK.json | 3 + .../locales/translated/de_DE.json | 3 + .../locales/translated/el_GR.json | 3 + .../locales/translated/es_ES.json | 3 + .../locales/translated/fi_FI.json | 3 + .../locales/translated/fr_FR.json | 3 + .../locales/translated/he_IL.json | 3 + .../locales/translated/hi_IN.json | 3 + .../locales/translated/hu_HU.json | 3 + .../locales/translated/id_ID.json | 3 + .../locales/translated/it_IT.json | 3 + .../locales/translated/ja_JP.json | 3 + .../locales/translated/ko_KR.json | 3 + .../locales/translated/nl_NL.json | 3 + .../locales/translated/no_NO.json | 3 + .../locales/translated/pl_PL.json | 3 + .../locales/translated/pt_BR.json | 3 + .../locales/translated/pt_PT.json | 3 + .../locales/translated/ro_RO.json | 3 + .../locales/translated/ru_RU.json | 3 + .../locales/translated/sr_SP.json | 3 + .../locales/translated/sv_SE.json | 3 + .../locales/translated/th_TH.json | 3 + .../locales/translated/tr_TR.json | 3 + .../locales/translated/uk_UA.json | 3 + .../locales/translated/vi_VN.json | 3 + .../locales/translated/zh_CN.json | 3 + .../locales/translated/zh_TW.json | 3 + plugins/ssh-terminal/src/backend/services.ts | 10 +- plugins/sso/locales/en.json | 9 + plugins/sso/locales/translated/af_ZA.json | 9 + plugins/sso/locales/translated/ar_SA.json | 9 + plugins/sso/locales/translated/bg_BG.json | 9 + plugins/sso/locales/translated/bn_BD.json | 9 + plugins/sso/locales/translated/ca_ES.json | 9 + plugins/sso/locales/translated/cs_CZ.json | 9 + plugins/sso/locales/translated/da_DK.json | 9 + plugins/sso/locales/translated/de_DE.json | 9 + plugins/sso/locales/translated/el_GR.json | 9 + plugins/sso/locales/translated/es_ES.json | 9 + plugins/sso/locales/translated/fi_FI.json | 9 + plugins/sso/locales/translated/fr_FR.json | 9 + plugins/sso/locales/translated/he_IL.json | 9 + plugins/sso/locales/translated/hi_IN.json | 9 + plugins/sso/locales/translated/hu_HU.json | 9 + plugins/sso/locales/translated/id_ID.json | 9 + plugins/sso/locales/translated/it_IT.json | 9 + plugins/sso/locales/translated/ja_JP.json | 9 + plugins/sso/locales/translated/ko_KR.json | 9 + plugins/sso/locales/translated/nl_NL.json | 9 + plugins/sso/locales/translated/no_NO.json | 9 + plugins/sso/locales/translated/pl_PL.json | 9 + plugins/sso/locales/translated/pt_BR.json | 9 + plugins/sso/locales/translated/pt_PT.json | 9 + plugins/sso/locales/translated/ro_RO.json | 9 + plugins/sso/locales/translated/ru_RU.json | 9 + plugins/sso/locales/translated/sr_SP.json | 9 + plugins/sso/locales/translated/sv_SE.json | 9 + plugins/sso/locales/translated/th_TH.json | 9 + plugins/sso/locales/translated/tr_TR.json | 9 + plugins/sso/locales/translated/uk_UA.json | 9 + plugins/sso/locales/translated/vi_VN.json | 9 + plugins/sso/locales/translated/zh_CN.json | 9 + plugins/sso/locales/translated/zh_TW.json | 9 + plugins/sso/src/backend/login.ts | 7 +- plugins/sso/src/frontend/ProvidersSetting.tsx | 408 +++++++++--------- plugins/sso/tests/backend/sso.test.ts | 14 + plugins/step-ca/locales/en.json | 3 + plugins/step-ca/locales/translated/af_ZA.json | 3 + plugins/step-ca/locales/translated/ar_SA.json | 3 + plugins/step-ca/locales/translated/bg_BG.json | 3 + plugins/step-ca/locales/translated/bn_BD.json | 3 + plugins/step-ca/locales/translated/ca_ES.json | 3 + plugins/step-ca/locales/translated/cs_CZ.json | 3 + plugins/step-ca/locales/translated/da_DK.json | 3 + plugins/step-ca/locales/translated/de_DE.json | 3 + plugins/step-ca/locales/translated/el_GR.json | 3 + plugins/step-ca/locales/translated/es_ES.json | 3 + plugins/step-ca/locales/translated/fi_FI.json | 3 + plugins/step-ca/locales/translated/fr_FR.json | 3 + plugins/step-ca/locales/translated/he_IL.json | 3 + plugins/step-ca/locales/translated/hi_IN.json | 3 + plugins/step-ca/locales/translated/hu_HU.json | 3 + plugins/step-ca/locales/translated/id_ID.json | 3 + plugins/step-ca/locales/translated/it_IT.json | 3 + plugins/step-ca/locales/translated/ja_JP.json | 3 + plugins/step-ca/locales/translated/ko_KR.json | 3 + plugins/step-ca/locales/translated/nl_NL.json | 3 + plugins/step-ca/locales/translated/no_NO.json | 3 + plugins/step-ca/locales/translated/pl_PL.json | 3 + plugins/step-ca/locales/translated/pt_BR.json | 3 + plugins/step-ca/locales/translated/pt_PT.json | 3 + plugins/step-ca/locales/translated/ro_RO.json | 3 + plugins/step-ca/locales/translated/ru_RU.json | 3 + plugins/step-ca/locales/translated/sr_SP.json | 3 + plugins/step-ca/locales/translated/sv_SE.json | 3 + plugins/step-ca/locales/translated/th_TH.json | 3 + plugins/step-ca/locales/translated/tr_TR.json | 3 + plugins/step-ca/locales/translated/uk_UA.json | 3 + plugins/step-ca/locales/translated/vi_VN.json | 3 + plugins/step-ca/locales/translated/zh_CN.json | 3 + plugins/step-ca/locales/translated/zh_TW.json | 3 + plugins/tailscale/locales/en.json | 3 + .../tailscale/locales/translated/af_ZA.json | 3 + .../tailscale/locales/translated/ar_SA.json | 3 + .../tailscale/locales/translated/bg_BG.json | 3 + .../tailscale/locales/translated/bn_BD.json | 3 + .../tailscale/locales/translated/ca_ES.json | 3 + .../tailscale/locales/translated/cs_CZ.json | 3 + .../tailscale/locales/translated/da_DK.json | 3 + .../tailscale/locales/translated/de_DE.json | 3 + .../tailscale/locales/translated/el_GR.json | 3 + .../tailscale/locales/translated/es_ES.json | 3 + .../tailscale/locales/translated/fi_FI.json | 3 + .../tailscale/locales/translated/fr_FR.json | 3 + .../tailscale/locales/translated/he_IL.json | 3 + .../tailscale/locales/translated/hi_IN.json | 3 + .../tailscale/locales/translated/hu_HU.json | 3 + .../tailscale/locales/translated/id_ID.json | 3 + .../tailscale/locales/translated/it_IT.json | 3 + .../tailscale/locales/translated/ja_JP.json | 3 + .../tailscale/locales/translated/ko_KR.json | 3 + .../tailscale/locales/translated/nl_NL.json | 3 + .../tailscale/locales/translated/no_NO.json | 3 + .../tailscale/locales/translated/pl_PL.json | 3 + .../tailscale/locales/translated/pt_BR.json | 3 + .../tailscale/locales/translated/pt_PT.json | 3 + .../tailscale/locales/translated/ro_RO.json | 3 + .../tailscale/locales/translated/ru_RU.json | 3 + .../tailscale/locales/translated/sr_SP.json | 3 + .../tailscale/locales/translated/sv_SE.json | 3 + .../tailscale/locales/translated/th_TH.json | 3 + .../tailscale/locales/translated/tr_TR.json | 3 + .../tailscale/locales/translated/uk_UA.json | 3 + .../tailscale/locales/translated/vi_VN.json | 3 + .../tailscale/locales/translated/zh_CN.json | 3 + .../tailscale/locales/translated/zh_TW.json | 3 + plugins/telemetry/locales/en.json | 3 + .../telemetry/locales/translated/af_ZA.json | 3 + .../telemetry/locales/translated/ar_SA.json | 3 + .../telemetry/locales/translated/bg_BG.json | 3 + .../telemetry/locales/translated/bn_BD.json | 3 + .../telemetry/locales/translated/ca_ES.json | 3 + .../telemetry/locales/translated/cs_CZ.json | 3 + .../telemetry/locales/translated/da_DK.json | 3 + .../telemetry/locales/translated/de_DE.json | 3 + .../telemetry/locales/translated/el_GR.json | 3 + .../telemetry/locales/translated/es_ES.json | 3 + .../telemetry/locales/translated/fi_FI.json | 3 + .../telemetry/locales/translated/fr_FR.json | 3 + .../telemetry/locales/translated/he_IL.json | 3 + .../telemetry/locales/translated/hi_IN.json | 3 + .../telemetry/locales/translated/hu_HU.json | 3 + .../telemetry/locales/translated/id_ID.json | 3 + .../telemetry/locales/translated/it_IT.json | 3 + .../telemetry/locales/translated/ja_JP.json | 3 + .../telemetry/locales/translated/ko_KR.json | 3 + .../telemetry/locales/translated/nl_NL.json | 3 + .../telemetry/locales/translated/no_NO.json | 3 + .../telemetry/locales/translated/pl_PL.json | 3 + .../telemetry/locales/translated/pt_BR.json | 3 + .../telemetry/locales/translated/pt_PT.json | 3 + .../telemetry/locales/translated/ro_RO.json | 3 + .../telemetry/locales/translated/ru_RU.json | 3 + .../telemetry/locales/translated/sr_SP.json | 3 + .../telemetry/locales/translated/sv_SE.json | 3 + .../telemetry/locales/translated/th_TH.json | 3 + .../telemetry/locales/translated/tr_TR.json | 3 + .../telemetry/locales/translated/uk_UA.json | 3 + .../telemetry/locales/translated/vi_VN.json | 3 + .../telemetry/locales/translated/zh_CN.json | 3 + .../telemetry/locales/translated/zh_TW.json | 3 + plugins/tmux-monitor/src/backend/service.ts | 14 +- .../tests/backend/service.test.ts | 21 +- plugins/vault/locales/en.json | 3 + plugins/vault/locales/translated/af_ZA.json | 3 + plugins/vault/locales/translated/ar_SA.json | 3 + plugins/vault/locales/translated/bg_BG.json | 3 + plugins/vault/locales/translated/bn_BD.json | 3 + plugins/vault/locales/translated/ca_ES.json | 3 + plugins/vault/locales/translated/cs_CZ.json | 3 + plugins/vault/locales/translated/da_DK.json | 3 + plugins/vault/locales/translated/de_DE.json | 3 + plugins/vault/locales/translated/el_GR.json | 3 + plugins/vault/locales/translated/es_ES.json | 3 + plugins/vault/locales/translated/fi_FI.json | 3 + plugins/vault/locales/translated/fr_FR.json | 3 + plugins/vault/locales/translated/he_IL.json | 3 + plugins/vault/locales/translated/hi_IN.json | 3 + plugins/vault/locales/translated/hu_HU.json | 3 + plugins/vault/locales/translated/id_ID.json | 3 + plugins/vault/locales/translated/it_IT.json | 3 + plugins/vault/locales/translated/ja_JP.json | 3 + plugins/vault/locales/translated/ko_KR.json | 3 + plugins/vault/locales/translated/nl_NL.json | 3 + plugins/vault/locales/translated/no_NO.json | 3 + plugins/vault/locales/translated/pl_PL.json | 3 + plugins/vault/locales/translated/pt_BR.json | 3 + plugins/vault/locales/translated/pt_PT.json | 3 + plugins/vault/locales/translated/ro_RO.json | 3 + plugins/vault/locales/translated/ru_RU.json | 3 + plugins/vault/locales/translated/sr_SP.json | 3 + plugins/vault/locales/translated/sv_SE.json | 3 + plugins/vault/locales/translated/th_TH.json | 3 + plugins/vault/locales/translated/tr_TR.json | 3 + plugins/vault/locales/translated/uk_UA.json | 3 + plugins/vault/locales/translated/vi_VN.json | 3 + plugins/vault/locales/translated/zh_CN.json | 3 + plugins/vault/locales/translated/zh_TW.json | 3 + src/backend/auth/provisioning.ts | 19 + src/backend/database/database.ts | 22 +- src/backend/database/db/index.ts | 2 + src/backend/database/repositories/factory.ts | 4 + .../repositories/session-repository.ts | 4 +- .../routes/credential-deploy-routes.ts | 18 +- .../database/routes/credential-key-routes.ts | 22 +- src/backend/database/routes/credentials.ts | 34 +- .../database/routes/host-bulk-routes.ts | 29 +- .../database/routes/host-status-routes.ts | 2 +- .../database/routes/host-tag-routes.ts | 122 ++++++ src/backend/database/routes/host.ts | 15 +- src/backend/database/routes/rbac.ts | 4 - .../routes/user-external-account-routes.ts | 50 ++- src/backend/hosts/defaults/index.ts | 19 + src/backend/hosts/defaults/materialize.ts | 149 +++---- src/backend/hosts/host-key-verifier.ts | 33 +- src/backend/hosts/host-resolver.ts | 4 + src/backend/hosts/host-session-status.ts | 4 + .../hosts/status/host-status-service.ts | 190 ++++---- src/backend/hosts/status/host-status.ts | 18 +- src/backend/hosts/status/jump-probe-pool.ts | 99 +++++ src/backend/hosts/status/tcp-ping.ts | 43 +- src/backend/hosts/stored-ssh-key.ts | 43 ++ src/backend/plugins/ctx-ssh-auth.ts | 91 ++-- src/backend/plugins/ctx.ts | 8 +- src/backend/plugins/http.ts | 2 +- src/backend/plugins/permissions.ts | 2 +- src/backend/plugins/user-data.ts | 69 ++- src/backend/plugins/ws.ts | 2 +- src/backend/sync/entities.ts | 8 +- src/backend/sync/host-plugin-settings.ts | 37 +- src/backend/sync/host-protocol-auth.ts | 42 ++ src/backend/tests/auth/login-pipeline.test.ts | 83 ++++ .../repositories/audit-log-repository.test.ts | 28 ++ .../repositories/factory-context.test.ts | 35 +- .../user-session-repositories.test.ts | 48 ++- .../credentials-secret-reference.test.ts | 193 +++++++++ .../host-import-terminal-settings.test.ts | 5 + .../routes/host-status-routes.test.ts | 2 +- .../database/routes/host-tag-routes.test.ts | 82 ++++ .../user-external-account-routes.test.ts | 59 +++ src/backend/tests/electron/after-pack.test.ts | 33 +- .../tests/hosts/host-key-recovery.test.ts | 44 ++ src/backend/tests/hosts/host-resolver.test.ts | 10 + .../tests/hosts/host-session-status.test.ts | 3 + .../hosts/status/host-status-service.test.ts | 110 +++-- .../tests/hosts/status/host-status.test.ts | 27 +- .../hosts/status/jump-probe-pool.test.ts | 127 ++++++ .../tests/hosts/stored-ssh-key.test.ts | 43 ++ src/backend/tests/plugins/ctx-audit.test.ts | 3 +- src/backend/tests/plugins/ctx-hosts.test.ts | 12 +- .../tests/plugins/ctx-ssh-auth.test.ts | 65 ++- src/backend/tests/plugins/user-data.test.ts | 26 ++ .../tests/sync/host-plugin-settings.test.ts | 44 ++ .../tests/sync/host-protocol-auth.test.ts | 68 +++ src/backend/tests/sync/two-way.test.ts | 1 + .../external-identity-migration.test.ts | 16 + .../upgrade/snippets-schema-migration.test.ts | 57 +++ .../sso-legacy-identity-migration.test.ts | 200 +++++++++ .../tests/utils/database-save-trigger.test.ts | 116 +++++ src/backend/upgrade/boot-migrations.ts | 29 +- .../upgrade/external-identity-migration.ts | 10 +- .../upgrade/snippets-schema-migration.ts | 19 + .../upgrade/sso-legacy-identity-migration.ts | 160 +++++++ src/backend/utils/audit-logger.ts | 4 +- src/backend/utils/database-save-trigger.ts | 65 ++- src/backend/utils/swagger.ts | 21 + src/types/ui-types.ts | 2 +- src/ui/api/host-status-api.ts | 45 +- src/ui/api/host-tags-api.ts | 9 + src/ui/api/ssh-host-management-api.ts | 36 +- src/ui/auth/Auth.tsx | 34 +- src/ui/components/dialog.tsx | 9 +- src/ui/components/select2.tsx | 2 +- src/ui/components/sheet.tsx | 5 +- src/ui/components/sidebar.tsx | 16 +- src/ui/dashboard/DashboardTab.tsx | 34 +- src/ui/hooks/use-status-color-scheme.ts | 10 +- src/ui/lib/ServerStatusContext.tsx | 274 ++++-------- src/ui/lib/server-status-store.ts | 99 +---- src/ui/locales/en.json | 33 +- src/ui/locales/translated/af_ZA.json | 33 +- src/ui/locales/translated/ar_SA.json | 33 +- src/ui/locales/translated/bg_BG.json | 33 +- src/ui/locales/translated/bn_BD.json | 33 +- src/ui/locales/translated/ca_ES.json | 33 +- src/ui/locales/translated/cs_CZ.json | 33 +- src/ui/locales/translated/da_DK.json | 33 +- src/ui/locales/translated/de_DE.json | 33 +- src/ui/locales/translated/el_GR.json | 33 +- src/ui/locales/translated/es_ES.json | 33 +- src/ui/locales/translated/fi_FI.json | 33 +- src/ui/locales/translated/fr_FR.json | 33 +- src/ui/locales/translated/he_IL.json | 33 +- src/ui/locales/translated/hi_IN.json | 33 +- src/ui/locales/translated/hu_HU.json | 33 +- src/ui/locales/translated/id_ID.json | 33 +- src/ui/locales/translated/it_IT.json | 33 +- src/ui/locales/translated/ja_JP.json | 33 +- src/ui/locales/translated/ko_KR.json | 33 +- src/ui/locales/translated/nl_NL.json | 33 +- src/ui/locales/translated/no_NO.json | 33 +- src/ui/locales/translated/pl_PL.json | 33 +- src/ui/locales/translated/pt_BR.json | 33 +- src/ui/locales/translated/pt_PT.json | 33 +- src/ui/locales/translated/ro_RO.json | 33 +- src/ui/locales/translated/ru_RU.json | 33 +- src/ui/locales/translated/sr_SP.json | 33 +- src/ui/locales/translated/sv_SE.json | 33 +- src/ui/locales/translated/th_TH.json | 33 +- src/ui/locales/translated/tr_TR.json | 33 +- src/ui/locales/translated/uk_UA.json | 33 +- src/ui/locales/translated/vi_VN.json | 33 +- src/ui/locales/translated/zh_CN.json | 33 +- src/ui/locales/translated/zh_TW.json | 33 +- src/ui/main-axios.ts | 5 +- src/ui/plugin-host/bridge.ts | 22 +- src/ui/plugin-host/loader.ts | 7 +- src/ui/settings/FeatureSettingsSections.tsx | 11 +- src/ui/shell/CommandPalette.tsx | 10 +- src/ui/sidebar/AdminApiKeysSection.tsx | 2 +- src/ui/sidebar/AdminHostTags.tsx | 99 +++++ src/ui/sidebar/AdminSettingsPanel.tsx | 2 +- src/ui/sidebar/AdminSettingsSections.tsx | 4 + src/ui/sidebar/CredentialEditorView.tsx | 6 +- src/ui/sidebar/HostEditor.tsx | 2 +- src/ui/sidebar/HostEditorGeneralTab.tsx | 62 ++- src/ui/sidebar/HostManagerTabs.tsx | 82 +++- src/ui/sidebar/HostsPanel.tsx | 19 +- src/ui/sidebar/live-host-status.ts | 36 ++ src/ui/sidebar/tree/FolderItem/FolderItem.tsx | 31 +- src/ui/sidebar/tree/HostItem/HostItem.tsx | 162 +++---- src/ui/sidebar/tree/SidebarTree.tsx | 3 +- src/ui/tests/api/host-status-api.test.ts | 17 +- src/ui/tests/auth/AuthLoginMethods.test.tsx | 25 ++ .../hooks/use-status-color-scheme.test.ts | 6 +- src/ui/tests/lib/server-status-store.test.ts | 48 +-- src/ui/tests/plugin-host/loader.test.tsx | 14 + .../settings/FeatureSettingsSections.test.tsx | 27 +- src/ui/tests/sidebar/AdminHostTags.test.tsx | 44 ++ .../sidebar/AdminUserManagePanel.test.tsx | 17 +- src/ui/tests/sidebar/live-host-status.test.ts | 41 ++ .../tests/sidebar/tab-strip-scroll.test.tsx | 70 +++ .../sidebar/tree/HostItem/HostItem.test.tsx | 3 +- .../tree/HostItem/host-status-tooltip.test.ts | 18 +- 912 files changed, 14220 insertions(+), 2200 deletions(-) create mode 100644 plugins/automations/tests/backend/sudo-capability.test.ts create mode 100644 plugins/file-manager/tests/backend/trash-service.test.ts create mode 100644 plugins/file-manager/tests/frontend/progress-toast-context.test.tsx create mode 100644 plugins/fleets/tests/backend/sudo-capability.test.ts create mode 100644 plugins/proxmox/tests/backend/sudo-capability.test.ts create mode 100644 src/backend/database/routes/host-tag-routes.ts create mode 100644 src/backend/hosts/status/jump-probe-pool.ts create mode 100644 src/backend/hosts/stored-ssh-key.ts create mode 100644 src/backend/tests/database/routes/credentials-secret-reference.test.ts create mode 100644 src/backend/tests/database/routes/host-tag-routes.test.ts create mode 100644 src/backend/tests/hosts/status/jump-probe-pool.test.ts create mode 100644 src/backend/tests/hosts/stored-ssh-key.test.ts create mode 100644 src/backend/tests/upgrade/snippets-schema-migration.test.ts create mode 100644 src/backend/tests/upgrade/sso-legacy-identity-migration.test.ts create mode 100644 src/backend/upgrade/snippets-schema-migration.ts create mode 100644 src/backend/upgrade/sso-legacy-identity-migration.ts create mode 100644 src/ui/api/host-tags-api.ts create mode 100644 src/ui/sidebar/AdminHostTags.tsx create mode 100644 src/ui/sidebar/live-host-status.ts create mode 100644 src/ui/tests/sidebar/AdminHostTags.test.tsx create mode 100644 src/ui/tests/sidebar/live-host-status.test.ts create mode 100644 src/ui/tests/sidebar/tab-strip-scroll.test.tsx diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ddec3063a..3bdca37e2 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,6 +1,6 @@ -A new plugin system powering every feature, a dedicated sync page with more control over what syncs, one inbox for all alerts, a redesigned split screen, admin, user and folder host defaults, host maintenance mode, and a large batch of file manager, terminal, and remote desktop fixes. +A patch for 2.9.0 that fixes OIDC sign-in after upgrading, Docker and Host Metrics logins, memory and CPU use, file downloads, tmux sessions, user data export and more. Also adds predefined host tags. @@ -12,90 +12,47 @@ https://youtu.be/lngaePO96tM -- Rebuilt Termix around a plugin system, with features like the terminal, file manager, tunnels, Docker, Proxmox, remote desktop, metrics, automations, AI and every login method now shipped as signed plugins on a shared SDK -- Moved desktop sync to its own page in the sidebar, with options to choose what syncs, keep single hosts or folders on the device only, and resolve conflicts -- Added a recent servers list when linking the desktop app -- Combined all alerts into one inbox with popups, Termix announcements and a new email channel -- Redesigned split screen with free-form panes and a pane picker -- Redesigned host defaults so they can be set at the admin, user or folder level and are inherited by hosts unless overridden -- Added per-host maintenance mode and recurring schedules to automations -- Added optional auto reconnect for dropped SSH sessions and a button to reconnect all disconnected terminal tabs -- Added a duplicate tab action and a reconnect session keybinding -- Added a host click setting to either focus an existing tab or always open a new one -- Added keyboard type-ahead search to the host list -- Added tighter compact host rows with inline tags -- Added an option to show tab numbers -- Added an option to hide folder paths above nested folders -- Added a list of the fixed app shortcuts to the keyboard shortcuts screen -- Added terminal toolbar position, start state and fade settings per host -- Added a host setting to turn off password prompt auto-fill -- Added the option to apply a saved custom theme in connection defaults -- Added FortiToken push 2FA support for SSH -- Added a unified multi-host tmux monitor view and a per-host tmux mouse toggle -- Added fleet sharing -- Added a list view to Docker management and support for the OrbStack Docker socket on macOS -- Added network graph sync between the desktop app and the server -- Added homepage canvas layout sync across devices -- Added RDP display zoom controls -- Added an option to skip the move to trash confirmation in the file manager -- Made the file manager open in the remote login directory by default -- Added add host and copy IP actions for Tailscale devices -- Added inline credential sharing in the sidebar, matching host sharing -- Made the Windows desktop shortcut optional in the installer -- Redesigned the snippets panel to match the host list -- Redesigned the session log player controls -- Host status now shows online once the port answers and only warns when a login fails -- Faster SFTP downloads -- Faster UI loading with less jitter and lag across tabs, the dashboard and the network graph +- Added predefined host tags that admins can set, with suggestions in the host editor +- Kept compact host row actions on the same line as the host name +- Added a reload button when a sign-in verification method fails to load +- Admins can now merge a duplicate SSO account made by 2.9.0 back into the original account +- Hosts behind the same jump hosts now share one connection for status checks +- Simplified host status to just online or offline, removing the "last login failed" state +- Host status now updates every 15 seconds without a page refresh, and status checks run every 30 seconds by default +- Completed the Simplified Chinese translation +- Documented cookie and API key sign-in in the API docs -- TOTP not being prompted for jump hosts in the terminal, file manager, metrics and client tunnels -- SSH host names resolving to IPv6 when IPv4 was available -- Host key updates not syncing between devices -- Host metrics returning 404 on the first connect -- Host metrics using too much CPU on the backend -- Host metrics showing image and firmware filesystems -- Sudo password not auto-filling -- Tunnels failing with shared credentials -- Imported jump host references breaking -- Hard to read terminal selection with the light theme -- Terminal input arriving out of order with local echo on -- Terminal image uploads failing when the image library was unavailable -- File manager saves failing or corrupting files, with no sudo prompt on protected files -- Sending a single file between servers failing -- Disk usage showing the wrong mount or not refreshing with the directory -- File uploads not cancelling and continuing to write on the server -- Ctrl/Cmd+F file search not working in the file manager -- File drops from the OS not working over existing rows -- No download progress in file viewers -- Text in Markdown previews not being selectable -- Inline rename, compact mode and narrow list layout issues in the file manager -- Remote desktop not using the host's saved guacd endpoint -- Remote desktop asking for clipboard access unprompted -- Remote desktop keys staying held after switching windows -- Session share links on desktop pointing at the local app instead of the server -- Shared terminal sizes and participant presence not syncing in session sharing -- Meeting guests not being shown to members, and guests seeing the full roster -- Session sharing not handing over cleanly after a takeover -- AI responses getting cut off mid stream -- AI provider settings not syncing to linked devices -- Proxmox guest sync and startup snippet sync not working -- LDAP logins losing the bind DN from the directory -- Homepage service checks failing for allowed private addresses -- Sidebar search showing overlapping hosts when grouped by tags -- Sidebar rows not resizing after changing density, and compact rows hiding host addresses -- Split screen layouts failing to create over plain HTTP -- Double Shift opening the command palette by accident -- Fleet detail buttons overflowing the sidebar -- Recent activity cutting off host names too early -- Docker container logs using the wrong background color -- Version number missing on desktop when the server was offline -- Desktop app not starting reliably, not quitting with active connections, and the Linux tray icon failing to load -- Mac App Store builds being blocked by the single instance lock -- Untranslated text in toasts and other parts of the UI -- Several dependency security advisories +- OIDC accounts from 2.8 not being able to sign in, or getting a new empty account, after upgrading +- Downloading a file in the file manager turning the whole screen black +- tmux sessions not resuming and new sessions being created instead +- Connections through two or more jump hosts failing +- Docker and Host Metrics failing to sign in while the terminal worked +- Fleets, Proxmox and automations not getting the host sudo password +- Server running out of memory on start and when importing hosts +- High CPU use after the app was first opened +- User data export freezing the server +- 1Password and other secret references being rejected as SSH keys +- Slow file deletes in the file manager +- Mac App Store app failing to start its local server +- Snippets failing to sync on older databases +- GitHub sign in failing +- RDP showing scrollbars and jittering near the edges +- Status checks triggering Fail2Ban bans while a session was open +- Too many database writes from session activity +- Host editor tabs being hidden when they did not fit +- SSH host keys being accepted without a check when the host was missing from the database +- Host status only updating after a full page refresh +- Every host showing offline right after signing in +- Host status flipping between online and offline on refresh or after one dropped packet +- Hosts showing "last login failed" when they connected fine +- Hosts behind a jump host staying offline after the jump connection dropped +- Host status being wiped in the desktop app when the host list failed to load +- Tunnels, remote desktop logins and other host settings missing from shared hosts in the desktop app +- SSO and LDAP provider dialogs overflowing the screen and using mismatched toggles +- Plugin audit log entries failing to save when no user was signed in diff --git a/package-lock.json b/package-lock.json index e6f1bb7f1..1b10f371c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "termix", - "version": "2.9.0", + "version": "2.9.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "termix", - "version": "2.9.0", + "version": "2.9.1", "hasInstallScript": true, "workspaces": [ "packages/*", diff --git a/package.json b/package.json index 4544a4f90..b032869af 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "packages/*", "plugins/*" ], - "version": "2.9.0", + "version": "2.9.1", "description": "Self-hosted SSH and remote desktop management.", "author": "Karmaa", "main": "electron/main.cjs", diff --git a/packages/plugin-sdk/src/backend.ts b/packages/plugin-sdk/src/backend.ts index d012d966b..660bad272 100644 --- a/packages/plugin-sdk/src/backend.ts +++ b/packages/plugin-sdk/src/backend.ts @@ -840,19 +840,24 @@ export interface PluginHosts { status: PluginHostStatusApi; } -/** online: a login worked. reachable: the port answers. offline: it does not. */ +/** + * online: the port answers, a session is open or a login worked. offline: the + * port does not answer. "reachable" is no longer sent and stays only so older + * plugins still type check. + */ export type PluginHostStatus = "online" | "reachable" | "offline"; export interface PluginHostStatusEntry { status: PluginHostStatus; lastChecked: string; + /** @deprecated No longer sent. */ reason?: "host_key_changed"; } /** * Core checks every host with status checks on by opening a TCP connection to - * it. A plugin that logs in to hosts tells core how that went, which is what - * turns "reachable" into "online". + * it. A plugin that logs in to hosts can report a working login, which marks + * the host online right away. */ export interface PluginHostStatusApi { /** @@ -862,7 +867,10 @@ export interface PluginHostStatusApi { get: (hostId: number) => Promise; /** Checks the host now unless core checked it recently. */ check: (hostId: number) => Promise; - /** Reports a login attempt. Not audited: pollers call it every sample. */ + /** + * Reports a login attempt. Only a working login changes the status; a + * failed one is ignored. Not audited: pollers call it every sample. + */ reportLogin: ( hostId: number, outcome: { ok: boolean; hostKeyChanged?: boolean }, diff --git a/packages/plugin-sdk/src/frontend.ts b/packages/plugin-sdk/src/frontend.ts index fa92480aa..109373cac 100644 --- a/packages/plugin-sdk/src/frontend.ts +++ b/packages/plugin-sdk/src/frontend.ts @@ -76,7 +76,7 @@ export interface PluginHostRecord { quickConnectSavable?: boolean; /** Assigned when a host is opened in a tab; tells duplicate tabs apart. */ instanceId?: string; - /** Core's status: "online" once a login worked. */ + /** Core's status: "online" when the host answers. */ status?: "online" | "reachable" | "offline" | "unknown"; online?: boolean; /** Someone else owns this host and shared it with the user. */ @@ -1134,11 +1134,13 @@ export interface ActivityTargetInfo { } /** - * Core's status for a host, the one behind the host list's dot. online: a - * login worked. reachable: the port answers. unknown: not checked yet. + * Core's status for a host, the one behind the host list's dot. online: the + * port answers. offline: it does not. unknown: not checked yet. "reachable" + * is no longer sent and stays only so older plugins still type check. */ export interface HostStatusInfo { status: "online" | "reachable" | "offline" | "unknown"; + /** @deprecated No longer sent. */ reason?: "host_key_changed"; } diff --git a/packaging/build/after-pack.cjs b/packaging/build/after-pack.cjs index 170731252..869b04c35 100644 --- a/packaging/build/after-pack.cjs +++ b/packaging/build/after-pack.cjs @@ -30,6 +30,20 @@ function copyPluginSdk(resourcesDir, sdkDir = path.join(repoRoot, "packages", "p exports.copyPluginSdk = copyPluginSdk; +/** Mac App Store builds report "mas", not "darwin", but are still .app bundles. */ +function resourcesDirFor({ electronPlatformName, appOutDir, packager }) { + return ["darwin", "mas"].includes(electronPlatformName) + ? path.join( + appOutDir, + `${packager.appInfo.productFilename}.app`, + "Contents", + "Resources", + ) + : path.join(appOutDir, "resources"); +} + +exports.resourcesDirFor = resourcesDirFor; + exports.default = async function afterPack(context) { const { targets, appOutDir } = context; @@ -39,15 +53,7 @@ exports.default = async function afterPack(context) { fs.writeFileSync(markerPath, ""); } - const resourcesDir = - context.electronPlatformName === "darwin" - ? path.join( - appOutDir, - `${context.packager.appInfo.productFilename}.app`, - "Contents", - "Resources", - ) - : path.join(appOutDir, "resources"); + const resourcesDir = resourcesDirFor(context); copyPluginSdk(resourcesDir); diff --git a/plugins/acme-ssl/locales/en.json b/plugins/acme-ssl/locales/en.json index 5c0aaa55b..cc7e8300a 100644 --- a/plugins/acme-ssl/locales/en.json +++ b/plugins/acme-ssl/locales/en.json @@ -54,5 +54,8 @@ "request": "Request certificate now", "requesting": "Requesting certificate...", "issued": "Certificate issued and installed" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/af_ZA.json b/plugins/acme-ssl/locales/translated/af_ZA.json index 771b7deee..eb23329c7 100644 --- a/plugins/acme-ssl/locales/translated/af_ZA.json +++ b/plugins/acme-ssl/locales/translated/af_ZA.json @@ -54,5 +54,8 @@ "request": "Versoek nou 'n sertifikaat", "requesting": "Versoek sertifikaat...", "issued": "Sertifikaat uitgereik en geïnstalleer" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ar_SA.json b/plugins/acme-ssl/locales/translated/ar_SA.json index 7b6e732e6..d66dc72e2 100644 --- a/plugins/acme-ssl/locales/translated/ar_SA.json +++ b/plugins/acme-ssl/locales/translated/ar_SA.json @@ -54,5 +54,8 @@ "request": "اطلب الشهادة الآن", "requesting": "جارٍ طلب الشهادة...", "issued": "تم إصدار الشهادة وتركيبها" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/bg_BG.json b/plugins/acme-ssl/locales/translated/bg_BG.json index 28007ffb7..d327bfcb4 100644 --- a/plugins/acme-ssl/locales/translated/bg_BG.json +++ b/plugins/acme-ssl/locales/translated/bg_BG.json @@ -54,5 +54,8 @@ "request": "Заявете сертификат сега", "requesting": "Заявка за сертификат...", "issued": "Сертификат издаден и инсталиран" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/bn_BD.json b/plugins/acme-ssl/locales/translated/bn_BD.json index 4b056c0c9..5bf348b83 100644 --- a/plugins/acme-ssl/locales/translated/bn_BD.json +++ b/plugins/acme-ssl/locales/translated/bn_BD.json @@ -54,5 +54,8 @@ "request": "এখনই সার্টিফিকেটের জন্য অনুরোধ করুন", "requesting": "সার্টিফিকেটের জন্য অনুরোধ...", "issued": "সার্টিফিকেট ইস্যু এবং ইনস্টল করা হয়েছে" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ca_ES.json b/plugins/acme-ssl/locales/translated/ca_ES.json index 691ee75e8..3c15830af 100644 --- a/plugins/acme-ssl/locales/translated/ca_ES.json +++ b/plugins/acme-ssl/locales/translated/ca_ES.json @@ -54,5 +54,8 @@ "request": "Sol·licita el certificat ara", "requesting": "Sol·licitant certificat...", "issued": "Certificat emès i instal·lat" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/cs_CZ.json b/plugins/acme-ssl/locales/translated/cs_CZ.json index 16487134c..b55e1f14e 100644 --- a/plugins/acme-ssl/locales/translated/cs_CZ.json +++ b/plugins/acme-ssl/locales/translated/cs_CZ.json @@ -54,5 +54,8 @@ "request": "Vyžádejte si certifikát nyní", "requesting": "Žádost o certifikát...", "issued": "Certifikát vydán a nainstalován" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/da_DK.json b/plugins/acme-ssl/locales/translated/da_DK.json index e3b371479..258e1ac89 100644 --- a/plugins/acme-ssl/locales/translated/da_DK.json +++ b/plugins/acme-ssl/locales/translated/da_DK.json @@ -54,5 +54,8 @@ "request": "Anmod om certifikat nu", "requesting": "Anmoder om certifikat...", "issued": "Certifikat udstedt og installeret" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/de_DE.json b/plugins/acme-ssl/locales/translated/de_DE.json index cececddff..6ecadc449 100644 --- a/plugins/acme-ssl/locales/translated/de_DE.json +++ b/plugins/acme-ssl/locales/translated/de_DE.json @@ -54,5 +54,8 @@ "request": "Zertifikat jetzt anfordern", "requesting": "Zertifikat wird angefordert...", "issued": "Zertifikat ausgestellt und installiert" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/el_GR.json b/plugins/acme-ssl/locales/translated/el_GR.json index 0f29bcca3..265c46201 100644 --- a/plugins/acme-ssl/locales/translated/el_GR.json +++ b/plugins/acme-ssl/locales/translated/el_GR.json @@ -54,5 +54,8 @@ "request": "Ζητήστε πιστοποιητικό τώρα", "requesting": "Αίτημα πιστοποιητικού...", "issued": "Έκδοση και εγκατάσταση πιστοποιητικού" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/es_ES.json b/plugins/acme-ssl/locales/translated/es_ES.json index 16a863d76..eda5c2f95 100644 --- a/plugins/acme-ssl/locales/translated/es_ES.json +++ b/plugins/acme-ssl/locales/translated/es_ES.json @@ -54,5 +54,8 @@ "request": "Solicita tu certificado ahora", "requesting": "Solicitando certificado...", "issued": "Certificado emitido e instalado" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/fi_FI.json b/plugins/acme-ssl/locales/translated/fi_FI.json index 4fa05bdaa..e21cd61f2 100644 --- a/plugins/acme-ssl/locales/translated/fi_FI.json +++ b/plugins/acme-ssl/locales/translated/fi_FI.json @@ -54,5 +54,8 @@ "request": "Pyydä todistus nyt", "requesting": "Pyydetään varmennetta...", "issued": "Sertifikaatti myönnetty ja asennettu" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/fr_FR.json b/plugins/acme-ssl/locales/translated/fr_FR.json index b54c8552a..864abbd3f 100644 --- a/plugins/acme-ssl/locales/translated/fr_FR.json +++ b/plugins/acme-ssl/locales/translated/fr_FR.json @@ -54,5 +54,8 @@ "request": "Demandez votre certificat dès maintenant", "requesting": "Demande de certificat en cours...", "issued": "Certificat délivré et installé" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/he_IL.json b/plugins/acme-ssl/locales/translated/he_IL.json index fdbc2e9d6..1f858a0b2 100644 --- a/plugins/acme-ssl/locales/translated/he_IL.json +++ b/plugins/acme-ssl/locales/translated/he_IL.json @@ -54,5 +54,8 @@ "request": "בקשת תעודה עכשיו", "requesting": "מבקש תעודה...", "issued": "תעודה הונפקה והותקנה" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/hi_IN.json b/plugins/acme-ssl/locales/translated/hi_IN.json index b5ec9ddc4..aee4104c0 100644 --- a/plugins/acme-ssl/locales/translated/hi_IN.json +++ b/plugins/acme-ssl/locales/translated/hi_IN.json @@ -54,5 +54,8 @@ "request": "अभी प्रमाणपत्र का अनुरोध करें", "requesting": "प्रमाणपत्र अनुरोध किया जा रहा है...", "issued": "प्रमाणपत्र जारी और स्थापित किया गया" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/hu_HU.json b/plugins/acme-ssl/locales/translated/hu_HU.json index 1eb71c5b7..c313fcff3 100644 --- a/plugins/acme-ssl/locales/translated/hu_HU.json +++ b/plugins/acme-ssl/locales/translated/hu_HU.json @@ -54,5 +54,8 @@ "request": "Igényeljen tanúsítványt most", "requesting": "Tanúsítvány kérése...", "issued": "Tanúsítvány kiállítva és telepítve" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/id_ID.json b/plugins/acme-ssl/locales/translated/id_ID.json index 2587f1bc1..9848edb05 100644 --- a/plugins/acme-ssl/locales/translated/id_ID.json +++ b/plugins/acme-ssl/locales/translated/id_ID.json @@ -54,5 +54,8 @@ "request": "Ajukan sertifikat sekarang", "requesting": "Meminta sertifikat...", "issued": "Sertifikat telah diterbitkan dan dipasang." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/it_IT.json b/plugins/acme-ssl/locales/translated/it_IT.json index 8993ef364..ac8f8ad4a 100644 --- a/plugins/acme-ssl/locales/translated/it_IT.json +++ b/plugins/acme-ssl/locales/translated/it_IT.json @@ -54,5 +54,8 @@ "request": "Richiedi subito il certificato", "requesting": "Richiesta certificato in corso...", "issued": "Certificato rilasciato e installato" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ja_JP.json b/plugins/acme-ssl/locales/translated/ja_JP.json index 668b8c0cf..de1f8f8fa 100644 --- a/plugins/acme-ssl/locales/translated/ja_JP.json +++ b/plugins/acme-ssl/locales/translated/ja_JP.json @@ -54,5 +54,8 @@ "request": "今すぐ証明書を申請する", "requesting": "証明書をリクエスト中...", "issued": "証明書が発行され、インストールされました。" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ko_KR.json b/plugins/acme-ssl/locales/translated/ko_KR.json index 3e5d9ed89..dc6e54edc 100644 --- a/plugins/acme-ssl/locales/translated/ko_KR.json +++ b/plugins/acme-ssl/locales/translated/ko_KR.json @@ -54,5 +54,8 @@ "request": "지금 인증서를 요청하세요", "requesting": "인증서 요청 중...", "issued": "인증서가 발급 및 설치되었습니다." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/nl_NL.json b/plugins/acme-ssl/locales/translated/nl_NL.json index bd5230214..a27215a35 100644 --- a/plugins/acme-ssl/locales/translated/nl_NL.json +++ b/plugins/acme-ssl/locales/translated/nl_NL.json @@ -54,5 +54,8 @@ "request": "Vraag nu uw certificaat aan", "requesting": "Certificaat aanvragen...", "issued": "Certificaat afgegeven en geïnstalleerd" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/no_NO.json b/plugins/acme-ssl/locales/translated/no_NO.json index 9309ceb09..f38a4279a 100644 --- a/plugins/acme-ssl/locales/translated/no_NO.json +++ b/plugins/acme-ssl/locales/translated/no_NO.json @@ -54,5 +54,8 @@ "request": "Be om sertifikat nå", "requesting": "Ber om sertifikat...", "issued": "Sertifikat utstedt og installert" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/pl_PL.json b/plugins/acme-ssl/locales/translated/pl_PL.json index 921a7d6d4..97f83ca88 100644 --- a/plugins/acme-ssl/locales/translated/pl_PL.json +++ b/plugins/acme-ssl/locales/translated/pl_PL.json @@ -54,5 +54,8 @@ "request": "Złóż wniosek o certyfikat już teraz", "requesting": "Żądanie certyfikatu...", "issued": "Certyfikat wydany i zainstalowany" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/pt_BR.json b/plugins/acme-ssl/locales/translated/pt_BR.json index c972d782c..cd9a43f50 100644 --- a/plugins/acme-ssl/locales/translated/pt_BR.json +++ b/plugins/acme-ssl/locales/translated/pt_BR.json @@ -54,5 +54,8 @@ "request": "Solicite o certificado agora", "requesting": "Solicitar certificado...", "issued": "Certificado emitido e instalado." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/pt_PT.json b/plugins/acme-ssl/locales/translated/pt_PT.json index c75d2e6dd..975b670f9 100644 --- a/plugins/acme-ssl/locales/translated/pt_PT.json +++ b/plugins/acme-ssl/locales/translated/pt_PT.json @@ -54,5 +54,8 @@ "request": "Solicite já o certificado", "requesting": "A solicitar certificado...", "issued": "Certificado emitido e instalado." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ro_RO.json b/plugins/acme-ssl/locales/translated/ro_RO.json index 99b2c3151..2243be8a9 100644 --- a/plugins/acme-ssl/locales/translated/ro_RO.json +++ b/plugins/acme-ssl/locales/translated/ro_RO.json @@ -54,5 +54,8 @@ "request": "Solicitați certificatul acum", "requesting": "Se solicită certificatul...", "issued": "Certificat emis și instalat" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/ru_RU.json b/plugins/acme-ssl/locales/translated/ru_RU.json index 7795f5ed2..145ea9b07 100644 --- a/plugins/acme-ssl/locales/translated/ru_RU.json +++ b/plugins/acme-ssl/locales/translated/ru_RU.json @@ -54,5 +54,8 @@ "request": "Запросить сертификат сейчас", "requesting": "Запрос сертификата...", "issued": "Сертификат выдан и установлен." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/sr_SP.json b/plugins/acme-ssl/locales/translated/sr_SP.json index 4f270ce8c..2a7bd1420 100644 --- a/plugins/acme-ssl/locales/translated/sr_SP.json +++ b/plugins/acme-ssl/locales/translated/sr_SP.json @@ -54,5 +54,8 @@ "request": "Затражите сертификат сада", "requesting": "Захтева се сертификат...", "issued": "Сертификат издат и инсталиран" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/sv_SE.json b/plugins/acme-ssl/locales/translated/sv_SE.json index 8abd67e81..00154b1ad 100644 --- a/plugins/acme-ssl/locales/translated/sv_SE.json +++ b/plugins/acme-ssl/locales/translated/sv_SE.json @@ -54,5 +54,8 @@ "request": "Begär certifikat nu", "requesting": "Begär certifikat...", "issued": "Certifikat utfärdat och installerat" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/th_TH.json b/plugins/acme-ssl/locales/translated/th_TH.json index c71e209b6..489315489 100644 --- a/plugins/acme-ssl/locales/translated/th_TH.json +++ b/plugins/acme-ssl/locales/translated/th_TH.json @@ -54,5 +54,8 @@ "request": "ขอใบรับรองตอนนี้", "requesting": "ขอใบรับรอง...", "issued": "ออกและติดตั้งใบรับรองแล้ว" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/tr_TR.json b/plugins/acme-ssl/locales/translated/tr_TR.json index aef1aad1b..a58645b94 100644 --- a/plugins/acme-ssl/locales/translated/tr_TR.json +++ b/plugins/acme-ssl/locales/translated/tr_TR.json @@ -54,5 +54,8 @@ "request": "Şimdi sertifika talep edin", "requesting": "Sertifika isteniyor...", "issued": "Sertifika düzenlendi ve kuruldu." + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/uk_UA.json b/plugins/acme-ssl/locales/translated/uk_UA.json index 738c42373..c5c87b5ca 100644 --- a/plugins/acme-ssl/locales/translated/uk_UA.json +++ b/plugins/acme-ssl/locales/translated/uk_UA.json @@ -54,5 +54,8 @@ "request": "Замовити сертифікат зараз", "requesting": "Запит сертифіката...", "issued": "Сертифікат видано та встановлено" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/vi_VN.json b/plugins/acme-ssl/locales/translated/vi_VN.json index a08d48b18..4a7605c61 100644 --- a/plugins/acme-ssl/locales/translated/vi_VN.json +++ b/plugins/acme-ssl/locales/translated/vi_VN.json @@ -54,5 +54,8 @@ "request": "Yêu cầu chứng chỉ ngay bây giờ", "requesting": "Đang yêu cầu chứng chỉ...", "issued": "Giấy chứng nhận đã được cấp và cài đặt" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/zh_CN.json b/plugins/acme-ssl/locales/translated/zh_CN.json index 038eade61..abdf553a5 100644 --- a/plugins/acme-ssl/locales/translated/zh_CN.json +++ b/plugins/acme-ssl/locales/translated/zh_CN.json @@ -54,5 +54,8 @@ "request": "立即申请证书", "requesting": "正在请求证书...", "issued": "证书已颁发并安装" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/acme-ssl/locales/translated/zh_TW.json b/plugins/acme-ssl/locales/translated/zh_TW.json index 996d23180..22122ab8d 100644 --- a/plugins/acme-ssl/locales/translated/zh_TW.json +++ b/plugins/acme-ssl/locales/translated/zh_TW.json @@ -54,5 +54,8 @@ "request": "立即申請證書", "requesting": "請求憑證中...", "issued": "證書已頒發並安裝" + }, + "plugin": { + "name": "ACME Certificates" } } diff --git a/plugins/ai/locales/en.json b/plugins/ai/locales/en.json index 7b5758ffa..25ac9b8bb 100644 --- a/plugins/ai/locales/en.json +++ b/plugins/ai/locales/en.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "View docs" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/af_ZA.json b/plugins/ai/locales/translated/af_ZA.json index 339bb3883..3a47a64df 100644 --- a/plugins/ai/locales/translated/af_ZA.json +++ b/plugins/ai/locales/translated/af_ZA.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Bekyk dokumente" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ar_SA.json b/plugins/ai/locales/translated/ar_SA.json index 9be5b2dea..8338528cf 100644 --- a/plugins/ai/locales/translated/ar_SA.json +++ b/plugins/ai/locales/translated/ar_SA.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "عرض المستندات" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/bg_BG.json b/plugins/ai/locales/translated/bg_BG.json index 07231463b..6229b3126 100644 --- a/plugins/ai/locales/translated/bg_BG.json +++ b/plugins/ai/locales/translated/bg_BG.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Преглед на документи" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/bn_BD.json b/plugins/ai/locales/translated/bn_BD.json index ee8f946c7..a89a81298 100644 --- a/plugins/ai/locales/translated/bn_BD.json +++ b/plugins/ai/locales/translated/bn_BD.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "নথি দেখুন" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ca_ES.json b/plugins/ai/locales/translated/ca_ES.json index a9184d446..6755747a2 100644 --- a/plugins/ai/locales/translated/ca_ES.json +++ b/plugins/ai/locales/translated/ca_ES.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Veure documents" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/cs_CZ.json b/plugins/ai/locales/translated/cs_CZ.json index 9a47a96ec..e7942ce12 100644 --- a/plugins/ai/locales/translated/cs_CZ.json +++ b/plugins/ai/locales/translated/cs_CZ.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Zobrazit dokumenty" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/da_DK.json b/plugins/ai/locales/translated/da_DK.json index 72dc289ba..36198c41c 100644 --- a/plugins/ai/locales/translated/da_DK.json +++ b/plugins/ai/locales/translated/da_DK.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Se dokumenter" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/de_DE.json b/plugins/ai/locales/translated/de_DE.json index e6d6d4ef0..212f37599 100644 --- a/plugins/ai/locales/translated/de_DE.json +++ b/plugins/ai/locales/translated/de_DE.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Dokumentation anzeigen" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/el_GR.json b/plugins/ai/locales/translated/el_GR.json index cb2ddde53..dc7257ecb 100644 --- a/plugins/ai/locales/translated/el_GR.json +++ b/plugins/ai/locales/translated/el_GR.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Προβολή εγγράφων" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/es_ES.json b/plugins/ai/locales/translated/es_ES.json index 14430a48d..01d9df1dd 100644 --- a/plugins/ai/locales/translated/es_ES.json +++ b/plugins/ai/locales/translated/es_ES.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Ver documentación" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/fi_FI.json b/plugins/ai/locales/translated/fi_FI.json index 1145b28d3..16c8d87a7 100644 --- a/plugins/ai/locales/translated/fi_FI.json +++ b/plugins/ai/locales/translated/fi_FI.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Näytä dokumentit" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/fr_FR.json b/plugins/ai/locales/translated/fr_FR.json index ef5361462..61ae218cd 100644 --- a/plugins/ai/locales/translated/fr_FR.json +++ b/plugins/ai/locales/translated/fr_FR.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Voir la documentation" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/he_IL.json b/plugins/ai/locales/translated/he_IL.json index f5e2c4e34..b268370a1 100644 --- a/plugins/ai/locales/translated/he_IL.json +++ b/plugins/ai/locales/translated/he_IL.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "הצג מסמכים" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/hi_IN.json b/plugins/ai/locales/translated/hi_IN.json index eb0e1009c..a4c75fce5 100644 --- a/plugins/ai/locales/translated/hi_IN.json +++ b/plugins/ai/locales/translated/hi_IN.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "दस्तावेज़ देखें" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/hu_HU.json b/plugins/ai/locales/translated/hu_HU.json index 29f3df4a5..13de71ebe 100644 --- a/plugins/ai/locales/translated/hu_HU.json +++ b/plugins/ai/locales/translated/hu_HU.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Dokumentumok megtekintése" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/id_ID.json b/plugins/ai/locales/translated/id_ID.json index 2caae0afb..1a9c21e95 100644 --- a/plugins/ai/locales/translated/id_ID.json +++ b/plugins/ai/locales/translated/id_ID.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Lihat dokumen" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/it_IT.json b/plugins/ai/locales/translated/it_IT.json index 5a0a51a67..3e95b1375 100644 --- a/plugins/ai/locales/translated/it_IT.json +++ b/plugins/ai/locales/translated/it_IT.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Visualizza documentazione" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ja_JP.json b/plugins/ai/locales/translated/ja_JP.json index 16c7460dd..7645ca006 100644 --- a/plugins/ai/locales/translated/ja_JP.json +++ b/plugins/ai/locales/translated/ja_JP.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "ドキュメントを表示" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ko_KR.json b/plugins/ai/locales/translated/ko_KR.json index c95fc4f25..fdd569213 100644 --- a/plugins/ai/locales/translated/ko_KR.json +++ b/plugins/ai/locales/translated/ko_KR.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "문서 보기" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/nl_NL.json b/plugins/ai/locales/translated/nl_NL.json index c601bcef6..50a823a76 100644 --- a/plugins/ai/locales/translated/nl_NL.json +++ b/plugins/ai/locales/translated/nl_NL.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Documenten bekijken" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/no_NO.json b/plugins/ai/locales/translated/no_NO.json index b76a26f06..0d820f8d1 100644 --- a/plugins/ai/locales/translated/no_NO.json +++ b/plugins/ai/locales/translated/no_NO.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Vis dokumenter" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/pl_PL.json b/plugins/ai/locales/translated/pl_PL.json index edbef7d6f..0c729acd1 100644 --- a/plugins/ai/locales/translated/pl_PL.json +++ b/plugins/ai/locales/translated/pl_PL.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Zobacz dokumentację" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/pt_BR.json b/plugins/ai/locales/translated/pt_BR.json index d0e8cc792..bbeef1b90 100644 --- a/plugins/ai/locales/translated/pt_BR.json +++ b/plugins/ai/locales/translated/pt_BR.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Documentação" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/pt_PT.json b/plugins/ai/locales/translated/pt_PT.json index 2decda4f7..b8dfc2428 100644 --- a/plugins/ai/locales/translated/pt_PT.json +++ b/plugins/ai/locales/translated/pt_PT.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Ver documentação" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ro_RO.json b/plugins/ai/locales/translated/ro_RO.json index 9aa460137..64a4d563f 100644 --- a/plugins/ai/locales/translated/ro_RO.json +++ b/plugins/ai/locales/translated/ro_RO.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Vizualizați documentele" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/ru_RU.json b/plugins/ai/locales/translated/ru_RU.json index 6b84a4c58..977a0d8c1 100644 --- a/plugins/ai/locales/translated/ru_RU.json +++ b/plugins/ai/locales/translated/ru_RU.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Документация" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/sr_SP.json b/plugins/ai/locales/translated/sr_SP.json index e8f3c2e88..362bb343f 100644 --- a/plugins/ai/locales/translated/sr_SP.json +++ b/plugins/ai/locales/translated/sr_SP.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Прикажи документе" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/sv_SE.json b/plugins/ai/locales/translated/sv_SE.json index 326ce2403..0e7ff0904 100644 --- a/plugins/ai/locales/translated/sv_SE.json +++ b/plugins/ai/locales/translated/sv_SE.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Visa dokument" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/th_TH.json b/plugins/ai/locales/translated/th_TH.json index 6df161654..7a993a7e9 100644 --- a/plugins/ai/locales/translated/th_TH.json +++ b/plugins/ai/locales/translated/th_TH.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "ดูเอกสาร" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/tr_TR.json b/plugins/ai/locales/translated/tr_TR.json index dfd8291ed..f691ddfe2 100644 --- a/plugins/ai/locales/translated/tr_TR.json +++ b/plugins/ai/locales/translated/tr_TR.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Dokümanları görüntüle" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/uk_UA.json b/plugins/ai/locales/translated/uk_UA.json index 8eb84143a..b78ac90ce 100644 --- a/plugins/ai/locales/translated/uk_UA.json +++ b/plugins/ai/locales/translated/uk_UA.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Переглянути документи" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/vi_VN.json b/plugins/ai/locales/translated/vi_VN.json index 81f034641..05b2d4fda 100644 --- a/plugins/ai/locales/translated/vi_VN.json +++ b/plugins/ai/locales/translated/vi_VN.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "Xem tài liệu" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/zh_CN.json b/plugins/ai/locales/translated/zh_CN.json index 9c8d76fd4..972da6491 100644 --- a/plugins/ai/locales/translated/zh_CN.json +++ b/plugins/ai/locales/translated/zh_CN.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "查看文档" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/ai/locales/translated/zh_TW.json b/plugins/ai/locales/translated/zh_TW.json index 6f801c660..e84c9a4c9 100644 --- a/plugins/ai/locales/translated/zh_TW.json +++ b/plugins/ai/locales/translated/zh_TW.json @@ -115,5 +115,8 @@ }, "hosts": { "docsLink": "檢視文件" + }, + "plugin": { + "name": "AI Assistant" } } diff --git a/plugins/alerts/locales/en.json b/plugins/alerts/locales/en.json index 9d7514f0d..b3203e591 100644 --- a/plugins/alerts/locales/en.json +++ b/plugins/alerts/locales/en.json @@ -168,5 +168,8 @@ "showRead": "Show read alerts", "allClear": "All clear", "loading": "Loading..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/af_ZA.json b/plugins/alerts/locales/translated/af_ZA.json index d2a22d477..ee0ca13ae 100644 --- a/plugins/alerts/locales/translated/af_ZA.json +++ b/plugins/alerts/locales/translated/af_ZA.json @@ -168,5 +168,8 @@ "showRead": "Wys leeswaarskuwings", "allClear": "Alles duidelik", "loading": "Laai tans..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ar_SA.json b/plugins/alerts/locales/translated/ar_SA.json index cec6ba30e..0eabca844 100644 --- a/plugins/alerts/locales/translated/ar_SA.json +++ b/plugins/alerts/locales/translated/ar_SA.json @@ -168,5 +168,8 @@ "showRead": "عرض تنبيهات القراءة", "allClear": "كل شيء طبيعي", "loading": "جارٍ التحميل..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/bg_BG.json b/plugins/alerts/locales/translated/bg_BG.json index 18f1553d6..23264b34d 100644 --- a/plugins/alerts/locales/translated/bg_BG.json +++ b/plugins/alerts/locales/translated/bg_BG.json @@ -168,5 +168,8 @@ "showRead": "Показване на известия за четене", "allClear": "Всичко е чисто", "loading": "Зареждане..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/bn_BD.json b/plugins/alerts/locales/translated/bn_BD.json index a8b64aa2f..32680ab7e 100644 --- a/plugins/alerts/locales/translated/bn_BD.json +++ b/plugins/alerts/locales/translated/bn_BD.json @@ -168,5 +168,8 @@ "showRead": "পঠিত সতর্কতা দেখান", "allClear": "সব পরিষ্কার", "loading": "লোড হচ্ছে..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ca_ES.json b/plugins/alerts/locales/translated/ca_ES.json index 092d637eb..798c2cec0 100644 --- a/plugins/alerts/locales/translated/ca_ES.json +++ b/plugins/alerts/locales/translated/ca_ES.json @@ -168,5 +168,8 @@ "showRead": "Mostra les alertes de lectura", "allClear": "Tot clar", "loading": "S'està carregant..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/cs_CZ.json b/plugins/alerts/locales/translated/cs_CZ.json index d8ac6e804..46e87bc69 100644 --- a/plugins/alerts/locales/translated/cs_CZ.json +++ b/plugins/alerts/locales/translated/cs_CZ.json @@ -168,5 +168,8 @@ "showRead": "Zobrazit upozornění na přečtení", "allClear": "Všechno čisté", "loading": "Načítání..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/da_DK.json b/plugins/alerts/locales/translated/da_DK.json index 02034918f..d08463a4d 100644 --- a/plugins/alerts/locales/translated/da_DK.json +++ b/plugins/alerts/locales/translated/da_DK.json @@ -168,5 +168,8 @@ "showRead": "Vis læseadvarsler", "allClear": "Alt klart", "loading": "Indlæser..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/de_DE.json b/plugins/alerts/locales/translated/de_DE.json index 842a45601..2acaf6184 100644 --- a/plugins/alerts/locales/translated/de_DE.json +++ b/plugins/alerts/locales/translated/de_DE.json @@ -168,5 +168,8 @@ "showRead": "Lesebenachrichtigungen anzeigen", "allClear": "Alles in Ordnung", "loading": "Laden..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/el_GR.json b/plugins/alerts/locales/translated/el_GR.json index b47ac7762..1ea75a15f 100644 --- a/plugins/alerts/locales/translated/el_GR.json +++ b/plugins/alerts/locales/translated/el_GR.json @@ -168,5 +168,8 @@ "showRead": "Εμφάνιση ειδοποιήσεων ανάγνωσης", "allClear": "Ορίζοντας είναι σαφής", "loading": "Φόρτωση..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/es_ES.json b/plugins/alerts/locales/translated/es_ES.json index aba6af717..eed85985d 100644 --- a/plugins/alerts/locales/translated/es_ES.json +++ b/plugins/alerts/locales/translated/es_ES.json @@ -168,5 +168,8 @@ "showRead": "Mostrar alertas de lectura", "allClear": "Todo correcto", "loading": "Cargando..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/fi_FI.json b/plugins/alerts/locales/translated/fi_FI.json index 3e9748ae8..77f1fb230 100644 --- a/plugins/alerts/locales/translated/fi_FI.json +++ b/plugins/alerts/locales/translated/fi_FI.json @@ -168,5 +168,8 @@ "showRead": "Näytä lukuilmoitukset", "allClear": "Kaikki selvää", "loading": "Ladataan..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/fr_FR.json b/plugins/alerts/locales/translated/fr_FR.json index 06d4a378a..c41d520f5 100644 --- a/plugins/alerts/locales/translated/fr_FR.json +++ b/plugins/alerts/locales/translated/fr_FR.json @@ -168,5 +168,8 @@ "showRead": "Afficher les alertes de lecture", "allClear": "Aucune alerte", "loading": "Chargement..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/he_IL.json b/plugins/alerts/locales/translated/he_IL.json index 0f3b1a5dc..e0f220f60 100644 --- a/plugins/alerts/locales/translated/he_IL.json +++ b/plugins/alerts/locales/translated/he_IL.json @@ -168,5 +168,8 @@ "showRead": "הצג התראות קריאה", "allClear": "הכל ברור", "loading": "טְעִינָה..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/hi_IN.json b/plugins/alerts/locales/translated/hi_IN.json index a9a60474a..91c335a21 100644 --- a/plugins/alerts/locales/translated/hi_IN.json +++ b/plugins/alerts/locales/translated/hi_IN.json @@ -168,5 +168,8 @@ "showRead": "पढ़े जाने के अलर्ट दिखाएँ", "allClear": "सब ठीक है", "loading": "लोड हो रहा है..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/hu_HU.json b/plugins/alerts/locales/translated/hu_HU.json index 8f5fcd7b4..9ed84aaa1 100644 --- a/plugins/alerts/locales/translated/hu_HU.json +++ b/plugins/alerts/locales/translated/hu_HU.json @@ -168,5 +168,8 @@ "showRead": "Olvasási értesítések megjelenítése", "allClear": "Minden tiszta", "loading": "Terhelés..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/id_ID.json b/plugins/alerts/locales/translated/id_ID.json index 2bd157083..b91790e6c 100644 --- a/plugins/alerts/locales/translated/id_ID.json +++ b/plugins/alerts/locales/translated/id_ID.json @@ -168,5 +168,8 @@ "showRead": "Tampilkan pemberitahuan telah dibaca", "allClear": "Semuanya aman.", "loading": "Memuat..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/it_IT.json b/plugins/alerts/locales/translated/it_IT.json index d601c4a82..a9884fa3e 100644 --- a/plugins/alerts/locales/translated/it_IT.json +++ b/plugins/alerts/locales/translated/it_IT.json @@ -168,5 +168,8 @@ "showRead": "Mostra gli avvisi di lettura", "allClear": "Tutto a posto", "loading": "Caricamento in corso..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ja_JP.json b/plugins/alerts/locales/translated/ja_JP.json index 16274c924..ecd7baf0c 100644 --- a/plugins/alerts/locales/translated/ja_JP.json +++ b/plugins/alerts/locales/translated/ja_JP.json @@ -168,5 +168,8 @@ "showRead": "既読通知を表示する", "allClear": "すべて正常", "loading": "読み込み中..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ko_KR.json b/plugins/alerts/locales/translated/ko_KR.json index b3dfe9046..18f8d3263 100644 --- a/plugins/alerts/locales/translated/ko_KR.json +++ b/plugins/alerts/locales/translated/ko_KR.json @@ -168,5 +168,8 @@ "showRead": "읽음 알림 표시", "allClear": "모두 정상", "loading": "로딩 중..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/nl_NL.json b/plugins/alerts/locales/translated/nl_NL.json index c8ae3775f..6ee048e75 100644 --- a/plugins/alerts/locales/translated/nl_NL.json +++ b/plugins/alerts/locales/translated/nl_NL.json @@ -168,5 +168,8 @@ "showRead": "Leeswaarschuwingen weergeven", "allClear": "Alles in orde", "loading": "Laden..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/no_NO.json b/plugins/alerts/locales/translated/no_NO.json index fa0690417..348cecefd 100644 --- a/plugins/alerts/locales/translated/no_NO.json +++ b/plugins/alerts/locales/translated/no_NO.json @@ -168,5 +168,8 @@ "showRead": "Vis lesevarsler", "allClear": "Alt klart", "loading": "Laster..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/pl_PL.json b/plugins/alerts/locales/translated/pl_PL.json index a39f4f9ea..6915a6ca5 100644 --- a/plugins/alerts/locales/translated/pl_PL.json +++ b/plugins/alerts/locales/translated/pl_PL.json @@ -168,5 +168,8 @@ "showRead": "Pokaż alerty odczytu", "allClear": "Bez alertów", "loading": "Ładowanie..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/pt_BR.json b/plugins/alerts/locales/translated/pt_BR.json index 25398d732..1bc8a1b54 100644 --- a/plugins/alerts/locales/translated/pt_BR.json +++ b/plugins/alerts/locales/translated/pt_BR.json @@ -168,5 +168,8 @@ "showRead": "Mostrar alertas de leitura", "allClear": "Tudo certo", "loading": "Carregando..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/pt_PT.json b/plugins/alerts/locales/translated/pt_PT.json index 8446380f0..2c85ff6aa 100644 --- a/plugins/alerts/locales/translated/pt_PT.json +++ b/plugins/alerts/locales/translated/pt_PT.json @@ -168,5 +168,8 @@ "showRead": "Mostrar alertas de leitura", "allClear": "Tudo em ordem", "loading": "A carregar..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ro_RO.json b/plugins/alerts/locales/translated/ro_RO.json index 1d86d245e..c439fe9da 100644 --- a/plugins/alerts/locales/translated/ro_RO.json +++ b/plugins/alerts/locales/translated/ro_RO.json @@ -168,5 +168,8 @@ "showRead": "Afișează alertele de citire", "allClear": "Totul este clar", "loading": "Încărcare..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/ru_RU.json b/plugins/alerts/locales/translated/ru_RU.json index 1e852207d..909cdec02 100644 --- a/plugins/alerts/locales/translated/ru_RU.json +++ b/plugins/alerts/locales/translated/ru_RU.json @@ -168,5 +168,8 @@ "showRead": "Показать уведомления о прочтении", "allClear": "Всё в порядке", "loading": "Загрузка..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/sr_SP.json b/plugins/alerts/locales/translated/sr_SP.json index 3415871fd..386636860 100644 --- a/plugins/alerts/locales/translated/sr_SP.json +++ b/plugins/alerts/locales/translated/sr_SP.json @@ -168,5 +168,8 @@ "showRead": "Прикажи обавештења о читању", "allClear": "Све је чисто", "loading": "Учитавање..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/sv_SE.json b/plugins/alerts/locales/translated/sv_SE.json index e9febf4b0..6ec9ad34d 100644 --- a/plugins/alerts/locales/translated/sv_SE.json +++ b/plugins/alerts/locales/translated/sv_SE.json @@ -168,5 +168,8 @@ "showRead": "Visa läsaviseringar", "allClear": "Faran över", "loading": "Belastning..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/th_TH.json b/plugins/alerts/locales/translated/th_TH.json index 2912f0461..f2967f355 100644 --- a/plugins/alerts/locales/translated/th_TH.json +++ b/plugins/alerts/locales/translated/th_TH.json @@ -168,5 +168,8 @@ "showRead": "แสดงการแจ้งเตือนการอ่าน", "allClear": "ทุกอย่างเรียบร้อย", "loading": "กำลังโหลด..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/tr_TR.json b/plugins/alerts/locales/translated/tr_TR.json index 752597c8c..711196804 100644 --- a/plugins/alerts/locales/translated/tr_TR.json +++ b/plugins/alerts/locales/translated/tr_TR.json @@ -168,5 +168,8 @@ "showRead": "Okuma uyarılarını göster", "allClear": "Her şey normal", "loading": "Yükleniyor..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/uk_UA.json b/plugins/alerts/locales/translated/uk_UA.json index 90dc9fb04..94e4d6ada 100644 --- a/plugins/alerts/locales/translated/uk_UA.json +++ b/plugins/alerts/locales/translated/uk_UA.json @@ -168,5 +168,8 @@ "showRead": "Показувати сповіщення про прочитання", "allClear": "Все чисто", "loading": "Завантаження..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/vi_VN.json b/plugins/alerts/locales/translated/vi_VN.json index a92f340fb..12564b46e 100644 --- a/plugins/alerts/locales/translated/vi_VN.json +++ b/plugins/alerts/locales/translated/vi_VN.json @@ -168,5 +168,8 @@ "showRead": "Hiển thị thông báo đã đọc", "allClear": "Tất cả ổn", "loading": "Đang tải..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/zh_CN.json b/plugins/alerts/locales/translated/zh_CN.json index 8f4bb1b6d..c74ea6ddb 100644 --- a/plugins/alerts/locales/translated/zh_CN.json +++ b/plugins/alerts/locales/translated/zh_CN.json @@ -168,5 +168,8 @@ "showRead": "显示已读提醒", "allClear": "一切正常", "loading": "加载中..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/locales/translated/zh_TW.json b/plugins/alerts/locales/translated/zh_TW.json index 8ab841e7c..d506245c3 100644 --- a/plugins/alerts/locales/translated/zh_TW.json +++ b/plugins/alerts/locales/translated/zh_TW.json @@ -168,5 +168,8 @@ "showRead": "顯示已讀提醒", "allClear": "一切正常", "loading": "載入中..." + }, + "plugin": { + "name": "Alerts" } } diff --git a/plugins/alerts/src/backend/repository.ts b/plugins/alerts/src/backend/repository.ts index 76bc04671..41358df4f 100644 --- a/plugins/alerts/src/backend/repository.ts +++ b/plugins/alerts/src/backend/repository.ts @@ -304,7 +304,7 @@ export async function createAlertsRepository( dedupeKey: item.dedupeKey ?? null, createdAt, }); - await db.persist(); + await db.persist({ lazy: true }); return toItem({ id, ...item, @@ -322,7 +322,7 @@ export async function createAlertsRepository( .update(items) .set({ deliveries: JSON.stringify(results) }) .where(eq(items.id, id)); - await db.persist(); + await db.persist({ lazy: true }); }, async hasUnreadWithKey(userId: string, key: string): Promise { diff --git a/plugins/automations/locales/en.json b/plugins/automations/locales/en.json index b459b4ade..77a517290 100644 --- a/plugins/automations/locales/en.json +++ b/plugins/automations/locales/en.json @@ -207,5 +207,19 @@ "remove": "Remove schedule", "loadFailed": "Could not refresh maintenance status. Changes are disabled until it can be loaded.", "loading": "Loading maintenance status…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/af_ZA.json b/plugins/automations/locales/translated/af_ZA.json index 68f0a8db6..91391e473 100644 --- a/plugins/automations/locales/translated/af_ZA.json +++ b/plugins/automations/locales/translated/af_ZA.json @@ -207,5 +207,19 @@ "remove": "Verwyder skedule", "loadFailed": "Kon nie onderhoudstatus verfris nie. Veranderinge is gedeaktiveer totdat dit gelaai kan word.", "loading": "Laai onderhoudstatus…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ar_SA.json b/plugins/automations/locales/translated/ar_SA.json index 57ad4dc0c..937ab4670 100644 --- a/plugins/automations/locales/translated/ar_SA.json +++ b/plugins/automations/locales/translated/ar_SA.json @@ -207,5 +207,19 @@ "remove": "إزالة الجدول الزمني", "loadFailed": "تعذر تحديث حالة الصيانة. التغييرات معطلة حتى يتم تحميلها.", "loading": "جارٍ تحميل حالة الصيانة…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/bg_BG.json b/plugins/automations/locales/translated/bg_BG.json index f4ee12569..f5c4b9f6a 100644 --- a/plugins/automations/locales/translated/bg_BG.json +++ b/plugins/automations/locales/translated/bg_BG.json @@ -207,5 +207,19 @@ "remove": "Премахване на графика", "loadFailed": "Не можа да се обнови състоянието на поддръжката. Промените са деактивирани, докато не може да бъде заредено.", "loading": "Зареждане на състоянието на поддръжката…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/bn_BD.json b/plugins/automations/locales/translated/bn_BD.json index 6310201f0..b8a127860 100644 --- a/plugins/automations/locales/translated/bn_BD.json +++ b/plugins/automations/locales/translated/bn_BD.json @@ -207,5 +207,19 @@ "remove": "সময়সূচী অপসারণ করুন", "loadFailed": "রক্ষণাবেক্ষণের অবস্থা রিফ্রেশ করা যায়নি। লোড না হওয়া পর্যন্ত পরিবর্তনগুলি নিষ্ক্রিয় থাকবে।", "loading": "রক্ষণাবেক্ষণের অবস্থা লোড হচ্ছে…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ca_ES.json b/plugins/automations/locales/translated/ca_ES.json index e9836b346..494c80fe0 100644 --- a/plugins/automations/locales/translated/ca_ES.json +++ b/plugins/automations/locales/translated/ca_ES.json @@ -207,5 +207,19 @@ "remove": "Elimina la programació", "loadFailed": "No s'ha pogut actualitzar l'estat del manteniment. Els canvis estan desactivats fins que es pugui carregar.", "loading": "S'està carregant l'estat del manteniment…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/cs_CZ.json b/plugins/automations/locales/translated/cs_CZ.json index 14533a055..bb5d72779 100644 --- a/plugins/automations/locales/translated/cs_CZ.json +++ b/plugins/automations/locales/translated/cs_CZ.json @@ -207,5 +207,19 @@ "remove": "Odebrat plán", "loadFailed": "Nepodařilo se obnovit stav údržby. Změny jsou zakázány, dokud nebude možné jej načíst.", "loading": "Načítání stavu údržby…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/da_DK.json b/plugins/automations/locales/translated/da_DK.json index 6b887b51f..299234647 100644 --- a/plugins/automations/locales/translated/da_DK.json +++ b/plugins/automations/locales/translated/da_DK.json @@ -207,5 +207,19 @@ "remove": "Fjern tidsplan", "loadFailed": "Vedligeholdelsesstatus kunne ikke opdateres. Ændringer er deaktiveret, indtil den kan indlæses.", "loading": "Indlæser vedligeholdelsesstatus…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/de_DE.json b/plugins/automations/locales/translated/de_DE.json index 9e9842af8..0c8b0c603 100644 --- a/plugins/automations/locales/translated/de_DE.json +++ b/plugins/automations/locales/translated/de_DE.json @@ -207,5 +207,19 @@ "remove": "Zeitplan entfernen", "loadFailed": "Der Wartungsstatus konnte nicht aktualisiert werden. Änderungen sind deaktiviert, bis die Daten geladen werden können.", "loading": "Lade Wartungsstatus…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/el_GR.json b/plugins/automations/locales/translated/el_GR.json index 116e2b767..6a07649d1 100644 --- a/plugins/automations/locales/translated/el_GR.json +++ b/plugins/automations/locales/translated/el_GR.json @@ -207,5 +207,19 @@ "remove": "Κατάργηση χρονοδιαγράμματος", "loadFailed": "Δεν ήταν δυνατή η ανανέωση της κατάστασης συντήρησης. Οι αλλαγές είναι απενεργοποιημένες μέχρι να είναι δυνατή η φόρτωσή τους.", "loading": "Φόρτωση κατάστασης συντήρησης…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/es_ES.json b/plugins/automations/locales/translated/es_ES.json index 6daf1c195..6e56e9b01 100644 --- a/plugins/automations/locales/translated/es_ES.json +++ b/plugins/automations/locales/translated/es_ES.json @@ -207,5 +207,19 @@ "remove": "Eliminar horario", "loadFailed": "No se pudo actualizar el estado de mantenimiento. Los cambios están deshabilitados hasta que se puedan cargar.", "loading": "Cargando estado de mantenimiento…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/fi_FI.json b/plugins/automations/locales/translated/fi_FI.json index f18d8a66b..25235c805 100644 --- a/plugins/automations/locales/translated/fi_FI.json +++ b/plugins/automations/locales/translated/fi_FI.json @@ -207,5 +207,19 @@ "remove": "Poista aikataulu", "loadFailed": "Ylläpidon tilaa ei voitu päivittää. Muutokset on poistettu käytöstä, kunnes ne voidaan ladata.", "loading": "Ladataan ylläpitotilaa…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/fr_FR.json b/plugins/automations/locales/translated/fr_FR.json index 628674df9..7ce5f49e5 100644 --- a/plugins/automations/locales/translated/fr_FR.json +++ b/plugins/automations/locales/translated/fr_FR.json @@ -207,5 +207,19 @@ "remove": "Supprimer le planning", "loadFailed": "Impossible d'actualiser l'état de maintenance. Les modifications sont désactivées jusqu'à ce que le chargement soit possible.", "loading": "État de la maintenance en cours de chargement…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/he_IL.json b/plugins/automations/locales/translated/he_IL.json index 7e0312d94..d2551d3fe 100644 --- a/plugins/automations/locales/translated/he_IL.json +++ b/plugins/automations/locales/translated/he_IL.json @@ -207,5 +207,19 @@ "remove": "הסר את לוח הזמנים", "loadFailed": "לא ניתן היה לרענן את סטטוס התחזוקה. השינויים מושבתים עד שניתן יהיה לטעון אותו.", "loading": "טוען סטטוס תחזוקה…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/hi_IN.json b/plugins/automations/locales/translated/hi_IN.json index e3949683f..745937a61 100644 --- a/plugins/automations/locales/translated/hi_IN.json +++ b/plugins/automations/locales/translated/hi_IN.json @@ -207,5 +207,19 @@ "remove": "अनुसूची हटाएँ", "loadFailed": "रखरखाव की स्थिति को रीफ़्रेश नहीं किया जा सका। जब तक यह लोड नहीं हो जाता, तब तक परिवर्तन अक्षम रहेंगे।", "loading": "रखरखाव की स्थिति लोड हो रही है…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/hu_HU.json b/plugins/automations/locales/translated/hu_HU.json index acb58a15e..135f72c62 100644 --- a/plugins/automations/locales/translated/hu_HU.json +++ b/plugins/automations/locales/translated/hu_HU.json @@ -207,5 +207,19 @@ "remove": "Ütemezés eltávolítása", "loadFailed": "Nem sikerült frissíteni a karbantartási állapotot. A változtatások le vannak tiltva, amíg be nem töltődik.", "loading": "Karbantartási állapot betöltése…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/id_ID.json b/plugins/automations/locales/translated/id_ID.json index 5936ff9bc..bcb06a8a9 100644 --- a/plugins/automations/locales/translated/id_ID.json +++ b/plugins/automations/locales/translated/id_ID.json @@ -207,5 +207,19 @@ "remove": "Hapus jadwal", "loadFailed": "Status pemeliharaan tidak dapat diperbarui. Perubahan dinonaktifkan hingga status dapat dimuat.", "loading": "Memuat status pemeliharaan…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/it_IT.json b/plugins/automations/locales/translated/it_IT.json index b5df9ff8a..2d5c24ac7 100644 --- a/plugins/automations/locales/translated/it_IT.json +++ b/plugins/automations/locales/translated/it_IT.json @@ -207,5 +207,19 @@ "remove": "Rimuovere la pianificazione", "loadFailed": "Impossibile aggiornare lo stato della manutenzione. Le modifiche sono disabilitate fino al caricamento.", "loading": "Caricamento dello stato di manutenzione…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ja_JP.json b/plugins/automations/locales/translated/ja_JP.json index 539d90589..c305ab93d 100644 --- a/plugins/automations/locales/translated/ja_JP.json +++ b/plugins/automations/locales/translated/ja_JP.json @@ -207,5 +207,19 @@ "remove": "スケジュールを削除", "loadFailed": "メンテナンス状況を更新できませんでした。読み込みが完了するまで、変更は無効になっています。", "loading": "メンテナンスステータスをロード中…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ko_KR.json b/plugins/automations/locales/translated/ko_KR.json index 3947cebab..030951a31 100644 --- a/plugins/automations/locales/translated/ko_KR.json +++ b/plugins/automations/locales/translated/ko_KR.json @@ -207,5 +207,19 @@ "remove": "일정을 삭제합니다", "loadFailed": "점검 상태를 새로 고칠 수 없습니다. 점검 상태가 로드될 때까지 변경 사항이 적용되지 않습니다.", "loading": "유지보수 상태 로딩 중…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/nl_NL.json b/plugins/automations/locales/translated/nl_NL.json index 17accf2fd..07a711359 100644 --- a/plugins/automations/locales/translated/nl_NL.json +++ b/plugins/automations/locales/translated/nl_NL.json @@ -207,5 +207,19 @@ "remove": "Schema verwijderen", "loadFailed": "De onderhoudsstatus kon niet worden vernieuwd. Wijzigingen zijn uitgeschakeld totdat de status kan worden geladen.", "loading": "Onderhoudsstatus laden…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/no_NO.json b/plugins/automations/locales/translated/no_NO.json index d4f9d001c..6582b8920 100644 --- a/plugins/automations/locales/translated/no_NO.json +++ b/plugins/automations/locales/translated/no_NO.json @@ -207,5 +207,19 @@ "remove": "Fjern tidsplan", "loadFailed": "Kunne ikke oppdatere vedlikeholdsstatusen. Endringer er deaktivert inntil den kan lastes inn.", "loading": "Laster inn vedlikeholdsstatus…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/pl_PL.json b/plugins/automations/locales/translated/pl_PL.json index 36a9987c5..c522be24b 100644 --- a/plugins/automations/locales/translated/pl_PL.json +++ b/plugins/automations/locales/translated/pl_PL.json @@ -207,5 +207,19 @@ "remove": "Usuń harmonogram", "loadFailed": "Nie można odświeżyć statusu konserwacji. Zmiany są zablokowane do czasu ich załadowania.", "loading": "Ładowanie statusu konserwacji…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/pt_BR.json b/plugins/automations/locales/translated/pt_BR.json index 2c1c52ae5..4ff93642a 100644 --- a/plugins/automations/locales/translated/pt_BR.json +++ b/plugins/automations/locales/translated/pt_BR.json @@ -207,5 +207,19 @@ "remove": "Remover agendamento", "loadFailed": "Não foi possível atualizar o status de manutenção. As alterações estão desativadas até que o status seja carregado.", "loading": "Carregando status de manutenção…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/pt_PT.json b/plugins/automations/locales/translated/pt_PT.json index 59f8bdc10..6d5d7a2ba 100644 --- a/plugins/automations/locales/translated/pt_PT.json +++ b/plugins/automations/locales/translated/pt_PT.json @@ -207,5 +207,19 @@ "remove": "Remover agendamento", "loadFailed": "Não foi possível atualizar o estado de manutenção. As alterações estão desativadas até que o estado seja carregado.", "loading": "A carregar o estado de manutenção…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ro_RO.json b/plugins/automations/locales/translated/ro_RO.json index ea56208ae..888b5da42 100644 --- a/plugins/automations/locales/translated/ro_RO.json +++ b/plugins/automations/locales/translated/ro_RO.json @@ -207,5 +207,19 @@ "remove": "Eliminați programul", "loadFailed": "Nu s-a putut actualiza starea de întreținere. Modificările sunt dezactivate până când pot fi încărcate.", "loading": "Se încarcă starea de întreținere…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/ru_RU.json b/plugins/automations/locales/translated/ru_RU.json index dbd84e2c8..1a23a95ca 100644 --- a/plugins/automations/locales/translated/ru_RU.json +++ b/plugins/automations/locales/translated/ru_RU.json @@ -207,5 +207,19 @@ "remove": "Удалить расписание", "loadFailed": "Не удалось обновить статус технического обслуживания. Изменения отключены до тех пор, пока не будет загружена соответствующая информация.", "loading": "Статус технического обслуживания загрузки…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/sr_SP.json b/plugins/automations/locales/translated/sr_SP.json index 5a556512d..37dd8fe24 100644 --- a/plugins/automations/locales/translated/sr_SP.json +++ b/plugins/automations/locales/translated/sr_SP.json @@ -207,5 +207,19 @@ "remove": "Уклони распоред", "loadFailed": "Није могуће освежити статус одржавања. Промене су онемогућене док се не учита.", "loading": "Учитавање статуса одржавања…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/sv_SE.json b/plugins/automations/locales/translated/sv_SE.json index 7cc2e2b1a..4bedfbe04 100644 --- a/plugins/automations/locales/translated/sv_SE.json +++ b/plugins/automations/locales/translated/sv_SE.json @@ -207,5 +207,19 @@ "remove": "Ta bort schema", "loadFailed": "Kunde inte uppdatera underhållsstatusen. Ändringar är inaktiverade tills den kan läsas in.", "loading": "Laddar underhållsstatus…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/th_TH.json b/plugins/automations/locales/translated/th_TH.json index cec86a6bb..5ae551ef1 100644 --- a/plugins/automations/locales/translated/th_TH.json +++ b/plugins/automations/locales/translated/th_TH.json @@ -207,5 +207,19 @@ "remove": "ลบกำหนดการ", "loadFailed": "ไม่สามารถรีเฟรชสถานะการบำรุงรักษาได้ การเปลี่ยนแปลงจะถูกปิดใช้งานจนกว่าจะสามารถโหลดได้", "loading": "กำลังโหลดสถานะการบำรุงรักษา…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/tr_TR.json b/plugins/automations/locales/translated/tr_TR.json index 62a10407c..e12e6701c 100644 --- a/plugins/automations/locales/translated/tr_TR.json +++ b/plugins/automations/locales/translated/tr_TR.json @@ -207,5 +207,19 @@ "remove": "Programı kaldır", "loadFailed": "Bakım durumu yenilenemedi. Yüklenene kadar değişiklikler devre dışı bırakılmıştır.", "loading": "Bakım durumu yükleniyor…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/uk_UA.json b/plugins/automations/locales/translated/uk_UA.json index 483cf0367..374d96bda 100644 --- a/plugins/automations/locales/translated/uk_UA.json +++ b/plugins/automations/locales/translated/uk_UA.json @@ -207,5 +207,19 @@ "remove": "Видалити розклад", "loadFailed": "Не вдалося оновити стан обслуговування. Зміни вимкнено, доки його не буде завантажено.", "loading": "Завантаження статусу технічного обслуговування…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/vi_VN.json b/plugins/automations/locales/translated/vi_VN.json index 9f54650df..123e18bcc 100644 --- a/plugins/automations/locales/translated/vi_VN.json +++ b/plugins/automations/locales/translated/vi_VN.json @@ -207,5 +207,19 @@ "remove": "Xóa lịch trình", "loadFailed": "Không thể cập nhật trạng thái bảo trì. Các thay đổi bị vô hiệu hóa cho đến khi có thể tải lại.", "loading": "Đang tải trạng thái bảo trì…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/zh_CN.json b/plugins/automations/locales/translated/zh_CN.json index 54b92d442..6d51670f7 100644 --- a/plugins/automations/locales/translated/zh_CN.json +++ b/plugins/automations/locales/translated/zh_CN.json @@ -207,5 +207,19 @@ "remove": "移除日程", "loadFailed": "无法刷新维护状态。更改功能已禁用,待状态加载完毕后方可启用。", "loading": "正在加载维护状态…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/locales/translated/zh_TW.json b/plugins/automations/locales/translated/zh_TW.json index 6e8299815..30fbe8d0f 100644 --- a/plugins/automations/locales/translated/zh_TW.json +++ b/plugins/automations/locales/translated/zh_TW.json @@ -207,5 +207,19 @@ "remove": "移除行程", "loadFailed": "無法刷新維護狀態。更改功能已停用,待狀態載入完畢後方可啟用。", "loading": "正在載入維護狀態…" + }, + "ui": { + "sidebar": { + "automations": { + "options": { + "connect": "connect", + "disconnect": "disconnect", + "offline": "offline", + "online": "online", + "failing": "failing", + "recovered": "recovered" + } + } + } } } diff --git a/plugins/automations/manifest.json b/plugins/automations/manifest.json index ba149255f..0da548831 100644 --- a/plugins/automations/manifest.json +++ b/plugins/automations/manifest.json @@ -17,6 +17,7 @@ "capabilities": [ "hosts:read", "credentials:use", + "credentials:read", "ssh:connect", "db:own", "events:core", diff --git a/plugins/automations/src/backend/repository.ts b/plugins/automations/src/backend/repository.ts index 5592a8b94..d200e6dc5 100644 --- a/plugins/automations/src/backend/repository.ts +++ b/plugins/automations/src/backend/repository.ts @@ -528,7 +528,7 @@ export async function createAutomationRepository( .set({ lastRunAt: run[0].startedAt, lastRunStatus: input.status }) .where(eq(automations.id, run[0].automationId)); } - await db.persist(); + await db.persist({ lazy: true }); }, async listRuns( @@ -630,7 +630,7 @@ export async function createAutomationRepository( .where(lt(runs.startedAt, cutoff)); if (old.length === 0) return 0; await drizzle.delete(runs).where(lt(runs.startedAt, cutoff)); - await db.persist(); + await db.persist({ lazy: true }); return old.length; }, diff --git a/plugins/automations/src/frontend/automations/StepBlock.tsx b/plugins/automations/src/frontend/automations/StepBlock.tsx index 1927052c3..653b7a51a 100644 --- a/plugins/automations/src/frontend/automations/StepBlock.tsx +++ b/plugins/automations/src/frontend/automations/StepBlock.tsx @@ -368,8 +368,12 @@ export function StepBlock({ - connect - disconnect + + {t("ui.sidebar.automations.options.connect")} + + + {t("ui.sidebar.automations.options.disconnect")} + {trigger.kind === "host_status" ? ( <> - offline - online + + {t("ui.sidebar.automations.options.offline")} + + + {t("ui.sidebar.automations.options.online")} + ) : ( <> - failing - recovered + + {t("ui.sidebar.automations.options.failing")} + + + {t("ui.sidebar.automations.options.recovered")} + )} diff --git a/plugins/automations/tests/backend/maintenance.test.ts b/plugins/automations/tests/backend/maintenance.test.ts index 3730aa1a2..ddcef56cb 100644 --- a/plugins/automations/tests/backend/maintenance.test.ts +++ b/plugins/automations/tests/backend/maintenance.test.ts @@ -89,7 +89,7 @@ describe("host maintenance", () => { await service.tick(); expect(server.mock.notifications).toHaveLength(0); server.mock.hostStatuses.set(1, { - status: "reachable", + status: "online", lastChecked: "2026-01-01T13:21Z", }); await service.tick(); diff --git a/plugins/automations/tests/backend/sudo-capability.test.ts b/plugins/automations/tests/backend/sudo-capability.test.ts new file mode 100644 index 000000000..ab3f3d7a1 --- /dev/null +++ b/plugins/automations/tests/backend/sudo-capability.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from "vitest"; +import fs from "node:fs"; +import path from "node:path"; + +// Elevated commands read the host's sudo password, which core only hands to +// a plugin holding credentials:read. +describe("sudo password access", () => { + it("declares credentials:read", () => { + const manifest = JSON.parse( + fs.readFileSync( + path.resolve(import.meta.dirname, "../../manifest.json"), + "utf8", + ), + ); + expect(manifest.capabilities).toContain("credentials:read"); + }); +}); diff --git a/plugins/docker/src/backend/connect.ts b/plugins/docker/src/backend/connect.ts index bacbad75c..5501fef3a 100644 --- a/plugins/docker/src/backend/connect.ts +++ b/plugins/docker/src/backend/connect.ts @@ -341,13 +341,7 @@ export async function startConnect( return; } - const { hostKeyChanged, authFailed } = classifyConnectError( - message, - logs, - ); - if (hostKeyChanged || authFailed) { - ctx.hosts.status.reportLogin(hostId, { ok: false, hostKeyChanged }); - } + const { authFailed } = classifyConnectError(message, logs); log.error("Docker SSH connection failed", { hostId, userId, diff --git a/plugins/docker/src/backend/routes.ts b/plugins/docker/src/backend/routes.ts index b031d6f99..672d241d8 100644 --- a/plugins/docker/src/backend/routes.ts +++ b/plugins/docker/src/backend/routes.ts @@ -210,11 +210,13 @@ export function registerRoutes(router: Router, { ctx, sessions, log }: Deps) { ), ); - const target: PluginSshHost = { - ...host, - id: numericHostId, - port: host.port || 22, - }; + const hasAuthOverride = [ + userProvidedPassword, + userProvidedSshKey, + userProvidedKeyPassword, + ].some((value) => typeof value === "string" && value.length > 0); + // Core associates the redacted host object with its stored credentials. + const target: PluginSshHost = hasAuthOverride ? { ...host } : host; if (typeof userProvidedPassword === "string" && userProvidedPassword) { target.password = userProvidedPassword; target.authType = "password"; diff --git a/plugins/docker/tests/backend/routes.test.ts b/plugins/docker/tests/backend/routes.test.ts index 5a76e4754..21641a10a 100644 --- a/plugins/docker/tests/backend/routes.test.ts +++ b/plugins/docker/tests/backend/routes.test.ts @@ -3,7 +3,7 @@ import type { PluginSshConnectOptions, PluginSshHost, } from "@termix/plugin-sdk/backend"; -import { startServer, type TestServer } from "./server"; +import { startServer, sshHost, type TestServer } from "./server"; import { FakeClient } from "./fake-ssh"; let server: TestServer | null = null; @@ -76,6 +76,41 @@ describe("docker routes", () => { expect((await connect(server, "s1", 99)).status).toBe(404); }); + it("keeps the core-resolved host identity when using stored credentials", async () => { + server = await startServer(); + const host = sshHost(7, { authType: "key", password: undefined }); + const originalConnect = server.mock.ctx.ssh.connect; + server.mock.ctx.ssh.resolveHost = async () => host; + server.mock.ctx.ssh.connect = (async (target, options) => { + if (target !== host) + throw new Error("Stored credential association lost"); + return originalConnect(target, options); + }) as typeof originalConnect; + const response = await connect(server); + expect(response.status).toBe(200); + expect(response.body.success).toBe(true); + }); + + it("applies explicit authentication overrides without changing the resolved host", async () => { + server = await startServer(); + const host = sshHost(7, { authType: "key", password: undefined }); + server.mock.ctx.ssh.resolveHost = async () => host; + const response = await server.request("POST", "/ssh/connect", { + body: { + sessionId: "override", + hostId: 7, + userProvidedPassword: "replacement", + }, + }); + expect(response.status).toBe(200); + expect(server.mock.sshConnections.at(-1)?.host).toMatchObject({ + authType: "password", + password: "replacement", + }); + expect(host.authType).toBe("key"); + expect(host.password).toBeUndefined(); + }); + it("connects, validates and manages containers on the session", async () => { server = await startServer(); const connected = await connect(server); @@ -268,7 +303,7 @@ describe("docker routes", () => { }); }); - it("reports a failed login to core", async () => { + it("never reports a failed login to core", async () => { const client = new FakeClient(); server = await startServer({ client }); server.mock.ctx.ssh.connect = (async () => { @@ -276,10 +311,6 @@ describe("docker routes", () => { }) as never; const response = await connect(server); expect(response.status).toBe(500); - expect(server.mock.statusReports).toContainEqual({ - hostId: 7, - ok: false, - hostKeyChanged: false, - }); + expect(server.mock.statusReports).toEqual([]); }); }); diff --git a/plugins/file-manager/locales/en.json b/plugins/file-manager/locales/en.json index dc86761ce..e162e7c37 100644 --- a/plugins/file-manager/locales/en.json +++ b/plugins/file-manager/locales/en.json @@ -323,7 +323,7 @@ "sideBySide": "Side by Side", "inline": "Inline", "fileComparison": "File Comparison: {{file1}} vs {{file2}}", - "fileTooLarge": "File too large: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH connection failed. Please check your connection to {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Failed to load file: {{error}}", "connecting": "Connecting...", @@ -365,7 +365,7 @@ "comfortableLayout": "Use comfortable layout", "cannotLoadPdf": "Cannot load PDF", "pdfLoadError": "There was an error loading this PDF file.", - "loadingPdf": "Loading PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Loading page...", "cancel": "Cancel", "copiedItems_one": "Copied {{count}} item", @@ -383,7 +383,16 @@ "videoUnsupported": "Your browser cannot play this video format.", "downloadToPlay": "Download to play it elsewhere", "cannotPreviewType": "Cannot preview this file type", - "cannotPreviewTypeHint": "This file type has no preview. Download it to open it in another app." + "cannotPreviewTypeHint": "This file type has no preview. Download it to open it in another app.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Source → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → dest (local): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/af_ZA.json b/plugins/file-manager/locales/translated/af_ZA.json index 3b38d9405..6deb21566 100644 --- a/plugins/file-manager/locales/translated/af_ZA.json +++ b/plugins/file-manager/locales/translated/af_ZA.json @@ -323,7 +323,7 @@ "sideBySide": "Sy aan Sy", "inline": "Inlyn", "fileComparison": "Lêervergelyking: {{file1}} vs {{file2}}", - "fileTooLarge": "Lêer te groot: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-verbinding het misluk. Kontroleer asseblief jou verbinding met {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Kon nie lêer laai nie: {{error}}", "connecting": "Verbind...", @@ -365,7 +365,7 @@ "comfortableLayout": "Gebruik gemaklike uitleg", "cannotLoadPdf": "Kan nie PDF laai nie", "pdfLoadError": "Daar was 'n fout tydens die laai van hierdie PDF-lêer.", - "loadingPdf": "Laai PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Laai bladsy...", "cancel": "Kanselleer", "copiedItems_one": "Gekopieerde {{count}} item", @@ -383,7 +383,16 @@ "videoUnsupported": "Jou blaaier kan nie hierdie videoformaat speel nie.", "downloadToPlay": "Laai dit af om dit elders te speel", "cannotPreviewType": "Kan nie hierdie lêertipe voorbeskou nie", - "cannotPreviewTypeHint": "Hierdie lêertipe het geen voorskou nie. Laai dit af om dit in 'n ander toepassing oop te maak." + "cannotPreviewTypeHint": "Hierdie lêertipe het geen voorskou nie. Laai dit af om dit in 'n ander toepassing oop te maak.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Bron → bediener: {{throughput}}", "metricsHopDestSftpWrite": "Bediener → bestemming (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Bediener → bestemming (plaaslik): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ar_SA.json b/plugins/file-manager/locales/translated/ar_SA.json index bb659990d..733d1bde7 100644 --- a/plugins/file-manager/locales/translated/ar_SA.json +++ b/plugins/file-manager/locales/translated/ar_SA.json @@ -323,7 +323,7 @@ "sideBySide": "جنباً إلى جنب", "inline": "مضمن", "fileComparison": "مقارنة الملفات: {{file1}} مقابل {{file2}}", - "fileTooLarge": "الملف كبير جداً: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "فشل اتصال SSH. يرجى التحقق من الاتصال بـ {{name}} ({{ip}}:{{port}})", "loadFileFailed": "فشل تحميل الملف: {{error}}", "connecting": "جارٍ الاتصال...", @@ -365,7 +365,7 @@ "comfortableLayout": "استخدم تصميمًا مريحًا", "cannotLoadPdf": "لا يمكن تحميل PDF", "pdfLoadError": "حدث خطأ أثناء تحميل ملف PDF هذا.", - "loadingPdf": "جارٍ تحميل PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "جارٍ تحميل الصفحة...", "cancel": "إلغاء", "copiedItems_one": "تم نسخ العنصر {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "لا يمكن لمتصفحك تشغيل هذا الفيديو.", "downloadToPlay": "قم بتنزيله لتشغيله في مكان آخر", "cannotPreviewType": "لا يمكن معاينة هذا النوع من الملفات", - "cannotPreviewTypeHint": "لا يتوفر معاينة لهذا النوع من الملفات. قم بتنزيله لفتحه في تطبيق آخر." + "cannotPreviewTypeHint": "لا يتوفر معاينة لهذا النوع من الملفات. قم بتنزيله لفتحه في تطبيق آخر.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "المصدر → الخادم: {{throughput}}", "metricsHopDestSftpWrite": "الخادم → الوجهة (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "الخادم → الوجهة (محلي): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/bg_BG.json b/plugins/file-manager/locales/translated/bg_BG.json index 501d9d548..5b8bb99e8 100644 --- a/plugins/file-manager/locales/translated/bg_BG.json +++ b/plugins/file-manager/locales/translated/bg_BG.json @@ -323,7 +323,7 @@ "sideBySide": "Рамо до рамо", "inline": "Вграден", "fileComparison": "Сравнение на файлове: {{file1}} срещу {{file2}}", - "fileTooLarge": "Файлът е твърде голям: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH връзката не бе успешна. Моля, проверете връзката си с {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Неуспешно зареждане на файл: {{error}}", "connecting": "Свързване...", @@ -365,7 +365,7 @@ "comfortableLayout": "Използвайте удобно оформление", "cannotLoadPdf": "Не може да се зареди PDF файл", "pdfLoadError": "Възникна грешка при зареждането на този PDF файл.", - "loadingPdf": "Зареждане на PDF файл...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Зареждане на страницата...", "cancel": "Отказ", "copiedItems_one": "Копиран елемент {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Вашият браузър не може да възпроизведе този видео формат.", "downloadToPlay": "Изтеглете, за да го играете другаде", "cannotPreviewType": "Не може да се прегледа този тип файл", - "cannotPreviewTypeHint": "Този тип файл няма предварителен преглед. Изтеглете го, за да го отворите в друго приложение." + "cannotPreviewTypeHint": "Този тип файл няма предварителен преглед. Изтеглете го, за да го отворите в друго приложение.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Източник → сървър: {{throughput}}", "metricsHopDestSftpWrite": "Сървър → дестинация (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Сървър → дестинация (локална): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/bn_BD.json b/plugins/file-manager/locales/translated/bn_BD.json index 469517c1f..688f73513 100644 --- a/plugins/file-manager/locales/translated/bn_BD.json +++ b/plugins/file-manager/locales/translated/bn_BD.json @@ -323,7 +323,7 @@ "sideBySide": "পাশাপাশি", "inline": "ইনলাইন", "fileComparison": "ফাইল তুলনা: {{file1}} বনাম {{file2}}", - "fileTooLarge": "ফাইলের আকার অনেক বড়: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH সংযোগ ব্যর্থ হয়েছে। অনুগ্রহ করে {{name}} ({{ip}}:{{port}} ) -এ আপনার সংযোগ পরীক্ষা করুন।", "loadFileFailed": "ফাইল লোড করতে ব্যর্থ: {{error}}", "connecting": "সংযোগ স্থাপন...", @@ -365,7 +365,7 @@ "comfortableLayout": "আরামদায়ক বিন্যাস ব্যবহার করুন", "cannotLoadPdf": "পিডিএফ লোড করা যাচ্ছে না", "pdfLoadError": "এই পিডিএফ ফাইলটি লোড করতে ত্রুটি হয়েছে।", - "loadingPdf": "পিডিএফ লোড হচ্ছে...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "পৃষ্ঠা লোড হচ্ছে...", "cancel": "বাতিল করুন", "copiedItems_one": "{{count}} আইটেমটি অনুলিপি করা হয়েছে", @@ -383,7 +383,16 @@ "videoUnsupported": "আপনার ব্রাউজার এই ভিডিও ফরম্যাটটি চালাতে পারছে না।", "downloadToPlay": "অন্যত্র চালানোর জন্য ডাউনলোড করুন", "cannotPreviewType": "এই ফাইল প্রকারের প্রিভিউ দেখা সম্ভব নয়", - "cannotPreviewTypeHint": "এই ফাইল টাইপের কোনো প্রিভিউ নেই। অন্য কোনো অ্যাপে খোলার জন্য এটি ডাউনলোড করুন।" + "cannotPreviewTypeHint": "এই ফাইল টাইপের কোনো প্রিভিউ নেই। অন্য কোনো অ্যাপে খোলার জন্য এটি ডাউনলোড করুন।", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "এসএফটিপি", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "উৎস → সার্ভার: {{throughput}}", "metricsHopDestSftpWrite": "সার্ভার → গন্তব্য (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "সার্ভার → গন্তব্য (স্থানীয়): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ca_ES.json b/plugins/file-manager/locales/translated/ca_ES.json index 0f6c88420..804500c74 100644 --- a/plugins/file-manager/locales/translated/ca_ES.json +++ b/plugins/file-manager/locales/translated/ca_ES.json @@ -323,7 +323,7 @@ "sideBySide": "Costat al costat", "inline": "En línia", "fileComparison": "Comparació de fitxers: {{file1}} vs {{file2}}", - "fileTooLarge": "Fitxer massa gran: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "La connexió SSH ha fallat. Si us plau, comproveu la connexió a {{name}} ({{ip}}:{{port}})", "loadFileFailed": "No s'ha pogut carregar el fitxer: {{error}}", "connecting": "Connectant...", @@ -365,7 +365,7 @@ "comfortableLayout": "Utilitza un disseny còmode", "cannotLoadPdf": "No es pot carregar el PDF", "pdfLoadError": "S'ha produït un error en carregar aquest fitxer PDF.", - "loadingPdf": "S'està carregant el PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "S'està carregant la pàgina...", "cancel": "Cancel·la", "copiedItems_one": "S'ha copiat l'element {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "El vostre navegador no pot reproduir aquest format de vídeo.", "downloadToPlay": "Descarrega-ho per reproduir-ho en un altre lloc", "cannotPreviewType": "No es pot previsualitzar aquest tipus de fitxer", - "cannotPreviewTypeHint": "Aquest tipus de fitxer no té vista prèvia. Baixeu-lo per obrir-lo en una altra aplicació." + "cannotPreviewTypeHint": "Aquest tipus de fitxer no té vista prèvia. Baixeu-lo per obrir-lo en una altra aplicació.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Font → servidor: {{throughput}}", "metricsHopDestSftpWrite": "Servidor → destí (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Servidor → destí (local): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/cs_CZ.json b/plugins/file-manager/locales/translated/cs_CZ.json index 4f85a43b4..d50baf218 100644 --- a/plugins/file-manager/locales/translated/cs_CZ.json +++ b/plugins/file-manager/locales/translated/cs_CZ.json @@ -323,7 +323,7 @@ "sideBySide": "Bok po boku", "inline": "Vložený", "fileComparison": "Porovnání souborů: {{file1}} vs. {{file2}}", - "fileTooLarge": "Soubor je příliš velký: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH připojení selhalo. Zkontrolujte prosím připojení k {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Nepodařilo se načíst soubor: {{error}}", "connecting": "Spojovací...", @@ -365,7 +365,7 @@ "comfortableLayout": "Použijte pohodlné rozvržení", "cannotLoadPdf": "Nelze načíst PDF", "pdfLoadError": "Při načítání tohoto PDF souboru došlo k chybě.", - "loadingPdf": "Načítání PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Načítání stránky...", "cancel": "Zrušit", "copiedItems_one": "Zkopírována položka {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Váš prohlížeč tento formát videa nepřehrává.", "downloadToPlay": "Stáhněte si pro přehrávání jinde", "cannotPreviewType": "Nelze zobrazit náhled tohoto typu souboru", - "cannotPreviewTypeHint": "Tento typ souboru nemá náhled. Stáhněte si jej a otevřete jej v jiné aplikaci." + "cannotPreviewTypeHint": "Tento typ souboru nemá náhled. Stáhněte si jej a otevřete jej v jiné aplikaci.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Zdroj → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → cíl (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → cíl (lokální): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/da_DK.json b/plugins/file-manager/locales/translated/da_DK.json index 2f6568c7f..40f7f2f10 100644 --- a/plugins/file-manager/locales/translated/da_DK.json +++ b/plugins/file-manager/locales/translated/da_DK.json @@ -323,7 +323,7 @@ "sideBySide": "Side om side", "inline": "Indlejret", "fileComparison": "Filsammenligning: {{file1}} vs. {{file2}}", - "fileTooLarge": "Filen er for stor: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-forbindelse mislykkedes. Kontroller venligst din forbindelse til {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Kunne ikke indlæse filen: {{error}}", "connecting": "Forbinder...", @@ -365,7 +365,7 @@ "comfortableLayout": "Brug et komfortabelt layout", "cannotLoadPdf": "Kan ikke indlæse PDF'en", "pdfLoadError": "Der opstod en fejl under indlæsning af denne PDF-fil.", - "loadingPdf": "Indlæser PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Indlæser side...", "cancel": "Ophæve", "copiedItems_one": "Kopieret {{count}} element", @@ -383,7 +383,16 @@ "videoUnsupported": "Din browser kan ikke afspille dette videoformat.", "downloadToPlay": "Download for at afspille det et andet sted", "cannotPreviewType": "Kan ikke forhåndsvise denne filtype", - "cannotPreviewTypeHint": "Denne filtype har ingen forhåndsvisning. Download den for at åbne den i en anden app." + "cannotPreviewTypeHint": "Denne filtype har ingen forhåndsvisning. Download den for at åbne den i en anden app.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Kilde → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → destination (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → destination (lokal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/de_DE.json b/plugins/file-manager/locales/translated/de_DE.json index 6f60ad6fe..c86bb96c4 100644 --- a/plugins/file-manager/locales/translated/de_DE.json +++ b/plugins/file-manager/locales/translated/de_DE.json @@ -323,7 +323,7 @@ "sideBySide": "Nebeneinander", "inline": "Inline", "fileComparison": "Dateivergleich: {{file1}} vs. {{file2}}", - "fileTooLarge": "Datei zu groß: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-Verbindung fehlgeschlagen. Bitte überprüfen Sie Ihre Verbindung zu {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Fehler beim Laden der Datei: {{error}}", "connecting": "Verbindung wird hergestellt...", @@ -365,7 +365,7 @@ "comfortableLayout": "Nutzen Sie ein komfortables Layout", "cannotLoadPdf": "PDF kann nicht geladen werden", "pdfLoadError": "Beim Laden dieser PDF-Datei ist ein Fehler aufgetreten.", - "loadingPdf": "PDF wird geladen...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Seite wird geladen...", "cancel": "Abbrechen", "copiedItems_one": "Kopierter Eintrag {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Ihr Browser kann dieses Videoformat nicht abspielen.", "downloadToPlay": "Laden Sie es herunter, um es woanders abzuspielen.", "cannotPreviewType": "Vorschau dieses Dateityps nicht möglich", - "cannotPreviewTypeHint": "Dieser Dateityp hat keine Vorschau. Laden Sie ihn herunter, um ihn in einer anderen App zu öffnen." + "cannotPreviewTypeHint": "Dieser Dateityp hat keine Vorschau. Laden Sie ihn herunter, um ihn in einer anderen App zu öffnen.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Quelle → Server: {{throughput}}", "metricsHopDestSftpWrite": "Server → Ziel (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → Ziel (lokal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/el_GR.json b/plugins/file-manager/locales/translated/el_GR.json index 4ab2d42d1..9944e97d4 100644 --- a/plugins/file-manager/locales/translated/el_GR.json +++ b/plugins/file-manager/locales/translated/el_GR.json @@ -323,7 +323,7 @@ "sideBySide": "Πλάι πλάι", "inline": "Ενσωματωμένο", "fileComparison": "Σύγκριση αρχείων: {{file1}} έναντι {{file2}}", - "fileTooLarge": "Το αρχείο είναι πολύ μεγάλο: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Η σύνδεση SSH απέτυχε. Ελέγξτε τη σύνδεσή σας με {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Αποτυχία φόρτωσης αρχείου: {{error}}", "connecting": "Συνδετικός...", @@ -365,7 +365,7 @@ "comfortableLayout": "Χρησιμοποιήστε άνετη διάταξη", "cannotLoadPdf": "Δεν είναι δυνατή η φόρτωση του PDF", "pdfLoadError": "Παρουσιάστηκε σφάλμα κατά τη φόρτωση αυτού του αρχείου PDF.", - "loadingPdf": "Φόρτωση PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Φόρτωση σελίδας...", "cancel": "Ματαίωση", "copiedItems_one": "Αντιγράφηκε {{count}} στοιχείο", @@ -383,7 +383,16 @@ "videoUnsupported": "Το πρόγραμμα περιήγησής σας δεν μπορεί να αναπαράγει αυτήν τη μορφή βίντεο.", "downloadToPlay": "Κατεβάστε το για να το παίξετε αλλού", "cannotPreviewType": "Δεν είναι δυνατή η προεπισκόπηση αυτού του τύπου αρχείου", - "cannotPreviewTypeHint": "Αυτός ο τύπος αρχείου δεν έχει προεπισκόπηση. Κατεβάστε το για να το ανοίξετε σε άλλη εφαρμογή." + "cannotPreviewTypeHint": "Αυτός ο τύπος αρχείου δεν έχει προεπισκόπηση. Κατεβάστε το για να το ανοίξετε σε άλλη εφαρμογή.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Πηγή → διακομιστής: {{throughput}}", "metricsHopDestSftpWrite": "Διακομιστής → προορισμός (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Διακομιστής → προορισμός (τοπικός): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/es_ES.json b/plugins/file-manager/locales/translated/es_ES.json index d9643f946..dd4036f6d 100644 --- a/plugins/file-manager/locales/translated/es_ES.json +++ b/plugins/file-manager/locales/translated/es_ES.json @@ -323,7 +323,7 @@ "sideBySide": "Lado a lado", "inline": "En línea", "fileComparison": "Comparación de archivos: {{file1}} vs {{file2}}", - "fileTooLarge": "Archivo demasiado grande: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Error de conexión SSH. Verifique su conexión a {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Error al cargar el archivo: {{error}}", "connecting": "Conectando...", @@ -365,7 +365,7 @@ "comfortableLayout": "Utilice una disposición cómoda", "cannotLoadPdf": "No se puede cargar el PDF", "pdfLoadError": "Se produjo un error al cargar este archivo PDF.", - "loadingPdf": "Cargando PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Cargando página...", "cancel": "Cancelar", "copiedItems_one": "Copiado {{count}} elemento", @@ -383,7 +383,16 @@ "videoUnsupported": "Tu navegador no puede reproducir este formato de vídeo.", "downloadToPlay": "Descárgalo para jugarlo en otro lugar.", "cannotPreviewType": "No se puede previsualizar este tipo de archivo.", - "cannotPreviewTypeHint": "Este tipo de archivo no tiene vista previa. Descárguelo para abrirlo en otra aplicación." + "cannotPreviewTypeHint": "Este tipo de archivo no tiene vista previa. Descárguelo para abrirlo en otra aplicación.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Origen → servidor: {{throughput}}", "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/fi_FI.json b/plugins/file-manager/locales/translated/fi_FI.json index 816a9e65a..5a01b1f22 100644 --- a/plugins/file-manager/locales/translated/fi_FI.json +++ b/plugins/file-manager/locales/translated/fi_FI.json @@ -323,7 +323,7 @@ "sideBySide": "Rinnakkain", "inline": "Rivissä", "fileComparison": "Tiedostovertailu: {{file1}} vs. {{file2}}", - "fileTooLarge": "Tiedosto liian suuri: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-yhteys epäonnistui. Tarkista yhteytesi kohteeseen {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Tiedoston lataus epäonnistui: {{error}}", "connecting": "Yhdistetään...", @@ -365,7 +365,7 @@ "comfortableLayout": "Käytä mukavaa asettelua", "cannotLoadPdf": "PDF-tiedoston lataaminen ei onnistu", "pdfLoadError": "PDF-tiedoston lataamisessa tapahtui virhe.", - "loadingPdf": "Ladataan PDF-tiedostoa...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Sivua ladataan...", "cancel": "Peruuttaa", "copiedItems_one": "Kopioitu {{count}} kohde", @@ -383,7 +383,16 @@ "videoUnsupported": "Selaimesi ei voi toistaa tätä videomuotoa.", "downloadToPlay": "Lataa toistaaksesi sen muualla", "cannotPreviewType": "Tätä tiedostotyyppiä ei voi esikatsella", - "cannotPreviewTypeHint": "Tällä tiedostotyypillä ei ole esikatselua. Lataa se avataksesi sen toisessa sovelluksessa." + "cannotPreviewTypeHint": "Tällä tiedostotyypillä ei ole esikatselua. Lataa se avataksesi sen toisessa sovelluksessa.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Lähde → palvelin: {{throughput}}", "metricsHopDestSftpWrite": "Palvelin → kohde (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Palvelin → kohde (paikallinen): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/fr_FR.json b/plugins/file-manager/locales/translated/fr_FR.json index 0b626a3ab..1e17d5155 100644 --- a/plugins/file-manager/locales/translated/fr_FR.json +++ b/plugins/file-manager/locales/translated/fr_FR.json @@ -323,7 +323,7 @@ "sideBySide": "Côte à côte", "inline": "En ligne", "fileComparison": "Comparaison de fichiers : {{file1}} vs {{file2}}", - "fileTooLarge": "Fichier trop volumineux : {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "La connexion SSH a échoué. Veuillez vérifier votre connexion à {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Impossible de charger le fichier : {{error}}", "connecting": "Connexion en cours...", @@ -365,7 +365,7 @@ "comfortableLayout": "Utilisez une disposition confortable", "cannotLoadPdf": "Impossible de charger le PDF", "pdfLoadError": "Une erreur s'est produite lors du chargement de ce fichier PDF.", - "loadingPdf": "Chargement du PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Chargement de la page...", "cancel": "Annuler", "copiedItems_one": "Élément copié {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Votre navigateur ne peut pas lire ce format vidéo.", "downloadToPlay": "Téléchargez-le pour y jouer ailleurs", "cannotPreviewType": "Impossible de prévisualiser ce type de fichier", - "cannotPreviewTypeHint": "Ce type de fichier ne possède pas d'aperçu. Téléchargez-le pour l'ouvrir dans une autre application." + "cannotPreviewTypeHint": "Ce type de fichier ne possède pas d'aperçu. Téléchargez-le pour l'ouvrir dans une autre application.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Source → serveur : {{throughput}}", "metricsHopDestSftpWrite": "Serveur → dest (SFTP) : {{throughput}}", "metricsHopDestLocalWrite": "Serveur → dest (local) : {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/he_IL.json b/plugins/file-manager/locales/translated/he_IL.json index 6a4bfe4db..373815ea4 100644 --- a/plugins/file-manager/locales/translated/he_IL.json +++ b/plugins/file-manager/locales/translated/he_IL.json @@ -323,7 +323,7 @@ "sideBySide": "זֶה בְּצַד זֶה", "inline": "מוטבע", "fileComparison": "השוואת קבצים: {{file1}} לעומת {{file2}}", - "fileTooLarge": "קובץ גדול מדי: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "חיבור SSH נכשל. אנא בדוק את החיבור שלך אל {{name}} ({{ip}}:{{port}})", "loadFileFailed": "טעינת הקובץ נכשלה: {{error}}", "connecting": "מְקַשֵׁר...", @@ -365,7 +365,7 @@ "comfortableLayout": "השתמש בפריסה נוחה", "cannotLoadPdf": "לא ניתן לטעון את ה-PDF", "pdfLoadError": "אירעה שגיאה בטעינת קובץ PDF זה.", - "loadingPdf": "טוען PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "טוען דף...", "cancel": "לְבַטֵל", "copiedItems_one": "פריט {{count}} הועתק", @@ -383,7 +383,16 @@ "videoUnsupported": "הדפדפן שלך לא יכול להפעיל פורמט וידאו זה.", "downloadToPlay": "הורד כדי להפעיל אותו במקום אחר", "cannotPreviewType": "לא ניתן להציג תצוגה מקדימה של סוג קובץ זה", - "cannotPreviewTypeHint": "לסוג קובץ זה אין תצוגה מקדימה. הורד אותו כדי לפתוח אותו באפליקציה אחרת." + "cannotPreviewTypeHint": "לסוג קובץ זה אין תצוגה מקדימה. הורד אותו כדי לפתוח אותו באפליקציה אחרת.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "מקור → שרת: {{throughput}}", "metricsHopDestSftpWrite": "שרת → יעד (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "שרת → יעד (מקומי): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/hi_IN.json b/plugins/file-manager/locales/translated/hi_IN.json index 0a346ed27..033ff3d62 100644 --- a/plugins/file-manager/locales/translated/hi_IN.json +++ b/plugins/file-manager/locales/translated/hi_IN.json @@ -323,7 +323,7 @@ "sideBySide": "साथ-साथ", "inline": "इनलाइन", "fileComparison": "फ़ाइल तुलना: {{file1}} बनाम {{file2}}", - "fileTooLarge": "फ़ाइल बहुत बड़ी है: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH कनेक्शन विफल। कृपया {{name}} ({{ip}}:{{port}}) से अपना कनेक्शन जाँचें।", "loadFileFailed": "फ़ाइल लोड करने में विफल: {{error}}", "connecting": "कनेक्ट हो रहा है...", @@ -365,7 +365,7 @@ "comfortableLayout": "सुविधाजनक लेआउट का उपयोग करें", "cannotLoadPdf": "PDF लोड नहीं कर सकता", "pdfLoadError": "इस PDF फ़ाइल को लोड करने में त्रुटि हुई।", - "loadingPdf": "PDF लोड हो रहा है...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "पृष्ठ लोड हो रहा है...", "cancel": "रद्द करें", "copiedItems_one": "आइटम कॉपी किया गया {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "आपका ब्राउज़र इस वीडियो प्रारूप को नहीं चला सकता।", "downloadToPlay": "इसे कहीं और खेलने के लिए डाउनलोड करें", "cannotPreviewType": "इस फ़ाइल प्रकार का पूर्वावलोकन नहीं किया जा सकता है", - "cannotPreviewTypeHint": "इस फ़ाइल प्रकार का कोई पूर्वावलोकन नहीं है। इसे डाउनलोड करके किसी अन्य ऐप में खोलें।" + "cannotPreviewTypeHint": "इस फ़ाइल प्रकार का कोई पूर्वावलोकन नहीं है। इसे डाउनलोड करके किसी अन्य ऐप में खोलें।", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "एसएफटीपी", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "स्रोत → सर्वर: {{throughput}}", "metricsHopDestSftpWrite": "सर्वर → गंतव्य (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "सर्वर → गंतव्य (स्थानीय): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/hu_HU.json b/plugins/file-manager/locales/translated/hu_HU.json index 505a543f0..b456afd5a 100644 --- a/plugins/file-manager/locales/translated/hu_HU.json +++ b/plugins/file-manager/locales/translated/hu_HU.json @@ -323,7 +323,7 @@ "sideBySide": "Egymás mellett", "inline": "Beágyazott", "fileComparison": "Fájl-összehasonlítás: {{file1}} vs {{file2}}", - "fileTooLarge": "A fájl túl nagy: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH kapcsolat sikertelen. Kérjük, ellenőrizze a kapcsolatot a következővel: {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Nem sikerült betölteni a fájlt: {{error}}", "connecting": "Kapcsolódás...", @@ -365,7 +365,7 @@ "comfortableLayout": "Használjon kényelmes elrendezést", "cannotLoadPdf": "Nem tudom betölteni a PDF-et", "pdfLoadError": "Hiba történt a PDF fájl betöltésekor.", - "loadingPdf": "PDF betöltése...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Oldal betöltése...", "cancel": "Mégsem", "copiedItems_one": "Másolt {{count}} elem", @@ -383,7 +383,16 @@ "videoUnsupported": "A böngésződ nem tudja lejátszani ezt a videóformátumot.", "downloadToPlay": "Töltsd le, hogy máshol is lejátszhasd", "cannotPreviewType": "Ez a fájltípus nem tekinthető meg előnézetben", - "cannotPreviewTypeHint": "Ennek a fájltípusnak nincs előnézete. Töltse le, hogy egy másik alkalmazásban megnyissa." + "cannotPreviewTypeHint": "Ennek a fájltípusnak nincs előnézete. Töltse le, hogy egy másik alkalmazásban megnyissa.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Forrás → szerver: {{throughput}}", "metricsHopDestSftpWrite": "Szerver → cél (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Szerver → cél (helyi): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/id_ID.json b/plugins/file-manager/locales/translated/id_ID.json index 713c6b40b..19e3a16f5 100644 --- a/plugins/file-manager/locales/translated/id_ID.json +++ b/plugins/file-manager/locales/translated/id_ID.json @@ -323,7 +323,7 @@ "sideBySide": "Berdampingan", "inline": "Sejajar", "fileComparison": "Perbandingan File: {{file1}} vs {{file2}}", - "fileTooLarge": "Ukuran file terlalu besar: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Koneksi SSH gagal. Harap periksa koneksi Anda ke {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Gagal memuat file: {{error}}", "connecting": "Menghubungkan...", @@ -365,7 +365,7 @@ "comfortableLayout": "Gunakan tata letak yang nyaman.", "cannotLoadPdf": "Tidak dapat memuat PDF", "pdfLoadError": "Terjadi kesalahan saat memuat file PDF ini.", - "loadingPdf": "Sedang memuat PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Sedang memuat halaman...", "cancel": "Membatalkan", "copiedItems_one": "Item {{count}} disalin", @@ -383,7 +383,16 @@ "videoUnsupported": "Browser Anda tidak dapat memutar format video ini.", "downloadToPlay": "Unduh untuk memainkannya di tempat lain", "cannotPreviewType": "Tidak dapat melihat pratinjau tipe file ini.", - "cannotPreviewTypeHint": "Jenis file ini tidak memiliki pratinjau. Unduh untuk membukanya di aplikasi lain." + "cannotPreviewTypeHint": "Jenis file ini tidak memiliki pratinjau. Unduh untuk membukanya di aplikasi lain.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Sumber → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → tujuan (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → tujuan (lokal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/it_IT.json b/plugins/file-manager/locales/translated/it_IT.json index 89c5cd031..08176d0ac 100644 --- a/plugins/file-manager/locales/translated/it_IT.json +++ b/plugins/file-manager/locales/translated/it_IT.json @@ -323,7 +323,7 @@ "sideBySide": "Fianco a fianco", "inline": "In linea", "fileComparison": "Confronto file: {{file1}} vs {{file2}}", - "fileTooLarge": "File troppo grande: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Connessione SSH non riuscita. Controlla la connessione a {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Caricamento del file non riuscito: {{error}}", "connecting": "Connessione in corso...", @@ -365,7 +365,7 @@ "comfortableLayout": "Utilizzare una disposizione comoda", "cannotLoadPdf": "Impossibile caricare il PDF", "pdfLoadError": "Si è verificato un errore durante il caricamento del file PDF.", - "loadingPdf": "Caricamento PDF in corso...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Caricamento pagina in corso...", "cancel": "Annulla", "copiedItems_one": "Elemento copiato {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Il tuo browser non è in grado di riprodurre questo formato video.", "downloadToPlay": "Scaricalo per riprodurlo altrove", "cannotPreviewType": "Impossibile visualizzare l'anteprima di questo tipo di file", - "cannotPreviewTypeHint": "Questo tipo di file non ha un'anteprima. Scaricalo per aprirlo in un'altra applicazione." + "cannotPreviewTypeHint": "Questo tipo di file non ha un'anteprima. Scaricalo per aprirlo in un'altra applicazione.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Sorgente → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → dest (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → dest (locale): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ja_JP.json b/plugins/file-manager/locales/translated/ja_JP.json index 866e59a80..c62f2995d 100644 --- a/plugins/file-manager/locales/translated/ja_JP.json +++ b/plugins/file-manager/locales/translated/ja_JP.json @@ -323,7 +323,7 @@ "sideBySide": "横並び表示", "inline": "インライン表示", "fileComparison": "ファイル比較: {{file1}} 対 {{file2}}", - "fileTooLarge": "ファイルが大きすぎます: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH接続に失敗しました。 {{name}} ({{ip}}:{{port}}) への接続を確認してください", "loadFileFailed": "ファイルの読み込みに失敗しました: {{error}}", "connecting": "接続中...", @@ -365,7 +365,7 @@ "comfortableLayout": "快適なレイアウトを使用する", "cannotLoadPdf": "PDFを読み込めません", "pdfLoadError": "このPDFファイルの読み込み中にエラーが発生しました。", - "loadingPdf": "PDFを読み込み中...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "ページを読み込み中...", "cancel": "キャンセル", "copiedItems_one": "{{count}} アイテムをコピーしました", @@ -383,7 +383,16 @@ "videoUnsupported": "お使いのブラウザはこの動画フォーマットを再生できません。", "downloadToPlay": "他の場所でプレイするにはダウンロードしてください", "cannotPreviewType": "このファイルタイプはプレビューできません", - "cannotPreviewTypeHint": "このファイル形式にはプレビュー機能がありません。ダウンロードして別のアプリで開いてください。" + "cannotPreviewTypeHint": "このファイル形式にはプレビュー機能がありません。ダウンロードして別のアプリで開いてください。", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "送信元 → サーバー: {{throughput}}", "metricsHopDestSftpWrite": "サーバー → 送信先 (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "サーバー → 送信先 (ローカル): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ko_KR.json b/plugins/file-manager/locales/translated/ko_KR.json index c116858b5..f71fce882 100644 --- a/plugins/file-manager/locales/translated/ko_KR.json +++ b/plugins/file-manager/locales/translated/ko_KR.json @@ -323,7 +323,7 @@ "sideBySide": "나란히 보기", "inline": "인라인", "fileComparison": "파일 비교: {{file1}} vs {{file2}}", - "fileTooLarge": "파일이 너무 큽니다: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH 연결 실패. {{name}}({{ip}}:{{port}})에 대한 연결을 확인하세요.", "loadFileFailed": "파일 불러오기 실패: {{error}}", "connecting": "연결 중...", @@ -365,7 +365,7 @@ "comfortableLayout": "편안한 레이아웃을 사용하세요", "cannotLoadPdf": "PDF를 로드할 수 없습니다", "pdfLoadError": "이 PDF 파일을 로드하는 중 오류가 발생했습니다.", - "loadingPdf": "PDF 로드 중...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "페이지 로드 중...", "cancel": "취소", "copiedItems_one": "복사됨 {{count}} 항목", @@ -383,7 +383,16 @@ "videoUnsupported": "현재 사용 중인 브라우저는 이 비디오 형식을 재생할 수 없습니다.", "downloadToPlay": "다운로드하여 다른 곳에서 재생하세요.", "cannotPreviewType": "이 파일 형식을 미리 볼 수 없습니다.", - "cannotPreviewTypeHint": "이 파일 형식은 미리보기를 지원하지 않습니다. 다운로드하여 다른 앱에서 열어보세요." + "cannotPreviewTypeHint": "이 파일 형식은 미리보기를 지원하지 않습니다. 다운로드하여 다른 앱에서 열어보세요.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "소스 → 서버: {{throughput}}", "metricsHopDestSftpWrite": "서버 → 목적지 (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "서버 → 목적지 (로컬): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/nl_NL.json b/plugins/file-manager/locales/translated/nl_NL.json index ce88a0ed9..7b17fcf67 100644 --- a/plugins/file-manager/locales/translated/nl_NL.json +++ b/plugins/file-manager/locales/translated/nl_NL.json @@ -323,7 +323,7 @@ "sideBySide": "Naast elkaar", "inline": "Inline", "fileComparison": "Bestandsvergelijking: {{file1}} versus {{file2}}", - "fileTooLarge": "Bestand te groot: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-verbinding mislukt. Controleer uw verbinding met {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Bestand laden mislukt: {{error}}", "connecting": "Verbinden...", @@ -365,7 +365,7 @@ "comfortableLayout": "Gebruik een comfortabele lay-out.", "cannotLoadPdf": "Kan PDF niet laden", "pdfLoadError": "Er is een fout opgetreden bij het laden van dit PDF-bestand.", - "loadingPdf": "PDF laden...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Pagina laden...", "cancel": "Annuleren", "copiedItems_one": "Gekopieerd {{count}} item", @@ -383,7 +383,16 @@ "videoUnsupported": "Uw browser kan dit videoformaat niet afspelen.", "downloadToPlay": "Download het om het elders te spelen.", "cannotPreviewType": "Kan dit bestandstype niet bekijken.", - "cannotPreviewTypeHint": "Dit bestandstype heeft geen voorbeeldweergave. Download het om het in een andere app te openen." + "cannotPreviewTypeHint": "Dit bestandstype heeft geen voorbeeldweergave. Download het om het in een andere app te openen.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Bron → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → bestemming (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → bestemming (lokaal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/no_NO.json b/plugins/file-manager/locales/translated/no_NO.json index e4f137e1a..7644de1c9 100644 --- a/plugins/file-manager/locales/translated/no_NO.json +++ b/plugins/file-manager/locales/translated/no_NO.json @@ -323,7 +323,7 @@ "sideBySide": "Side om side", "inline": "Innebygd", "fileComparison": "Filsammenligning: {{file1}} vs {{file2}}", - "fileTooLarge": "Fil for stor: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-tilkobling mislyktes. Kontroller tilkoblingen til {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Kunne ikke laste fil: {{error}}", "connecting": "Kobler til...", @@ -365,7 +365,7 @@ "comfortableLayout": "Bruk komfortabel layout", "cannotLoadPdf": "Kan ikke laste inn PDF-filen", "pdfLoadError": "Det oppsto en feil under lasting av denne PDF-filen.", - "loadingPdf": "Laster inn PDF-filen...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Laster inn side...", "cancel": "Avbryt", "copiedItems_one": "Kopierte {{count}} element", @@ -383,7 +383,16 @@ "videoUnsupported": "Nettleseren din kan ikke spille av dette videoformatet.", "downloadToPlay": "Last ned for å spille det et annet sted", "cannotPreviewType": "Kan ikke forhåndsvise denne filtypen", - "cannotPreviewTypeHint": "Denne filtypen har ingen forhåndsvisning. Last den ned for å åpne den i en annen app." + "cannotPreviewTypeHint": "Denne filtypen har ingen forhåndsvisning. Last den ned for å åpne den i en annen app.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Kilde → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → destinasjon (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → dest (lokal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/pl_PL.json b/plugins/file-manager/locales/translated/pl_PL.json index c47ad20fe..e576da60e 100644 --- a/plugins/file-manager/locales/translated/pl_PL.json +++ b/plugins/file-manager/locales/translated/pl_PL.json @@ -323,7 +323,7 @@ "sideBySide": "Obok siebie", "inline": "W linii", "fileComparison": "Porównanie plików: {{file1}} vs {{file2}}", - "fileTooLarge": "Plik jest za duży: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Połączenie SSH nie powiodło się. Sprawdź połączenie z {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Nie udało się załadować pliku: {{error}}", "connecting": "Łączenie...", @@ -365,7 +365,7 @@ "comfortableLayout": "Użyj wygodnego układu", "cannotLoadPdf": "Nie można załadować pliku PDF", "pdfLoadError": "Wystąpił błąd podczas ładowania pliku PDF.", - "loadingPdf": "Ładowanie pliku PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Ładowanie strony...", "cancel": "Anuluj", "copiedItems_one": "Skopiowano element {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Twoja przeglądarka nie może odtworzyć tego formatu wideo.", "downloadToPlay": "Pobierz, aby odtworzyć w innym miejscu", "cannotPreviewType": "Nie można wyświetlić podglądu tego typu pliku", - "cannotPreviewTypeHint": "Ten typ pliku nie ma podglądu. Pobierz go, aby otworzyć w innej aplikacji." + "cannotPreviewTypeHint": "Ten typ pliku nie ma podglądu. Pobierz go, aby otworzyć w innej aplikacji.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Źródło → serwer: {{throughput}}", "metricsHopDestSftpWrite": "Serwer → cel (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Serwer → cel (lokalny): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/pt_BR.json b/plugins/file-manager/locales/translated/pt_BR.json index 95eaf7b4f..d639c1b19 100644 --- a/plugins/file-manager/locales/translated/pt_BR.json +++ b/plugins/file-manager/locales/translated/pt_BR.json @@ -323,7 +323,7 @@ "sideBySide": "Lado a lado", "inline": "Em linha", "fileComparison": "Comparação de arquivos: {{file1}} vs {{file2}}", - "fileTooLarge": "Arquivo muito grande: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "A conexão SSH falhou. Verifique sua conexão com {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Falha ao carregar o arquivo: {{error}}", "connecting": "Conectando...", @@ -365,7 +365,7 @@ "comfortableLayout": "Use um layout confortável", "cannotLoadPdf": "Não foi possível carregar o PDF.", "pdfLoadError": "Ocorreu um erro ao carregar este arquivo PDF.", - "loadingPdf": "Carregando PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Carregando página...", "cancel": "Cancelar", "copiedItems_one": "Item copiado {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Seu navegador não consegue reproduzir este formato de vídeo.", "downloadToPlay": "Faça o download para jogar em outro lugar.", "cannotPreviewType": "Não é possível visualizar este tipo de arquivo.", - "cannotPreviewTypeHint": "Este tipo de arquivo não possui pré-visualização. Faça o download para abri-lo em outro aplicativo." + "cannotPreviewTypeHint": "Este tipo de arquivo não possui pré-visualização. Faça o download para abri-lo em outro aplicativo.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Origem → servidor: {{throughput}}", "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/pt_PT.json b/plugins/file-manager/locales/translated/pt_PT.json index b62e74de5..a584bb5c9 100644 --- a/plugins/file-manager/locales/translated/pt_PT.json +++ b/plugins/file-manager/locales/translated/pt_PT.json @@ -323,7 +323,7 @@ "sideBySide": "Lado a lado", "inline": "Em linha", "fileComparison": "Comparação de ficheiros: {{file1}} vs {{file2}}", - "fileTooLarge": "Ficheiro demasiado grande: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Falha na ligação SSH. Verifique a sua ligação a {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Falha ao carregar ficheiro: {{error}}", "connecting": "A ligar...", @@ -365,7 +365,7 @@ "comfortableLayout": "Utilize um layout confortável", "cannotLoadPdf": "Não é possível carregar o PDF", "pdfLoadError": "Ocorreu um erro ao carregar este ficheiro PDF.", - "loadingPdf": "A carregar PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "A carregar página...", "cancel": "Cancelar", "copiedItems_one": "Item copiado {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "O seu navegador não consegue reproduzir este formato de vídeo.", "downloadToPlay": "Faça o download para jogar noutro local.", "cannotPreviewType": "Não é possível visualizar este tipo de ficheiro.", - "cannotPreviewTypeHint": "Este tipo de ficheiro não possui pré-visualização. Faça o download para abri-lo noutra aplicação." + "cannotPreviewTypeHint": "Este tipo de ficheiro não possui pré-visualização. Faça o download para abri-lo noutra aplicação.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Origem → servidor: {{throughput}}", "metricsHopDestSftpWrite": "Servidor → destino (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Servidor → destino (local): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ro_RO.json b/plugins/file-manager/locales/translated/ro_RO.json index b6233bd42..4ec35cc92 100644 --- a/plugins/file-manager/locales/translated/ro_RO.json +++ b/plugins/file-manager/locales/translated/ro_RO.json @@ -323,7 +323,7 @@ "sideBySide": "Alăturat", "inline": "În linie", "fileComparison": "Comparație fișiere: {{file1}} vs {{file2}}", - "fileTooLarge": "Fișier prea mare: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Conexiunea SSH a eșuat. Vă rugăm să verificați conexiunea la {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Nu s-a putut încărca fișierul: {{error}}", "connecting": "Se conectează...", @@ -365,7 +365,7 @@ "comfortableLayout": "Folosește un aspect confortabil", "cannotLoadPdf": "Nu se poate încărca PDF-ul", "pdfLoadError": "A apărut o eroare la încărcarea acestui fișier PDF.", - "loadingPdf": "Se încarcă PDF-ul...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Se încarcă pagina...", "cancel": "Anula", "copiedItems_one": "Elementul {{count}} a fost copiat", @@ -383,7 +383,16 @@ "videoUnsupported": "Browserul dvs. nu poate reda acest format video.", "downloadToPlay": "Descarcă pentru a-l reda în altă parte", "cannotPreviewType": "Nu se poate previzualiza acest tip de fișier", - "cannotPreviewTypeHint": "Acest tip de fișier nu are previzualizare. Descărcați-l pentru a-l deschide în altă aplicație." + "cannotPreviewTypeHint": "Acest tip de fișier nu are previzualizare. Descărcați-l pentru a-l deschide în altă aplicație.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Sursă → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → destinație (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → destinație (locală): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/ru_RU.json b/plugins/file-manager/locales/translated/ru_RU.json index 1a43999fc..caab155a8 100644 --- a/plugins/file-manager/locales/translated/ru_RU.json +++ b/plugins/file-manager/locales/translated/ru_RU.json @@ -323,7 +323,7 @@ "sideBySide": "Бок о бок", "inline": "Встроенный", "fileComparison": "Сравнение файлов: {{file1}} и {{file2}}", - "fileTooLarge": "Файл слишком большой: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Ошибка SSH-подключения. Проверьте подключение к {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Не удалось загрузить файл: {{error}}", "connecting": "Подключение...", @@ -365,7 +365,7 @@ "comfortableLayout": "Используйте удобную планировку", "cannotLoadPdf": "Не удаётся загрузить PDF", "pdfLoadError": "Ошибка при загрузке этого PDF-файла.", - "loadingPdf": "Загрузка PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Загрузка страницы...", "cancel": "Отмена", "copiedItems_one": "Скопировано {{count}} элемент", @@ -383,7 +383,16 @@ "videoUnsupported": "Ваш браузер не может воспроизвести этот видеоформат.", "downloadToPlay": "Скачайте, чтобы играть в другом месте.", "cannotPreviewType": "Предварительный просмотр файла этого типа невозможен.", - "cannotPreviewTypeHint": "Для этого типа файла предварительный просмотр недоступен. Скачайте его, чтобы открыть в другом приложении." + "cannotPreviewTypeHint": "Для этого типа файла предварительный просмотр недоступен. Скачайте его, чтобы открыть в другом приложении.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Источник → сервер: {{throughput}}", "metricsHopDestSftpWrite": "Сервер → назначение (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Сервер → назначение (локально): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/sr_SP.json b/plugins/file-manager/locales/translated/sr_SP.json index 23fff2739..272901a5c 100644 --- a/plugins/file-manager/locales/translated/sr_SP.json +++ b/plugins/file-manager/locales/translated/sr_SP.json @@ -323,7 +323,7 @@ "sideBySide": "Један поред другог", "inline": "Уграђено", "fileComparison": "Поређење датотека: {{file1}} наспрам {{file2}}", - "fileTooLarge": "Датотека је превелика: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH веза није успела. Молимо вас да проверите везу са {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Није успело учитавање датотеке: {{error}}", "connecting": "Повезивање...", @@ -365,7 +365,7 @@ "comfortableLayout": "Користите удобан распоред", "cannotLoadPdf": "Није могуће учитати PDF", "pdfLoadError": "Дошло је до грешке при учитавању ове PDF датотеке.", - "loadingPdf": "Учитавање PDF-а...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Учитавање странице...", "cancel": "Откажи", "copiedItems_one": "Копирана ставка {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Ваш прегледач не може да репродукује овај видео формат.", "downloadToPlay": "Преузмите да бисте је репродуковали негде другде", "cannotPreviewType": "Не могу да прегледам овај тип датотеке", - "cannotPreviewTypeHint": "Овај тип датотеке нема преглед. Преузмите је да бисте је отворили у другој апликацији." + "cannotPreviewTypeHint": "Овај тип датотеке нема преглед. Преузмите је да бисте је отворили у другој апликацији.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "СФТП", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Извор → сервер: {{throughput}}", "metricsHopDestSftpWrite": "Сервер → одредиште (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Сервер → одредиште (локално): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/sv_SE.json b/plugins/file-manager/locales/translated/sv_SE.json index b1b207a27..365cb99db 100644 --- a/plugins/file-manager/locales/translated/sv_SE.json +++ b/plugins/file-manager/locales/translated/sv_SE.json @@ -323,7 +323,7 @@ "sideBySide": "Sida vid sida", "inline": "Inline", "fileComparison": "Filjämförelse: {{file1}} vs {{file2}}", - "fileTooLarge": "Filen är för stor: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH-anslutningen misslyckades. Kontrollera din anslutning till {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Misslyckades med att ladda filen: {{error}}", "connecting": "Ansluter...", @@ -365,7 +365,7 @@ "comfortableLayout": "Använd bekväm layout", "cannotLoadPdf": "Kan inte ladda PDF-filen", "pdfLoadError": "Det uppstod ett fel när PDF-filen laddades.", - "loadingPdf": "Laddar PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Laddar sida...", "cancel": "Avboka", "copiedItems_one": "Kopierade {{count}} objekt", @@ -383,7 +383,16 @@ "videoUnsupported": "Din webbläsare kan inte spela upp det här videoformatet.", "downloadToPlay": "Ladda ner för att spela det någon annanstans", "cannotPreviewType": "Det går inte att förhandsgranska den här filtypen", - "cannotPreviewTypeHint": "Den här filtypen har ingen förhandsgranskning. Ladda ner den för att öppna den i en annan app." + "cannotPreviewTypeHint": "Den här filtypen har ingen förhandsgranskning. Ladda ner den för att öppna den i en annan app.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Källa → server: {{throughput}}", "metricsHopDestSftpWrite": "Server → destination (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Server → destination (lokal): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/th_TH.json b/plugins/file-manager/locales/translated/th_TH.json index 627a53c0b..bb2b2d8a3 100644 --- a/plugins/file-manager/locales/translated/th_TH.json +++ b/plugins/file-manager/locales/translated/th_TH.json @@ -323,7 +323,7 @@ "sideBySide": "เคียงข้างกัน", "inline": "อินไลน์", "fileComparison": "การเปรียบเทียบไฟล์: {{file1}} กับ {{file2}}", - "fileTooLarge": "ไฟล์มีขนาดใหญ่เกินไป: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "การเชื่อมต่อ SSH ล้มเหลว โปรดตรวจสอบการเชื่อมต่อของคุณกับ {{name}} ({{ip}}:{{port}})", "loadFileFailed": "ไม่สามารถโหลดไฟล์ได้: {{error}}", "connecting": "กำลังเชื่อมต่อ...", @@ -365,7 +365,7 @@ "comfortableLayout": "ใช้รูปแบบการจัดวางที่สะดวกสบาย", "cannotLoadPdf": "ไม่สามารถโหลดไฟล์ PDF ได้", "pdfLoadError": "เกิดข้อผิดพลาดในการโหลดไฟล์ PDF นี้", - "loadingPdf": "กำลังโหลดไฟล์ PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "กำลังโหลดหน้าเว็บ...", "cancel": "ยกเลิก", "copiedItems_one": "คัดลอกรายการ {{count}} แล้ว", @@ -383,7 +383,16 @@ "videoUnsupported": "เบราว์เซอร์ของคุณไม่สามารถเล่นวิดีโอรูปแบบนี้ได้", "downloadToPlay": "ดาวน์โหลดเพื่อเล่นที่อื่น", "cannotPreviewType": "ไม่สามารถแสดงตัวอย่างไฟล์ประเภทนี้ได้", - "cannotPreviewTypeHint": "ไฟล์ประเภทนี้ไม่มีตัวอย่างให้ดู ดาวน์โหลดเพื่อเปิดในแอปพลิเคชันอื่น" + "cannotPreviewTypeHint": "ไฟล์ประเภทนี้ไม่มีตัวอย่างให้ดู ดาวน์โหลดเพื่อเปิดในแอปพลิเคชันอื่น", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "เอสเอฟทีพี", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "แหล่งที่มา → เซิร์ฟเวอร์: {{throughput}}", "metricsHopDestSftpWrite": "เซิร์ฟเวอร์ → ปลายทาง (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "เซิร์ฟเวอร์ → ปลายทาง (ภายในเครื่อง): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/tr_TR.json b/plugins/file-manager/locales/translated/tr_TR.json index a69bb2d64..242c53113 100644 --- a/plugins/file-manager/locales/translated/tr_TR.json +++ b/plugins/file-manager/locales/translated/tr_TR.json @@ -323,7 +323,7 @@ "sideBySide": "Yan Yana", "inline": "Satır İçi", "fileComparison": "Dosya Karşılaştırması: {{file1}} vs {{file2}}", - "fileTooLarge": "Dosya çok büyük: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH bağlantısı başarısız oldu. Lütfen {{name}} ({{ip}}:{{port}}) ile bağlantınızı kontrol edin", "loadFileFailed": "Dosya yüklenemedi: {{error}}", "connecting": "Bağlanıyor...", @@ -365,7 +365,7 @@ "comfortableLayout": "Rahat bir düzen kullanın.", "cannotLoadPdf": "PDF yüklenemiyor", "pdfLoadError": "Bu PDF dosyası yüklenirken bir hata oluştu.", - "loadingPdf": "PDF yükleniyor...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Sayfa yükleniyor...", "cancel": "İptal", "copiedItems_one": "Kopyalanan {{count}} öğe", @@ -383,7 +383,16 @@ "videoUnsupported": "Tarayıcınız bu video formatını oynatamıyor.", "downloadToPlay": "Başka yerde oynamak için indirin", "cannotPreviewType": "Bu dosya türünün önizlemesi yapılamıyor.", - "cannotPreviewTypeHint": "Bu dosya türünün önizlemesi yok. Başka bir uygulamada açmak için indirin." + "cannotPreviewTypeHint": "Bu dosya türünün önizlemesi yok. Başka bir uygulamada açmak için indirin.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Kaynak → sunucu: {{throughput}}", "metricsHopDestSftpWrite": "Sunucu → hedef (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Sunucu → hedef (yerel): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/uk_UA.json b/plugins/file-manager/locales/translated/uk_UA.json index a656b8f25..917e65102 100644 --- a/plugins/file-manager/locales/translated/uk_UA.json +++ b/plugins/file-manager/locales/translated/uk_UA.json @@ -323,7 +323,7 @@ "sideBySide": "Пліч-о-пліч", "inline": "Вбудований", "fileComparison": "Порівняння файлів: {{file1}} проти {{file2}}", - "fileTooLarge": "Файл занадто великий: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Помилка SSH-з’єднання. Будь ласка, перевірте ваше з’єднання з {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Не вдалося завантажити файл: {{error}}", "connecting": "Підключення...", @@ -365,7 +365,7 @@ "comfortableLayout": "Використовуйте зручний макет", "cannotLoadPdf": "Не вдається завантажити PDF", "pdfLoadError": "Під час завантаження цього PDF-файлу сталася помилка.", - "loadingPdf": "Завантаження PDF-файлу...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Завантаження сторінки...", "cancel": "Скасувати", "copiedItems_one": "Скопійовано елемент {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Ваш браузер не може відтворити цей відеоформат.", "downloadToPlay": "Завантажте, щоб відтворити деінде", "cannotPreviewType": "Неможливо переглянути цей тип файлу", - "cannotPreviewTypeHint": "Цей тип файлу не має попереднього перегляду. Завантажте його, щоб відкрити в іншій програмі." + "cannotPreviewTypeHint": "Цей тип файлу не має попереднього перегляду. Завантажте його, щоб відкрити в іншій програмі.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Джерело → сервер: {{throughput}}", "metricsHopDestSftpWrite": "Сервер → призначення (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Сервер → призначення (локальний): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/vi_VN.json b/plugins/file-manager/locales/translated/vi_VN.json index b86279b53..83912eb68 100644 --- a/plugins/file-manager/locales/translated/vi_VN.json +++ b/plugins/file-manager/locales/translated/vi_VN.json @@ -323,7 +323,7 @@ "sideBySide": "Song song", "inline": "Trong dòng", "fileComparison": "So sánh tệp: {{file1}} vs {{file2}}", - "fileTooLarge": "Tệp quá lớn: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "Kết nối SSH thất bại. Vui lòng kiểm tra kết nối tới {{name}} ({{ip}}:{{port}})", "loadFileFailed": "Không thể tải tệp: {{error}}", "connecting": "Đang kết nối...", @@ -365,7 +365,7 @@ "comfortableLayout": "Sử dụng bố cục thoải mái", "cannotLoadPdf": "Không thể tải PDF", "pdfLoadError": "Đã xảy ra lỗi khi tải tệp PDF này.", - "loadingPdf": "Đang tải PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "Đang tải trang...", "cancel": "Hủy", "copiedItems_one": "Đã sao chép mục {{count}}", @@ -383,7 +383,16 @@ "videoUnsupported": "Trình duyệt của bạn không thể phát định dạng video này.", "downloadToPlay": "Tải xuống để chơi ở nơi khác", "cannotPreviewType": "Không thể xem trước loại tệp này", - "cannotPreviewTypeHint": "Loại tệp này không có bản xem trước. Hãy tải xuống để mở bằng ứng dụng khác." + "cannotPreviewTypeHint": "Loại tệp này không có bản xem trước. Hãy tải xuống để mở bằng ứng dụng khác.", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "Nguồn → máy chủ: {{throughput}}", "metricsHopDestSftpWrite": "Máy chủ → đích (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "Máy chủ → đích (cục bộ): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/zh_CN.json b/plugins/file-manager/locales/translated/zh_CN.json index 58235b9ce..e69cd6f2f 100644 --- a/plugins/file-manager/locales/translated/zh_CN.json +++ b/plugins/file-manager/locales/translated/zh_CN.json @@ -323,7 +323,7 @@ "sideBySide": "并排", "inline": "内联", "fileComparison": "文件比较: {{file1}} 对比 {{file2}}", - "fileTooLarge": "文件过大: {{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH 连接失败。请检查您到 {{name}} ({{ip}}:{{port}}) 的连接", "loadFileFailed": "加载文件失败: {{error}}", "connecting": "连接中...", @@ -365,7 +365,7 @@ "comfortableLayout": "采用舒适的布局", "cannotLoadPdf": "无法加载 PDF", "pdfLoadError": "加载此 PDF 文件时出错。", - "loadingPdf": "正在加载 PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "正在加载页面...", "cancel": "取消", "copiedItems_one": "已复制 {{count}} 项目", @@ -383,7 +383,16 @@ "videoUnsupported": "您的浏览器无法播放此视频格式。", "downloadToPlay": "下载后即可在其他地方播放", "cannotPreviewType": "无法预览此文件类型", - "cannotPreviewTypeHint": "此文件类型没有预览。请下载后在其他应用程序中打开。" + "cannotPreviewTypeHint": "此文件类型没有预览。请下载后在其他应用程序中打开。", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "源 → 服务器:{{throughput}}", "metricsHopDestSftpWrite": "服务器 → 目标 (SFTP):{{throughput}}", "metricsHopDestLocalWrite": "服务器 → 目标 (本地):{{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/locales/translated/zh_TW.json b/plugins/file-manager/locales/translated/zh_TW.json index 6b96895e6..c126c8b88 100644 --- a/plugins/file-manager/locales/translated/zh_TW.json +++ b/plugins/file-manager/locales/translated/zh_TW.json @@ -323,7 +323,7 @@ "sideBySide": "並排", "inline": "內嵌", "fileComparison": "檔案比對:{{file1}} vs {{file2}}", - "fileTooLarge": "檔案過大:{{error}}", + "fileTooLarge": "File is too large (> 10MB) and cannot be opened as text for security reasons.", "sshConnectionFailed": "SSH 連線失敗。請檢查與 {{name}} ({{ip}}:{{port}}) 的連線", "loadFileFailed": "載入檔案失敗:{{error}}", "connecting": "連線中...", @@ -365,7 +365,7 @@ "comfortableLayout": "採用舒適的佈局", "cannotLoadPdf": "無法載入 PDF", "pdfLoadError": "載入此 PDF 檔案時發生錯誤。", - "loadingPdf": "正在載入 PDF...", + "loadingPdf": "Loading PDF viewer...", "loadingPage": "正在載入頁面...", "cancel": "取消", "copiedItems_one": "已複製 {{count}} 項目", @@ -383,7 +383,16 @@ "videoUnsupported": "您的瀏覽器無法播放此影片格式。", "downloadToPlay": "下載後即可在其他地方播放", "cannotPreviewType": "無法預覽此文件類型", - "cannotPreviewTypeHint": "此文件類型沒有預覽。請下載後在其他應用程式中開啟。" + "cannotPreviewTypeHint": "此文件類型沒有預覽。請下載後在其他應用程式中開啟。", + "loadingFile": "Loading file...", + "loadingImage": "Loading image...", + "loadingEditor": "Loading editor...", + "loadingPreview": "Loading preview...", + "loadingAudio": "Loading audio player...", + "emptyPreview": "Nothing to preview yet...", + "revert": "Revert", + "openAsText": "Open as Text", + "confirmOpenAsText": "Do you want to continue opening this file as text? This may slow down your browser." }, "sftpTransfer": { "title": "SFTP", @@ -539,5 +548,8 @@ "metricsHopSourceRead": "來源主機 → 伺服器: {{throughput}}", "metricsHopDestSftpWrite": "伺服器 → 目標主機 (SFTP): {{throughput}}", "metricsHopDestLocalWrite": "伺服器 → 目標主機 (本機): {{throughput}}" + }, + "plugin": { + "name": "File Manager" } } diff --git a/plugins/file-manager/src/backend/operation-routes.ts b/plugins/file-manager/src/backend/operation-routes.ts index 19fd1fa05..b2a3edc38 100644 --- a/plugins/file-manager/src/backend/operation-routes.ts +++ b/plugins/file-manager/src/backend/operation-routes.ts @@ -1,5 +1,6 @@ import type { Express, Request, Response } from "express"; import type { PluginContext } from "@termix/plugin-sdk/backend"; +import type { SFTPWrapper } from "ssh2"; import { execChannel, execWithSudo, @@ -24,6 +25,8 @@ type FileOperationRoutesDeps = { const TRASH_RETENTION_DAYS_KEY = "trashRetentionDays"; +const TRASH_PURGE_INTERVAL_MS = 60 * 60 * 1000; + export function registerFileOperationRoutes( app: Express, { ctx, sshSessions, verifySessionOwnership }: FileOperationRoutesDeps, @@ -39,6 +42,22 @@ export function registerFileOperationRoutes( } }; + // Deleting used to purge expired trash first, reading every trash entry + // before answering. Do it after the response, at most hourly per session. + const lastPurge = new WeakMap(); + const purgeExpiredTrash = (session: SSHSession, sftp: SFTPWrapper) => { + const now = Date.now(); + if (now - (lastPurge.get(session) ?? 0) < TRASH_PURGE_INTERVAL_MS) return; + lastPurge.set(session, now); + void getTrashRetentionDays() + .then((days) => listTrash(sftp, days)) + .catch((error) => + ctx.log.warn( + `Could not purge expired trash: ${(error as Error).message}`, + ), + ); + }; + async function ownedSession( req: Request, res: Response, @@ -494,9 +513,8 @@ export function registerFileOperationRoutes( if (!permanent) { try { const sftp = await getSessionSftp(sshConn); - const retentionDays = await getTrashRetentionDays(); - await listTrash(sftp, retentionDays); const item = await moveToTrash(sftp, itemPath); + purgeExpiredTrash(sshConn, sftp); ctx.log.info( `Item moved to trash: ${sessionId} (${itemPath}, trashId=${item.id})`, ); diff --git a/plugins/file-manager/src/backend/trash-service.ts b/plugins/file-manager/src/backend/trash-service.ts index 6b0705df4..bf09e8e66 100644 --- a/plugins/file-manager/src/backend/trash-service.ts +++ b/plugins/file-manager/src/backend/trash-service.ts @@ -70,6 +70,8 @@ async function exists(sftp: SFTPWrapper, target: string) { } async function ensureDirectory(sftp: SFTPWrapper, target: string) { + // Usually there already: one round trip instead of one per segment. + if (await exists(sftp, target)) return; const normalized = target.replace(/\\/g, "/"); const root = normalized.startsWith("/") ? "/" : ""; const parts = normalized.split("/").filter(Boolean); @@ -95,13 +97,32 @@ async function removeTree(sftp: SFTPWrapper, target: string): Promise { await rmdir(sftp, target); } -async function trashPaths(sftp: SFTPWrapper) { +type TrashDirs = { root: string; files: string; info: string }; + +// The trash folders of a channel do not move while it is open, and finding +// them costs several round trips, which made every delete slow on a remote +// host (#1390). +const trashDirsByChannel = new WeakMap>(); + +function trashPaths(sftp: SFTPWrapper): Promise { + let dirs = trashDirsByChannel.get(sftp); + if (!dirs) { + dirs = findTrashPaths(sftp); + trashDirsByChannel.set(sftp, dirs); + dirs.catch(() => trashDirsByChannel.delete(sftp)); + } + return dirs; +} + +async function findTrashPaths(sftp: SFTPWrapper): Promise { const home = await call((done) => sftp.realpath(".", done)); const root = path.posix.join(home.replace(/\\/g, "/"), TRASH_DIR); const files = path.posix.join(root, "files"); const info = path.posix.join(root, "info"); - await ensureDirectory(sftp, files); - await ensureDirectory(sftp, info); + await Promise.all([ + ensureDirectory(sftp, files), + ensureDirectory(sftp, info), + ]); return { root, files, info }; } @@ -124,7 +145,7 @@ function publicItem(item: StoredTrashItem): TrashItem { async function readStoredItem( sftp: SFTPWrapper, - dirs: { root: string; files: string; info: string }, + dirs: TrashDirs, id: string, ): Promise { if (!ID_PATTERN.test(id)) throw new Error("Invalid trash item id"); diff --git a/plugins/file-manager/src/frontend/FileManager.tsx b/plugins/file-manager/src/frontend/FileManager.tsx index c234717ac..9d10f5ff9 100644 --- a/plugins/file-manager/src/frontend/FileManager.tsx +++ b/plugins/file-manager/src/frontend/FileManager.tsx @@ -1416,10 +1416,13 @@ function FileManagerContent({ const { downloadSSHFileStream } = await import("./api/ssh-file-operations-api"); - toast.loading(, { - id: toastId, - duration: Infinity, - }); + toast.loading( + , + { + id: toastId, + duration: Infinity, + }, + ); await downloadSSHFileStream( sshSessionId, @@ -1438,6 +1441,7 @@ function FileManagerContent({ toast.loading( { const toastId = toast.loading( - , + , { duration: Infinity }, ); try { @@ -145,6 +145,7 @@ export function DiffViewer({ ({ loaded, total }) => { toast.loading( 0 ? Math.min(100, Math.round((loaded / total) * 100)) diff --git a/plugins/file-manager/src/frontend/components/FileViewer.tsx b/plugins/file-manager/src/frontend/components/FileViewer.tsx index edca6e27f..3d0d1e685 100644 --- a/plugins/file-manager/src/frontend/components/FileViewer.tsx +++ b/plugins/file-manager/src/frontend/components/FileViewer.tsx @@ -350,7 +350,9 @@ export function FileViewer({
-

Loading file...

+

+ {t("fileManager.loadingFile")} +

); @@ -446,7 +448,7 @@ export function FileViewer({ className="flex items-center gap-2" > - Revert + {t("fileManager.revert")} )} @@ -647,14 +649,12 @@ export function FileViewer({ {isTooLarge ? (

- File is too large (> 10MB) and cannot be opened as - text for security reasons. + {t("fileManager.fileTooLarge")}

) : (

- Do you want to continue opening this file as text? This - may slow down your browser. + {t("fileManager.confirmOpenAsText")}

)} @@ -669,7 +669,7 @@ export function FileViewer({ className="flex items-center gap-2" > - Open as Text + {t("fileManager.openAsText")} )} @@ -694,7 +694,9 @@ export function FileViewer({ )} {fileTypeInfo.type === "image" && !showLargeFileWarning && ( - }> + } + > {isEditable ? ( } + fallback={ + + } > + } > @@ -872,7 +880,11 @@ export function FileViewer({
} + fallback={ + + } > @@ -885,7 +897,7 @@ export function FileViewer({ {fileTypeInfo.type === "pdf" && !showLargeFileWarning && ( } + fallback={} > } + fallback={} > {file.path} {hasChanges && ( - ● Unsaved changes + ● {t("common.unsavedChanges")} )}
diff --git a/plugins/file-manager/src/frontend/components/FileWindow.tsx b/plugins/file-manager/src/frontend/components/FileWindow.tsx index 2db6bad3e..e727e6527 100644 --- a/plugins/file-manager/src/frontend/components/FileWindow.tsx +++ b/plugins/file-manager/src/frontend/components/FileWindow.tsx @@ -483,7 +483,7 @@ export function FileWindow({ const handleDownload = async () => { const toastId = toast.loading( - , + , { duration: Infinity }, ); try { @@ -495,6 +495,7 @@ export function FileWindow({ ({ loaded, total }) => { toast.loading(
-

Loading image...

+

+ {t("fileManager.loadingImage")} +

)} diff --git a/plugins/file-manager/src/frontend/components/LocalTransferProgressToast.tsx b/plugins/file-manager/src/frontend/components/LocalTransferProgressToast.tsx index 8151a91fe..5f6b2dbaf 100644 --- a/plugins/file-manager/src/frontend/components/LocalTransferProgressToast.tsx +++ b/plugins/file-manager/src/frontend/components/LocalTransferProgressToast.tsx @@ -1,5 +1,5 @@ import { Button } from "@termix/plugin-sdk/ui"; -import { useTranslation } from "@termix/plugin-sdk/frontend"; +import type { TranslateFn } from "@termix/plugin-sdk/frontend"; import { formatFileSize } from "../file-manager-utils.ts"; export interface LocalTransferBatchStatus { @@ -16,15 +16,16 @@ export interface LocalTransferBatchStatus { } interface LocalTransferProgressToastProps { + t: TranslateFn; status: LocalTransferBatchStatus; onCancel?: () => void; } export function LocalTransferProgressToast({ + t, status, onCancel, }: LocalTransferProgressToastProps) { - const { t } = useTranslation(); const percent = status.totalBytes > 0 ? Math.min(100, Math.round((status.bytesDone / status.totalBytes) * 100)) diff --git a/plugins/file-manager/src/frontend/components/TransferProgressToast.tsx b/plugins/file-manager/src/frontend/components/TransferProgressToast.tsx index 830b143f8..4a85f1b9e 100644 --- a/plugins/file-manager/src/frontend/components/TransferProgressToast.tsx +++ b/plugins/file-manager/src/frontend/components/TransferProgressToast.tsx @@ -4,7 +4,7 @@ import { getTransferProgressPercent, type TransferProgressResponse, } from "../api/transfer-api"; -import { useTranslation } from "@termix/plugin-sdk/frontend"; +import type { TranslateFn } from "@termix/plugin-sdk/frontend"; import { Archive, ArchiveRestore, @@ -16,6 +16,7 @@ import { import { TransferProgressBar } from "./TransferProgressBar"; interface TransferProgressToastProps { + t: TranslateFn; status: TransferProgressResponse; liveMbPerSec?: number; stalled?: boolean; @@ -25,6 +26,7 @@ interface TransferProgressToastProps { } export function TransferProgressToast({ + t, status, liveMbPerSec, stalled = false, @@ -32,7 +34,6 @@ export function TransferProgressToast({ onCancel, cancelling = false, }: TransferProgressToastProps) { - const { t } = useTranslation(); const percent = getTransferProgressPercent(status); let title = t("transfer.progressTransferring"); diff --git a/plugins/file-manager/src/frontend/hooks/useLocalTransfers.ts b/plugins/file-manager/src/frontend/hooks/useLocalTransfers.ts index 3ea737781..1ac7541c5 100644 --- a/plugins/file-manager/src/frontend/hooks/useLocalTransfers.ts +++ b/plugins/file-manager/src/frontend/hooks/useLocalTransfers.ts @@ -193,6 +193,7 @@ export function useLocalTransfers({ const render = () => { toast.loading( createElement(LocalTransferProgressToast, { + t, status: { ...status, cancelling }, onCancel: () => { cancelled = true; diff --git a/plugins/file-manager/src/frontend/transferProgressMonitor.tsx b/plugins/file-manager/src/frontend/transferProgressMonitor.tsx index ae1b742bf..8c86f3e30 100644 --- a/plugins/file-manager/src/frontend/transferProgressMonitor.tsx +++ b/plugins/file-manager/src/frontend/transferProgressMonitor.tsx @@ -38,6 +38,7 @@ function formatFileSize(bytes?: number): string { } function renderTransferProgressToast( + t: TFunction, toastId: string | number, status: TransferProgressResponse, liveMbPerSec?: number, @@ -47,6 +48,7 @@ function renderTransferProgressToast( ): void { toast.loading( , @@ -279,6 +282,7 @@ export function beginTransferProgressMonitoring( if (cancelling) return; cancelling = true; renderTransferProgressToast( + t, progressToast, { ...initialStatus, transferId }, undefined, @@ -294,6 +298,7 @@ export function beginTransferProgressMonitoring( options.onProgress?.(status); const { rate, stalled } = progressTracker.update(status); renderTransferProgressToast( + t, progressToast, status, rate, @@ -333,6 +338,7 @@ export function beginTransferProgressMonitoring( }); renderTransferProgressToast( + t, progressToast, initialStatus, undefined, diff --git a/plugins/file-manager/tests/backend/download-stream.test.ts b/plugins/file-manager/tests/backend/download-stream.test.ts index 6aa694431..f44456539 100644 --- a/plugins/file-manager/tests/backend/download-stream.test.ts +++ b/plugins/file-manager/tests/backend/download-stream.test.ts @@ -58,9 +58,13 @@ describe("SFTP download stream", () => { const data = Buffer.alloc(1024 * 1024 + 123); for (let i = 0; i < data.length; i++) data[i] = (i * 13 + (i >>> 8)) % 256; const remote = source(data); - expect( - await contents(createDownloadStream(remote.sftp, "/file", data.length)), - ).toEqual(data); + const received = await contents( + createDownloadStream(remote.sftp, "/file", data.length), + ); + // toEqual walks a 1 MB buffer byte by byte, slow enough to time out + // when every plugin suite runs at once. + expect(received.length).toBe(data.length); + expect(received.equals(data)).toBe(true); expect(remote.peak()).toBe(8); expect(remote.closedWithPending).toEqual([0]); }); diff --git a/plugins/file-manager/tests/backend/trash-service.test.ts b/plugins/file-manager/tests/backend/trash-service.test.ts new file mode 100644 index 000000000..fcfa37bc5 --- /dev/null +++ b/plugins/file-manager/tests/backend/trash-service.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it, vi } from "vitest"; +import type { SFTPWrapper } from "ssh2"; +import { listTrash, moveToTrash } from "../../src/backend/trash-service.js"; + +/** An in-memory SFTP channel that counts every request. */ +function fakeSftp() { + const dirs = new Set(["/", "/home", "/home/me"]); + const files = new Map([["/home/me/a.txt", Buffer.from("a")]]); + const calls: string[] = []; + const stats = (target: string) => + dirs.has(target) || files.has(target) + ? { + isDirectory: () => dirs.has(target), + size: files.get(target)?.length ?? 0, + } + : null; + const sftp = { + realpath: vi.fn((_p: string, done: (e?: Error, v?: string) => void) => { + calls.push("realpath"); + done(undefined, "/home/me"); + }), + stat: vi.fn((target: string, done: (e?: Error, v?: unknown) => void) => { + calls.push("stat"); + const found = stats(target); + done(found ? undefined : new Error("ENOENT"), found ?? undefined); + }), + lstat: vi.fn((target: string, done: (e?: Error, v?: unknown) => void) => { + calls.push("lstat"); + const found = stats(target); + done(found ? undefined : new Error("ENOENT"), found ?? undefined); + }), + mkdir: vi.fn((target: string, done: (e?: Error) => void) => { + calls.push("mkdir"); + dirs.add(target); + done(); + }), + rename: vi.fn((from: string, to: string, done: (e?: Error) => void) => { + calls.push("rename"); + files.set(to, files.get(from)!); + files.delete(from); + done(); + }), + writeFile: vi.fn( + (target: string, data: string, done: (e?: Error) => void) => { + calls.push("writeFile"); + files.set(target, Buffer.from(data)); + done(); + }, + ), + readdir: vi.fn((target: string, done: (e?: Error, v?: unknown) => void) => { + calls.push("readdir"); + const prefix = `${target}/`; + done( + undefined, + [...files.keys()] + .filter((name) => name.startsWith(prefix)) + .map((name) => ({ filename: name.slice(prefix.length) })), + ); + }), + readFile: vi.fn((target: string, done: (e?: Error, v?: Buffer) => void) => { + calls.push("readFile"); + done(undefined, files.get(target)); + }), + unlink: vi.fn((target: string, done: (e?: Error) => void) => { + calls.push("unlink"); + files.delete(target); + done(); + }), + }; + return { sftp: sftp as unknown as SFTPWrapper, calls, files }; +} + +describe("trash", () => { + it("finds the trash folders once per channel", async () => { + const { sftp, calls, files } = fakeSftp(); + files.set("/home/me/b.txt", Buffer.from("b")); + + await moveToTrash(sftp, "/home/me/a.txt"); + const first = calls.length; + calls.length = 0; + await moveToTrash(sftp, "/home/me/b.txt"); + + expect(calls.filter((call) => call === "realpath")).toHaveLength(0); + expect(calls.filter((call) => call === "mkdir")).toHaveLength(0); + // lstat, rename and the metadata write. + expect(calls.length).toBeLessThan(first); + expect(calls).toEqual(["lstat", "rename", "writeFile"]); + }); + + it("lists what was moved", async () => { + const { sftp } = fakeSftp(); + const item = await moveToTrash(sftp, "/home/me/a.txt"); + expect(await listTrash(sftp, 7)).toEqual([item]); + }); +}); diff --git a/plugins/file-manager/tests/frontend/progress-toast-context.test.tsx b/plugins/file-manager/tests/frontend/progress-toast-context.test.tsx new file mode 100644 index 000000000..4032b6644 --- /dev/null +++ b/plugins/file-manager/tests/frontend/progress-toast-context.test.tsx @@ -0,0 +1,54 @@ +import { cleanup, fireEvent, render, screen } from "@testing-library/react"; +import { afterEach, expect, it, vi } from "vitest"; +vi.mock("@termix/plugin-sdk/frontend", () => ({ + useTranslation: () => { + throw Error("No plugin scope in the global toaster"); + }, +})); +import { DownloadProgressToast } from "../../src/frontend/components/DownloadProgressToast"; +import { TransferProgressToast } from "../../src/frontend/components/TransferProgressToast"; +import { LocalTransferProgressToast } from "../../src/frontend/components/LocalTransferProgressToast"; +afterEach(cleanup); +const t = (key: string) => key; +it("renders download progress outside plugin scope", () => { + render( + , + ); + expect(screen.getByRole("progressbar").getAttribute("aria-valuenow")).toBe( + "50", + ); +}); +it("renders host transfer progress outside plugin scope", () => { + render( + , + ); + expect(screen.getByRole("progressbar")).toBeTruthy(); +}); +it("preserves cancellation on local transfers outside plugin scope", () => { + const cancel = vi.fn(); + render( + , + ); + fireEvent.click(screen.getByRole("button")); + expect(cancel).toHaveBeenCalledOnce(); +}); diff --git a/plugins/fleets/manifest.json b/plugins/fleets/manifest.json index 5d0ded88f..e11eab9d8 100644 --- a/plugins/fleets/manifest.json +++ b/plugins/fleets/manifest.json @@ -18,6 +18,7 @@ "hosts:read", "hosts:write", "credentials:use", + "credentials:read", "ssh:connect", "db:own", "network:serve", diff --git a/plugins/fleets/src/backend/routes.ts b/plugins/fleets/src/backend/routes.ts index 99d91f77c..857a291ae 100644 --- a/plugins/fleets/src/backend/routes.ts +++ b/plugins/fleets/src/backend/routes.ts @@ -1357,9 +1357,9 @@ export function registerFleetRoutes( fleetId, "manage", async (host) => { - // Package actions need the host's sudo password, an operational - // secret ctx.hosts.get() leaves out. ctx.ssh.connect resolves the - // full host the connect pipeline uses, which carries it. + // Package actions need the host's sudo password. connect() hands + // back a redacted host, so read it through resolveHost. + const full = await ctx.ssh.resolveHost(host.id); const connection = await ctx.ssh.connect(host.id, { purpose: "fleet", }); @@ -1388,7 +1388,7 @@ export function registerFleetRoutes( const result = await execElevated( sshClient, cmd, - connection.host.sudoPassword as string | undefined, + full?.sudoPassword as string | undefined, { forceSudo: true, timeoutMs: 600000 }, ); return { diff --git a/plugins/fleets/tests/backend/sudo-capability.test.ts b/plugins/fleets/tests/backend/sudo-capability.test.ts new file mode 100644 index 000000000..ab3f3d7a1 --- /dev/null +++ b/plugins/fleets/tests/backend/sudo-capability.test.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from "vitest"; +import fs from "node:fs"; +import path from "node:path"; + +// Elevated commands read the host's sudo password, which core only hands to +// a plugin holding credentials:read. +describe("sudo password access", () => { + it("declares credentials:read", () => { + const manifest = JSON.parse( + fs.readFileSync( + path.resolve(import.meta.dirname, "../../manifest.json"), + "utf8", + ), + ); + expect(manifest.capabilities).toContain("credentials:read"); + }); +}); diff --git a/plugins/homepage/locales/en.json b/plugins/homepage/locales/en.json index 760b3a445..9835baa55 100644 --- a/plugins/homepage/locales/en.json +++ b/plugins/homepage/locales/en.json @@ -169,7 +169,139 @@ "noServices": "No services set up", "configureLocation": "Set a location in the widget settings", "bannerTextPlaceholder": "Banner text", - "serviceNamePlaceholder": "My service" + "serviceNamePlaceholder": "My service", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Private certificate authority (PEM)", "description": "Optional trusted CA bundle for allowlisted hosts. Certificate verification remains enabled. Leave empty to use the system trust store." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/af_ZA.json b/plugins/homepage/locales/translated/af_ZA.json index 59a7eaa40..f8da3505b 100644 --- a/plugins/homepage/locales/translated/af_ZA.json +++ b/plugins/homepage/locales/translated/af_ZA.json @@ -169,7 +169,139 @@ "noServices": "Geen dienste opgestel nie", "configureLocation": "Stel 'n ligging in die widget-instellings", "bannerTextPlaceholder": "Banier teks", - "serviceNamePlaceholder": "My diens" + "serviceNamePlaceholder": "My diens", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Privaat sertifikaatowerheid (PEM)", "description": "Opsionele vertroude CA-bundel vir gashere op die toelaatlys. Sertifikaatverifikasie bly geaktiveer. Los leeg om die stelselvertrouensberging te gebruik." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ar_SA.json b/plugins/homepage/locales/translated/ar_SA.json index 60d453c87..43b0bd1f3 100644 --- a/plugins/homepage/locales/translated/ar_SA.json +++ b/plugins/homepage/locales/translated/ar_SA.json @@ -169,7 +169,139 @@ "noServices": "لم يتم إعداد أي خدمات", "configureLocation": "حدد موقعًا في إعدادات الأداة", "bannerTextPlaceholder": "نص الشعار", - "serviceNamePlaceholder": "خدمتي" + "serviceNamePlaceholder": "خدمتي", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "هيئة إصدار الشهادات الخاصة (PEM)", "description": "حزمة شهادات المصادقة الموثوقة اختيارية للأجهزة المضيفة المدرجة في القائمة المسموح بها. يبقى التحقق من الشهادات مُفعّلاً. اترك هذا الحقل فارغًا لاستخدام مخزن شهادات النظام الموثوقة." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/bg_BG.json b/plugins/homepage/locales/translated/bg_BG.json index db688c497..3ffae6d62 100644 --- a/plugins/homepage/locales/translated/bg_BG.json +++ b/plugins/homepage/locales/translated/bg_BG.json @@ -169,7 +169,139 @@ "noServices": "Няма настроени услуги", "configureLocation": "Задайте местоположение в настройките на джаджата", "bannerTextPlaceholder": "Текст на банера", - "serviceNamePlaceholder": "Моята услуга" + "serviceNamePlaceholder": "Моята услуга", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Частен сертифициращ орган (PEM)", "description": "Незадължителен пакет с доверени CA за хостове от разрешения списък. Проверката на сертификата остава активирана. Оставете празно, за да използвате хранилището за доверени сертификати на системата." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/bn_BD.json b/plugins/homepage/locales/translated/bn_BD.json index f3a53a786..e496c5f86 100644 --- a/plugins/homepage/locales/translated/bn_BD.json +++ b/plugins/homepage/locales/translated/bn_BD.json @@ -169,7 +169,139 @@ "noServices": "কোন পরিষেবা সেট আপ করা হয়নি", "configureLocation": "উইজেট সেটিংসে একটি অবস্থান নির্ধারণ করুন।", "bannerTextPlaceholder": "ব্যানার টেক্সট", - "serviceNamePlaceholder": "আমার পরিষেবা" + "serviceNamePlaceholder": "আমার পরিষেবা", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "বেসরকারি শংসাপত্র কর্তৃপক্ষ (পিইএম)", "description": "অনুমোদিত হোস্টগুলির জন্য ঐচ্ছিক বিশ্বস্ত CA বান্ডেল। সার্টিফিকেট যাচাইকরণ সক্রিয় থাকবে। সিস্টেম ট্রাস্ট স্টোর ব্যবহার করতে এটি খালি রাখুন।" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ca_ES.json b/plugins/homepage/locales/translated/ca_ES.json index 8016ee023..0394334fe 100644 --- a/plugins/homepage/locales/translated/ca_ES.json +++ b/plugins/homepage/locales/translated/ca_ES.json @@ -169,7 +169,139 @@ "noServices": "No hi ha serveis configurats", "configureLocation": "Defineix una ubicació a la configuració del widget", "bannerTextPlaceholder": "Text del bàner", - "serviceNamePlaceholder": "El meu servei" + "serviceNamePlaceholder": "El meu servei", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autoritat de certificació privada (PEM)", "description": "Paquet opcional de CA de confiança per a amfitrions de la llista permesa. La verificació del certificat roman habilitada. Deixeu-ho en blanc per utilitzar el magatzem de confiança del sistema." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/cs_CZ.json b/plugins/homepage/locales/translated/cs_CZ.json index 2de6e1574..a64156f3f 100644 --- a/plugins/homepage/locales/translated/cs_CZ.json +++ b/plugins/homepage/locales/translated/cs_CZ.json @@ -169,7 +169,139 @@ "noServices": "Žádné služby nejsou nastaveny", "configureLocation": "Nastavte umístění v nastavení widgetu", "bannerTextPlaceholder": "Text banneru", - "serviceNamePlaceholder": "Moje služba" + "serviceNamePlaceholder": "Moje služba", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Soukromá certifikační autorita (PEM)", "description": "Volitelný balíček důvěryhodných certifikačních autorit pro hostitele na seznamu povolených. Ověřování certifikátů zůstává povoleno. Pro použití systémového úložiště důvěryhodných certifikátů ponechte pole prázdné." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/da_DK.json b/plugins/homepage/locales/translated/da_DK.json index 4d698ed92..1fc6269da 100644 --- a/plugins/homepage/locales/translated/da_DK.json +++ b/plugins/homepage/locales/translated/da_DK.json @@ -169,7 +169,139 @@ "noServices": "Ingen tjenester konfigureret", "configureLocation": "Angiv en placering i widgetindstillingerne", "bannerTextPlaceholder": "Bannertekst", - "serviceNamePlaceholder": "Min tjeneste" + "serviceNamePlaceholder": "Min tjeneste", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Privat certifikatmyndighed (PEM)", "description": "Valgfri pakke med betroede CA'er til værter på tilladelseslisten. Certifikatbekræftelse forbliver aktiveret. Lad være tomt for at bruge systemets tillidslager." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/de_DE.json b/plugins/homepage/locales/translated/de_DE.json index 3efc033a1..ba98b1aa6 100644 --- a/plugins/homepage/locales/translated/de_DE.json +++ b/plugins/homepage/locales/translated/de_DE.json @@ -169,7 +169,139 @@ "noServices": "Keine Dienste eingerichtet", "configureLocation": "Legen Sie in den Widget-Einstellungen einen Standort fest.", "bannerTextPlaceholder": "Bannertext", - "serviceNamePlaceholder": "Mein Service" + "serviceNamePlaceholder": "Mein Service", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Private Zertifizierungsstelle (PEM)", "description": "Optionales Paket vertrauenswürdiger Zertifizierungsstellen für zugelassene Hosts. Die Zertifikatsprüfung bleibt aktiviert. Lassen Sie dieses Feld leer, um den System-Truststore zu verwenden." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/el_GR.json b/plugins/homepage/locales/translated/el_GR.json index 0f15655dc..5c2a1ef15 100644 --- a/plugins/homepage/locales/translated/el_GR.json +++ b/plugins/homepage/locales/translated/el_GR.json @@ -169,7 +169,139 @@ "noServices": "Δεν έχουν ρυθμιστεί υπηρεσίες", "configureLocation": "Ορίστε μια τοποθεσία στις ρυθμίσεις του γραφικού στοιχείου", "bannerTextPlaceholder": "Κείμενο banner", - "serviceNamePlaceholder": "Η υπηρεσία μου" + "serviceNamePlaceholder": "Η υπηρεσία μου", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Ιδιωτική αρχή έκδοσης πιστοποιητικών (PEM)", "description": "Προαιρετικό πακέτο αξιόπιστης έκδοσης πιστοποιητικών (CA) για κεντρικούς υπολογιστές που έχουν καταχωρηθεί στη λίστα επιτρεπόμενων. Η επαλήθευση πιστοποιητικών παραμένει ενεργοποιημένη. Αφήστε το κενό για να χρησιμοποιήσετε το χώρο αποθήκευσης αξιοπιστίας του συστήματος." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/es_ES.json b/plugins/homepage/locales/translated/es_ES.json index 27d769120..5af511f00 100644 --- a/plugins/homepage/locales/translated/es_ES.json +++ b/plugins/homepage/locales/translated/es_ES.json @@ -169,7 +169,139 @@ "noServices": "No hay servicios configurados", "configureLocation": "Establezca una ubicación en la configuración del widget.", "bannerTextPlaceholder": "Texto del banner", - "serviceNamePlaceholder": "Mi servicio" + "serviceNamePlaceholder": "Mi servicio", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autoridad de certificación privada (PEM)", "description": "Paquete de certificados CA de confianza opcional para los hosts permitidos. La verificación de certificados permanece habilitada. Déjelo en blanco para usar el almacén de certificados de confianza del sistema." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/fi_FI.json b/plugins/homepage/locales/translated/fi_FI.json index 625693f8e..3b8d747ab 100644 --- a/plugins/homepage/locales/translated/fi_FI.json +++ b/plugins/homepage/locales/translated/fi_FI.json @@ -169,7 +169,139 @@ "noServices": "Ei palveluita määritettynä", "configureLocation": "Aseta sijainti widgetin asetuksissa", "bannerTextPlaceholder": "Banneriteksti", - "serviceNamePlaceholder": "Palveluni" + "serviceNamePlaceholder": "Palveluni", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Yksityinen varmentaja (PEM)", "description": "Valinnainen luotettujen varmenteiden paketti sallittujen isäntien luettelosta. Varmenteiden vahvistus pysyy käytössä. Jätä tyhjäksi käyttääksesi järjestelmän luotettujen varmenteiden säilöä." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/fr_FR.json b/plugins/homepage/locales/translated/fr_FR.json index 91fa269c6..0c3844ec0 100644 --- a/plugins/homepage/locales/translated/fr_FR.json +++ b/plugins/homepage/locales/translated/fr_FR.json @@ -169,7 +169,139 @@ "noServices": "Aucun service configuré", "configureLocation": "Définissez un emplacement dans les paramètres du widget", "bannerTextPlaceholder": "Texte de la bannière", - "serviceNamePlaceholder": "Mon service" + "serviceNamePlaceholder": "Mon service", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autorité de certification privée (PEM)", "description": "Ensemble d'autorités de certification de confiance optionnel pour les hôtes autorisés. La vérification des certificats reste activée. Laissez ce champ vide pour utiliser le magasin de certificats système." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/he_IL.json b/plugins/homepage/locales/translated/he_IL.json index c93eaff70..dcfd9d5c7 100644 --- a/plugins/homepage/locales/translated/he_IL.json +++ b/plugins/homepage/locales/translated/he_IL.json @@ -169,7 +169,139 @@ "noServices": "לא הוגדרו שירותים", "configureLocation": "הגדרת מיקום בהגדרות הווידג'ט", "bannerTextPlaceholder": "טקסט באנר", - "serviceNamePlaceholder": "השירות שלי" + "serviceNamePlaceholder": "השירות שלי", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "רשות אישורים פרטית (PEM)", "description": "חבילת CA מהימנה אופציונלית עבור מארחים ברשימת היתרים. אימות אישורים נשאר מופעל. השאר ריק כדי להשתמש במאגר האמון של המערכת." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/hi_IN.json b/plugins/homepage/locales/translated/hi_IN.json index 6d018d789..7bc39e9a1 100644 --- a/plugins/homepage/locales/translated/hi_IN.json +++ b/plugins/homepage/locales/translated/hi_IN.json @@ -169,7 +169,139 @@ "noServices": "कोई सेवा स्थापित नहीं की गई", "configureLocation": "विजेट सेटिंग में स्थान निर्धारित करें", "bannerTextPlaceholder": "बैनर पाठ", - "serviceNamePlaceholder": "मेरी सेवा" + "serviceNamePlaceholder": "मेरी सेवा", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "निजी प्रमाणपत्र प्राधिकरण (पीईएम)", "description": "अनुमत होस्टों के लिए वैकल्पिक विश्वसनीय CA बंडल। प्रमाणपत्र सत्यापन सक्षम रहता है। सिस्टम ट्रस्ट स्टोर का उपयोग करने के लिए इसे खाली छोड़ दें।" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/hu_HU.json b/plugins/homepage/locales/translated/hu_HU.json index 3b4d397eb..50644cfec 100644 --- a/plugins/homepage/locales/translated/hu_HU.json +++ b/plugins/homepage/locales/translated/hu_HU.json @@ -169,7 +169,139 @@ "noServices": "Nincsenek szolgáltatások beállítva", "configureLocation": "Helyszín beállítása a widget beállításaiban", "bannerTextPlaceholder": "Banner szöveg", - "serviceNamePlaceholder": "A szolgáltatásom" + "serviceNamePlaceholder": "A szolgáltatásom", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Magán hitelesítésszolgáltató (PEM)", "description": "Opcionális megbízható CA csomag az engedélyezőlistán szereplő gazdagépekhez. A tanúsítvány-ellenőrzés továbbra is engedélyezve marad. Hagyja üresen a rendszer megbízható tárolójának használatához." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/id_ID.json b/plugins/homepage/locales/translated/id_ID.json index 64880d4a9..21c2788f1 100644 --- a/plugins/homepage/locales/translated/id_ID.json +++ b/plugins/homepage/locales/translated/id_ID.json @@ -169,7 +169,139 @@ "noServices": "Tidak ada layanan yang disiapkan.", "configureLocation": "Tetapkan lokasi di pengaturan widget.", "bannerTextPlaceholder": "Teks spanduk", - "serviceNamePlaceholder": "Layanan saya" + "serviceNamePlaceholder": "Layanan saya", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Lembaga sertifikasi swasta (PEM)", "description": "Bundel CA tepercaya opsional untuk host yang diizinkan. Verifikasi sertifikat tetap diaktifkan. Biarkan kosong untuk menggunakan penyimpanan tepercaya sistem." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/it_IT.json b/plugins/homepage/locales/translated/it_IT.json index de1a95336..2214302b9 100644 --- a/plugins/homepage/locales/translated/it_IT.json +++ b/plugins/homepage/locales/translated/it_IT.json @@ -169,7 +169,139 @@ "noServices": "Nessun servizio configurato", "configureLocation": "Imposta una posizione nelle impostazioni del widget", "bannerTextPlaceholder": "Testo del banner", - "serviceNamePlaceholder": "Il mio servizio" + "serviceNamePlaceholder": "Il mio servizio", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autorità di certificazione privata (PEM)", "description": "Pacchetto CA attendibile opzionale per gli host consentiti. La verifica del certificato rimane abilitata. Lasciare vuoto per utilizzare l'archivio di certificati attendibili del sistema." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ja_JP.json b/plugins/homepage/locales/translated/ja_JP.json index a6fc864f3..26945c450 100644 --- a/plugins/homepage/locales/translated/ja_JP.json +++ b/plugins/homepage/locales/translated/ja_JP.json @@ -169,7 +169,139 @@ "noServices": "サービスが設定されていません", "configureLocation": "ウィジェットの設定で場所を設定してください", "bannerTextPlaceholder": "バナーテキスト", - "serviceNamePlaceholder": "私のサービス" + "serviceNamePlaceholder": "私のサービス", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "民間認証局(PEM)", "description": "許可リストに登録されたホスト用のオプションの信頼できる認証局(CA)バンドル。証明書の検証は引き続き有効です。システムトラストストアを使用する場合は、空欄のままにしてください。" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ko_KR.json b/plugins/homepage/locales/translated/ko_KR.json index 7652c9b25..02a841627 100644 --- a/plugins/homepage/locales/translated/ko_KR.json +++ b/plugins/homepage/locales/translated/ko_KR.json @@ -169,7 +169,139 @@ "noServices": "설정된 서비스가 없습니다", "configureLocation": "위젯 설정에서 위치를 지정하세요", "bannerTextPlaceholder": "배너 텍스트", - "serviceNamePlaceholder": "내 서비스" + "serviceNamePlaceholder": "내 서비스", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "민간 인증 기관(PEM)", "description": "허용 목록에 있는 호스트에 대한 선택적 신뢰 CA 번들입니다. 인증서 검증은 계속 활성화됩니다. 시스템 신뢰 저장소를 사용하려면 비워 두십시오." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/nl_NL.json b/plugins/homepage/locales/translated/nl_NL.json index aabf00f45..2d077eb9a 100644 --- a/plugins/homepage/locales/translated/nl_NL.json +++ b/plugins/homepage/locales/translated/nl_NL.json @@ -169,7 +169,139 @@ "noServices": "Geen services ingesteld", "configureLocation": "Stel een locatie in in de widgetinstellingen.", "bannerTextPlaceholder": "Bannertekst", - "serviceNamePlaceholder": "Mijn service" + "serviceNamePlaceholder": "Mijn service", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Particuliere certificeringsinstantie (PEM)", "description": "Optioneel pakket met vertrouwde CA's voor hosts op de whitelist. Certificaatverificatie blijft ingeschakeld. Laat dit veld leeg om de systeemvertrouwensarchief te gebruiken." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/no_NO.json b/plugins/homepage/locales/translated/no_NO.json index c828520eb..ad9a1fa6c 100644 --- a/plugins/homepage/locales/translated/no_NO.json +++ b/plugins/homepage/locales/translated/no_NO.json @@ -169,7 +169,139 @@ "noServices": "Ingen tjenester konfigurert", "configureLocation": "Angi en plassering i widgetinnstillingene", "bannerTextPlaceholder": "Bannertekst", - "serviceNamePlaceholder": "Min tjeneste" + "serviceNamePlaceholder": "Min tjeneste", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Privat sertifikatmyndighet (PEM)", "description": "Valgfri pakke med klarert CA for verter på tillatelseslisten. Sertifikatverifisering forblir aktivert. La stå tomt for å bruke systemets klareringslager." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/pl_PL.json b/plugins/homepage/locales/translated/pl_PL.json index ac081e41b..347038b59 100644 --- a/plugins/homepage/locales/translated/pl_PL.json +++ b/plugins/homepage/locales/translated/pl_PL.json @@ -169,7 +169,139 @@ "noServices": "Brak skonfigurowanych usług", "configureLocation": "Ustaw lokalizację w ustawieniach widżetu", "bannerTextPlaceholder": "Tekst banera", - "serviceNamePlaceholder": "Moja usługa" + "serviceNamePlaceholder": "Moja usługa", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Prywatny urząd certyfikacji (PEM)", "description": "Opcjonalny pakiet zaufanego urzędu certyfikacji dla hostów z listy dozwolonych. Weryfikacja certyfikatu pozostaje włączona. Pozostaw puste, aby korzystać z systemowego magazynu zaufanych certyfikatów." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/pt_BR.json b/plugins/homepage/locales/translated/pt_BR.json index f865b8481..68933a7d6 100644 --- a/plugins/homepage/locales/translated/pt_BR.json +++ b/plugins/homepage/locales/translated/pt_BR.json @@ -169,7 +169,139 @@ "noServices": "Nenhum serviço configurado", "configureLocation": "Defina uma localização nas configurações do widget.", "bannerTextPlaceholder": "Texto do banner", - "serviceNamePlaceholder": "Meu serviço" + "serviceNamePlaceholder": "Meu serviço", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autoridade de certificação privada (PEM)", "description": "Pacote opcional de CAs confiáveis para hosts na lista de permissões. A verificação de certificados permanece ativada. Deixe em branco para usar o repositório de certificados confiáveis do sistema." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/pt_PT.json b/plugins/homepage/locales/translated/pt_PT.json index e5a8d8f34..ff2493f90 100644 --- a/plugins/homepage/locales/translated/pt_PT.json +++ b/plugins/homepage/locales/translated/pt_PT.json @@ -169,7 +169,139 @@ "noServices": "Nenhum serviço configurado", "configureLocation": "Defina uma localização nas definições do widget.", "bannerTextPlaceholder": "Texto do banner", - "serviceNamePlaceholder": "O meu serviço" + "serviceNamePlaceholder": "O meu serviço", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autoridade de certificação privada (PEM)", "description": "Pacote opcional de CAs fidedignas para hosts na lista de permissões. A verificação de certificados permanece ativada. Deixe em branco para utilizar o repositório de certificados fidedignos do sistema." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ro_RO.json b/plugins/homepage/locales/translated/ro_RO.json index 8270c7bb9..101523611 100644 --- a/plugins/homepage/locales/translated/ro_RO.json +++ b/plugins/homepage/locales/translated/ro_RO.json @@ -169,7 +169,139 @@ "noServices": "Niciun serviciu configurat", "configureLocation": "Setați o locație în setările widgetului", "bannerTextPlaceholder": "Textul bannerului", - "serviceNamePlaceholder": "Serviciul meu" + "serviceNamePlaceholder": "Serviciul meu", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Autoritate de certificare privată (PEM)", "description": "Pachet CA opțional de încredere pentru gazdele din lista permisă. Verificarea certificatelor rămâne activată. Lăsați câmpul gol pentru a utiliza depozitul de încredere al sistemului." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/ru_RU.json b/plugins/homepage/locales/translated/ru_RU.json index e72dceee1..f587d1676 100644 --- a/plugins/homepage/locales/translated/ru_RU.json +++ b/plugins/homepage/locales/translated/ru_RU.json @@ -169,7 +169,139 @@ "noServices": "Сервисы не настроены", "configureLocation": "Укажите местоположение в настройках виджета.", "bannerTextPlaceholder": "Текст баннера", - "serviceNamePlaceholder": "Моя услуга" + "serviceNamePlaceholder": "Моя услуга", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Частный центр сертификации (PEM)", "description": "Дополнительный пакет доверенных центров сертификации для хостов из списка разрешенных. Проверка сертификатов остается включенной. Оставьте поле пустым, чтобы использовать системное хранилище доверенных сертификатов." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/sr_SP.json b/plugins/homepage/locales/translated/sr_SP.json index 3370bd4c5..d79a2afb8 100644 --- a/plugins/homepage/locales/translated/sr_SP.json +++ b/plugins/homepage/locales/translated/sr_SP.json @@ -169,7 +169,139 @@ "noServices": "Није подешена ниједна услуга", "configureLocation": "Подесите локацију у подешавањима виџета", "bannerTextPlaceholder": "Текст банера", - "serviceNamePlaceholder": "Моја услуга" + "serviceNamePlaceholder": "Моја услуга", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Приватни ауторитет за сертификате (PEM)", "description": "Опциони пакет поузданих CA сертификата за хостове са дозвољене листе. Верификација сертификата остаје омогућена. Оставите празно да бисте користили складиште поузданих сертификата система." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/sv_SE.json b/plugins/homepage/locales/translated/sv_SE.json index 988f61672..669c512a6 100644 --- a/plugins/homepage/locales/translated/sv_SE.json +++ b/plugins/homepage/locales/translated/sv_SE.json @@ -169,7 +169,139 @@ "noServices": "Inga tjänster konfigurerade", "configureLocation": "Ange en plats i widgetinställningarna", "bannerTextPlaceholder": "Bannertext", - "serviceNamePlaceholder": "Min tjänst" + "serviceNamePlaceholder": "Min tjänst", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Privat certifikatutfärdare (PEM)", "description": "Valfritt paket med betrodda certifikatutfärdare för godkända värdar. Certifikatverifiering förblir aktiverad. Lämna tomt för att använda systemets förtroendearkiv." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/th_TH.json b/plugins/homepage/locales/translated/th_TH.json index c391ab2d2..4b3718d48 100644 --- a/plugins/homepage/locales/translated/th_TH.json +++ b/plugins/homepage/locales/translated/th_TH.json @@ -169,7 +169,139 @@ "noServices": "ไม่มีการตั้งค่าบริการใดๆ", "configureLocation": "ตั้งค่าตำแหน่งที่ตั้งในการตั้งค่าวิดเจ็ต", "bannerTextPlaceholder": "ข้อความแบนเนอร์", - "serviceNamePlaceholder": "บริการของฉัน" + "serviceNamePlaceholder": "บริการของฉัน", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "หน่วยงานออกใบรับรองเอกชน (PEM)", "description": "ชุดใบรับรอง CA ที่เชื่อถือได้สำหรับโฮสต์ที่อนุญาต (ไม่บังคับ) การตรวจสอบใบรับรองยังคงเปิดใช้งานอยู่ เว้นว่างไว้เพื่อใช้ที่เก็บใบรับรองที่เชื่อถือได้ของระบบ" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/tr_TR.json b/plugins/homepage/locales/translated/tr_TR.json index e73419f4a..1994898c6 100644 --- a/plugins/homepage/locales/translated/tr_TR.json +++ b/plugins/homepage/locales/translated/tr_TR.json @@ -169,7 +169,139 @@ "noServices": "Hiçbir hizmet kurulmadı.", "configureLocation": "Widget ayarlarında bir konum belirleyin.", "bannerTextPlaceholder": "Afiş metni", - "serviceNamePlaceholder": "Hizmetim" + "serviceNamePlaceholder": "Hizmetim", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Özel sertifika yetkilisi (PEM)", "description": "İzin verilen sunucular için isteğe bağlı güvenilir CA paketi. Sertifika doğrulaması etkin kalır. Sistem güven deposunu kullanmak için boş bırakın." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/uk_UA.json b/plugins/homepage/locales/translated/uk_UA.json index 242782be5..671ea5985 100644 --- a/plugins/homepage/locales/translated/uk_UA.json +++ b/plugins/homepage/locales/translated/uk_UA.json @@ -169,7 +169,139 @@ "noServices": "Жодних послуг не налаштовано", "configureLocation": "Встановіть місцезнаходження в налаштуваннях віджета", "bannerTextPlaceholder": "Текст банера", - "serviceNamePlaceholder": "Моя послуга" + "serviceNamePlaceholder": "Моя послуга", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Приватний центр сертифікації (PEM)", "description": "Додатковий пакет довірених ЦС для хостів із білого списку. Перевірка сертифікатів залишається ввімкненою. Залиште поле порожнім, щоб використовувати системне сховище довірених сертифікатів." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/vi_VN.json b/plugins/homepage/locales/translated/vi_VN.json index 87558ba1e..f5c2a210a 100644 --- a/plugins/homepage/locales/translated/vi_VN.json +++ b/plugins/homepage/locales/translated/vi_VN.json @@ -169,7 +169,139 @@ "noServices": "Chưa có dịch vụ nào được thiết lập.", "configureLocation": "Chọn vị trí trong cài đặt tiện ích.", "bannerTextPlaceholder": "Văn bản biểu ngữ", - "serviceNamePlaceholder": "Dịch vụ của tôi" + "serviceNamePlaceholder": "Dịch vụ của tôi", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "Cơ quan cấp chứng chỉ tư nhân (PEM)", "description": "Gói CA đáng tin cậy tùy chọn cho các máy chủ được phép. Quá trình xác minh chứng chỉ vẫn được bật. Để trống để sử dụng kho lưu trữ chứng chỉ tin cậy của hệ thống." } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/zh_CN.json b/plugins/homepage/locales/translated/zh_CN.json index e99d2a743..ee9b2ae7b 100644 --- a/plugins/homepage/locales/translated/zh_CN.json +++ b/plugins/homepage/locales/translated/zh_CN.json @@ -169,7 +169,139 @@ "noServices": "未设置任何服务。", "configureLocation": "在小部件设置中设置位置", "bannerTextPlaceholder": "横幅文字", - "serviceNamePlaceholder": "我的服务" + "serviceNamePlaceholder": "我的服务", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "私有证书颁发机构(PEM)", "description": "可选的受信任 CA 证书包,适用于已列入允许列表的主机。证书验证功能仍然启用。留空则使用系统信任存储。" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/locales/translated/zh_TW.json b/plugins/homepage/locales/translated/zh_TW.json index d262a3d7c..286654afe 100644 --- a/plugins/homepage/locales/translated/zh_TW.json +++ b/plugins/homepage/locales/translated/zh_TW.json @@ -169,7 +169,139 @@ "noServices": "未設定任何服務。", "configureLocation": "在小部件設定中設定位置", "bannerTextPlaceholder": "橫幅文字", - "serviceNamePlaceholder": "我的服務" + "serviceNamePlaceholder": "我的服務", + "emptyNote": "Empty note...", + "weatherLoadFailed": "Could not load weather for \"{{location}}\"", + "feelsLike": "Feels like {{temperature}}", + "timezonePlaceholder": "America/New_York (leave blank for local)", + "notesPlaceholder": "Write your notes here...", + "locationPlaceholder": "New York, London, Tokyo...", + "widgets": { + "bookmark_list": { + "name": "Bookmarks", + "description": "A list of quick links" + }, + "calendar": { + "name": "Calendar", + "description": "A month calendar with today highlighted" + }, + "clock": { + "name": "Clock", + "description": "A live clock with configurable timezone" + }, + "countdown": { + "name": "Countdown", + "description": "Counts down to a target date and time" + }, + "custom_api": { + "name": "Custom API", + "description": "Fetch and display data from any JSON API" + }, + "dashboard_links": { + "name": "Dashboard Links", + "description": "Shows your saved dashboard service links" + }, + "folder": { + "name": "Folder", + "description": "A background card for grouping widgets visually" + }, + "host_grid": { + "name": "Host Grid", + "description": "Live status overview grid for all your SSH hosts" + }, + "host_status": { + "name": "Host Status", + "description": "Shows live status and metrics for an SSH host" + }, + "iframe_embed": { + "name": "iFrame Embed", + "description": "Embed any URL in an iframe" + }, + "image_widget": { + "name": "Image", + "description": "Display any image from a URL" + }, + "link_tree": { + "name": "Link Tree", + "description": "Grouped links organized into labeled sections" + }, + "markdown_notes": { + "name": "Markdown Notes", + "description": "Notes with optional Markdown rendering and inline editing" + }, + "notes": { + "name": "Notes", + "description": "A text notes widget" + }, + "ping_status": { + "name": "Ping Status", + "description": "Check if URLs or services are reachable" + }, + "quick_connect": { + "name": "Quick Connect", + "description": "Launch terminal, files, docker, tunnels, and more for your hosts" + }, + "recent_activity": { + "name": "Recent Activity", + "description": "Shows recent terminal, Docker, file, and tunnel activity" + }, + "rss_feed": { + "name": "RSS Feed", + "description": "Display items from an RSS or Atom feed" + }, + "search_bar": { + "name": "Search Bar", + "description": "Quick search with Google, DuckDuckGo, Bing, or a custom engine" + }, + "search_links": { + "name": "Search Shortcuts", + "description": "Quick buttons to search different engines" + }, + "service_grid": { + "name": "Service Grid", + "description": "A grid of service tiles with icons and links" + }, + "service_link": { + "name": "Service Link", + "description": "A clickable tile linking to a service URL" + }, + "ssh_terminal": { + "name": "SSH Terminal", + "description": "An inline SSH terminal connected to a configured host" + }, + "system_overview": { + "name": "System Overview", + "description": "Termix version, database health, and uptime at a glance" + }, + "termix_uptime": { + "name": "Termix Uptime", + "description": "Shows how long the Termix server has been running" + }, + "text_banner": { + "name": "Text Banner", + "description": "A styled text label for sections and headings" + }, + "weather": { + "name": "Weather", + "description": "Live weather for any location" + }, + "docker_widget": { + "name": "Docker Manager", + "description": "Embedded Docker container manager for a configured host" + }, + "file_manager_widget": { + "name": "File Manager", + "description": "Embedded SFTP file manager for a configured host" + }, + "tunnel_widget": { + "name": "Tunnel Manager", + "description": "Embedded SSH tunnel manager for a configured host" + }, + "metrics_chart": { + "name": "Metrics Chart", + "description": "Historical CPU, memory, disk, or network chart for a host" + } + } }, "permissions": { "use": { @@ -186,5 +318,8 @@ "label": "私有憑證授權單位(PEM)", "description": "可選的受信任 CA 憑證包,適用於已列入允許清單的主機。憑證驗證功能仍然啟用。留空則使用系統信任儲存。" } + }, + "plugin": { + "name": "Homepage" } } diff --git a/plugins/homepage/src/frontend/dialogs/AddWidgetMenu.tsx b/plugins/homepage/src/frontend/dialogs/AddWidgetMenu.tsx index 53e1d8773..8a3763674 100644 --- a/plugins/homepage/src/frontend/dialogs/AddWidgetMenu.tsx +++ b/plugins/homepage/src/frontend/dialogs/AddWidgetMenu.tsx @@ -140,14 +140,18 @@ export function AddWidgetMenu({ state, onAdd, onClose }: AddWidgetMenuProps) { {type.labelComponent ? ( ) : ( - type.name + t(`homepage.widgets.${type.id}.name`, { + defaultValue: type.name, + }) )} {type.labelComponent ? ( ) : ( - type.description + t(`homepage.widgets.${type.id}.description`, { + defaultValue: type.description, + }) )} diff --git a/plugins/homepage/src/frontend/dialogs/ClockEditForm.tsx b/plugins/homepage/src/frontend/dialogs/ClockEditForm.tsx index 7a1833739..5d306fb47 100644 --- a/plugins/homepage/src/frontend/dialogs/ClockEditForm.tsx +++ b/plugins/homepage/src/frontend/dialogs/ClockEditForm.tsx @@ -23,7 +23,7 @@ export function ClockEditForm({ onChange={(e) => onChange({ ...config, timezone: e.target.value || undefined }) } - placeholder="America/New_York (leave blank for local)" + placeholder={t("homepage.timezonePlaceholder")} aria-invalid={invalidTimezone} className={ invalidTimezone ? "h-8 text-sm border-destructive" : "h-8 text-sm" diff --git a/plugins/homepage/src/frontend/dialogs/NotesEditForm.tsx b/plugins/homepage/src/frontend/dialogs/NotesEditForm.tsx index c75e3b476..61195b04a 100644 --- a/plugins/homepage/src/frontend/dialogs/NotesEditForm.tsx +++ b/plugins/homepage/src/frontend/dialogs/NotesEditForm.tsx @@ -16,7 +16,7 @@ export function NotesEditForm({