Compare commits

..

23 Commits

Author SHA1 Message Date
henrygd
f055658eba update bun.lockb and package-lock.json 2025-07-24 20:03:19 -04:00
henrygd
e430c747fe 0.12.0 release :) 2025-07-24 19:51:51 -04:00
henrygd
ca62b1db36 update translations 2025-07-24 19:47:25 -04:00
henrygd
38569b7057 update install scripts for 0.12.0 release 2025-07-24 18:39:13 -04:00
henrygd
203244090f update alert history icon 2025-07-24 18:11:39 -04:00
henrygd
2bed722045 add windows upgrade scripts 2025-07-24 17:36:17 -04:00
henrygd
13f3a52760 remove beta scripts from copy/paste commands 2025-07-24 17:35:21 -04:00
henrygd
16b9827c70 bump migration name for 0.12.0 release 2025-07-24 17:35:06 -04:00
henrygd
0fc352d7fc update js deps 2025-07-23 19:51:19 -04:00
凉心
8a2bee11d4 Update viewport meta to prevent input zoom on iOS (#858)
- Prevents page zoom when tapping input fields on iPhone
2025-07-23 19:39:39 -04:00
henrygd
485f7d16ff add tests for agent/client.go and hub/ws/ws.go 2025-07-23 15:54:02 -04:00
henrygd
46fdc94cb8 improve bandwidth measurement precision + refactor default area chart 2025-07-23 15:52:02 -04:00
henrygd
261f7fb76c update go dependencies 2025-07-21 20:14:31 -04:00
henrygd
18d9258907 Alert history updates 2025-07-21 20:07:52 -04:00
Sven van Ginkel
9d7fb8ab80 [Feature] Add Alerts History page (#973)
* Add alert history

* refactor

* fix one colunm

* update migration

* add retention
2025-07-20 19:20:51 -04:00
henrygd
3730a78e5a update load avg display and include it in longer records 2025-07-16 21:24:42 -04:00
Sven van Ginkel
7cdd0907e8 [Feature][0.12.0-Beta] Enhance Load Average Display, Charting & Alert Grouping (#960)
* Add 1m load

* update alart dialog

* fix null data

* Remove omit zero

* change table and alert view
2025-07-16 16:03:26 -04:00
henrygd
3586f73f30 check for malformed sensor names on darwin (#796) 2025-07-16 14:56:13 -04:00
henrygd
752ccc6beb hide tokens page for readonly users 2025-07-16 14:41:23 -04:00
henrygd
f577476c81 clear systems from memory on logout (#970) 2025-07-16 14:39:15 -04:00
henrygd
49ae424698 refactor: consolidate fixedFloat funcs + remove trailing zeroes from y axis 2025-07-15 21:46:41 -04:00
henrygd
d4fd19522b fix races when loading user settings 2025-07-15 21:29:51 -04:00
henrygd
5c047e4afd Refactor unit preferences and update chart components
* Refactor user settings to use enum for unit preferences (temperature,
network, disk).
* Update chart components to utilize new unit formatting functions
* Remove deprecated conversion functions and streamline unit handling
across charts.
* Enhance settings page to allow user selection of unit preferences with
updated labels.
2025-07-15 18:57:37 -04:00
90 changed files with 8175 additions and 2908 deletions

View File

@@ -56,7 +56,7 @@ dev-hub: export ENV=dev
dev-hub:
mkdir -p ./site/dist && touch ./site/dist/index.html
@if command -v entr >/dev/null 2>&1; then \
find ./cmd/hub ./internal/{alerts,hub,records,users} -name "*.go" | entr -r -s "cd ./cmd/hub && go run . serve"; \
find ./cmd/hub/*.go ./internal/{alerts,hub,records,users}/*.go | entr -r -s "cd ./cmd/hub && go run . serve --http 0.0.0.0:8090"; \
else \
cd ./cmd/hub && go run . serve --http 0.0.0.0:8090; \
fi

View File

@@ -7,20 +7,20 @@ replace github.com/nicholas-fedor/shoutrrr => github.com/nicholas-fedor/shoutrrr
require (
github.com/blang/semver v3.5.1+incompatible
github.com/fxamacker/cbor/v2 v2.8.0
github.com/fxamacker/cbor/v2 v2.9.0
github.com/gliderlabs/ssh v0.3.8
github.com/google/uuid v1.6.0
github.com/lxzan/gws v1.8.9
github.com/nicholas-fedor/shoutrrr v0.8.15
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.28.4
github.com/pocketbase/pocketbase v0.29.0
github.com/rhysd/go-github-selfupdate v1.2.3
github.com/shirou/gopsutil/v4 v4.25.6
github.com/spf13/cast v1.9.2
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
golang.org/x/crypto v0.39.0
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b
golang.org/x/crypto v0.40.0
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
gopkg.in/yaml.v3 v3.0.1
)
@@ -39,7 +39,7 @@ require (
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/go-sql-driver/mysql v1.9.1 // indirect
github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
github.com/golang-jwt/jwt/v5 v5.2.3 // indirect
github.com/google/go-github/v30 v30.1.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
@@ -52,19 +52,19 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/spf13/pflag v1.0.7 // indirect
github.com/tcnksm/go-gitconfig v0.1.2 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/ulikunitz/xz v0.5.12 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/image v0.28.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/image v0.29.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.15.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
modernc.org/libc v1.65.10 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect

View File

@@ -26,8 +26,8 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/
github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fxamacker/cbor/v2 v2.8.0 h1:fFtUGXUzXPHTIUdne5+zzMPTfffl3RD5qYnkY40vtxU=
github.com/fxamacker/cbor/v2 v2.8.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM=
github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ=
github.com/gabriel-vasile/mimetype v1.4.9 h1:5k+WDwEsD9eTLL8Tz3L0VnmVh9QxGjRmjBvAG7U/oYY=
github.com/gabriel-vasile/mimetype v1.4.9/go.mod h1:WnSQhFKJuBlRyLiKohA/2DtIlPFAbguNaG7QCHcyGok=
github.com/ganigeorgiev/fexpr v0.5.0 h1:XA9JxtTE/Xm+g/JFI6RfZEHSiQlk+1glLvRK1Lpv/Tk=
@@ -46,8 +46,8 @@ github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtS
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
github.com/golang-jwt/jwt/v5 v5.2.2/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -103,8 +103,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.28.4 h1:RmhWXDcfKrFM9/W0G0Zrlv4eKBM8/s/v4SQKytjgD20=
github.com/pocketbase/pocketbase v0.28.4/go.mod h1:jSuN93vE/oeJVOz2D2ZxcYyr2bYNmDOMCUkM+JhyJQ0=
github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIaf1R8KUs=
github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
@@ -120,8 +120,9 @@ github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE=
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.7 h1:vN6T9TfwStFPFM5XzjsvmzZkLuaLX+HS+0SeFLRgU6M=
github.com/spf13/pflag v1.0.7/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
@@ -143,29 +144,29 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.28.0 h1:gdem5JW1OLS4FbkWgLO+7ZeFzYtL3xClb97GaUzYMFE=
golang.org/x/image v0.28.0/go.mod h1:GUJYXtnGKEUgggyzh+Vxt+AviiCcyiwpsl8iQ8MvwGY=
golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas=
golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -173,19 +174,19 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -201,16 +202,20 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.26.1 h1:+X5NtzVBn0KgsBCBe+xkDC7twLb/jNVj9FPgiwSQO3s=
modernc.org/cc/v4 v4.26.1/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM=
modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
modernc.org/fileutil v1.3.3 h1:3qaU+7f7xxTUmvU1pJTZiDLAIoJVdUSSauJNHg9yXoA=
modernc.org/fileutil v1.3.3/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM=
modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc=
modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=

View File

@@ -0,0 +1,391 @@
//go:build testing
// +build testing
package agent
import (
"beszel"
"beszel/internal/common"
"crypto/ed25519"
"net/url"
"os"
"strings"
"testing"
"time"
"github.com/fxamacker/cbor/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
)
// TestNewWebSocketClient tests WebSocket client creation
func TestNewWebSocketClient(t *testing.T) {
agent := createTestAgent(t)
testCases := []struct {
name string
hubURL string
token string
expectError bool
errorMsg string
}{
{
name: "valid configuration",
hubURL: "http://localhost:8080",
token: "test-token-123",
expectError: false,
},
{
name: "valid https URL",
hubURL: "https://hub.example.com",
token: "secure-token",
expectError: false,
},
{
name: "missing hub URL",
hubURL: "",
token: "test-token",
expectError: true,
errorMsg: "HUB_URL environment variable not set",
},
{
name: "invalid URL",
hubURL: "ht\ttp://invalid",
token: "test-token",
expectError: true,
errorMsg: "invalid hub URL",
},
{
name: "missing token",
hubURL: "http://localhost:8080",
token: "",
expectError: true,
errorMsg: "TOKEN environment variable not set",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Set up environment
if tc.hubURL != "" {
os.Setenv("BESZEL_AGENT_HUB_URL", tc.hubURL)
} else {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
}
if tc.token != "" {
os.Setenv("BESZEL_AGENT_TOKEN", tc.token)
} else {
os.Unsetenv("BESZEL_AGENT_TOKEN")
}
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
if tc.expectError {
assert.Error(t, err)
if err != nil && tc.errorMsg != "" {
assert.Contains(t, err.Error(), tc.errorMsg)
}
assert.Nil(t, client)
} else {
require.NoError(t, err)
assert.NotNil(t, client)
assert.Equal(t, agent, client.agent)
assert.Equal(t, tc.token, client.token)
assert.Equal(t, tc.hubURL, client.hubURL.String())
assert.NotEmpty(t, client.fingerprint)
assert.NotNil(t, client.hubRequest)
}
})
}
}
// TestWebSocketClient_GetOptions tests WebSocket client options configuration
func TestWebSocketClient_GetOptions(t *testing.T) {
agent := createTestAgent(t)
testCases := []struct {
name string
inputURL string
expectedScheme string
expectedPath string
}{
{
name: "http to ws conversion",
inputURL: "http://localhost:8080",
expectedScheme: "ws",
expectedPath: "/api/beszel/agent-connect",
},
{
name: "https to wss conversion",
inputURL: "https://hub.example.com",
expectedScheme: "wss",
expectedPath: "/api/beszel/agent-connect",
},
{
name: "existing path preservation",
inputURL: "http://localhost:8080/custom/path",
expectedScheme: "ws",
expectedPath: "/custom/path/api/beszel/agent-connect",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Set up environment
os.Setenv("BESZEL_AGENT_HUB_URL", tc.inputURL)
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
require.NoError(t, err)
options := client.getOptions()
// Parse the WebSocket URL
wsURL, err := url.Parse(options.Addr)
require.NoError(t, err)
assert.Equal(t, tc.expectedScheme, wsURL.Scheme)
assert.Equal(t, tc.expectedPath, wsURL.Path)
// Check headers
assert.Equal(t, "test-token", options.RequestHeader.Get("X-Token"))
assert.Equal(t, beszel.Version, options.RequestHeader.Get("X-Beszel"))
assert.Contains(t, options.RequestHeader.Get("User-Agent"), "Mozilla/5.0")
// Test options caching
options2 := client.getOptions()
assert.Same(t, options, options2, "Options should be cached")
})
}
}
// TestWebSocketClient_VerifySignature tests signature verification
func TestWebSocketClient_VerifySignature(t *testing.T) {
agent := createTestAgent(t)
// Generate test key pairs
_, goodPrivKey, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
goodPubKey, err := ssh.NewPublicKey(goodPrivKey.Public().(ed25519.PublicKey))
require.NoError(t, err)
_, badPrivKey, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
badPubKey, err := ssh.NewPublicKey(badPrivKey.Public().(ed25519.PublicKey))
require.NoError(t, err)
// Set up environment
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
require.NoError(t, err)
testCases := []struct {
name string
keys []ssh.PublicKey
token string
signWith ed25519.PrivateKey
expectError bool
}{
{
name: "valid signature with correct key",
keys: []ssh.PublicKey{goodPubKey},
token: "test-token",
signWith: goodPrivKey,
expectError: false,
},
{
name: "invalid signature with wrong key",
keys: []ssh.PublicKey{goodPubKey},
token: "test-token",
signWith: badPrivKey,
expectError: true,
},
{
name: "valid signature with multiple keys",
keys: []ssh.PublicKey{badPubKey, goodPubKey},
token: "test-token",
signWith: goodPrivKey,
expectError: false,
},
{
name: "no valid keys",
keys: []ssh.PublicKey{badPubKey},
token: "test-token",
signWith: goodPrivKey,
expectError: true,
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Set up agent with test keys
agent.keys = tc.keys
client.token = tc.token
// Create signature
signature := ed25519.Sign(tc.signWith, []byte(tc.token))
err := client.verifySignature(signature)
if tc.expectError {
assert.Error(t, err)
assert.Contains(t, err.Error(), "invalid signature")
} else {
assert.NoError(t, err)
}
})
}
}
// TestWebSocketClient_HandleHubRequest tests hub request routing (basic verification logic)
func TestWebSocketClient_HandleHubRequest(t *testing.T) {
agent := createTestAgent(t)
// Set up environment
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
require.NoError(t, err)
testCases := []struct {
name string
action common.WebSocketAction
hubVerified bool
expectError bool
errorMsg string
}{
{
name: "CheckFingerprint without verification",
action: common.CheckFingerprint,
hubVerified: false,
expectError: false, // CheckFingerprint is allowed without verification
},
{
name: "GetData without verification",
action: common.GetData,
hubVerified: false,
expectError: true,
errorMsg: "hub not verified",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
client.hubVerified = tc.hubVerified
// Create minimal request
hubRequest := &common.HubRequest[cbor.RawMessage]{
Action: tc.action,
Data: cbor.RawMessage{},
}
err := client.handleHubRequest(hubRequest)
if tc.expectError {
assert.Error(t, err)
if tc.errorMsg != "" {
assert.Contains(t, err.Error(), tc.errorMsg)
}
} else {
// For CheckFingerprint, we expect a decode error since we're not providing valid data,
// but it shouldn't be the "hub not verified" error
if err != nil && tc.errorMsg != "" {
assert.NotContains(t, err.Error(), tc.errorMsg)
}
}
})
}
}
// TestWebSocketClient_GetUserAgent tests user agent generation
func TestGetUserAgent(t *testing.T) {
// Run multiple times to check both variants
userAgents := make(map[string]bool)
for range 20 {
ua := getUserAgent()
userAgents[ua] = true
// Check that it's a valid Mozilla user agent
assert.Contains(t, ua, "Mozilla/5.0")
assert.Contains(t, ua, "AppleWebKit/537.36")
assert.Contains(t, ua, "Chrome/124.0.0.0")
assert.Contains(t, ua, "Safari/537.36")
// Should contain either Windows or Mac
isWindows := strings.Contains(ua, "Windows NT 11.0")
isMac := strings.Contains(ua, "Macintosh; Intel Mac OS X 14_0_0")
assert.True(t, isWindows || isMac, "User agent should contain either Windows or Mac identifier")
}
// With enough iterations, we should see both variants
// though this might occasionally fail
if len(userAgents) == 1 {
t.Log("Note: Only one user agent variant was generated in this test run")
}
}
// TestWebSocketClient_Close tests connection closing
func TestWebSocketClient_Close(t *testing.T) {
agent := createTestAgent(t)
// Set up environment
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
require.NoError(t, err)
// Test closing with nil connection (should not panic)
assert.NotPanics(t, func() {
client.Close()
})
}
// TestWebSocketClient_ConnectRateLimit tests connection rate limiting
func TestWebSocketClient_ConnectRateLimit(t *testing.T) {
agent := createTestAgent(t)
// Set up environment
os.Setenv("BESZEL_AGENT_HUB_URL", "http://localhost:8080")
os.Setenv("BESZEL_AGENT_TOKEN", "test-token")
defer func() {
os.Unsetenv("BESZEL_AGENT_HUB_URL")
os.Unsetenv("BESZEL_AGENT_TOKEN")
}()
client, err := newWebSocketClient(agent)
require.NoError(t, err)
// Set recent connection attempt
client.lastConnectAttempt = time.Now()
// Test that connection fails quickly due to rate limiting
// This won't actually connect but should fail fast
err = client.Connect()
assert.Error(t, err, "Connection should fail but not hang")
}

View File

@@ -6,8 +6,10 @@ import (
"fmt"
"log/slog"
"path"
"runtime"
"strconv"
"strings"
"unicode/utf8"
"github.com/shirou/gopsutil/v4/common"
"github.com/shirou/gopsutil/v4/sensors"
@@ -103,6 +105,11 @@ func (a *Agent) updateTemperatures(systemStats *system.Stats) {
systemStats.Temperatures = make(map[string]float64, len(temps))
for i, sensor := range temps {
// check for malformed strings on darwin (gopsutil/issues/1832)
if runtime.GOOS == "darwin" && !utf8.ValidString(sensor.SensorKey) {
continue
}
// scale temperature
if sensor.Temperature != 0 && sensor.Temperature < 1 {
sensor.Temperature = scaleTemperature(sensor.Temperature)

View File

@@ -473,11 +473,11 @@ func TestWriteToSessionEncoding(t *testing.T) {
hubVersion: "0.12.0-beta0",
expectedUsesCbor: false,
},
{
name: "matching beta version should use CBOR",
hubVersion: "0.12.0-beta2",
expectedUsesCbor: true,
},
// {
// name: "matching beta version should use CBOR",
// hubVersion: "0.12.0-beta2",
// expectedUsesCbor: true,
// },
}
for _, tt := range tests {

View File

@@ -174,24 +174,27 @@ func (a *Agent) getSystemStats() system.Stats {
a.initializeNetIoStats()
}
if netIO, err := psutilNet.IOCounters(true); err == nil {
secondsElapsed := time.Since(a.netIoStats.Time).Seconds()
msElapsed := uint64(time.Since(a.netIoStats.Time).Milliseconds())
a.netIoStats.Time = time.Now()
bytesSent := uint64(0)
bytesRecv := uint64(0)
totalBytesSent := uint64(0)
totalBytesRecv := uint64(0)
// sum all bytes sent and received
for _, v := range netIO {
// skip if not in valid network interfaces list
if _, exists := a.netInterfaces[v.Name]; !exists {
continue
}
bytesSent += v.BytesSent
bytesRecv += v.BytesRecv
totalBytesSent += v.BytesSent
totalBytesRecv += v.BytesRecv
}
// add to systemStats
sentPerSecond := float64(bytesSent-a.netIoStats.BytesSent) / secondsElapsed
recvPerSecond := float64(bytesRecv-a.netIoStats.BytesRecv) / secondsElapsed
networkSentPs := bytesToMegabytes(sentPerSecond)
networkRecvPs := bytesToMegabytes(recvPerSecond)
var bytesSentPerSecond, bytesRecvPerSecond uint64
if msElapsed > 0 {
bytesSentPerSecond = (totalBytesSent - a.netIoStats.BytesSent) * 1000 / msElapsed
bytesRecvPerSecond = (totalBytesRecv - a.netIoStats.BytesRecv) * 1000 / msElapsed
}
networkSentPs := bytesToMegabytes(float64(bytesSentPerSecond))
networkRecvPs := bytesToMegabytes(float64(bytesRecvPerSecond))
// add check for issue (#150) where sent is a massive number
if networkSentPs > 10_000 || networkRecvPs > 10_000 {
slog.Warn("Invalid net stats. Resetting.", "sent", networkSentPs, "recv", networkRecvPs)
@@ -206,9 +209,10 @@ func (a *Agent) getSystemStats() system.Stats {
} else {
systemStats.NetworkSent = networkSentPs
systemStats.NetworkRecv = networkRecvPs
systemStats.Bandwidth[0], systemStats.Bandwidth[1] = bytesSentPerSecond, bytesRecvPerSecond
// update netIoStats
a.netIoStats.BytesSent = bytesSent
a.netIoStats.BytesRecv = bytesRecv
a.netIoStats.BytesSent = totalBytesSent
a.netIoStats.BytesRecv = totalBytesRecv
}
}
@@ -251,12 +255,15 @@ func (a *Agent) getSystemStats() system.Stats {
// update base system info
a.systemInfo.Cpu = systemStats.Cpu
a.systemInfo.LoadAvg1 = systemStats.LoadAvg1
a.systemInfo.LoadAvg5 = systemStats.LoadAvg5
a.systemInfo.LoadAvg15 = systemStats.LoadAvg15
a.systemInfo.MemPct = systemStats.MemPct
a.systemInfo.DiskPct = systemStats.DiskPct
a.systemInfo.Uptime, _ = host.Uptime()
// TODO: in future release, remove MB bandwidth values in favor of bytes
a.systemInfo.Bandwidth = twoDecimals(systemStats.NetworkSent + systemStats.NetworkRecv)
a.systemInfo.BandwidthBytes = systemStats.Bandwidth[0] + systemStats.Bandwidth[1]
slog.Debug("sysinfo", "data", a.systemInfo)
return systemStats

View File

@@ -47,6 +47,7 @@ type SystemAlertStats struct {
NetSent float64 `json:"ns"`
NetRecv float64 `json:"nr"`
Temperatures map[string]float32 `json:"t"`
LoadAvg1 float64 `json:"l1"`
LoadAvg5 float64 `json:"l5"`
LoadAvg15 float64 `json:"l15"`
}
@@ -92,10 +93,18 @@ func NewAlertManager(app hubLike) *AlertManager {
alertQueue: make(chan alertTask),
stopChan: make(chan struct{}),
}
am.bindEvents()
go am.startWorker()
return am
}
// Bind events to the alerts collection lifecycle
func (am *AlertManager) bindEvents() {
am.hub.OnRecordAfterUpdateSuccess("alerts").BindFunc(updateHistoryOnAlertUpdate)
am.hub.OnRecordAfterDeleteSuccess("alerts").BindFunc(resolveHistoryOnAlertDelete)
}
// SendAlert sends an alert to the user
func (am *AlertManager) SendAlert(data AlertMessageData) error {
// get user settings
record, err := am.hub.FindFirstRecordByFilter(

View File

@@ -0,0 +1,85 @@
package alerts
import (
"time"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
)
// On triggered alert record delete, set matching alert history record to resolved
func resolveHistoryOnAlertDelete(e *core.RecordEvent) error {
if !e.Record.GetBool("triggered") {
return e.Next()
}
_ = resolveAlertHistoryRecord(e.App, e.Record)
return e.Next()
}
// On alert record update, update alert history record
func updateHistoryOnAlertUpdate(e *core.RecordEvent) error {
original := e.Record.Original()
new := e.Record
originalTriggered := original.GetBool("triggered")
newTriggered := new.GetBool("triggered")
// no need to update alert history if triggered state has not changed
if originalTriggered == newTriggered {
return e.Next()
}
// if new state is triggered, create new alert history record
if newTriggered {
_, _ = createAlertHistoryRecord(e.App, new)
return e.Next()
}
// if new state is not triggered, check for matching alert history record and set it to resolved
_ = resolveAlertHistoryRecord(e.App, new)
return e.Next()
}
// resolveAlertHistoryRecord sets the resolved field to the current time
func resolveAlertHistoryRecord(app core.App, alertRecord *core.Record) error {
alertHistoryRecords, err := app.FindRecordsByFilter(
"alerts_history",
"alert_id={:alert_id} && resolved=null",
"-created",
1,
0,
dbx.Params{"alert_id": alertRecord.Id},
)
if err != nil {
return err
}
if len(alertHistoryRecords) == 0 {
return nil
}
alertHistoryRecord := alertHistoryRecords[0] // there should be only one record
alertHistoryRecord.Set("resolved", time.Now().UTC())
err = app.Save(alertHistoryRecord)
if err != nil {
app.Logger().Error("Failed to resolve alert history", "err", err)
}
return err
}
// createAlertHistoryRecord creates a new alert history record
func createAlertHistoryRecord(app core.App, alertRecord *core.Record) (alertHistoryRecord *core.Record, err error) {
alertHistoryCollection, err := app.FindCachedCollectionByNameOrId("alerts_history")
if err != nil {
return nil, err
}
alertHistoryRecord = core.NewRecord(alertHistoryCollection)
alertHistoryRecord.Set("alert_id", alertRecord.Id)
alertHistoryRecord.Set("user", alertRecord.GetString("user"))
alertHistoryRecord.Set("system", alertRecord.GetString("system"))
alertHistoryRecord.Set("name", alertRecord.GetString("name"))
alertHistoryRecord.Set("value", alertRecord.GetFloat("value"))
err = app.Save(alertHistoryRecord)
if err != nil {
app.Logger().Error("Failed to save alert history", "err", err)
}
return alertHistoryRecord, err
}

View File

@@ -136,6 +136,14 @@ func (am *AlertManager) handleSystemUp(systemName string, alertRecords []*core.R
// sendStatusAlert sends a status alert ("up" or "down") to the users associated with the alert records.
func (am *AlertManager) sendStatusAlert(alertStatus string, systemName string, alertRecord *core.Record) error {
switch alertStatus {
case "up":
alertRecord.Set("triggered", false)
case "down":
alertRecord.Set("triggered", true)
}
am.hub.Save(alertRecord)
var emoji string
if alertStatus == "up" {
emoji = "\u2705" // Green checkmark emoji
@@ -146,16 +154,16 @@ func (am *AlertManager) sendStatusAlert(alertStatus string, systemName string, a
title := fmt.Sprintf("Connection to %s is %s %v", systemName, alertStatus, emoji)
message := strings.TrimSuffix(title, emoji)
if errs := am.hub.ExpandRecord(alertRecord, []string{"user"}, nil); len(errs) > 0 {
return errs["user"]
}
user := alertRecord.ExpandedOne("user")
if user == nil {
return nil
}
// if errs := am.hub.ExpandRecord(alertRecord, []string{"user"}, nil); len(errs) > 0 {
// return errs["user"]
// }
// user := alertRecord.ExpandedOne("user")
// if user == nil {
// return nil
// }
return am.SendAlert(AlertMessageData{
UserID: user.Id,
UserID: alertRecord.GetString("user"),
Title: title,
Message: message,
Link: am.hub.MakeLink("system", systemName),

View File

@@ -15,7 +15,7 @@ import (
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *system.CombinedData) error {
alertRecords, err := am.hub.FindAllRecords("alerts",
dbx.NewExp("system={:system}", dbx.Params{"system": systemRecord.Id}),
dbx.NewExp("system={:system} AND name!='Status'", dbx.Params{"system": systemRecord.Id}),
)
if err != nil || len(alertRecords) == 0 {
// log.Println("no alerts found for system")
@@ -54,6 +54,9 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
}
val = data.Info.DashboardTemp
unit = "°C"
case "LoadAvg1":
val = data.Info.LoadAvg1
unit = ""
case "LoadAvg5":
val = data.Info.LoadAvg5
unit = ""
@@ -196,6 +199,8 @@ func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, data *syst
}
alert.mapSums[key] += temp
}
case "LoadAvg1":
alert.val += stats.LoadAvg1
case "LoadAvg5":
alert.val += stats.LoadAvg5
case "LoadAvg15":

View File

@@ -34,6 +34,8 @@ type Stats struct {
LoadAvg1 float64 `json:"l1,omitempty" cbor:"23,keyasint,omitempty,omitzero"`
LoadAvg5 float64 `json:"l5,omitempty" cbor:"24,keyasint,omitempty,omitzero"`
LoadAvg15 float64 `json:"l15,omitempty" cbor:"25,keyasint,omitempty,omitzero"`
Bandwidth [2]uint64 `json:"b,omitzero" cbor:"26,keyasint,omitzero"` // [sent bytes, recv bytes]
MaxBandwidth [2]uint64 `json:"bm,omitzero" cbor:"27,keyasint,omitzero"` // [sent bytes, recv bytes]
}
type GPUData struct {
@@ -77,23 +79,25 @@ const (
)
type Info struct {
Hostname string `json:"h" cbor:"0,keyasint"`
KernelVersion string `json:"k,omitempty" cbor:"1,keyasint,omitempty"`
Cores int `json:"c" cbor:"2,keyasint"`
Threads int `json:"t,omitempty" cbor:"3,keyasint,omitempty"`
CpuModel string `json:"m" cbor:"4,keyasint"`
Uptime uint64 `json:"u" cbor:"5,keyasint"`
Cpu float64 `json:"cpu" cbor:"6,keyasint"`
MemPct float64 `json:"mp" cbor:"7,keyasint"`
DiskPct float64 `json:"dp" cbor:"8,keyasint"`
Bandwidth float64 `json:"b" cbor:"9,keyasint"`
AgentVersion string `json:"v" cbor:"10,keyasint"`
Podman bool `json:"p,omitempty" cbor:"11,keyasint,omitempty"`
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
Os Os `json:"os" cbor:"14,keyasint"`
LoadAvg5 float64 `json:"l5,omitempty" cbor:"15,keyasint,omitempty,omitzero"`
LoadAvg15 float64 `json:"l15,omitempty" cbor:"16,keyasint,omitempty,omitzero"`
Hostname string `json:"h" cbor:"0,keyasint"`
KernelVersion string `json:"k,omitempty" cbor:"1,keyasint,omitempty"`
Cores int `json:"c" cbor:"2,keyasint"`
Threads int `json:"t,omitempty" cbor:"3,keyasint,omitempty"`
CpuModel string `json:"m" cbor:"4,keyasint"`
Uptime uint64 `json:"u" cbor:"5,keyasint"`
Cpu float64 `json:"cpu" cbor:"6,keyasint"`
MemPct float64 `json:"mp" cbor:"7,keyasint"`
DiskPct float64 `json:"dp" cbor:"8,keyasint"`
Bandwidth float64 `json:"b" cbor:"9,keyasint"`
AgentVersion string `json:"v" cbor:"10,keyasint"`
Podman bool `json:"p,omitempty" cbor:"11,keyasint,omitempty"`
GpuPct float64 `json:"g,omitempty" cbor:"12,keyasint,omitempty"`
DashboardTemp float64 `json:"dt,omitempty" cbor:"13,keyasint,omitempty"`
Os Os `json:"os" cbor:"14,keyasint"`
LoadAvg1 float64 `json:"l1,omitempty" cbor:"15,keyasint,omitempty"`
LoadAvg5 float64 `json:"l5,omitempty" cbor:"16,keyasint,omitempty"`
LoadAvg15 float64 `json:"l15,omitempty" cbor:"17,keyasint,omitempty"`
BandwidthBytes uint64 `json:"bb" cbor:"18,keyasint"`
}
// Final data structure to return to the hub

View File

@@ -215,7 +215,7 @@ func (h *Hub) startServer(se *core.ServeEvent) error {
// registerCronJobs sets up scheduled tasks
func (h *Hub) registerCronJobs(_ *core.ServeEvent) error {
// delete old records once every hour
// delete old system_stats and alerts_history records once every hour
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
// create longer records every 10 minutes
h.Cron().MustAdd("create longer records", "*/10 * * * *", h.rm.CreateLongerRecords)

View File

@@ -159,8 +159,10 @@ func (sm *SystemManager) onRecordUpdate(e *core.RecordEvent) error {
// - down: Triggers status change alerts
func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
newStatus := e.Record.GetString("status")
prevStatus := pending
system, ok := sm.systems.GetOk(e.Record.Id)
if ok {
prevStatus = system.Status
system.Status = newStatus
}
@@ -182,6 +184,7 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
if err := sm.AddRecord(e.Record, nil); err != nil {
e.App.Logger().Error("Error adding record", "err", err)
}
_ = deactivateAlerts(e.App, e.Record.Id)
return e.Next()
}
@@ -190,8 +193,6 @@ func (sm *SystemManager) onRecordAfterUpdateSuccess(e *core.RecordEvent) error {
return sm.AddRecord(e.Record, nil)
}
prevStatus := system.Status
// Trigger system alerts when system comes online
if newStatus == up {
if err := sm.hub.HandleSystemAlerts(e.Record, system.data); err != nil {

View File

@@ -114,6 +114,9 @@ func (ws *WsConn) Ping() error {
// sendMessage encodes data to CBOR and sends it as a binary message to the agent.
func (ws *WsConn) sendMessage(data common.HubRequest[any]) error {
if ws.conn == nil {
return gws.ErrConnClosed
}
bytes, err := cbor.Marshal(data)
if err != nil {
return err

View File

@@ -0,0 +1,221 @@
//go:build testing
// +build testing
package ws
import (
"beszel/internal/common"
"crypto/ed25519"
"testing"
"time"
"github.com/fxamacker/cbor/v2"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
)
// TestGetUpgrader tests the singleton upgrader
func TestGetUpgrader(t *testing.T) {
// Reset the global upgrader to test singleton behavior
upgrader = nil
// First call should create the upgrader
upgrader1 := GetUpgrader()
assert.NotNil(t, upgrader1, "Upgrader should not be nil")
// Second call should return the same instance
upgrader2 := GetUpgrader()
assert.Same(t, upgrader1, upgrader2, "Should return the same upgrader instance")
// Verify it's properly configured
assert.NotNil(t, upgrader1, "Upgrader should be configured")
}
// TestNewWsConnection tests WebSocket connection creation
func TestNewWsConnection(t *testing.T) {
// We can't easily mock gws.Conn, so we'll pass nil and test the structure
wsConn := NewWsConnection(nil)
assert.NotNil(t, wsConn, "WebSocket connection should not be nil")
assert.Nil(t, wsConn.conn, "Connection should be nil as passed")
assert.NotNil(t, wsConn.responseChan, "Response channel should be initialized")
assert.NotNil(t, wsConn.DownChan, "Down channel should be initialized")
assert.Equal(t, 1, cap(wsConn.responseChan), "Response channel should have capacity of 1")
assert.Equal(t, 1, cap(wsConn.DownChan), "Down channel should have capacity of 1")
}
// TestWsConn_IsConnected tests the connection status check
func TestWsConn_IsConnected(t *testing.T) {
// Test with nil connection
wsConn := NewWsConnection(nil)
assert.False(t, wsConn.IsConnected(), "Should not be connected when conn is nil")
}
// TestWsConn_Close tests the connection closing with nil connection
func TestWsConn_Close(t *testing.T) {
wsConn := NewWsConnection(nil)
// Should handle nil connection gracefully
assert.NotPanics(t, func() {
wsConn.Close([]byte("test message"))
}, "Should not panic when closing nil connection")
}
// TestWsConn_SendMessage_CBOR tests CBOR encoding in sendMessage
func TestWsConn_SendMessage_CBOR(t *testing.T) {
wsConn := NewWsConnection(nil)
testData := common.HubRequest[any]{
Action: common.GetData,
Data: "test data",
}
// This will fail because conn is nil, but we can test the CBOR encoding logic
// by checking that the function properly encodes to CBOR before failing
err := wsConn.sendMessage(testData)
assert.Error(t, err, "Should error with nil connection")
// Test CBOR encoding separately
bytes, err := cbor.Marshal(testData)
assert.NoError(t, err, "Should encode to CBOR successfully")
// Verify we can decode it back
var decodedData common.HubRequest[any]
err = cbor.Unmarshal(bytes, &decodedData)
assert.NoError(t, err, "Should decode from CBOR successfully")
assert.Equal(t, testData.Action, decodedData.Action, "Action should match")
}
// TestWsConn_GetFingerprint_SignatureGeneration tests signature creation logic
func TestWsConn_GetFingerprint_SignatureGeneration(t *testing.T) {
// Generate test key pair
_, privKey, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
signer, err := ssh.NewSignerFromKey(privKey)
require.NoError(t, err)
token := "test-token"
// This will timeout since conn is nil, but we can verify the signature logic
// We can't test the full flow, but we can test that the signature is created properly
challenge := []byte(token)
signature, err := signer.Sign(nil, challenge)
assert.NoError(t, err, "Should create signature successfully")
assert.NotEmpty(t, signature.Blob, "Signature blob should not be empty")
assert.Equal(t, signer.PublicKey().Type(), signature.Format, "Signature format should match key type")
// Test the fingerprint request structure
fpRequest := common.FingerprintRequest{
Signature: signature.Blob,
NeedSysInfo: true,
}
// Test CBOR encoding of fingerprint request
fpData, err := cbor.Marshal(fpRequest)
assert.NoError(t, err, "Should encode fingerprint request to CBOR")
var decodedFpRequest common.FingerprintRequest
err = cbor.Unmarshal(fpData, &decodedFpRequest)
assert.NoError(t, err, "Should decode fingerprint request from CBOR")
assert.Equal(t, fpRequest.Signature, decodedFpRequest.Signature, "Signature should match")
assert.Equal(t, fpRequest.NeedSysInfo, decodedFpRequest.NeedSysInfo, "NeedSysInfo should match")
// Test the full hub request structure
hubRequest := common.HubRequest[any]{
Action: common.CheckFingerprint,
Data: fpRequest,
}
hubData, err := cbor.Marshal(hubRequest)
assert.NoError(t, err, "Should encode hub request to CBOR")
var decodedHubRequest common.HubRequest[cbor.RawMessage]
err = cbor.Unmarshal(hubData, &decodedHubRequest)
assert.NoError(t, err, "Should decode hub request from CBOR")
assert.Equal(t, common.CheckFingerprint, decodedHubRequest.Action, "Action should be CheckFingerprint")
}
// TestWsConn_RequestSystemData_RequestFormat tests system data request format
func TestWsConn_RequestSystemData_RequestFormat(t *testing.T) {
// Test the request format that would be sent
request := common.HubRequest[any]{
Action: common.GetData,
}
// Test CBOR encoding
data, err := cbor.Marshal(request)
assert.NoError(t, err, "Should encode request to CBOR")
// Test decoding
var decodedRequest common.HubRequest[any]
err = cbor.Unmarshal(data, &decodedRequest)
assert.NoError(t, err, "Should decode request from CBOR")
assert.Equal(t, common.GetData, decodedRequest.Action, "Should have GetData action")
}
// TestFingerprintRecord tests the FingerprintRecord struct
func TestFingerprintRecord(t *testing.T) {
record := FingerprintRecord{
Id: "test-id",
SystemId: "system-123",
Fingerprint: "test-fingerprint",
Token: "test-token",
}
assert.Equal(t, "test-id", record.Id)
assert.Equal(t, "system-123", record.SystemId)
assert.Equal(t, "test-fingerprint", record.Fingerprint)
assert.Equal(t, "test-token", record.Token)
}
// TestDeadlineConstant tests that the deadline constant is reasonable
func TestDeadlineConstant(t *testing.T) {
assert.Equal(t, 70*time.Second, deadline, "Deadline should be 70 seconds")
}
// TestCommonActions tests that the common actions are properly defined
func TestCommonActions(t *testing.T) {
// Test that the actions we use exist and have expected values
assert.Equal(t, common.WebSocketAction(0), common.GetData, "GetData should be action 0")
assert.Equal(t, common.WebSocketAction(1), common.CheckFingerprint, "CheckFingerprint should be action 1")
}
// TestHandler tests that we can create a Handler
func TestHandler(t *testing.T) {
handler := &Handler{}
assert.NotNil(t, handler, "Handler should be created successfully")
// The Handler embeds gws.BuiltinEventHandler, so it should have the embedded type
assert.NotNil(t, handler.BuiltinEventHandler, "Should have embedded BuiltinEventHandler")
}
// TestWsConnChannelBehavior tests channel behavior without WebSocket connections
func TestWsConnChannelBehavior(t *testing.T) {
wsConn := NewWsConnection(nil)
// Test that channels are properly initialized and can be used
select {
case wsConn.DownChan <- struct{}{}:
// Should be able to write to channel
default:
t.Error("Should be able to write to DownChan")
}
// Test reading from DownChan
select {
case <-wsConn.DownChan:
// Should be able to read from channel
case <-time.After(10 * time.Millisecond):
t.Error("Should be able to read from DownChan")
}
// Response channel should be empty initially
select {
case <-wsConn.responseChan:
t.Error("Response channel should be empty initially")
default:
// Expected - channel should be empty
}
}

View File

@@ -203,12 +203,19 @@ func (rm *RecordManager) AverageSystemStats(db dbx.Builder, records RecordIds) *
sum.DiskWritePs += stats.DiskWritePs
sum.NetworkSent += stats.NetworkSent
sum.NetworkRecv += stats.NetworkRecv
sum.LoadAvg1 += stats.LoadAvg1
sum.LoadAvg5 += stats.LoadAvg5
sum.LoadAvg15 += stats.LoadAvg15
sum.Bandwidth[0] += stats.Bandwidth[0]
sum.Bandwidth[1] += stats.Bandwidth[1]
// Set peak values
sum.MaxCpu = max(sum.MaxCpu, stats.MaxCpu, stats.Cpu)
sum.MaxNetworkSent = max(sum.MaxNetworkSent, stats.MaxNetworkSent, stats.NetworkSent)
sum.MaxNetworkRecv = max(sum.MaxNetworkRecv, stats.MaxNetworkRecv, stats.NetworkRecv)
sum.MaxDiskReadPs = max(sum.MaxDiskReadPs, stats.MaxDiskReadPs, stats.DiskReadPs)
sum.MaxDiskWritePs = max(sum.MaxDiskWritePs, stats.MaxDiskWritePs, stats.DiskWritePs)
sum.MaxBandwidth[0] = max(sum.MaxBandwidth[0], stats.MaxBandwidth[0], stats.Bandwidth[0])
sum.MaxBandwidth[1] = max(sum.MaxBandwidth[1], stats.MaxBandwidth[1], stats.Bandwidth[1])
// Accumulate temperatures
if stats.Temperatures != nil {
@@ -278,7 +285,11 @@ func (rm *RecordManager) AverageSystemStats(db dbx.Builder, records RecordIds) *
sum.DiskWritePs = twoDecimals(sum.DiskWritePs / count)
sum.NetworkSent = twoDecimals(sum.NetworkSent / count)
sum.NetworkRecv = twoDecimals(sum.NetworkRecv / count)
sum.LoadAvg1 = twoDecimals(sum.LoadAvg1 / count)
sum.LoadAvg5 = twoDecimals(sum.LoadAvg5 / count)
sum.LoadAvg15 = twoDecimals(sum.LoadAvg15 / count)
sum.Bandwidth[0] = sum.Bandwidth[0] / uint64(count)
sum.Bandwidth[1] = sum.Bandwidth[1] / uint64(count)
// Average temperatures
if sum.Temperatures != nil && tempCount > 0 {
for key := range sum.Temperatures {
@@ -361,12 +372,46 @@ func (rm *RecordManager) AverageContainerStats(db dbx.Builder, records RecordIds
return result
}
// Deletes records older than what is displayed in the UI
// Delete old records
func (rm *RecordManager) DeleteOldRecords() {
// Define the collections to process
rm.app.RunInTransaction(func(txApp core.App) error {
err := deleteOldSystemStats(txApp)
if err != nil {
return err
}
err = deleteOldAlertsHistory(txApp, 200, 250)
if err != nil {
return err
}
return nil
})
}
// Delete old alerts history records
func deleteOldAlertsHistory(app core.App, countToKeep, countBeforeDeletion int) error {
db := app.DB()
var users []struct {
Id string `db:"user"`
}
err := db.NewQuery("SELECT user, COUNT(*) as count FROM alerts_history GROUP BY user HAVING count > {:countBeforeDeletion}").Bind(dbx.Params{"countBeforeDeletion": countBeforeDeletion}).All(&users)
if err != nil {
return err
}
for _, user := range users {
_, err = db.NewQuery("DELETE FROM alerts_history WHERE user = {:user} AND id NOT IN (SELECT id FROM alerts_history WHERE user = {:user} ORDER BY created DESC LIMIT {:countToKeep})").Bind(dbx.Params{"user": user.Id, "countToKeep": countToKeep}).Execute()
if err != nil {
return err
}
}
return nil
}
// Deletes system_stats records older than what is displayed in the UI
func deleteOldSystemStats(app core.App) error {
// Collections to process
collections := [2]string{"system_stats", "container_stats"}
// Define record types and their retention periods
// Record types and their retention periods
type RecordDeletionData struct {
recordType string
retention time.Duration
@@ -382,10 +427,9 @@ func (rm *RecordManager) DeleteOldRecords() {
now := time.Now().UTC()
for _, collection := range collections {
// Build the WHERE clause dynamically
// Build the WHERE clause
var conditionParts []string
var params dbx.Params = make(map[string]any)
for i := range recordData {
rd := recordData[i]
// Create parameterized condition for this record type
@@ -393,19 +437,15 @@ func (rm *RecordManager) DeleteOldRecords() {
conditionParts = append(conditionParts, fmt.Sprintf("(type = '%s' AND created < {:%s})", rd.recordType, dateParam))
params[dateParam] = now.Add(-rd.retention)
}
// Combine conditions with OR
conditionStr := strings.Join(conditionParts, " OR ")
// Construct the full raw query
// Construct and execute the full raw query
rawQuery := fmt.Sprintf("DELETE FROM %s WHERE %s", collection, conditionStr)
// Execute the query with parameters
if _, err := rm.app.DB().NewQuery(rawQuery).Bind(params).Execute(); err != nil {
// return fmt.Errorf("failed to delete from %s: %v", collection, err)
rm.app.Logger().Error("failed to delete", "collection", collection, "error", err)
if _, err := app.DB().NewQuery(rawQuery).Bind(params).Execute(); err != nil {
return fmt.Errorf("failed to delete from %s: %v", collection, err)
}
}
return nil
}
/* Round float to two decimals */

View File

@@ -0,0 +1,381 @@
//go:build testing
// +build testing
package records_test
import (
"beszel/internal/records"
"beszel/internal/tests"
"fmt"
"testing"
"time"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/types"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestDeleteOldRecords tests the main DeleteOldRecords function
func TestDeleteOldRecords(t *testing.T) {
hub, err := tests.NewTestHub(t.TempDir())
require.NoError(t, err)
defer hub.Cleanup()
rm := records.NewRecordManager(hub)
// Create test user for alerts history
user, err := tests.CreateUser(hub, "test@example.com", "testtesttest")
require.NoError(t, err)
// Create test system
system, err := tests.CreateRecord(hub, "systems", map[string]any{
"name": "test-system",
"host": "localhost",
"port": "45876",
"status": "up",
"users": []string{user.Id},
})
require.NoError(t, err)
now := time.Now()
// Create old system_stats records that should be deleted
var record *core.Record
record, err = tests.CreateRecord(hub, "system_stats", map[string]any{
"system": system.Id,
"type": "1m",
"stats": `{"cpu": 50.0, "mem": 1024}`,
})
require.NoError(t, err)
// created is autodate field, so we need to set it manually
record.SetRaw("created", now.UTC().Add(-2*time.Hour).Format(types.DefaultDateLayout))
err = hub.SaveNoValidate(record)
require.NoError(t, err)
require.NotNil(t, record)
require.InDelta(t, record.GetDateTime("created").Time().UTC().Unix(), now.UTC().Add(-2*time.Hour).Unix(), 1)
require.Equal(t, record.Get("system"), system.Id)
require.Equal(t, record.Get("type"), "1m")
// Create recent system_stats record that should be kept
_, err = tests.CreateRecord(hub, "system_stats", map[string]any{
"system": system.Id,
"type": "1m",
"stats": `{"cpu": 30.0, "mem": 512}`,
"created": now.Add(-30 * time.Minute), // 30 minutes old, should be kept
})
require.NoError(t, err)
// Create many alerts history records to trigger deletion
for i := range 260 { // More than countBeforeDeletion (250)
_, err = tests.CreateRecord(hub, "alerts_history", map[string]any{
"user": user.Id,
"name": "CPU",
"value": i + 1,
"system": system.Id,
"created": now.Add(-time.Duration(i) * time.Minute),
})
require.NoError(t, err)
}
// Count records before deletion
systemStatsCountBefore, err := hub.CountRecords("system_stats")
require.NoError(t, err)
alertsCountBefore, err := hub.CountRecords("alerts_history")
require.NoError(t, err)
// Run deletion
rm.DeleteOldRecords()
// Count records after deletion
systemStatsCountAfter, err := hub.CountRecords("system_stats")
require.NoError(t, err)
alertsCountAfter, err := hub.CountRecords("alerts_history")
require.NoError(t, err)
// Verify old system stats were deleted
assert.Less(t, systemStatsCountAfter, systemStatsCountBefore, "Old system stats should be deleted")
// Verify alerts history was trimmed
assert.Less(t, alertsCountAfter, alertsCountBefore, "Excessive alerts history should be deleted")
assert.Equal(t, alertsCountAfter, int64(200), "Alerts count should be equal to countToKeep (200)")
}
// TestDeleteOldSystemStats tests the deleteOldSystemStats function
func TestDeleteOldSystemStats(t *testing.T) {
hub, err := tests.NewTestHub(t.TempDir())
require.NoError(t, err)
defer hub.Cleanup()
// Create test system
user, err := tests.CreateUser(hub, "test@example.com", "testtesttest")
require.NoError(t, err)
system, err := tests.CreateRecord(hub, "systems", map[string]any{
"name": "test-system",
"host": "localhost",
"port": "45876",
"status": "up",
"users": []string{user.Id},
})
require.NoError(t, err)
now := time.Now().UTC()
// Test data for different record types and their retention periods
testCases := []struct {
recordType string
retention time.Duration
shouldBeKept bool
ageFromNow time.Duration
description string
}{
{"1m", time.Hour, true, 30 * time.Minute, "1m record within 1 hour should be kept"},
{"1m", time.Hour, false, 2 * time.Hour, "1m record older than 1 hour should be deleted"},
{"10m", 12 * time.Hour, true, 6 * time.Hour, "10m record within 12 hours should be kept"},
{"10m", 12 * time.Hour, false, 24 * time.Hour, "10m record older than 12 hours should be deleted"},
{"20m", 24 * time.Hour, true, 12 * time.Hour, "20m record within 24 hours should be kept"},
{"20m", 24 * time.Hour, false, 48 * time.Hour, "20m record older than 24 hours should be deleted"},
{"120m", 7 * 24 * time.Hour, true, 3 * 24 * time.Hour, "120m record within 7 days should be kept"},
{"120m", 7 * 24 * time.Hour, false, 10 * 24 * time.Hour, "120m record older than 7 days should be deleted"},
{"480m", 30 * 24 * time.Hour, true, 15 * 24 * time.Hour, "480m record within 30 days should be kept"},
{"480m", 30 * 24 * time.Hour, false, 45 * 24 * time.Hour, "480m record older than 30 days should be deleted"},
}
// Create test records for both system_stats and container_stats
collections := []string{"system_stats", "container_stats"}
recordIds := make(map[string][]string)
for _, collection := range collections {
recordIds[collection] = make([]string, 0)
for i, tc := range testCases {
recordTime := now.Add(-tc.ageFromNow)
var stats string
if collection == "system_stats" {
stats = fmt.Sprintf(`{"cpu": %d.0, "mem": %d}`, i*10, i*100)
} else {
stats = fmt.Sprintf(`[{"name": "container%d", "cpu": %d.0, "mem": %d}]`, i, i*5, i*50)
}
record, err := tests.CreateRecord(hub, collection, map[string]any{
"system": system.Id,
"type": tc.recordType,
"stats": stats,
})
require.NoError(t, err)
record.SetRaw("created", recordTime.Format(types.DefaultDateLayout))
err = hub.SaveNoValidate(record)
require.NoError(t, err)
recordIds[collection] = append(recordIds[collection], record.Id)
}
}
// Run deletion
err = records.TestDeleteOldSystemStats(hub)
require.NoError(t, err)
// Verify results
for _, collection := range collections {
for i, tc := range testCases {
recordId := recordIds[collection][i]
// Try to find the record
_, err := hub.FindRecordById(collection, recordId)
if tc.shouldBeKept {
assert.NoError(t, err, "Record should exist: %s", tc.description)
} else {
assert.Error(t, err, "Record should be deleted: %s", tc.description)
}
}
}
}
// TestDeleteOldAlertsHistory tests the deleteOldAlertsHistory function
func TestDeleteOldAlertsHistory(t *testing.T) {
hub, err := tests.NewTestHub(t.TempDir())
require.NoError(t, err)
defer hub.Cleanup()
// Create test users
user1, err := tests.CreateUser(hub, "user1@example.com", "testtesttest")
require.NoError(t, err)
user2, err := tests.CreateUser(hub, "user2@example.com", "testtesttest")
require.NoError(t, err)
system, err := tests.CreateRecord(hub, "systems", map[string]any{
"name": "test-system",
"host": "localhost",
"port": "45876",
"status": "up",
"users": []string{user1.Id, user2.Id},
})
require.NoError(t, err)
now := time.Now().UTC()
testCases := []struct {
name string
user *core.Record
alertCount int
countToKeep int
countBeforeDeletion int
expectedAfterDeletion int
description string
}{
{
name: "User with few alerts (below threshold)",
user: user1,
alertCount: 100,
countToKeep: 50,
countBeforeDeletion: 150,
expectedAfterDeletion: 100, // No deletion because below threshold
description: "User with alerts below countBeforeDeletion should not have any deleted",
},
{
name: "User with many alerts (above threshold)",
user: user2,
alertCount: 300,
countToKeep: 100,
countBeforeDeletion: 200,
expectedAfterDeletion: 100, // Should be trimmed to countToKeep
description: "User with alerts above countBeforeDeletion should be trimmed to countToKeep",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
// Create alerts for this user
for i := 0; i < tc.alertCount; i++ {
_, err := tests.CreateRecord(hub, "alerts_history", map[string]any{
"user": tc.user.Id,
"name": "CPU",
"value": i + 1,
"system": system.Id,
"created": now.Add(-time.Duration(i) * time.Minute),
})
require.NoError(t, err)
}
// Count before deletion
countBefore, err := hub.CountRecords("alerts_history",
dbx.NewExp("user = {:user}", dbx.Params{"user": tc.user.Id}))
require.NoError(t, err)
assert.Equal(t, int64(tc.alertCount), countBefore, "Initial count should match")
// Run deletion
err = records.TestDeleteOldAlertsHistory(hub, tc.countToKeep, tc.countBeforeDeletion)
require.NoError(t, err)
// Count after deletion
countAfter, err := hub.CountRecords("alerts_history",
dbx.NewExp("user = {:user}", dbx.Params{"user": tc.user.Id}))
require.NoError(t, err)
assert.Equal(t, int64(tc.expectedAfterDeletion), countAfter, tc.description)
// If deletion occurred, verify the most recent records were kept
if tc.expectedAfterDeletion < tc.alertCount {
records, err := hub.FindRecordsByFilter("alerts_history",
"user = {:user}",
"-created", // Order by created DESC
tc.countToKeep,
0,
map[string]any{"user": tc.user.Id})
require.NoError(t, err)
assert.Len(t, records, tc.expectedAfterDeletion, "Should have exactly countToKeep records")
// Verify records are in descending order by created time
for i := 1; i < len(records); i++ {
prev := records[i-1].GetDateTime("created").Time()
curr := records[i].GetDateTime("created").Time()
assert.True(t, prev.After(curr) || prev.Equal(curr),
"Records should be ordered by created time (newest first)")
}
}
})
}
}
// TestDeleteOldAlertsHistoryEdgeCases tests edge cases for alerts history deletion
func TestDeleteOldAlertsHistoryEdgeCases(t *testing.T) {
hub, err := tests.NewTestHub(t.TempDir())
require.NoError(t, err)
defer hub.Cleanup()
t.Run("No users with excessive alerts", func(t *testing.T) {
// Create user with few alerts
user, err := tests.CreateUser(hub, "few@example.com", "testtesttest")
require.NoError(t, err)
system, err := tests.CreateRecord(hub, "systems", map[string]any{
"name": "test-system",
"host": "localhost",
"port": "45876",
"status": "up",
"users": []string{user.Id},
})
// Create only 5 alerts (well below threshold)
for i := range 5 {
_, err := tests.CreateRecord(hub, "alerts_history", map[string]any{
"user": user.Id,
"name": "CPU",
"value": i + 1,
"system": system.Id,
})
require.NoError(t, err)
}
// Should not error and should not delete anything
err = records.TestDeleteOldAlertsHistory(hub, 10, 20)
require.NoError(t, err)
count, err := hub.CountRecords("alerts_history")
require.NoError(t, err)
assert.Equal(t, int64(5), count, "All alerts should remain")
})
t.Run("Empty alerts_history table", func(t *testing.T) {
// Clear any existing alerts
_, err := hub.DB().NewQuery("DELETE FROM alerts_history").Execute()
require.NoError(t, err)
// Should not error with empty table
err = records.TestDeleteOldAlertsHistory(hub, 10, 20)
require.NoError(t, err)
})
}
// TestRecordManagerCreation tests RecordManager creation
func TestRecordManagerCreation(t *testing.T) {
hub, err := tests.NewTestHub(t.TempDir())
require.NoError(t, err)
defer hub.Cleanup()
rm := records.NewRecordManager(hub)
assert.NotNil(t, rm, "RecordManager should not be nil")
}
// TestTwoDecimals tests the twoDecimals helper function
func TestTwoDecimals(t *testing.T) {
testCases := []struct {
input float64
expected float64
}{
{1.234567, 1.23},
{1.235, 1.24}, // Should round up
{1.0, 1.0},
{0.0, 0.0},
{-1.234567, -1.23},
{-1.235, -1.23}, // Negative rounding
}
for _, tc := range testCases {
result := records.TestTwoDecimals(tc.input)
assert.InDelta(t, tc.expected, result, 0.02, "twoDecimals(%f) should equal %f", tc.input, tc.expected)
}
}

View File

@@ -0,0 +1,23 @@
//go:build testing
// +build testing
package records
import (
"github.com/pocketbase/pocketbase/core"
)
// TestDeleteOldSystemStats exposes deleteOldSystemStats for testing
func TestDeleteOldSystemStats(app core.App) error {
return deleteOldSystemStats(app)
}
// TestDeleteOldAlertsHistory exposes deleteOldAlertsHistory for testing
func TestDeleteOldAlertsHistory(app core.App, countToKeep, countBeforeDeletion int) error {
return deleteOldAlertsHistory(app, countToKeep, countBeforeDeletion)
}
// TestTwoDecimals exposes twoDecimals for testing
func TestTwoDecimals(value float64) float64 {
return twoDecimals(value)
}

View File

@@ -17,9 +17,12 @@ type UserSettings struct {
ChartTime string `json:"chartTime"`
NotificationEmails []string `json:"emails"`
NotificationWebhooks []string `json:"webhooks"`
// TemperatureUnit int `json:"unitTemp"` // 0 for Celsius, 1 for Fahrenheit
// NetworkUnit int `json:"unitNet"` // 0 for bytes, 1 for bits
// DiskUnit int `json:"unitDisk"` // 0 for bytes, 1 for bits
// UnitTemp uint8 `json:"unitTemp"` // 0 for Celsius, 1 for Fahrenheit
// UnitNet uint8 `json:"unitNet"` // 0 for bytes, 1 for bits
// UnitDisk uint8 `json:"unitDisk"` // 0 for bytes, 1 for bits
// New field for alert history retention (e.g., "1m", "3m", "6m", "1y")
AlertHistoryRetention string `json:"alertHistoryRetention,omitempty"`
}
func NewUserManager(app core.App) *UserManager {
@@ -41,7 +44,6 @@ func (um *UserManager) InitializeUserSettings(e *core.RecordEvent) error {
record := e.Record
// intialize settings with defaults
settings := UserSettings{
// Language: "en",
ChartTime: "1h",
NotificationEmails: []string{},
NotificationWebhooks: []string{},

View File

@@ -76,6 +76,7 @@ func init() {
"Disk",
"Temperature",
"Bandwidth",
"LoadAvg1",
"LoadAvg5",
"LoadAvg15"
]
@@ -139,6 +140,124 @@ func init() {
],
"system": false
},
{
"id": "pbc_1697146157",
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"viewRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"createRule": null,
"updateRule": null,
"deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"name": "alerts_history",
"type": "base",
"fields": [
{
"autogeneratePattern": "[a-z0-9]{15}",
"hidden": false,
"id": "text3208210256",
"max": 15,
"min": 15,
"name": "id",
"pattern": "^[a-z0-9]+$",
"presentable": false,
"primaryKey": true,
"required": true,
"system": true,
"type": "text"
},
{
"cascadeDelete": true,
"collectionId": "_pb_users_auth_",
"hidden": false,
"id": "relation2375276105",
"maxSelect": 1,
"minSelect": 0,
"name": "user",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"cascadeDelete": true,
"collectionId": "2hz5ncl8tizk5nx",
"hidden": false,
"id": "relation3377271179",
"maxSelect": 1,
"minSelect": 0,
"name": "system",
"presentable": false,
"required": true,
"system": false,
"type": "relation"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "text2466471794",
"max": 0,
"min": 0,
"name": "alert_id",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": false,
"system": false,
"type": "text"
},
{
"autogeneratePattern": "",
"hidden": false,
"id": "text1579384326",
"max": 0,
"min": 0,
"name": "name",
"pattern": "",
"presentable": false,
"primaryKey": false,
"required": true,
"system": false,
"type": "text"
},
{
"hidden": false,
"id": "number494360628",
"max": null,
"min": null,
"name": "value",
"onlyInt": false,
"presentable": false,
"required": false,
"system": false,
"type": "number"
},
{
"hidden": false,
"id": "autodate2990389176",
"name": "created",
"onCreate": true,
"onUpdate": false,
"presentable": false,
"system": false,
"type": "autodate"
},
{
"hidden": false,
"id": "date2276568630",
"max": "",
"min": "",
"name": "resolved",
"presentable": false,
"required": false,
"system": false,
"type": "date"
}
],
"indexes": [
"CREATE INDEX ` + "`" + `idx_YdGnup5aqB` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `user` + "`" + `)",
"CREATE INDEX ` + "`" + `idx_taLet9VdME` + "`" + ` ON ` + "`" + `alerts_history` + "`" + ` (` + "`" + `created` + "`" + `)"
],
"system": false
},
{
"id": "juohu4jipgc13v7",
"listRule": "@request.auth.id != \"\"",
@@ -756,7 +875,6 @@ func init() {
LEFT JOIN fingerprints f ON s.id = f.system
WHERE f.system IS NULL
`).Column(&systemIds)
if err != nil {
return err
}

Binary file not shown.

View File

@@ -4,7 +4,7 @@
<meta charset="UTF-8" />
<link rel="manifest" href="./static/manifest.json" />
<link rel="icon" type="image/svg+xml" href="./static/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
<title>Beszel</title>
<script>
globalThis.BESZEL = {

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "beszel",
"private": true,
"version": "0.12.0-beta2",
"version": "0.12.0",
"type": "module",
"scripts": {
"dev": "vite",
@@ -13,9 +13,9 @@
"dependencies": {
"@henrygd/queue": "^1.0.7",
"@henrygd/semaphore": "^0.0.2",
"@lingui/detect-locale": "^5.3.2",
"@lingui/macro": "^5.3.2",
"@lingui/react": "^5.3.2",
"@lingui/detect-locale": "^5.3.3",
"@lingui/macro": "^5.3.3",
"@lingui/react": "^5.3.3",
"@nanostores/react": "^0.7.3",
"@nanostores/router": "^0.11.0",
"@radix-ui/react-alert-dialog": "^1.1.14",
@@ -39,24 +39,25 @@
"d3-time": "^3.1.0",
"lucide-react": "^0.452.0",
"nanostores": "^0.11.4",
"pocketbase": "^0.26.0",
"pocketbase": "^0.26.2",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"recharts": "^2.15.3",
"recharts": "^2.15.4",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"valibot": "^0.42.1"
},
"devDependencies": {
"@lingui/cli": "^5.3.2",
"@lingui/cli": "^5.3.3",
"@lingui/swc-plugin": "^5.5.2",
"@lingui/vite-plugin": "^5.3.2",
"@types/bun": "^1.2.15",
"@lingui/vite-plugin": "^5.3.3",
"@tailwindcss/container-queries": "^0.1.1",
"@types/bun": "^1.2.19",
"@types/react": "^18.3.23",
"@types/react-dom": "^18.3.7",
"@vitejs/plugin-react-swc": "^3.10.1",
"@vitejs/plugin-react-swc": "^3.11.0",
"autoprefixer": "^10.4.21",
"postcss": "^8.5.4",
"postcss": "^8.5.6",
"tailwindcss": "^3.4.17",
"tailwindcss-rtl": "^0.9.0",
"typescript": "^5.8.3",

View File

@@ -0,0 +1,164 @@
import { ColumnDef } from "@tanstack/react-table"
import { AlertsHistoryRecord } from "@/types"
import { Button } from "@/components/ui/button"
import { Badge } from "@/components/ui/badge"
import { alertInfo, formatShortDate, toFixedFloat, formatDuration, cn } from "@/lib/utils"
import { Trans } from "@lingui/react/macro"
import { t } from "@lingui/core/macro"
export const alertsHistoryColumns: ColumnDef<AlertsHistoryRecord>[] = [
{
accessorKey: "system",
enableSorting: true,
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans>System</Trans>
</Button>
),
cell: ({ row }) => <span className="ps-2">{row.original.expand?.system?.name || row.original.system}</span>,
filterFn: (row, _, filterValue) => {
const display = row.original.expand?.system?.name || row.original.system || ""
return display.toLowerCase().includes(filterValue.toLowerCase())
},
},
{
// accessorKey: "name",
id: "name",
accessorFn: (record) => {
const name = record.name
const info = alertInfo[name]
return info?.name().replace("cpu", "CPU") || name
},
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans>Name</Trans>
</Button>
),
cell: ({ getValue, row }) => {
let name = getValue() as string
const info = alertInfo[row.original.name]
const Icon = info?.icon
return (
<span className="flex items-center gap-2 ps-1 min-w-40">
{Icon && <Icon className="size-3.5" />}
{name}
</span>
)
},
},
{
accessorKey: "value",
enableSorting: false,
header: () => (
<Button variant="ghost">
<Trans>Value</Trans>
</Button>
),
cell({ row, getValue }) {
const name = row.original.name
if (name === "Status") {
return <span className="ps-2">{t`Down`}</span>
}
const value = getValue() as number
const unit = alertInfo[name]?.unit
return (
<span className="tabular-nums ps-2.5">
{toFixedFloat(value, value < 10 ? 2 : 1)}
{unit}
</span>
)
},
},
{
accessorKey: "state",
enableSorting: true,
sortingFn: (rowA, rowB) => (rowA.original.resolved ? 1 : 0) - (rowB.original.resolved ? 1 : 0),
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans comment="Context: alert state (active or resolved)">State</Trans>
</Button>
),
cell: ({ row }) => {
const resolved = row.original.resolved
return (
<Badge
className={cn(
"capitalize pointer-events-none",
resolved
? "bg-green-100 text-green-800 border-green-200 dark:opacity-80"
: "bg-yellow-100 text-yellow-800 border-yellow-200"
)}
>
{/* {resolved ? <CircleCheckIcon className="size-3 me-0.5" /> : <CircleAlertIcon className="size-3 me-0.5" />} */}
{resolved ? <Trans>Resolved</Trans> : <Trans>Active</Trans>}
</Badge>
)
},
},
{
accessorKey: "created",
accessorFn: (record) => formatShortDate(record.created),
enableSorting: true,
invertSorting: true,
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans comment="Context: date created">Created</Trans>
</Button>
),
cell: ({ getValue, row }) => (
<span className="ps-1 tabular-nums tracking-tight" title={`${row.original.created} UTC`}>
{getValue() as string}
</span>
),
},
{
accessorKey: "resolved",
enableSorting: true,
invertSorting: true,
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans>Resolved</Trans>
</Button>
),
cell: ({ row, getValue }) => {
const resolved = getValue() as string | null
if (!resolved) {
return null
}
return (
<span className="ps-1 tabular-nums tracking-tight" title={`${row.original.resolved} UTC`}>
{formatShortDate(resolved)}
</span>
)
},
},
{
accessorKey: "duration",
invertSorting: true,
enableSorting: true,
sortingFn: (rowA, rowB) => {
const aCreated = new Date(rowA.original.created)
const bCreated = new Date(rowB.original.created)
const aResolved = rowA.original.resolved ? new Date(rowA.original.resolved) : null
const bResolved = rowB.original.resolved ? new Date(rowB.original.resolved) : null
const aDuration = aResolved ? aResolved.getTime() - aCreated.getTime() : null
const bDuration = bResolved ? bResolved.getTime() - bCreated.getTime() : null
if (!aDuration && bDuration) return -1
if (aDuration && !bDuration) return 1
return (aDuration || 0) - (bDuration || 0)
},
header: ({ column }) => (
<Button variant="ghost" onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}>
<Trans>Duration</Trans>
</Button>
),
cell: ({ row }) => {
const duration = formatDuration(row.original.created, row.original.resolved)
if (!duration) {
return null
}
return <span className="ps-2">{duration}</span>
},
},
]

View File

@@ -1,128 +1,91 @@
import { t } from "@lingui/core/macro"
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { useYAxisWidth, cn, formatShortDate, chartMargin } from "@/lib/utils"
// import Spinner from '../spinner'
import { ChartData } from "@/types"
import { memo, useMemo } from "react"
import { useLingui } from "@lingui/react/macro"
import { ChartData, SystemStatsRecord } from "@/types"
import { useMemo } from "react"
/** [label, key, color, opacity] */
type DataKeys = [string, string, number, number]
const getNestedValue = (path: string, max = false, data: any): number | null => {
// fallback value (obj?.stats?.cpum ? 0 : null) should only come into play when viewing
// a max value which doesn't exist, or the value was zero and omitted from the stats object.
// so we check if cpum is present. if so, return 0 to make sure the zero value is displayed.
// if not, return null - there is no max data so do not display anything.
return `stats.${path}${max ? "m" : ""}`
.split(".")
.reduce((acc: any, key: string) => acc?.[key] ?? (data.stats?.cpum ? 0 : null), data)
export type DataPoint = {
label: string
dataKey: (data: SystemStatsRecord) => number | undefined
color: string
opacity: number
}
export default memo(function AreaChartDefault({
maxToggled = false,
chartName,
export default function AreaChartDefault({
chartData,
max,
maxToggled,
tickFormatter,
contentFormatter,
}: {
maxToggled?: boolean
chartName: string
dataPoints,
}: // logRender = false,
{
chartData: ChartData
max?: number
tickFormatter: (value: number) => string
contentFormatter: ({ value }: { value: number }) => string
maxToggled?: boolean
tickFormatter: (value: number, index: number) => string
contentFormatter: ({ value, payload }: { value: number; payload: SystemStatsRecord }) => string
dataPoints?: DataPoint[]
// logRender?: boolean
}) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const { i18n } = useLingui()
const { chartTime } = chartData
const showMax = chartTime !== "1h" && maxToggled
const dataKeys: DataKeys[] = useMemo(() => {
// [label, key, color, opacity]
if (chartName === "CPU Usage") {
return [[t`CPU Usage`, "cpu", 1, 0.4]]
} else if (chartName === "dio") {
return [
[t({ message: "Write", comment: "Disk write" }), "dw", 3, 0.3],
[t({ message: "Read", comment: "Disk read" }), "dr", 1, 0.3],
]
} else if (chartName === "bw") {
return [
[t({ message: "Sent", comment: "Network bytes sent (upload)" }), "ns", 5, 0.2],
[t({ message: "Received", comment: "Network bytes received (download)" }), "nr", 2, 0.2],
]
} else if (chartName.startsWith("efs")) {
return [
[t`Write`, `${chartName}.w`, 3, 0.3],
[t`Read`, `${chartName}.r`, 1, 0.3],
]
} else if (chartName.startsWith("g.")) {
return [chartName.includes("mu") ? [t`Used`, chartName, 2, 0.25] : [t`Usage`, chartName, 1, 0.4]]
return useMemo(() => {
if (chartData.systemStats.length === 0) {
return null
}
return []
}, [chartName, i18n.locale])
// console.log('Rendered at', new Date())
if (chartData.systemStats.length === 0) {
return null
}
return (
<div>
<ChartContainer
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
"opacity-100": yAxisWidth,
})}
>
<AreaChart accessibilityLayer data={chartData.systemStats} margin={chartMargin}>
<CartesianGrid vertical={false} />
<YAxis
direction="ltr"
orientation={chartData.orientation}
className="tracking-tighter"
width={yAxisWidth}
domain={[0, max ?? "auto"]}
tickFormatter={(value) => updateYAxisWidth(tickFormatter(value))}
tickLine={false}
axisLine={false}
/>
{xAxis(chartData)}
<ChartTooltip
animationEasing="ease-out"
animationDuration={150}
content={
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={contentFormatter}
// indicator="line"
/>
}
/>
{dataKeys.map((key, i) => {
const color = `hsl(var(--chart-${key[2]}))`
return (
<Area
key={i}
dataKey={getNestedValue.bind(null, key[1], showMax)}
name={key[0]}
type="monotoneX"
fill={color}
fillOpacity={key[3]}
stroke={color}
isAnimationActive={false}
/>
)
// if (logRender) {
// console.log("Rendered at", new Date())
// }
return (
<div>
<ChartContainer
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
"opacity-100": yAxisWidth,
})}
{/* <ChartLegend content={<ChartLegendContent />} /> */}
</AreaChart>
</ChartContainer>
</div>
)
})
>
<AreaChart accessibilityLayer data={chartData.systemStats} margin={chartMargin}>
<CartesianGrid vertical={false} />
<YAxis
direction="ltr"
orientation={chartData.orientation}
className="tracking-tighter"
width={yAxisWidth}
domain={[0, max ?? "auto"]}
tickFormatter={(value, index) => updateYAxisWidth(tickFormatter(value, index))}
tickLine={false}
axisLine={false}
/>
{xAxis(chartData)}
<ChartTooltip
animationEasing="ease-out"
animationDuration={150}
content={
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={contentFormatter}
/>
}
/>
{dataPoints?.map((dataPoint, i) => {
const color = `hsl(var(--chart-${dataPoint.color}))`
return (
<Area
key={i}
dataKey={dataPoint.dataKey}
name={dataPoint.label}
type="monotoneX"
fill={color}
fillOpacity={dataPoint.opacity}
stroke={color}
isAnimationActive={false}
/>
)
})}
{/* <ChartLegend content={<ChartLegendContent />} /> */}
</AreaChart>
</ChartContainer>
</div>
)
}, [chartData.systemStats.length, yAxisWidth, maxToggled])
}

View File

@@ -1,22 +1,13 @@
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { memo, useMemo } from "react"
import {
useYAxisWidth,
cn,
formatShortDate,
chartMargin,
toFixedWithoutTrailingZeros,
formatBytes,
decimalString,
toFixedFloat,
} from "@/lib/utils"
import { useYAxisWidth, cn, formatShortDate, chartMargin, toFixedFloat, formatBytes, decimalString } from "@/lib/utils"
// import Spinner from '../spinner'
import { useStore } from "@nanostores/react"
import { $containerFilter, $userSettings } from "@/lib/stores"
import { ChartData } from "@/types"
import { Separator } from "../ui/separator"
import { ChartType, DataUnit } from "@/lib/enums"
import { ChartType, Unit } from "@/lib/enums"
export default memo(function ContainerChart({
dataKey,
@@ -85,11 +76,11 @@ export default memo(function ContainerChart({
// tick formatter
if (chartType === ChartType.CPU) {
obj.tickFormatter = (value) => {
const val = toFixedWithoutTrailingZeros(value, 2) + unit
const val = toFixedFloat(value, 2) + unit
return updateYAxisWidth(val)
}
} else {
const chartUnit = isNetChart ? userSettings.unitNet : DataUnit.Bytes
const chartUnit = isNetChart ? userSettings.unitNet : Unit.Bytes
obj.tickFormatter = (val) => {
const { value, unit } = formatBytes(val, isNetChart, chartUnit, true)
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
@@ -118,7 +109,7 @@ export default memo(function ContainerChart({
}
} else if (chartType === ChartType.Memory) {
obj.toolTipFormatter = (item: any) => {
const { value, unit } = formatBytes(item.value, false, DataUnit.Bytes, true)
const { value, unit } = formatBytes(item.value, false, Unit.Bytes, true)
return decimalString(value) + " " + unit
}
} else {

View File

@@ -1,10 +1,10 @@
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { useYAxisWidth, cn, formatShortDate, decimalString, toFixedFloat, chartMargin, formatBytes } from "@/lib/utils"
import { useYAxisWidth, cn, formatShortDate, decimalString, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
import { ChartData } from "@/types"
import { memo } from "react"
import { useLingui } from "@lingui/react/macro"
import { DataUnit } from "@/lib/enums"
import { Unit } from "@/lib/enums"
export default memo(function DiskChart({
dataKey,
@@ -47,7 +47,7 @@ export default memo(function DiskChart({
tickLine={false}
axisLine={false}
tickFormatter={(val) => {
const { value, unit } = formatBytes(val * 1024, false, DataUnit.Bytes, true)
const { value, unit } = formatBytes(val * 1024, false, Unit.Bytes, true)
return updateYAxisWidth(toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit)
}}
/>
@@ -59,7 +59,7 @@ export default memo(function DiskChart({
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={({ value }) => {
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
return decimalString(convertedValue) + " " + unit
}}
/>

View File

@@ -8,14 +8,7 @@ import {
ChartTooltipContent,
xAxis,
} from "@/components/ui/chart"
import {
useYAxisWidth,
cn,
formatShortDate,
toFixedWithoutTrailingZeros,
decimalString,
chartMargin,
} from "@/lib/utils"
import { useYAxisWidth, cn, formatShortDate, toFixedFloat, decimalString, chartMargin } from "@/lib/utils"
import { ChartData } from "@/types"
import { memo, useMemo } from "react"
@@ -72,7 +65,7 @@ export default memo(function GpuPowerChart({ chartData }: { chartData: ChartData
domain={[0, "auto"]}
width={yAxisWidth}
tickFormatter={(value) => {
const val = toFixedWithoutTrailingZeros(value, 2)
const val = toFixedFloat(value, 2)
return updateYAxisWidth(val + "W")
}}
tickLine={false}

View File

@@ -0,0 +1,91 @@
import { CartesianGrid, Line, LineChart, YAxis } from "recharts"
import {
ChartContainer,
ChartLegend,
ChartLegendContent,
ChartTooltip,
ChartTooltipContent,
xAxis,
} from "@/components/ui/chart"
import { useYAxisWidth, cn, formatShortDate, toFixedFloat, decimalString, chartMargin } from "@/lib/utils"
import { ChartData } from "@/types"
import { memo } from "react"
import { t } from "@lingui/core/macro"
export default memo(function LoadAverageChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
if (chartData.systemStats.length === 0) {
return null
}
const keys = {
l1: {
color: "hsl(271, 81%, 60%)", // Purple
label: t({ message: `1 min`, comment: "Load average" }),
},
l5: {
color: "hsl(217, 91%, 60%)", // Blue
label: t({ message: `5 min`, comment: "Load average" }),
},
l15: {
color: "hsl(25, 95%, 53%)", // Orange
label: t({ message: `15 min`, comment: "Load average" }),
},
}
return (
<div>
<ChartContainer
className={cn("h-full w-full absolute aspect-auto bg-card opacity-0 transition-opacity", {
"opacity-100": yAxisWidth,
})}
>
<LineChart accessibilityLayer data={chartData.systemStats} margin={chartMargin}>
<CartesianGrid vertical={false} />
<YAxis
direction="ltr"
orientation={chartData.orientation}
className="tracking-tighter"
domain={[0, "auto"]}
width={yAxisWidth}
tickFormatter={(value) => {
return updateYAxisWidth(String(toFixedFloat(value, 2)))
}}
tickLine={false}
axisLine={false}
/>
{xAxis(chartData)}
<ChartTooltip
animationEasing="ease-out"
animationDuration={150}
// @ts-ignore
// itemSorter={(a, b) => b.value - a.value}
content={
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={(item) => decimalString(item.value)}
/>
}
/>
{Object.entries(keys).map(([key, value]: [string, { color: string; label: string }]) => {
return (
<Line
key={key}
dataKey={`stats.${key}`}
name={value.label}
type="monotoneX"
dot={false}
strokeWidth={1.5}
stroke={value.color}
isAnimationActive={false}
/>
)
})}
<ChartLegend content={<ChartLegendContent />} />
</LineChart>
</ChartContainer>
</div>
)
})

View File

@@ -1,10 +1,10 @@
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import { useYAxisWidth, cn, toFixedFloat, decimalString, formatShortDate, chartMargin, formatBytes } from "@/lib/utils"
import { useYAxisWidth, cn, decimalString, formatShortDate, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
import { memo } from "react"
import { ChartData } from "@/types"
import { useLingui } from "@lingui/react/macro"
import { DataUnit } from "@/lib/enums"
import { Unit } from "@/lib/enums"
export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
@@ -40,7 +40,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
tickLine={false}
axisLine={false}
tickFormatter={(value) => {
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
return updateYAxisWidth(toFixedFloat(convertedValue, value >= 10 ? 0 : 1) + " " + unit)
}}
/>
@@ -57,7 +57,7 @@ export default memo(function MemChart({ chartData }: { chartData: ChartData }) {
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={({ value }) => {
// mem values are supplied as GB
const { value: convertedValue, unit } = formatBytes(value * 1024, false, DataUnit.Bytes, true)
const { value: convertedValue, unit } = formatBytes(value * 1024, false, Unit.Bytes, true)
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
}}
/>

View File

@@ -1,20 +1,16 @@
import { t } from "@lingui/core/macro";
import { t } from "@lingui/core/macro"
import { Area, AreaChart, CartesianGrid, YAxis } from "recharts"
import { ChartContainer, ChartTooltip, ChartTooltipContent, xAxis } from "@/components/ui/chart"
import {
useYAxisWidth,
cn,
formatShortDate,
toFixedWithoutTrailingZeros,
decimalString,
chartMargin,
} from "@/lib/utils"
import { useYAxisWidth, cn, formatShortDate, decimalString, chartMargin, formatBytes, toFixedFloat } from "@/lib/utils"
import { ChartData } from "@/types"
import { memo } from "react"
import { $userSettings } from "@/lib/stores"
import { useStore } from "@nanostores/react"
export default memo(function SwapChart({ chartData }: { chartData: ChartData }) {
const { yAxisWidth, updateYAxisWidth } = useYAxisWidth()
const userSettings = useStore($userSettings)
if (chartData.systemStats.length === 0) {
return null
@@ -33,11 +29,14 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
direction="ltr"
orientation={chartData.orientation}
className="tracking-tighter"
domain={[0, () => toFixedWithoutTrailingZeros(chartData.systemStats.at(-1)?.stats.s ?? 0.04, 2)]}
domain={[0, () => toFixedFloat(chartData.systemStats.at(-1)?.stats.s ?? 0.04, 2)]}
width={yAxisWidth}
tickLine={false}
axisLine={false}
tickFormatter={(value) => updateYAxisWidth(value + " GB")}
tickFormatter={(value) => {
const { value: convertedValue, unit } = formatBytes(value * 1024, false, userSettings.unitDisk, true)
return updateYAxisWidth(toFixedFloat(convertedValue, value >= 10 ? 0 : 1) + " " + unit)
}}
/>
{xAxis(chartData)}
<ChartTooltip
@@ -46,7 +45,11 @@ export default memo(function SwapChart({ chartData }: { chartData: ChartData })
content={
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={(item) => decimalString(item.value) + " GB"}
contentFormatter={({ value }) => {
// mem values are supplied as GB
const { value: convertedValue, unit } = formatBytes(value * 1024, false, userSettings.unitDisk, true)
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
}}
// indicator="line"
/>
}

View File

@@ -12,9 +12,9 @@ import {
useYAxisWidth,
cn,
formatShortDate,
toFixedWithoutTrailingZeros,
toFixedFloat,
chartMargin,
convertTemperature,
formatTemperature,
decimalString,
} from "@/lib/utils"
import { ChartData } from "@/types"
@@ -75,8 +75,8 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
domain={[0, "auto"]}
width={yAxisWidth}
tickFormatter={(val) => {
const { value, unit } = convertTemperature(val, userSettings.unitTemp)
return updateYAxisWidth(toFixedWithoutTrailingZeros(value, 2) + " " + unit)
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
return updateYAxisWidth(toFixedFloat(value, 2) + " " + unit)
}}
tickLine={false}
axisLine={false}
@@ -91,7 +91,7 @@ export default memo(function TemperatureChart({ chartData }: { chartData: ChartD
<ChartTooltipContent
labelFormatter={(_, data) => formatShortDate(data[0].payload.created)}
contentFormatter={(item) => {
const { value, unit } = convertTemperature(item.value, userSettings.unitTemp)
const { value, unit } = formatTemperature(item.value, userSettings.unitTemp)
return decimalString(value) + " " + unit
}}
filter={filter}

View File

@@ -1,4 +1,5 @@
import {
AlertOctagonIcon,
BookIcon,
DatabaseBackupIcon,
FingerprintIcon,
@@ -69,7 +70,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(false)
}}
>
<Server className="me-2 h-4 w-4" />
<Server className="me-2 size-4" />
<span>{system.name}</span>
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
</CommandItem>
@@ -86,7 +87,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(false)
}}
>
<LayoutDashboard className="me-2 h-4 w-4" />
<LayoutDashboard className="me-2 size-4" />
<span>
<Trans>Dashboard</Trans>
</span>
@@ -100,7 +101,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(false)
}}
>
<SettingsIcon className="me-2 h-4 w-4" />
<SettingsIcon className="me-2 size-4" />
<span>
<Trans>Settings</Trans>
</span>
@@ -113,7 +114,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(false)
}}
>
<MailIcon className="me-2 h-4 w-4" />
<MailIcon className="me-2 size-4" />
<span>
<Trans>Notifications</Trans>
</span>
@@ -125,19 +126,31 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
setOpen(false)
}}
>
<FingerprintIcon className="me-2 h-4 w-4" />
<FingerprintIcon className="me-2 size-4" />
<span>
<Trans>Tokens & Fingerprints</Trans>
</span>
{SettingsShortcut}
</CommandItem>
<CommandItem
onSelect={() => {
navigate(getPagePath($router, "settings", { name: "alert-history" }))
setOpen(false)
}}
>
<AlertOctagonIcon className="me-2 size-4" />
<span>
<Trans>Alert History</Trans>
</span>
{SettingsShortcut}
</CommandItem>
<CommandItem
keywords={["help", "oauth", "oidc"]}
onSelect={() => {
window.location.href = "https://beszel.dev/guide/what-is-beszel"
}}
>
<BookIcon className="me-2 h-4 w-4" />
<BookIcon className="me-2 size-4" />
<span>
<Trans>Documentation</Trans>
</span>
@@ -155,7 +168,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
window.open(prependBasePath("/_/"), "_blank")
}}
>
<UsersIcon className="me-2 h-4 w-4" />
<UsersIcon className="me-2 size-4" />
<span>
<Trans>Users</Trans>
</span>
@@ -167,7 +180,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
window.open(prependBasePath("/_/#/logs"), "_blank")
}}
>
<LogsIcon className="me-2 h-4 w-4" />
<LogsIcon className="me-2 size-4" />
<span>
<Trans>Logs</Trans>
</span>
@@ -179,7 +192,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
window.open(prependBasePath("/_/#/settings/backups"), "_blank")
}}
>
<DatabaseBackupIcon className="me-2 h-4 w-4" />
<DatabaseBackupIcon className="me-2 size-4" />
<span>
<Trans>Backups</Trans>
</span>
@@ -192,7 +205,7 @@ export default memo(function CommandPalette({ open, setOpen }: { open: boolean;
window.open(prependBasePath("/_/#/settings/mail"), "_blank")
}}
>
<MailIcon className="me-2 h-4 w-4" />
<MailIcon className="me-2 size-4" />
<span>
<Trans>SMTP settings</Trans>
</span>

View File

@@ -3,8 +3,8 @@ import { DropdownMenuContent, DropdownMenuItem } from "./ui/dropdown-menu"
import { copyToClipboard, getHubURL } from "@/lib/utils"
import { i18n } from "@lingui/core"
const isBeta = BESZEL.HUB_VERSION.includes("beta")
const imageTag = isBeta ? ":edge" : ""
// const isbeta = beszel.hub_version.includes("beta")
// const imagetag = isbeta ? ":edge" : ""
/**
* Get the URL of the script to install the agent.
@@ -12,18 +12,20 @@ const imageTag = isBeta ? ":edge" : ""
* @returns The URL for the script.
*/
const getScriptUrl = (path: string = "") => {
const url = new URL("https://get.beszel.dev")
url.pathname = path
if (isBeta) {
url.searchParams.set("beta", "1")
}
return url.toString()
return `https://get.beszel.dev${path}`
// no beta for now
// const url = new URL("https://get.beszel.dev")
// url.pathname = path
// if (isBeta) {
// url.searchParams.set("beta", "1")
// }
// return url.toString()
}
export function copyDockerCompose(port = "45876", publicKey: string, token: string) {
copyToClipboard(`services:
beszel-agent:
image: henrygd/beszel-agent${imageTag}
image: henrygd/beszel-agent
container_name: beszel-agent
restart: unless-stopped
network_mode: host
@@ -41,7 +43,7 @@ export function copyDockerCompose(port = "45876", publicKey: string, token: stri
export function copyDockerRun(port = "45876", publicKey: string, token: string) {
copyToClipboard(
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -v ./beszel_agent_data:/var/lib/beszel-agent -e KEY="${publicKey}" -e LISTEN=${port} -e TOKEN="${token}" -e HUB_URL="${getHubURL()}" henrygd/beszel-agent${imageTag}`
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -v ./beszel_agent_data:/var/lib/beszel-agent -e KEY="${publicKey}" -e LISTEN=${port} -e TOKEN="${token}" -e HUB_URL="${getHubURL()}" henrygd/beszel-agent`
)
}

View File

@@ -110,10 +110,14 @@ const ActiveAlerts = memo(({ activeAlerts }: { activeAlerts: AlertRecord[] }) =>
{alert.sysname} {info.name().toLowerCase().replace("cpu", "CPU")}
</AlertTitle>
<AlertDescription>
<Trans>
Exceeds {alert.value}
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
</Trans>
{alert.name === "Status" ? (
<Trans>Connection is down</Trans>
) : (
<Trans>
Exceeds {alert.value}
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
</Trans>
)}
</AlertDescription>
<Link
href={getPagePath($router, "system", { name: alert.sysname! })}

View File

@@ -0,0 +1,385 @@
import { pb } from "@/lib/stores"
import { alertInfo, cn, formatDuration, formatShortDate } from "@/lib/utils"
import { AlertsHistoryRecord } from "@/types"
import {
getCoreRowModel,
getPaginationRowModel,
getSortedRowModel,
getFilteredRowModel,
useReactTable,
flexRender,
ColumnFiltersState,
SortingState,
VisibilityState,
} from "@tanstack/react-table"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Button, buttonVariants } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { alertsHistoryColumns } from "../../alerts-history-columns"
import { Checkbox } from "@/components/ui/checkbox"
import { memo, useEffect, useState } from "react"
import { Label } from "@/components/ui/label"
import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from "@/components/ui/select"
import {
ChevronLeftIcon,
ChevronRightIcon,
ChevronsLeftIcon,
ChevronsRightIcon,
DownloadIcon,
Trash2Icon,
} from "lucide-react"
import { Trans } from "@lingui/react/macro"
import { t } from "@lingui/core/macro"
import { useToast } from "@/components/ui/use-toast"
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog"
const SectionIntro = memo(() => {
return (
<div>
<h3 className="text-xl font-medium mb-2">
<Trans>Alert History</Trans>
</h3>
<p className="text-sm text-muted-foreground leading-relaxed">
<Trans>View your 200 most recent alerts.</Trans>
</p>
</div>
)
})
export default function AlertsHistoryDataTable() {
const [data, setData] = useState<AlertsHistoryRecord[]>([])
const [sorting, setSorting] = useState<SortingState>([])
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({})
const [rowSelection, setRowSelection] = useState({})
const [globalFilter, setGlobalFilter] = useState("")
const { toast } = useToast()
const [deleteOpen, setDeleteDialogOpen] = useState(false)
useEffect(() => {
let unsubscribe: (() => void) | undefined
const pbOptions = {
expand: "system",
fields: "id,name,value,state,created,resolved,expand.system.name",
}
// Initial load
pb.collection<AlertsHistoryRecord>("alerts_history")
.getFullList({
...pbOptions,
sort: "-created",
})
.then((records) => setData(records))
// Subscribe to changes
;(async () => {
unsubscribe = await pb.collection("alerts_history").subscribe(
"*",
(e) => {
if (e.action === "create") {
setData((current) => [e.record as AlertsHistoryRecord, ...current])
}
if (e.action === "update") {
setData((current) => current.map((r) => (r.id === e.record.id ? (e.record as AlertsHistoryRecord) : r)))
}
if (e.action === "delete") {
setData((current) => current.filter((r) => r.id !== e.record.id))
}
},
pbOptions
)
})()
// Unsubscribe on unmount
return () => unsubscribe?.()
}, [])
const table = useReactTable({
data,
columns: [
{
id: "select",
header: ({ table }) => (
<Checkbox
className="ms-2"
checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && "indeterminate")}
onCheckedChange={(value) => table.toggleAllPageRowsSelected(!!value)}
aria-label="Select all"
/>
),
cell: ({ row }) => (
<Checkbox
checked={row.getIsSelected()}
onCheckedChange={(value) => row.toggleSelected(!!value)}
aria-label="Select row"
/>
),
enableSorting: false,
enableHiding: false,
},
...alertsHistoryColumns,
],
getCoreRowModel: getCoreRowModel(),
getPaginationRowModel: getPaginationRowModel(),
getSortedRowModel: getSortedRowModel(),
getFilteredRowModel: getFilteredRowModel(),
onSortingChange: setSorting,
onColumnFiltersChange: setColumnFilters,
onColumnVisibilityChange: setColumnVisibility,
onRowSelectionChange: setRowSelection,
state: {
sorting,
columnFilters,
columnVisibility,
rowSelection,
globalFilter,
},
onGlobalFilterChange: setGlobalFilter,
globalFilterFn: (row, _columnId, filterValue) => {
const system = row.original.expand?.system?.name ?? ""
const name = row.getValue("name") ?? ""
const created = row.getValue("created") ?? ""
const search = String(filterValue).toLowerCase()
return (
system.toLowerCase().includes(search) ||
(name as string).toLowerCase().includes(search) ||
(created as string).toLowerCase().includes(search)
)
},
})
// Bulk delete handler
const handleBulkDelete = async () => {
setDeleteDialogOpen(false)
const selectedIds = table.getSelectedRowModel().rows.map((row) => row.original.id)
try {
let batch = pb.createBatch()
let inBatch = 0
for (const id of selectedIds) {
batch.collection("alerts_history").delete(id)
inBatch++
if (inBatch > 20) {
await batch.send()
batch = pb.createBatch()
inBatch = 0
}
}
inBatch && (await batch.send())
table.resetRowSelection()
} catch (e) {
toast({
variant: "destructive",
title: t`Error`,
description: `Failed to delete records.`,
})
}
}
// Export to CSV handler
const handleExportCSV = () => {
const selectedRows = table.getSelectedRowModel().rows
if (!selectedRows.length) return
const cells: Record<string, (record: AlertsHistoryRecord) => string> = {
system: (record) => record.expand?.system?.name || record.system,
name: (record) => alertInfo[record.name]?.name() || record.name,
value: (record) => record.value + (alertInfo[record.name]?.unit ?? ""),
state: (record) => (record.resolved ? t`Resolved` : t`Active`),
created: (record) => formatShortDate(record.created),
resolved: (record) => (record.resolved ? formatShortDate(record.resolved) : ""),
duration: (record) => (record.resolved ? formatDuration(record.created, record.resolved) : ""),
}
const csvRows = [Object.keys(cells).join(",")]
for (const row of selectedRows) {
const r = row.original
csvRows.push(
Object.values(cells)
.map((val) => val(r))
.join(",")
)
}
const blob = new Blob([csvRows.join("\n")], { type: "text/csv" })
const url = URL.createObjectURL(blob)
const a = document.createElement("a")
a.href = url
a.download = "alerts_history.csv"
a.click()
URL.revokeObjectURL(url)
}
return (
<div className="@container w-full">
<div className="@3xl:flex items-end mb-4 gap-4">
<SectionIntro />
<div className="flex items-center gap-2 ms-auto mt-3 @3xl:mt-0">
{table.getFilteredSelectedRowModel().rows.length > 0 && (
<div className="fixed bottom-0 left-0 w-full p-4 grid grid-cols-2 items-center gap-4 z-50 backdrop-blur-md shrink-0 @lg:static @lg:p-0 @lg:w-auto @lg:gap-3">
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteDialogOpen(open)}>
<AlertDialogTrigger asChild>
<Button variant="destructive" className="h-9 shrink-0">
<Trash2Icon className="size-4 shrink-0" />
<span className="ms-1">
<Trans>Delete</Trans>
</span>
</Button>
</AlertDialogTrigger>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>This will permanently delete all selected records from the database.</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={handleBulkDelete}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
<Button variant="outline" className="h-10" onClick={handleExportCSV}>
<DownloadIcon className="size-4" />
<span className="ms-1">
<Trans>Export</Trans>
</span>
</Button>
</div>
)}
<Input
placeholder={t`Filter...`}
value={globalFilter}
onChange={(e) => setGlobalFilter(e.target.value)}
className="px-4 w-full max-w-full @3xl:w-64"
/>
</div>
</div>
<div className="rounded-md border overflow-x-auto whitespace-nowrap">
<Table>
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => (
<TableHead className="px-2" key={header.id}>
{header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
))}
</TableRow>
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow key={row.id} data-state={row.getIsSelected() && "selected"}>
{row.getVisibleCells().map((cell) => (
<TableCell key={cell.id} className="py-3">
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={table.getAllColumns().length} className="h-24 text-center">
<Trans>No results.</Trans>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
<div className="flex items-center justify-between ps-1 tabular-nums">
<div className="text-muted-foreground hidden flex-1 text-sm lg:flex">
<Trans>
{table.getFilteredSelectedRowModel().rows.length} of {table.getFilteredRowModel().rows.length} row(s)
selected.
</Trans>
</div>
<div className="flex w-full items-center gap-8 lg:w-fit my-3">
<div className="hidden items-center gap-2 lg:flex">
<Label htmlFor="rows-per-page" className="text-sm font-medium">
<Trans>Rows per page</Trans>
</Label>
<Select
value={`${table.getState().pagination.pageSize}`}
onValueChange={(value) => {
table.setPageSize(Number(value))
}}
>
<SelectTrigger className="w-[4.8em]" id="rows-per-page">
<SelectValue placeholder={table.getState().pagination.pageSize} />
</SelectTrigger>
<SelectContent side="top">
{[10, 20, 50, 100, 200].map((pageSize) => (
<SelectItem key={pageSize} value={`${pageSize}`}>
{pageSize}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="flex w-fit items-center justify-center text-sm font-medium">
<Trans>
Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
</Trans>
</div>
<div className="ms-auto flex items-center gap-2 lg:ms-0">
<Button
variant="outline"
className="hidden size-9 p-0 lg:flex"
onClick={() => table.setPageIndex(0)}
disabled={!table.getCanPreviousPage()}
>
<span className="sr-only">Go to first page</span>
<ChevronsLeftIcon className="size-5" />
</Button>
<Button
variant="outline"
className="size-9"
size="icon"
onClick={() => table.previousPage()}
disabled={!table.getCanPreviousPage()}
>
<span className="sr-only">Go to previous page</span>
<ChevronLeftIcon className="size-5" />
</Button>
<Button
variant="outline"
className="size-9"
size="icon"
onClick={() => table.nextPage()}
disabled={!table.getCanNextPage()}
>
<span className="sr-only">Go to next page</span>
<ChevronRightIcon className="size-5" />
</Button>
<Button
variant="outline"
className="hidden size-9 lg:flex"
size="icon"
onClick={() => table.setPageIndex(table.getPageCount() - 1)}
disabled={!table.getCanNextPage()}
>
<span className="sr-only">Go to last page</span>
<ChevronsRightIcon className="size-5" />
</Button>
</div>
</div>
</div>
</div>
)
}

View File

@@ -11,7 +11,7 @@ import { useState } from "react"
import languages from "@/lib/languages"
import { dynamicActivate } from "@/lib/i18n"
import { useLingui } from "@lingui/react/macro"
import { DataUnit, TemperatureUnit } from "@/lib/enums"
import { Unit } from "@/lib/enums"
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
const [isLoading, setIsLoading] = useState(false)
@@ -104,7 +104,7 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
<div className="space-y-2">
<div className="mb-4">
<h3 className="mb-1 text-lg font-medium">
<Trans>Unit preferences</Trans>
<Trans comment="Temperature / network units">Unit preferences</Trans>
</h3>
<p className="text-sm text-muted-foreground leading-relaxed">
<Trans>Change display units for metrics.</Trans>
@@ -118,33 +118,41 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
<Select
name="unitTemp"
key={userSettings.unitTemp}
defaultValue={userSettings.unitTemp?.toString() || String(TemperatureUnit.Celsius)}
defaultValue={userSettings.unitTemp?.toString() || String(Unit.Celsius)}
>
<SelectTrigger id="unitTemp">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value={String(TemperatureUnit.Celsius)}>Celsius (°C)</SelectItem>
<SelectItem value={String(TemperatureUnit.Fahrenheit)}>Fahrenheit (°F)</SelectItem>
<SelectItem value={String(Unit.Celsius)}>
<Trans>Celsius (°C)</Trans>
</SelectItem>
<SelectItem value={String(Unit.Fahrenheit)}>
<Trans>Fahrenheit (°F)</Trans>
</SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label className="block" htmlFor="unitTemp">
<Trans>Network unit</Trans>
<Label className="block" htmlFor="unitNet">
<Trans comment="Context: Bytes or bits">Network unit</Trans>
</Label>
<Select
name="unitNet"
key={userSettings.unitNet}
defaultValue={userSettings.unitNet?.toString() ?? String(DataUnit.Bytes)}
defaultValue={userSettings.unitNet?.toString() ?? String(Unit.Bytes)}
>
<SelectTrigger id="unitTemp">
<SelectTrigger id="unitNet">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value={String(DataUnit.Bytes)}>Bytes (KB/s, MB/s, GB/s)</SelectItem>
<SelectItem value={String(DataUnit.Bits)}>Bits (kbps, Mbps, Gbps)</SelectItem>
<SelectItem value={String(Unit.Bytes)}>
<Trans>Bytes (KB/s, MB/s, GB/s)</Trans>
</SelectItem>
<SelectItem value={String(Unit.Bits)}>
<Trans>Bits (Kbps, Mbps, Gbps)</Trans>
</SelectItem>
</SelectContent>
</Select>
</div>
@@ -156,14 +164,18 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
<Select
name="unitDisk"
key={userSettings.unitDisk}
defaultValue={userSettings.unitDisk?.toString() ?? String(DataUnit.Bytes)}
defaultValue={userSettings.unitDisk?.toString() ?? String(Unit.Bytes)}
>
<SelectTrigger id="unitDisk">
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value={String(DataUnit.Bytes)}>Bytes (KB/s, MB/s, GB/s)</SelectItem>
<SelectItem value={String(DataUnit.Bits)}>Bits (kbps, Mbps, Gbps)</SelectItem>
<SelectItem value={String(Unit.Bytes)}>
<Trans>Bytes (KB/s, MB/s, GB/s)</Trans>
</SelectItem>
<SelectItem value={String(Unit.Bits)}>
<Trans>Bits (Kbps, Mbps, Gbps)</Trans>
</SelectItem>
</SelectContent>
</Select>
</div>

View File

@@ -7,7 +7,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/com
import { useStore } from "@nanostores/react"
import { $router } from "@/components/router.tsx"
import { getPagePath, redirectPage } from "@nanostores/router"
import { BellIcon, FileSlidersIcon, FingerprintIcon, SettingsIcon } from "lucide-react"
import { BellIcon, FileSlidersIcon, FingerprintIcon, SettingsIcon, AlertOctagonIcon } from "lucide-react"
import { $userSettings, pb } from "@/lib/stores.ts"
import { toast } from "@/components/ui/use-toast.ts"
import { UserSettings } from "@/types.js"
@@ -16,6 +16,7 @@ import Notifications from "./notifications.tsx"
import ConfigYaml from "./config-yaml.tsx"
import { useLingui } from "@lingui/react/macro"
import Fingerprints from "./tokens-fingerprints.tsx"
import AlertsHistoryDataTable from "./alerts-history-data-table"
export async function saveSettings(newSettings: Partial<UserSettings>) {
try {
@@ -63,7 +64,12 @@ export default function SettingsLayout() {
title: t`Tokens & Fingerprints`,
href: getPagePath($router, "settings", { name: "tokens" }),
icon: FingerprintIcon,
// admin: true,
noReadOnly: true,
},
{
title: t`Alert History`,
href: getPagePath($router, "settings", { name: "alert-history" }),
icon: AlertOctagonIcon,
},
{
title: t`YAML Config`,
@@ -121,5 +127,7 @@ function SettingsContent({ name }: { name: string }) {
return <ConfigYaml />
case "tokens":
return <Fingerprints />
case "alert-history":
return <AlertsHistoryDataTable />
}
}

View File

@@ -1,5 +1,5 @@
import React from "react"
import { cn, isAdmin } from "@/lib/utils"
import { cn, isAdmin, isReadOnlyUser } from "@/lib/utils"
import { buttonVariants } from "../../ui/button"
import { $router, Link, navigate } from "../../router"
import { useStore } from "@nanostores/react"
@@ -12,6 +12,7 @@ interface SidebarNavProps extends React.HTMLAttributes<HTMLElement> {
title: string
icon?: React.FC<React.SVGProps<SVGSVGElement>>
admin?: boolean
noReadOnly?: boolean
}[]
}
@@ -32,7 +33,7 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
return (
<SelectItem key={item.href} value={item.href}>
<span className="flex items-center gap-2 truncate">
{item.icon && <item.icon className="h-4 w-4" />}
{item.icon && <item.icon className="size-4" />}
<span className="truncate">{item.title}</span>
</span>
</SelectItem>
@@ -44,9 +45,9 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
</div>
{/* Desktop View */}
<nav className={cn("hidden md:grid gap-1", className)} {...props}>
<nav className={cn("hidden md:grid gap-1 sticky top-6", className)} {...props}>
{items.map((item) => {
if (item.admin && !isAdmin()) {
if ((item.admin && !isAdmin()) || (item.noReadOnly && isReadOnlyUser())) {
return null
}
return (
@@ -59,7 +60,7 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
page?.path === item.href ? "bg-muted hover:bg-muted" : "hover:bg-muted/50"
)}
>
{item.icon && <item.icon className="h-4 w-4 shrink-0" />}
{item.icon && <item.icon className="size-4 shrink-0" />}
<span className="truncate">{item.title}</span>
</Link>
)

View File

@@ -34,6 +34,8 @@ import {
InstallDropdown,
} from "@/components/install-dropdowns"
import { AppleIcon, DockerIcon, TuxIcon, WindowsIcon } from "@/components/ui/icons"
import { redirectPage } from "@nanostores/router"
import { $router } from "@/components/router"
const pbFingerprintOptions = {
expand: "system",
@@ -41,6 +43,9 @@ const pbFingerprintOptions = {
}
const SettingsFingerprintsPage = memo(() => {
if (isReadOnlyUser()) {
redirectPage($router, "settings", { name: "general" })
}
const [fingerprints, setFingerprints] = useState<FingerprintRecord[]>([])
// Get fingerprint records on mount
@@ -154,7 +159,7 @@ const SectionUniversalToken = memo(() => {
or on hub restart.
</Trans>
</p>
<div className="min-h-16 overflow-auto max-w-full inline-flex items-center gap-5 mt-3 border py-2 pl-5 pr-4 rounded-md">
<div className="min-h-16 overflow-auto max-w-full inline-flex items-center gap-5 mt-3 border py-2 ps-5 pe-4 rounded-md">
{!isLoading && (
<>
<Switch

View File

@@ -11,7 +11,7 @@ import {
$temperatureFilter,
} from "@/lib/stores"
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
import { ChartType, DataUnit, Os } from "@/lib/enums"
import { ChartType, Unit, Os } from "@/lib/enums"
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
import { useStore } from "@nanostores/react"
@@ -27,7 +27,6 @@ import {
getPbTimestamp,
listen,
toFixedFloat,
toFixedWithoutTrailingZeros,
useLocalStorage,
} from "@/lib/utils"
import { Separator } from "../ui/separator"
@@ -49,6 +48,7 @@ const DiskChart = lazy(() => import("../charts/disk-chart"))
const SwapChart = lazy(() => import("../charts/swap-chart"))
const TemperatureChart = lazy(() => import("../charts/temperature-chart"))
const GpuPowerChart = lazy(() => import("../charts/gpu-power-chart"))
const LoadAverageChart = lazy(() => import("../charts/load-average-chart"))
const cache = new Map<string, any>()
@@ -371,6 +371,7 @@ export default function SystemDetail({ name }: { name: string }) {
// select field for switching between avg and max values
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
const showMax = chartTime !== "1h" && maxValues
// if no data, show empty message
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
@@ -477,9 +478,16 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName="CPU Usage"
maxToggled={maxValues}
tickFormatter={(val) => toFixedWithoutTrailingZeros(val, 2) + "%"}
dataPoints={[
{
label: t`CPU Usage`,
dataKey: ({ stats }) => (showMax ? stats?.cpum : stats?.cpu),
color: "1",
opacity: 0.4,
},
]}
tickFormatter={(val) => toFixedFloat(val, 2) + "%"}
contentFormatter={({ value }) => decimalString(value) + "%"}
/>
</ChartCard>
@@ -530,8 +538,21 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName="dio"
maxToggled={maxValues}
dataPoints={[
{
label: t({ message: "Write", comment: "Disk write" }),
dataKey: ({ stats }) => (showMax ? stats?.dwm : stats?.dw),
color: "3",
opacity: 0.3,
},
{
label: t({ message: "Read", comment: "Disk read" }),
dataKey: ({ stats }) => (showMax ? stats?.drm : stats?.dr),
color: "1",
opacity: 0.3,
},
]}
tickFormatter={(val) => {
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
@@ -552,16 +573,39 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName="bw"
maxToggled={maxValues}
dataPoints={[
{
label: t`Sent`,
// use bytes if available, otherwise multiply old MB (can remove in future)
dataKey(data) {
if (showMax) {
return data?.stats?.bm?.[0] ?? (data?.stats?.nsm ?? 0) * 1024 * 1024
}
return data?.stats?.b?.[0] ?? data?.stats?.ns * 1024 * 1024
},
color: "5",
opacity: 0.2,
},
{
label: t`Received`,
dataKey(data) {
if (showMax) {
return data?.stats?.bm?.[1] ?? (data?.stats?.nrm ?? 0) * 1024 * 1024
}
return data?.stats?.b?.[1] ?? data?.stats?.nr * 1024 * 1024
},
color: "2",
opacity: 0.2,
},
]}
tickFormatter={(val) => {
let { value, unit } = formatBytes(val, true, userSettings.unitNet, true)
// value = value >= 10 ? Math.ceil(value) : value
let { value, unit } = formatBytes(val, true, userSettings.unitNet, false)
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
}}
contentFormatter={({ value }) => {
const { value: convertedValue, unit } = formatBytes(value, true, userSettings.unitNet, true)
return decimalString(convertedValue, convertedValue >= 100 ? 1 : 2) + " " + unit
contentFormatter={(data) => {
const { value, unit } = formatBytes(data.value, true, userSettings.unitNet, false)
return decimalString(value, value >= 100 ? 1 : 2) + " " + unit
}}
/>
</ChartCard>
@@ -597,6 +641,18 @@ export default function SystemDetail({ name }: { name: string }) {
</ChartCard>
)}
{/* Load Average chart */}
{system.info.l1 !== undefined && (
<ChartCard
empty={dataEmpty}
grid={grid}
title={t`Load Average`}
description={t`System load averages over time`}
>
<LoadAverageChart chartData={chartData} />
</ChartCard>
)}
{/* Temperature chart */}
{systemStats.at(-1)?.stats.t && (
<ChartCard
@@ -628,10 +684,6 @@ export default function SystemDetail({ name }: { name: string }) {
<div className="grid xl:grid-cols-2 gap-4">
{Object.keys(systemStats.at(-1)?.stats.g ?? {}).map((id) => {
const gpu = systemStats.at(-1)?.stats.g?.[id] as GPUData
// const sizeFormatter = (value: number, decimals?: number) => {
// const { v, u } = getSizeAndUnit(value, false)
// return toFixedFloat(v, decimals || 1) + u
// }
return (
<div key={id} className="contents">
<ChartCard
@@ -642,8 +694,15 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName={`g.${id}.u`}
tickFormatter={(val) => toFixedWithoutTrailingZeros(val, 2) + "%"}
dataPoints={[
{
label: t`Usage`,
dataKey: ({ stats }) => stats?.g?.[id]?.u ?? 0,
color: "1",
opacity: 0.35,
},
]}
tickFormatter={(val) => toFixedFloat(val, 2) + "%"}
contentFormatter={({ value }) => decimalString(value) + "%"}
/>
</ChartCard>
@@ -655,14 +714,21 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName={`g.${id}.mu`}
dataPoints={[
{
label: t`Usage`,
dataKey: ({ stats }) => stats?.g?.[id]?.mu ?? 0,
color: "2",
opacity: 0.25,
},
]}
max={gpu.mt}
tickFormatter={(val) => {
const { value, unit } = formatBytes(val, false, DataUnit.Bytes, true)
const { value, unit } = formatBytes(val, false, Unit.Bytes, true)
return toFixedFloat(value, value >= 10 ? 0 : 1) + " " + unit
}}
contentFormatter={({ value }) => {
const { value: convertedValue, unit } = formatBytes(value, false, DataUnit.Bytes, true)
const { value: convertedValue, unit } = formatBytes(value, false, Unit.Bytes, true)
return decimalString(convertedValue) + " " + unit
}}
/>
@@ -700,7 +766,20 @@ export default function SystemDetail({ name }: { name: string }) {
>
<AreaChartDefault
chartData={chartData}
chartName={`efs.${extraFsName}`}
dataPoints={[
{
label: t`Write`,
dataKey: ({ stats }) => stats?.efs?.[extraFsName]?.[showMax ? "wm" : "w"] ?? 0,
color: "3",
opacity: 0.3,
},
{
label: t`Read`,
dataKey: ({ stats }) => stats?.efs?.[extraFsName]?.[showMax ? "rm" : "r"] ?? 0,
color: "1",
opacity: 0.3,
},
]}
maxToggled={maxValues}
tickFormatter={(val) => {
const { value, unit } = formatBytes(val, true, userSettings.unitDisk, true)

View File

@@ -70,7 +70,7 @@ import {
copyToClipboard,
isReadOnlyUser,
useLocalStorage,
convertTemperature,
formatTemperature,
decimalString,
formatBytes,
} from "@/lib/utils"
@@ -135,7 +135,6 @@ export default function SystemsTable() {
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
const [columnVisibility, setColumnVisibility] = useLocalStorage<VisibilityState>("cols", {})
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("viewMode", window.innerWidth > 1024 ? "table" : "grid")
const userSettings = useStore($userSettings)
const locale = i18n.locale
@@ -174,7 +173,7 @@ export default function SystemsTable() {
invertSorting: false,
Icon: ServerIcon,
cell: (info) => (
<span className="flex gap-0.5 items-center text-base md:pe-5">
<span className="flex gap-0.5 items-center text-base md:ps-1 md:pe-5">
<IndicatorDot system={info.row.original} />
<Button
data-nolink
@@ -183,14 +182,14 @@ export default function SystemsTable() {
onClick={() => copyToClipboard(info.getValue() as string)}
>
{info.getValue() as string}
<CopyIcon className="h-2.5 w-2.5" />
<CopyIcon className="size-2.5" />
</Button>
</span>
),
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.cpu,
accessorFn: ({ info }) => decimalString(info.cpu, info.cpu >= 10 ? 1 : 2),
id: "cpu",
name: () => t`CPU`,
cell: CellFormatter,
@@ -223,14 +222,57 @@ export default function SystemsTable() {
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.b || 0,
id: "loadAverage",
accessorFn: ({ info }) => {
const { l1 = 0, l5 = 0, l15 = 0 } = info
return l1 + l5 + l15
},
name: () => t({ message: "Load Avg", comment: "Short label for load average" }),
size: 0,
Icon: HourglassIcon,
header: sortableHeader,
cell(info: CellContext<SystemRecord, unknown>) {
const { info: sysInfo, status } = info.row.original
if (sysInfo.l1 === undefined) {
return null
}
const { l1 = 0, l5 = 0, l15 = 0, t: cpuThreads = 1 } = sysInfo
const loadAverages = [l1, l5, l15]
function getDotColor() {
const max = Math.max(...loadAverages)
const normalized = max / cpuThreads
if (status !== "up") return "bg-primary/30"
if (normalized < 0.7) return "bg-green-500"
if (normalized < 1) return "bg-yellow-500"
return "bg-red-600"
}
return (
<div className="flex items-center gap-[.35em] w-full tabular-nums tracking-tight">
<span className={cn("inline-block size-2 rounded-full me-0.5", getDotColor())} />
{loadAverages.map((la, i) => (
<span key={i}>{decimalString(la, la >= 10 ? 1 : 2)}</span>
))}
</div>
)
},
},
{
accessorFn: ({ info }) => info.bb || (info.b || 0) * 1024 * 1024,
id: "net",
name: () => t`Net`,
size: 0,
Icon: EthernetIcon,
header: sortableHeader,
cell(info) {
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, true)
const sys = info.row.original
if (sys.status === "paused") {
return null
}
const userSettings = useStore($userSettings)
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, false)
return (
<span className="tabular-nums whitespace-nowrap">
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
@@ -238,46 +280,6 @@ export default function SystemsTable() {
)
},
},
{
accessorFn: (originalRow) => originalRow.info.l5,
id: "l5",
name: () => t({ message: "L5", comment: "Load average 5 minutes" }),
size: 0,
hideSort: true,
Icon: HourglassIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
if (!val) {
return null
}
return (
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-1")}>
{decimalString(val)}
</span>
)
},
},
{
accessorFn: (originalRow) => originalRow.info.l15,
id: "l15",
name: () => t({ message: "L15", comment: "Load average 15 minutes" }),
size: 0,
hideSort: true,
Icon: HourglassIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
if (!val) {
return null
}
return (
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-1")}>
{decimalString(val)}
</span>
)
},
},
{
accessorFn: (originalRow) => originalRow.info.dt,
id: "temp",
@@ -291,7 +293,8 @@ export default function SystemsTable() {
if (!val) {
return null
}
const { value, unit } = convertTemperature(val, userSettings.unitTemp)
const userSettings = useStore($userSettings)
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
return (
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-0.5")}>
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
@@ -545,7 +548,7 @@ function SystemsTableHead({ table, colLength }: { table: TableType<SystemRecord>
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<TableHead className="px-1" key={header.id}>
<TableHead className="px-1.5" key={header.id}>
{flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
)

View File

@@ -1,3 +1,5 @@
"use client"
import * as React from "react"
import * as CheckboxPrimitive from "@radix-ui/react-checkbox"
import { Check } from "lucide-react"
@@ -11,13 +13,14 @@ const Checkbox = React.forwardRef<
<CheckboxPrimitive.Root
ref={ref}
className={cn(
"peer h-4 w-4 shrink-0 rounded-[.3em] border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
"peer size-4 flex items-center justify-center shrink-0 rounded-[.3em] border border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
className
)}
{...props}
>
<CheckboxPrimitive.Indicator className={cn("flex items-center justify-center text-current")}>
<Check className="h-4 w-4" />
<Check className="size-4" />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
))

View File

@@ -0,0 +1,49 @@
import * as React from "react"
import { ChevronDownIcon, HourglassIcon } from "lucide-react"
import { cn } from "@/lib/utils"
import { Button } from "./button"
interface CollapsibleProps {
title: string
children: React.ReactNode
description?: React.ReactNode
defaultOpen?: boolean
className?: string
icon?: React.ReactNode
}
export function Collapsible({ title, children, description, defaultOpen = false, className, icon }: CollapsibleProps) {
const [isOpen, setIsOpen] = React.useState(defaultOpen)
return (
<div className={cn("border rounded-lg", className)}>
<Button
variant="ghost"
className="w-full justify-between p-4 font-semibold"
onClick={() => setIsOpen(!isOpen)}
>
<div className="flex items-center gap-2">
{icon}
{title}
</div>
<ChevronDownIcon
className={cn("h-4 w-4 transition-transform duration-200", {
"rotate-180": isOpen,
})}
/>
</Button>
{description && (
<div className="px-4 pb-2 text-sm text-muted-foreground">
{description}
</div>
)}
{isOpen && (
<div className="px-4 pb-4">
<div className="grid gap-3">
{children}
</div>
</div>
)}
</div>
)
}

View File

@@ -37,7 +37,7 @@ const TableRow = React.forwardRef<HTMLTableRowElement, React.HTMLAttributes<HTML
<tr
ref={ref}
className={cn(
"border-b border-border/60 hover:bg-muted/40 dark:hover:bg-muted/20 data-[state=selected]:bg-muted",
"border-b border-border/60 hover:bg-muted/40 dark:hover:bg-muted/20 data-[state=selected]:!bg-muted",
className
)}
{...props}

View File

@@ -1,3 +1,4 @@
/** Operating system */
export enum Os {
Linux = 0,
Darwin,
@@ -5,6 +6,7 @@ export enum Os {
FreeBSD,
}
/** Type of chart */
export enum ChartType {
Memory,
Disk,
@@ -12,12 +14,10 @@ export enum ChartType {
CPU,
}
export enum DataUnit {
/** Unit of measurement */
export enum Unit {
Bytes,
Bits,
}
export enum TemperatureUnit {
Celsius,
Fahrenheit,
}

View File

@@ -28,9 +28,9 @@ export const $maxValues = atom(false)
export const $userSettings = map<UserSettings>({
chartTime: "1h",
emails: [pb.authStore.record?.email || ""],
temperatureUnit: "celsius",
networkUnit: "mbps",
diskUnit: "mbps",
// unitTemp: "celsius",
// unitNet: "mbps",
// unitDisk: "mbps",
})
// update local storage on change
$userSettings.subscribe((value) => {

View File

@@ -10,8 +10,7 @@ import {
ChartTimes,
FingerprintRecord,
SystemRecord,
TemperatureConversion,
DataUnitConversion,
UserSettings,
} from "@/types"
import { RecordModel, RecordSubscription } from "pocketbase"
import { WritableAtom } from "nanostores"
@@ -20,7 +19,7 @@ import { useEffect, useState } from "react"
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
import { EthernetIcon, HourglassIcon, ThermometerIcon } from "@/components/ui/icons"
import { prependBasePath } from "@/components/router"
import { DataUnit, TemperatureUnit } from "./enums"
import { Unit } from "./enums"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
@@ -83,7 +82,10 @@ export const updateSystemList = (() => {
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
export async function logOut() {
sessionStorage.setItem("lo", "t")
$systems.set([])
$alerts.set([])
$userSettings.set({} as UserSettings)
sessionStorage.setItem("lo", "t") // prevent auto login on logout
pb.authStore.clear()
pb.realtime.unsubscribe()
}
@@ -235,17 +237,17 @@ export function useYAxisWidth() {
return { yAxisWidth, updateYAxisWidth }
}
export function toFixedWithoutTrailingZeros(num: number, digits: number) {
return parseFloat(num.toFixed(digits)).toString()
}
/** Format number to x decimal places, without trailing zeros */
export function toFixedFloat(num: number, digits: number) {
return parseFloat((digits === 0 ? Math.ceil(num) : num).toFixed(digits))
}
let decimalFormatters: Map<number, Intl.NumberFormat> = new Map()
/** Format number to x decimal places */
/** Format number to x decimal places, maintaining trailing zeros */
export function decimalString(num: number, digits = 2) {
if (digits === 0) {
return Math.ceil(num).toString()
}
let formatter = decimalFormatters.get(digits)
if (!formatter) {
formatter = new Intl.NumberFormat(undefined, {
@@ -276,11 +278,13 @@ export function useLocalStorage<T>(key: string, defaultValue: T) {
return [value, setValue]
}
export function convertTemperature(celsius: number, unit = TemperatureUnit.Celsius): TemperatureConversion {
const userSettings = $userSettings.get()
unit ||= userSettings.unitTemp || TemperatureUnit.Celsius
/** Format temperature to user's preferred unit */
export function formatTemperature(celsius: number, unit?: Unit): { value: number; unit: string } {
if (!unit) {
unit = $userSettings.get().unitTemp || Unit.Celsius
}
// need loose equality check due to form data being strings
if (unit == TemperatureUnit.Fahrenheit) {
if (unit == Unit.Fahrenheit) {
return {
value: celsius * 1.8 + 32,
unit: "°F",
@@ -292,17 +296,18 @@ export function convertTemperature(celsius: number, unit = TemperatureUnit.Celsi
}
}
/** Format bytes to user's preferred unit */
export function formatBytes(
size: number,
perSecond = false,
unit = DataUnit.Bytes,
unit = Unit.Bytes,
isMegabytes = false
): DataUnitConversion {
): { value: number; unit: string } {
// Convert MB to bytes if isMegabytes is true
if (isMegabytes) size *= 1024 * 1024
// need loose equality check due to form data being strings
if (unit == DataUnit.Bits) {
if (unit == Unit.Bits) {
const bits = size * 8
const suffix = perSecond ? "ps" : ""
if (bits < 1000) return { value: bits, unit: `b${suffix}` }
@@ -322,7 +327,7 @@ export function formatBytes(
unit: `Tb${suffix}`,
}
}
// bytes
const suffix = perSecond ? "/s" : ""
if (size < 100) return { value: size, unit: `B${suffix}` }
if (size < 1000 * 1024) return { value: size / 1024, unit: `KB${suffix}` }
@@ -342,42 +347,27 @@ export function formatBytes(
}
}
/** Fetch or create user settings in database */
export async function updateUserSettings() {
try {
const req = await pb.collection("user_settings").getFirstListItem("", { fields: "settings" })
$userSettings.set(req.settings)
return
} catch (e) {
console.log("get settings", e)
console.error("get settings", e)
}
// create user settings if error fetching existing
try {
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.record!.id })
$userSettings.set(createdSettings.settings)
} catch (e) {
console.log("create settings", e)
console.error("create settings", e)
}
}
/**
* Get the value and unit of size (TB, GB, or MB) for a given size
* @param n size in gigabytes or megabytes
* @param isGigabytes boolean indicating if n represents gigabytes (true) or megabytes (false)
* @returns an object containing the value and unit of size
*/
export const getSizeAndUnit = (n: number, isGigabytes = true) => {
const sizeInGB = isGigabytes ? n : n / 1_000
if (sizeInGB >= 1_000) {
return { v: sizeInGB / 1_000, u: " TB" }
} else if (sizeInGB >= 1) {
return { v: sizeInGB, u: " GB" }
}
return { v: isGigabytes ? sizeInGB * 1_000 : n, u: " MB" }
}
export const chartMargin = { top: 12 }
/** Alert info for each alert type */
export const alertInfo: Record<string, AlertInfo> = {
Status: {
name: () => t`Status`,
@@ -418,6 +408,16 @@ export const alertInfo: Record<string, AlertInfo> = {
icon: ThermometerIcon,
desc: () => t`Triggers when any sensor exceeds a threshold`,
},
LoadAvg1: {
name: () => t`Load Average 1m`,
unit: "",
icon: HourglassIcon,
max: 100,
min: 0.1,
start: 10,
step: 0.1,
desc: () => t`Triggers when 1 minute load average exceeds a threshold`,
},
LoadAvg5: {
name: () => t`Load Average 5m`,
unit: "",
@@ -456,3 +456,42 @@ export const getHubURL = () => BESZEL?.HUB_URL || window.location.origin
/** Map of system IDs to their corresponding tokens (used to avoid fetching in add-system dialog) */
export const tokenMap = new Map<SystemRecord["id"], FingerprintRecord["token"]>()
/** Calculate duration between two dates and format as human-readable string */
export function formatDuration(
createdDate: string | null | undefined,
resolvedDate: string | null | undefined
): string {
const created = createdDate ? new Date(createdDate) : null
const resolved = resolvedDate ? new Date(resolvedDate) : null
if (!created || !resolved) return ""
const diffMs = resolved.getTime() - created.getTime()
if (diffMs < 0) return ""
const totalSeconds = Math.floor(diffMs / 1000)
let hours = Math.floor(totalSeconds / 3600)
let minutes = Math.floor((totalSeconds % 3600) / 60)
let seconds = totalSeconds % 60
// if seconds are close to 60, round up to next minute
// if minutes are close to 60, round up to next hour
if (seconds >= 58) {
minutes += 1
seconds = 0
}
if (minutes >= 60) {
hours += 1
minutes = 0
}
// For durations over 1 hour, omit seconds for cleaner display
if (hours > 0) {
return [hours ? `${hours}h` : null, minutes ? `${minutes}m` : null].filter(Boolean).join(" ")
}
return [hours ? `${hours}h` : null, minutes ? `${minutes}m` : null, seconds ? `${seconds}s` : null]
.filter(Boolean)
.join(" ")
}

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# يوم} other {# أيام}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "تم تحديد {0} من {1} صف"
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
msgid "1 hour"
msgstr "1 ساعة"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "دقيقة واحدة"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 أسبوع"
@@ -39,6 +50,11 @@ msgstr "1 أسبوع"
msgid "12 hours"
msgstr "12 ساعة"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 دقيقة"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 ساعة"
@@ -47,12 +63,22 @@ msgstr "24 ساعة"
msgid "30 days"
msgstr "30 يومًا"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 دقائق"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "إجراءات"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "نشط"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "التنبيهات النشطة"
@@ -86,6 +112,12 @@ msgstr "مسؤول"
msgid "Agent"
msgstr "وكيل"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "سجل التنبيهات"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "جميع الأنظمة"
msgid "Are you sure you want to delete {name}?"
msgstr "هل أنت متأكد أنك تريد حذف {name}؟"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "هل أنت متأكد؟"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "النسخ التلقائي يتطلب سياقًا آمنًا."
@@ -152,11 +188,22 @@ msgstr "يستخدم بيزيل <0>Shoutrrr</0> للتكامل مع خدمات
msgid "Binary"
msgstr "ثنائي"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "بت (كيلوبت/ثانية، ميجابت/ثانية، جيجابت/ثانية)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "بايت (كيلوبايت/ثانية، ميجابايت/ثانية، جيجابايت/ثانية)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "ذاكرة التخزين المؤقت / المخازن المؤقتة"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "إلغاء"
@@ -164,6 +211,14 @@ msgstr "إلغاء"
msgid "Caution - potential data loss"
msgstr "تحذير - فقدان محتمل للبيانات"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "درجة مئوية (°م)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "تغيير وحدات عرض المقاييس."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "تغيير خيارات التطبيق العامة."
@@ -202,7 +257,12 @@ msgstr "قم بتكوين كيفية تلقي إشعارات التنبيه."
msgid "Confirm password"
msgstr "تأكيد كلمة المرور"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "الاتصال مقطوع"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "متابعة"
@@ -258,7 +318,7 @@ msgstr "المعالج"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "استخدام وحدة المعالجة المركزية"
@@ -266,6 +326,11 @@ msgstr "استخدام وحدة المعالجة المركزية"
msgid "Create account"
msgstr "إنشاء حساب"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "أنشئت"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "الفترة الزمنية الافتراضية"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "حذف"
@@ -296,6 +362,10 @@ msgstr "القرص"
msgid "Disk I/O"
msgstr "إدخال/إخراج القرص"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "وحدة القرص"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "التوثيق"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "معطل"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "المدة"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "أدخل عنوان البريد الإشباكي..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "خطأ"
@@ -369,6 +445,10 @@ msgstr "يتجاوز {0}{1} في آخر {2, plural, one {# دقيقة} other {#
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "سيتم حذف الأنظمة الحالية غير المعرفة في <0>config.yml</0>. يرجى عمل نسخ احتياطية بانتظام."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "تصدير"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "تصدير التكوين"
@@ -377,6 +457,10 @@ msgstr "تصدير التكوين"
msgid "Export your current systems configuration."
msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "فهرنهايت (°ف)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "فشل في المصادقة"
@@ -396,12 +480,13 @@ msgstr "فشل في تحديث التنبيه"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "تصفية..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "البصمة"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "عنوان البريد الإشباكي غير صالح."
msgid "Kernel"
msgstr "النواة"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "اللغة"
@@ -471,13 +546,26 @@ msgstr "التخطيط"
msgid "Light"
msgstr "فاتح"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "متوسط التحميل"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "متوسط التحميل 15 دقيقة"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "متوسط التحميل 1 دقيقة"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "متوسط التحميل 5 دقائق"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "متوسط التحميل"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "استخدام الذاكرة"
msgid "Memory usage of docker containers"
msgstr "استخدام الذاكرة لحاويات Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "الاسم"
@@ -543,10 +632,19 @@ msgstr "حركة مرور الشبكة لحاويات Docker"
msgid "Network traffic of public interfaces"
msgstr "حركة مرور الشبكة للواجهات العامة"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "وحدة الشبكة"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "لم يتم العثور على نتائج."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "لا توجد نتائج."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "الكتابة فوق التنبيهات الحالية"
msgid "Page"
msgstr "صفحة"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "صفحة {0} من {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "الصفحات / الإعدادات"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "المفتاح العام"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "قراءة"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "تم الاستلام"
@@ -679,6 +782,12 @@ msgstr "تم الاستلام"
msgid "Reset Password"
msgstr "إعادة تعيين كلمة المرور"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "تم حلها"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "استئناف"
@@ -687,6 +796,10 @@ msgstr "استئناف"
msgid "Rotate token"
msgstr "تدوير الرمز المميز"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "صفوف لكل صفحة"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإشباكي."
@@ -712,8 +825,7 @@ msgstr "البحث عن الأنظمة أو الإعدادات..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "راجع <0>إعدادات الإشعارات</0> لتكوين كيفية تلقي التنبيهات."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "تم الإرسال"
@@ -744,6 +856,11 @@ msgstr "إعدادات SMTP"
msgid "Sort By"
msgstr "الترتيب حسب"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "الحالة"
#: src/lib/utils.ts
msgid "Status"
msgstr "الحالة"
@@ -759,11 +876,16 @@ msgstr "استخدام التبديل"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "النظام"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "متوسط تحميل النظام مع مرور الوقت"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "الأنظمة"
@@ -786,6 +908,10 @@ msgstr "درجة الحرارة"
msgid "Temperature"
msgstr "درجة الحرارة"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "وحدة درجة الحرارة"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "درجات حرارة مستشعرات النظام"
@@ -806,6 +932,10 @@ msgstr "ثم قم بتسجيل الدخول إلى الواجهة الخلفية
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "لا يمكن التراجع عن هذا الإجراء. سيؤدي ذلك إلى حذف جميع السجلات الحالية لـ {name} من قاعدة البيانات بشكل دائم."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "سيؤدي هذا إلى حذف جميع السجلات المحددة من قاعدة البيانات بشكل دائم."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "معدل نقل {extraFsName}"
@@ -846,13 +976,17 @@ msgstr "تسمح الرموز المميزة للوكلاء بالاتصال و
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "تُستخدم الرموز المميزة والبصمات للمصادقة على اتصالات WebSocket إلى المحور."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة دقيقة واحدة عتبة معينة"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة 15 دقيقة عتبة معينة"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل لمدة 5 دقائق عتبة معينة"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "يتم التفعيل عندما يتغير الحالة بين التش
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز استخدام أي قرص عتبة معينة"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "تفضيلات الوحدة"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "رمز مميز عالمي"
@@ -898,7 +1037,8 @@ msgstr "مدة التشغيل"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "الاستخدام"
@@ -908,7 +1048,6 @@ msgstr "استخدام القسم الجذر"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "مستخدم"
@@ -917,10 +1056,18 @@ msgstr "مستخدم"
msgid "Users"
msgstr "المستخدمون"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "القيمة"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "عرض"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "عرض أحدث 200 تنبيه."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "الأعمدة الظاهرة"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "أمر Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "كتابة"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ден} other {# дни}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часа}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# час} other {# часа}}"
msgid "1 hour"
msgstr "1 час"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 седмица"
@@ -39,6 +50,11 @@ msgstr "1 седмица"
msgid "12 hours"
msgstr "12 часа"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 часа"
@@ -47,12 +63,22 @@ msgstr "24 часа"
msgid "30 days"
msgstr "30 дни"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Действия"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Активни тревоги"
@@ -86,6 +112,12 @@ msgstr "Администратор"
msgid "Agent"
msgstr "Агент"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Всички системи"
msgid "Are you sure you want to delete {name}?"
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Автоматичното копиране изисква защитен контескт."
@@ -152,11 +188,22 @@ msgstr "Beszel ползва <0>Shoutrrr</0> за да се интегрира с
msgid "Binary"
msgstr "Двоичен код"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Откажи"
@@ -164,6 +211,14 @@ msgstr "Откажи"
msgid "Caution - potential data loss"
msgstr "Внимание - възможност за загуба на данни"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Смени общите опции на приложението."
@@ -202,7 +257,12 @@ msgstr "Настрой как получаваш нотификации за т
msgid "Confirm password"
msgstr "Потвърди парола"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продължи"
@@ -258,7 +318,7 @@ msgstr "Процесор"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Употреба на процесор"
@@ -266,6 +326,11 @@ msgstr "Употреба на процесор"
msgid "Create account"
msgstr "Създай акаунт"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Времеви диапазон по подразбиране"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Изтрий"
@@ -296,6 +362,10 @@ msgstr "Диск"
msgid "Disk I/O"
msgstr "Диск I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Въведи имейл адрес..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Грешка"
@@ -369,6 +445,10 @@ msgstr "Надвишава {0}{1} в последните {2, plural, one {# м
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Съществуващи системи които не са дефинирани в <0>config.yml</0> ще бъдат изтрити. Моля прави чести архиви."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Експортирай конфигурация"
@@ -377,6 +457,10 @@ msgstr "Експортирай конфигурация"
msgid "Export your current systems configuration."
msgstr "Експортирай конфигурацията на системите."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Неуспешно удостоверяване"
@@ -396,6 +480,7 @@ msgstr "Неуспешно обнови тревога"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Филтрирай..."
@@ -448,16 +533,6 @@ msgstr "Невалиден имейл адрес."
msgid "Kernel"
msgstr "Linux Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Език"
@@ -471,14 +546,27 @@ msgstr "Подреждане"
msgid "Light"
msgstr "Светъл"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Изход"
@@ -527,6 +615,7 @@ msgstr "Употреба на паметта"
msgid "Memory usage of docker containers"
msgstr "Използването на памет от docker контейнерите"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Име"
@@ -543,10 +632,19 @@ msgstr "Мрежов трафик на docker контейнери"
msgid "Network traffic of public interfaces"
msgstr "Мрежов трафик на публични интерфейси"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Няма намерени резултати."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Презапиши съществуващи тревоги"
msgid "Page"
msgstr "Страница"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Страници / Настройки"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Публичен ключ"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Прочети"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Получени"
@@ -679,6 +782,12 @@ msgstr "Получени"
msgid "Reset Password"
msgstr "Нулиране на парола"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Възобнови"
@@ -687,6 +796,10 @@ msgstr "Възобнови"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл."
@@ -712,8 +825,7 @@ msgstr "Търси за системи или настройки..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Виж <0>настройките за нотификациите</0> за да конфигурираш как получаваш тревоги."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Изпратени"
@@ -744,6 +856,11 @@ msgstr "Настройки за SMTP"
msgid "Sort By"
msgstr "Сортиране по"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Статус"
@@ -759,11 +876,16 @@ msgstr "Използване на swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системи"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Температири на системни сензори"
@@ -806,6 +932,10 @@ msgstr "След това влез в backend-а и нулирай парола
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Пропускателна способност на {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Задейства се, когато статуса превключв
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Време на работа"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Употреба"
@@ -908,7 +1048,6 @@ msgstr "Употреба на root partition-а"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Използвани"
@@ -917,10 +1056,18 @@ msgstr "Използвани"
msgid "Users"
msgstr "Потребители"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Изглед"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Видими полета"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Команда Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Запиши"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Ho
msgid "1 hour"
msgstr "1 hodina"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 týden"
@@ -39,6 +50,11 @@ msgstr "1 týden"
msgid "12 hours"
msgstr "12 hodin"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 hodin"
@@ -47,12 +63,22 @@ msgstr "24 hodin"
msgid "30 days"
msgstr "30 dní"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akce"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktivní výstrahy"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Všechny systémy"
msgid "Are you sure you want to delete {name}?"
msgstr "Opravdu chcete odstranit {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
@@ -152,11 +188,22 @@ msgstr "Beszel používá <0>Shoutrrr</0> k integraci s populárními notifikač
msgid "Binary"
msgstr "Binary"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / vyrovnávací paměť"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Zrušit"
@@ -164,6 +211,14 @@ msgstr "Zrušit"
msgid "Caution - potential data loss"
msgstr "Upozornění - možná ztráta dat"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Změnit obecné nastavení aplikace."
@@ -202,7 +257,12 @@ msgstr "Konfigurace způsobu přijímání upozornění."
msgid "Confirm password"
msgstr "Potvrdit heslo"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Pokračovat"
@@ -258,7 +318,7 @@ msgstr "Procesor"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Využití procesoru"
@@ -266,6 +326,11 @@ msgstr "Využití procesoru"
msgid "Create account"
msgstr "Vytvořit účet"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Výchozí doba"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Odstranit"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentace"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nefunkční"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Zadejte e-mailovou adresu..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Chyba"
@@ -369,6 +445,10 @@ msgstr "Překračuje {0}{1} za {2, plural, one {poslední # minutu} few {posledn
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, budou odstraněny. Provádějte pravidelné zálohování."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Exportovat konfiguraci"
@@ -377,6 +457,10 @@ msgstr "Exportovat konfiguraci"
msgid "Export your current systems configuration."
msgstr "Exportovat aktuální konfiguraci systémů."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Ověření se nezdařilo"
@@ -396,6 +480,7 @@ msgstr "Nepodařilo se aktualizovat upozornění"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtr..."
@@ -448,16 +533,6 @@ msgstr "Neplatná e-mailová adresa."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Jazyk"
@@ -471,14 +546,27 @@ msgstr "Rozvržení"
msgid "Light"
msgstr "Světlý"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Odhlásit"
@@ -527,6 +615,7 @@ msgstr "Využití paměti"
msgid "Memory usage of docker containers"
msgstr "Využití paměti docker kontejnerů"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Název"
@@ -543,10 +632,19 @@ msgstr "Síťový provoz kontejnerů docker"
msgid "Network traffic of public interfaces"
msgstr "Síťový provoz veřejných rozhraní"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Nenalezeny žádné výskyty."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Přepsat existující upozornění"
msgid "Page"
msgstr "Stránka"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Stránky / Nastavení"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Veřejný klíč"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Číst"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Přijato"
@@ -679,6 +782,12 @@ msgstr "Přijato"
msgid "Reset Password"
msgstr "Obnovit heslo"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Pokračovat"
@@ -687,6 +796,10 @@ msgstr "Pokračovat"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole."
@@ -712,8 +825,7 @@ msgstr "Hledat systémy nebo nastavení..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Podívejte se na <0>nastavení upozornění</0> pro nastavení toho, jak přijímáte upozornění."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Odeslat"
@@ -744,6 +856,11 @@ msgstr "Nastavení SMTP"
msgid "Sort By"
msgstr "Seřadit podle"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Stav"
@@ -759,11 +876,16 @@ msgstr "Swap využití"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Systém"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systémy"
@@ -786,6 +908,10 @@ msgstr "Teplota"
msgid "Temperature"
msgstr "Teplota"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Teploty systémových senzorů"
@@ -806,6 +932,10 @@ msgstr "Poté se přihlaste do backendu a obnovte heslo k uživatelskému účtu
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tuto akci nelze vzít zpět. Tím se z databáze trvale odstraní všechny aktuální záznamy pro {name}."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Propustnost {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Spouští se, když se změní dostupnost"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Doba provozu"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Využití"
@@ -908,7 +1048,6 @@ msgstr "Využití kořenového oddílu"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Využito"
@@ -917,10 +1056,18 @@ msgstr "Využito"
msgid "Users"
msgstr "Uživatelé"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Zobrazení"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Viditelné sloupce"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr ""
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Psát"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# day} other {# days}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hour} other {# hours}}"
msgid "1 hour"
msgstr "1 time"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 uge"
@@ -39,6 +50,11 @@ msgstr "1 uge"
msgid "12 hours"
msgstr "12 timer"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 timer"
@@ -47,12 +63,22 @@ msgstr "24 timer"
msgid "30 days"
msgstr "30 dage"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Handlinger"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktive Alarmer"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Alle systemer"
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på, at du vil slette {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kræver en sikker kontekst."
@@ -152,11 +188,22 @@ msgstr "Beszel bruger <0>Shoutrrr</0> til at integrere med populære notifikatio
msgid "Binary"
msgstr "Binær"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Fortryd"
@@ -164,6 +211,14 @@ msgstr "Fortryd"
msgid "Caution - potential data loss"
msgstr "Forsigtig - muligt tab af data"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Skift generelle applikationsindstillinger."
@@ -202,7 +257,12 @@ msgstr "Konfigurer hvordan du modtager advarselsmeddelelser."
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Forsæt"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU forbrug"
@@ -266,6 +326,11 @@ msgstr "CPU forbrug"
msgid "Create account"
msgstr "Opret konto"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Slet"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Indtast e-mailadresse..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Fejl"
@@ -369,6 +445,10 @@ msgstr "Overskrider {0}{1} i sidste {2, plural, one {# minut} other {# minutter}
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Eksisterende systemer ikke defineret i <0>config.yml</0> vil blive slettet. Opret venligst regelmæssige sikkerhedskopier."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Eksporter konfiguration"
@@ -377,6 +457,10 @@ msgstr "Eksporter konfiguration"
msgid "Export your current systems configuration."
msgstr "Eksporter din nuværende systemkonfiguration."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Kunne ikke godkende"
@@ -396,6 +480,7 @@ msgstr "Kunne ikke opdatere alarm"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Ugyldig email adresse."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Sprog"
@@ -471,14 +546,27 @@ msgstr "Layout"
msgid "Light"
msgstr "Lys"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Log ud"
@@ -527,6 +615,7 @@ msgstr "Hukommelsesforbrug"
msgid "Memory usage of docker containers"
msgstr "Hukommelsesforbrug af dockercontainere"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Navn"
@@ -543,10 +632,19 @@ msgstr "Netværkstrafik af dockercontainere"
msgid "Network traffic of public interfaces"
msgstr "Netværkstrafik af offentlige grænseflader"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Ingen resultater fundet."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Overskriv eksisterende alarmer"
msgid "Page"
msgstr "Side"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Sider / Indstillinger"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Offentlig nøgle"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Læs"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Modtaget"
@@ -679,6 +782,12 @@ msgstr "Modtaget"
msgid "Reset Password"
msgstr "Nulstil adgangskode"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Genoptag"
@@ -687,6 +796,10 @@ msgstr "Genoptag"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser."
@@ -712,8 +825,7 @@ msgstr "Søg efter systemer eller indstillinger..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Se <0>meddelelsesindstillinger</0> for at konfigurere, hvordan du modtager alarmer."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Sendt"
@@ -744,6 +856,11 @@ msgstr "SMTP-indstillinger"
msgid "Sort By"
msgstr "Sorter efter"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap forbrug"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systemer"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturer i systemsensorer"
@@ -806,6 +932,10 @@ msgstr "Log derefter ind på backend og nulstil adgangskoden til din brugerkonto
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Denne handling kan ikke fortrydes. Dette vil permanent slette alle aktuelle elementer for {name} fra databasen."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Gennemløb af {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Udløser når status skifter mellem op og ned"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Udløser når brugen af en disk overstiger en tærskel"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Oppetid"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Forbrug"
@@ -908,7 +1048,6 @@ msgstr "Brug af rodpartition"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Brugt"
@@ -917,10 +1056,18 @@ msgstr "Brugt"
msgid "Users"
msgstr "Brugere"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Vis"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Synlige felter"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows-kommando"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Skriv"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# Tag} other {# Tage}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
msgid "1 hour"
msgstr "1 Stunde"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 Woche"
@@ -39,6 +50,11 @@ msgstr "1 Woche"
msgid "12 hours"
msgstr "12 Stunden"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 Stunden"
@@ -47,12 +63,22 @@ msgstr "24 Stunden"
msgid "30 days"
msgstr "30 Tage"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Aktionen"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktive Warnungen"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Alle Systeme"
msgid "Are you sure you want to delete {name}?"
msgstr "Möchtest du {name} wirklich löschen?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatisches Kopieren erfordert einen sicheren Kontext."
@@ -152,11 +188,22 @@ msgstr "Beszel verwendet <0>Shoutrrr</0>, um sich mit beliebten Benachrichtigung
msgid "Binary"
msgstr "Binär"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Puffer"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Abbrechen"
@@ -164,6 +211,14 @@ msgstr "Abbrechen"
msgid "Caution - potential data loss"
msgstr "Vorsicht - potenzieller Datenverlust"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Allgemeine Anwendungsoptionen ändern."
@@ -202,7 +257,12 @@ msgstr "Konfiguriere, wie du Warnbenachrichtigungen erhältst."
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortfahren"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU-Auslastung"
@@ -266,6 +326,11 @@ msgstr "CPU-Auslastung"
msgid "Create account"
msgstr "Konto erstellen"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Standardzeitraum"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Löschen"
@@ -296,6 +362,10 @@ msgstr "Festplatte"
msgid "Disk I/O"
msgstr "Festplatten-I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "E-Mail-Adresse eingeben..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Fehler"
@@ -369,6 +445,10 @@ msgstr "Überschreitet {0}{1} in den letzten {2, plural, one {# Minute} other {#
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Bestehende Systeme, die nicht in der <0>config.yml</0> definiert sind, werden gelöscht. Bitte mache regelmäßige Backups."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Konfiguration exportieren"
@@ -377,6 +457,10 @@ msgstr "Konfiguration exportieren"
msgid "Export your current systems configuration."
msgstr "Exportiere die aktuelle Systemkonfiguration."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Authentifizierung fehlgeschlagen"
@@ -396,6 +480,7 @@ msgstr "Warnung konnte nicht aktualisiert werden"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Ungültige E-Mail-Adresse."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Sprache"
@@ -471,14 +546,27 @@ msgstr "Anordnung"
msgid "Light"
msgstr "Hell"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Abmelden"
@@ -527,6 +615,7 @@ msgstr "Arbeitsspeichernutzung"
msgid "Memory usage of docker containers"
msgstr "Arbeitsspeichernutzung der Docker-Container"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Name"
@@ -543,10 +632,19 @@ msgstr "Netzwerkverkehr der Docker-Container"
msgid "Network traffic of public interfaces"
msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Keine Ergebnisse gefunden."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Bestehende Warnungen überschreiben"
msgid "Page"
msgstr "Seite"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Seiten / Einstellungen"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Schlüssel"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lesen"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Empfangen"
@@ -679,6 +782,12 @@ msgstr "Empfangen"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Fortsetzen"
@@ -687,6 +796,10 @@ msgstr "Fortsetzen"
msgid "Rotate token"
msgstr "Token rotieren"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
@@ -712,8 +825,7 @@ msgstr "Nach Systemen oder Einstellungen suchen..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du Warnungen erhältst."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Gesendet"
@@ -744,6 +856,11 @@ msgstr "SMTP-Einstellungen"
msgid "Sort By"
msgstr "Sortieren nach"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap-Nutzung"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systeme"
@@ -786,6 +908,10 @@ msgstr "Temperatur"
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturen der Systemsensoren"
@@ -806,6 +932,10 @@ msgstr "Melde dich dann im Backend an und setze dein Benutzerkontopasswort in de
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch werden alle aktuellen Datensätze für {name} dauerhaft aus der Datenbank gelöscht."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Durchsatz von {extraFsName}"
@@ -846,6 +976,10 @@ msgstr "Tokens ermöglichen es Agents, sich zu verbinden und zu registrieren. Fi
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens und Fingerabdrücke werden verwendet, um WebSocket-Verbindungen zum Hub zu authentifizieren."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Löst aus, wenn der Status zwischen online und offline wechselt"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Löst aus, wenn die Nutzung einer Festplatte einen Schwellenwert überschreitet"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Universeller Token"
@@ -898,7 +1037,8 @@ msgstr "Betriebszeit"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Nutzung"
@@ -908,7 +1048,6 @@ msgstr "Nutzung der Root-Partition"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Verwendet"
@@ -917,10 +1056,18 @@ msgstr "Verwendet"
msgid "Users"
msgstr "Benutzer"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Ansicht"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Sichtbare Spalten"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows-Befehl"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Schreiben"

View File

@@ -18,6 +18,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# day} other {# days}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{0} of {1} row(s) selected."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
@@ -26,6 +32,11 @@ msgstr "{hours, plural, one {# hour} other {# hours}}"
msgid "1 hour"
msgstr "1 hour"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 min"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 week"
@@ -34,6 +45,11 @@ msgstr "1 week"
msgid "12 hours"
msgstr "12 hours"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 min"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 hours"
@@ -42,12 +58,22 @@ msgstr "24 hours"
msgid "30 days"
msgstr "30 days"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Actions"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "Active"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Active Alerts"
@@ -81,6 +107,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "Alert History"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -95,6 +127,10 @@ msgstr "All Systems"
msgid "Are you sure you want to delete {name}?"
msgstr "Are you sure you want to delete {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "Are you sure?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatic copy requires a secure context."
@@ -147,11 +183,22 @@ msgstr "Beszel uses <0>Shoutrrr</0> to integrate with popular notification servi
msgid "Binary"
msgstr "Binary"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "Bits (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "Bytes (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancel"
@@ -159,6 +206,14 @@ msgstr "Cancel"
msgid "Caution - potential data loss"
msgstr "Caution - potential data loss"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "Celsius (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "Change display units for metrics."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Change general application options."
@@ -197,7 +252,12 @@ msgstr "Configure how you receive alert notifications."
msgid "Confirm password"
msgstr "Confirm password"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "Connection is down"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continue"
@@ -253,7 +313,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU Usage"
@@ -261,6 +321,11 @@ msgstr "CPU Usage"
msgid "Create account"
msgstr "Create account"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "Created"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -276,6 +341,7 @@ msgid "Default time period"
msgstr "Default time period"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Delete"
@@ -291,6 +357,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "Disk unit"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -319,11 +389,16 @@ msgstr "Documentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Down"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "Duration"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -349,6 +424,7 @@ msgstr "Enter email address..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Error"
@@ -364,6 +440,10 @@ msgstr "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "Export"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Export configuration"
@@ -372,6 +452,10 @@ msgstr "Export configuration"
msgid "Export your current systems configuration."
msgstr "Export your current systems configuration."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Failed to authenticate"
@@ -391,6 +475,7 @@ msgstr "Failed to update alert"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -443,16 +528,6 @@ msgstr "Invalid email address."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr "L15"
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr "L5"
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Language"
@@ -466,14 +541,27 @@ msgstr "Layout"
msgid "Light"
msgstr "Light"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "Load Average"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr "Load Average 15m"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "Load Average 1m"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr "Load Average 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "Load Avg"
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Log Out"
@@ -522,6 +610,7 @@ msgstr "Memory Usage"
msgid "Memory usage of docker containers"
msgstr "Memory usage of docker containers"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Name"
@@ -538,10 +627,19 @@ msgstr "Network traffic of docker containers"
msgid "Network traffic of public interfaces"
msgstr "Network traffic of public interfaces"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "Network unit"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "No results found."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "No results."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -579,6 +677,12 @@ msgstr "Overwrite existing alerts"
msgid "Page"
msgstr "Page"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "Page {0} of {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Pages / Settings"
@@ -660,13 +764,12 @@ msgid "Public Key"
msgstr "Public Key"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Read"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Received"
@@ -674,6 +777,12 @@ msgstr "Received"
msgid "Reset Password"
msgstr "Reset Password"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "Resolved"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Resume"
@@ -682,6 +791,10 @@ msgstr "Resume"
msgid "Rotate token"
msgstr "Rotate token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "Rows per page"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Save address using enter key or comma. Leave blank to disable email notifications."
@@ -707,8 +820,7 @@ msgstr "Search for systems or settings..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "See <0>notification settings</0> to configure how you receive alerts."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Sent"
@@ -739,6 +851,11 @@ msgstr "SMTP settings"
msgid "Sort By"
msgstr "Sort By"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "State"
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -754,11 +871,16 @@ msgstr "Swap Usage"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "System load averages over time"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systems"
@@ -781,6 +903,10 @@ msgstr "Temp"
msgid "Temperature"
msgstr "Temperature"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "Temperature unit"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperatures of system sensors"
@@ -801,6 +927,10 @@ msgstr "Then log into the backend and reset your user account password in the us
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "This action cannot be undone. This will permanently delete all current records for {name} from the database."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "This will permanently delete all selected records from the database."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Throughput of {extraFsName}"
@@ -841,6 +971,10 @@ msgstr "Tokens allow agents to connect and register. Fingerprints are stable ide
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "Triggers when 1 minute load average exceeds a threshold"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr "Triggers when 15 minute load average exceeds a threshold"
@@ -873,6 +1007,11 @@ msgstr "Triggers when status switches between up and down"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Triggers when usage of any disk exceeds a threshold"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "Unit preferences"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Universal token"
@@ -893,7 +1032,8 @@ msgstr "Uptime"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Usage"
@@ -903,7 +1043,6 @@ msgstr "Usage of root partition"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Used"
@@ -912,10 +1051,18 @@ msgstr "Used"
msgid "Users"
msgstr "Users"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "Value"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "View"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "View your 200 most recent alerts."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Visible Fields"
@@ -943,8 +1090,8 @@ msgid "Windows command"
msgstr "Windows command"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Write"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# día} other {# días}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{0} de {1} fila(s) seleccionada(s)."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hora} other {# horas}}"
msgid "1 hour"
msgstr "1 hora"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 min"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 semana"
@@ -39,6 +50,11 @@ msgstr "1 semana"
msgid "12 hours"
msgstr "12 horas"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 min"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 horas"
@@ -47,12 +63,22 @@ msgstr "24 horas"
msgid "30 days"
msgstr "30 días"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Acciones"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "Activo"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Alertas Activas"
@@ -86,6 +112,12 @@ msgstr "Administrador"
msgid "Agent"
msgstr "Agente"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "Historial de Alertas"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Todos los Sistemas"
msgid "Are you sure you want to delete {name}?"
msgstr "¿Está seguro de que desea eliminar {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "¿Estás seguro?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "La copia automática requiere un contexto seguro."
@@ -152,11 +188,22 @@ msgstr "Beszel utiliza <0>Shoutrrr</0> para integrarse con servicios populares d
msgid "Binary"
msgstr "Binario"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "Bits (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "Bytes (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Caché / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancelar"
@@ -164,6 +211,14 @@ msgstr "Cancelar"
msgid "Caution - potential data loss"
msgstr "Precaución - posible pérdida de datos"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "Celsius (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "Cambiar las unidades de visualización de las métricas."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Cambiar las opciones generales de la aplicación."
@@ -202,7 +257,12 @@ msgstr "Configure cómo recibe las notificaciones de alertas."
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "La conexión está caída"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuar"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Uso de CPU"
@@ -266,6 +326,11 @@ msgstr "Uso de CPU"
msgid "Create account"
msgstr "Crear cuenta"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "Creado"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Período de tiempo predeterminado"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Eliminar"
@@ -296,6 +362,10 @@ msgstr "Disco"
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "Unidad de disco"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Documentación"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Abajo"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "Duración"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Ingrese dirección de correo..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Error"
@@ -369,6 +445,10 @@ msgstr "Excede {0}{1} en el último {2, plural, one {# minuto} other {# minutos}
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Los sistemas existentes no definidos en <0>config.yml</0> serán eliminados. Por favor, haga copias de seguridad regularmente."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "Exportar"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Exportar configuración"
@@ -377,6 +457,10 @@ msgstr "Exportar configuración"
msgid "Export your current systems configuration."
msgstr "Exporte la configuración actual de sus sistemas."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "Fahrenheit (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Error al autenticar"
@@ -396,12 +480,13 @@ msgstr "Error al actualizar la alerta"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "Huella dactilar"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "Dirección de correo electrónico no válida."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Idioma"
@@ -471,13 +546,26 @@ msgstr "Diseño"
msgid "Light"
msgstr "Claro"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "Carga Media"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "Carga media 15m"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "Carga media 1m"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "Carga media 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "Carga media"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "Uso de Memoria"
msgid "Memory usage of docker containers"
msgstr "Uso de memoria de los contenedores de Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nombre"
@@ -543,10 +632,19 @@ msgstr "Tráfico de red de los contenedores de Docker"
msgid "Network traffic of public interfaces"
msgstr "Tráfico de red de interfaces públicas"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "Unidad de red"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "No se encontraron resultados."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "Sin resultados."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Sobrescribir alertas existentes"
msgid "Page"
msgstr "Página"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "Página {0} de {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Páginas / Configuraciones"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Clave Pública"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lectura"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Recibido"
@@ -679,6 +782,12 @@ msgstr "Recibido"
msgid "Reset Password"
msgstr "Restablecer Contraseña"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "Resuelto"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Reanudar"
@@ -687,6 +796,10 @@ msgstr "Reanudar"
msgid "Rotate token"
msgstr "Rotar token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "Filas por página"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Guarde la dirección usando la tecla enter o coma. Deje en blanco para desactivar las notificaciones por correo."
@@ -712,8 +825,7 @@ msgstr "Buscar sistemas o configuraciones..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Consulte <0>configuración de notificaciones</0> para configurar cómo recibe alertas."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Enviado"
@@ -744,6 +856,11 @@ msgstr "Configuración SMTP"
msgid "Sort By"
msgstr "Ordenar por"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "Estado"
#: src/lib/utils.ts
msgid "Status"
msgstr "Estado"
@@ -759,11 +876,16 @@ msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "Promedios de carga del sistema a lo largo del tiempo"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemas"
@@ -786,6 +908,10 @@ msgstr "Temperatura"
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "Unidad de temperatura"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturas de los sensores del sistema"
@@ -806,6 +932,10 @@ msgstr "Luego inicie sesión en el backend y restablezca la contraseña de su cu
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Esta acción no se puede deshacer. Esto eliminará permanentemente todos los registros actuales de {name} de la base de datos."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "Esto eliminará permanentemente todos los registros seleccionados de la base de datos."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Rendimiento de {extraFsName}"
@@ -846,13 +976,17 @@ msgstr "Los tokens permiten que los agentes se conecten y registren. Las huellas
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Los tokens y las huellas digitales se utilizan para autenticar las conexiones WebSocket al hub."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "Se activa cuando la carga media de 1 minuto supera un umbral"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "Se activa cuando la carga media de 15 minutos supera un umbral"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "Se activa cuando la carga media de 5 minutos supera un umbral"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "Se activa cuando el estado cambia entre activo e inactivo"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Se activa cuando el uso de cualquier disco supera un umbral"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "Preferencias de unidad"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Token universal"
@@ -898,7 +1037,8 @@ msgstr "Tiempo de actividad"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Uso"
@@ -908,7 +1048,6 @@ msgstr "Uso de la partición raíz"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Usado"
@@ -917,10 +1056,18 @@ msgstr "Usado"
msgid "Users"
msgstr "Usuarios"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "Valor"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Vista"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "Ver sus 200 alertas más recientes."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Columnas visibles"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Comando Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Escritura"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# روز} other {# روز}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{0} از {1} ردیف انتخاب شده است."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
msgid "1 hour"
msgstr "۱ ساعت"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "۱ دقیقه"
#: src/lib/utils.ts
msgid "1 week"
msgstr "۱ هفته"
@@ -39,6 +50,11 @@ msgstr "۱ هفته"
msgid "12 hours"
msgstr "۱۲ ساعت"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "۱۵ دقیقه"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "۲۴ ساعت"
@@ -47,12 +63,22 @@ msgstr "۲۴ ساعت"
msgid "30 days"
msgstr "۳۰ روز"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "۵ دقیقه"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "عملیات"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "فعال"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr " هشدارهای فعال"
@@ -86,6 +112,12 @@ msgstr "مدیر"
msgid "Agent"
msgstr "عامل"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "تاریخچه هشدارها"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "همه سیستم‌ها"
msgid "Are you sure you want to delete {name}?"
msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف کنید؟"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "آیا مطمئن هستید؟"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
@@ -115,7 +151,7 @@ msgstr "میانگین استفاده از CPU کانتینرها"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx
msgid "Average exceeds <0>{value}{0}</0>"
msgstr ""
msgstr "میانگین از <0>{value}{0}</0> فراتر رفته است"
#: src/components/routes/system.tsx
msgid "Average power consumption of GPUs"
@@ -152,11 +188,22 @@ msgstr "بِزل از <0>Shoutrrr</0> برای ادغام با سرویس‌ها
msgid "Binary"
msgstr "دودویی"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "بیت (کیلوبیت بر ثانیه، مگابیت بر ثانیه، گیگابیت بر ثانیه)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "بایت (کیلوبایت بر ثانیه، مگابایت بر ثانیه، گیگابایت بر ثانیه)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "حافظه پنهان / بافرها"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "لغو"
@@ -164,6 +211,14 @@ msgstr "لغو"
msgid "Caution - potential data loss"
msgstr "احتیاط - احتمال از دست رفتن داده‌ها"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "سلسیوس (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "تغییر واحدهای نمایش برای معیارها."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "تغییر گزینه‌های کلی برنامه."
@@ -202,7 +257,12 @@ msgstr "نحوه دریافت هشدارهای اطلاع‌رسانی را پی
msgid "Confirm password"
msgstr "تأیید رمز عبور"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "اتصال قطع است"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "ادامه"
@@ -258,7 +318,7 @@ msgstr "پردازنده"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "میزان استفاده از پردازنده"
@@ -266,6 +326,11 @@ msgstr "میزان استفاده از پردازنده"
msgid "Create account"
msgstr "ایجاد حساب کاربری"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "ایجاد شده"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "بازه زمانی پیش‌فرض"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "حذف"
@@ -296,6 +362,10 @@ msgstr "دیسک"
msgid "Disk I/O"
msgstr "ورودی/خروجی دیسک"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "واحد دیسک"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,15 +394,20 @@ msgstr "مستندات"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
msgstr "قطع"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "مدت زمان"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
msgstr ""
msgstr "ویرایش"
#: src/components/login/forgot-pass-form.tsx
#: src/components/login/auth-form.tsx
@@ -354,6 +429,7 @@ msgstr "آدرس ایمیل را وارد کنید..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "خطا"
@@ -369,6 +445,10 @@ msgstr "در {2, plural, one {# دقیقه} other {# دقیقه}} گذشته ا
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "سیستم‌های موجود که در <0>config.yml</0> تعریف نشده‌اند حذف خواهند شد. لطفاً به طور منظم پشتیبان‌گیری کنید."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "خروجی گرفتن"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "خارج کردن پیکربندی"
@@ -377,6 +457,10 @@ msgstr "خارج کردن پیکربندی"
msgid "Export your current systems configuration."
msgstr "پیکربندی سیستم‌های فعلی خود را خارج کنید."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "فارنهایت (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "احراز هویت ناموفق بود"
@@ -396,12 +480,13 @@ msgstr "به‌روزرسانی هشدار ناموفق بود"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "فیلتر..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "اثر انگشت"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "آدرس ایمیل نامعتبر است."
msgid "Kernel"
msgstr "هسته"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "زبان"
@@ -471,13 +546,26 @@ msgstr "طرح‌بندی"
msgid "Light"
msgstr "روشن"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "میانگین بار"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "میانگین بار ۱۵ دقیقه"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "میانگین بار ۱ دقیقه"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "میانگین بار ۵ دقیقه"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "میانگین بار"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -507,7 +595,7 @@ msgstr "مدیریت تنظیمات نمایش و اعلان‌ها."
#: src/components/add-system.tsx
msgid "Manual setup instructions"
msgstr ""
msgstr "دستورالعمل‌های راه‌اندازی دستی"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx
@@ -527,6 +615,7 @@ msgstr "میزان استفاده از حافظه"
msgid "Memory usage of docker containers"
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "نام"
@@ -543,10 +632,19 @@ msgstr "ترافیک شبکه کانتینرهای داکر"
msgid "Network traffic of public interfaces"
msgstr "ترافیک شبکه رابط‌های عمومی"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "واحد شبکه"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "هیچ نتیجه‌ای یافت نشد."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "نتیجه‌ای یافت نشد."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "بازنویسی هشدارهای موجود"
msgid "Page"
msgstr "صفحه"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "صفحه {0} از {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "صفحات / تنظیمات"
@@ -599,7 +703,7 @@ msgstr "رمز عبور باید حداقل ۸ کاراکتر باشد."
#: src/components/login/auth-form.tsx
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "رمز عبور باید کمتر از ۷۲ بایت باشد."
#: src/components/login/forgot-pass-form.tsx
msgid "Password reset request received"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "کلید عمومی"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "خواندن"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "دریافت شد"
@@ -679,6 +782,12 @@ msgstr "دریافت شد"
msgid "Reset Password"
msgstr "بازنشانی رمز عبور"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "حل شده"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "ادامه"
@@ -687,6 +796,10 @@ msgstr "ادامه"
msgid "Rotate token"
msgstr "چرخش توکن"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "ردیف در هر صفحه"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلان‌های ایمیلی، خالی بگذارید."
@@ -698,7 +811,7 @@ msgstr "ذخیره تنظیمات"
#: src/components/add-system.tsx
msgid "Save system"
msgstr ""
msgstr "ذخیره سیستم"
#: src/components/navbar.tsx
msgid "Search"
@@ -712,8 +825,7 @@ msgstr "جستجو برای سیستم‌ها یا تنظیمات..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "برای پیکربندی نحوه دریافت هشدارها، به <0>تنظیمات اعلان</0> مراجعه کنید."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "ارسال شد"
@@ -744,6 +856,11 @@ msgstr "تنظیمات SMTP"
msgid "Sort By"
msgstr "مرتب‌سازی بر اساس"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "وضعیت"
#: src/lib/utils.ts
msgid "Status"
msgstr "وضعیت"
@@ -759,11 +876,16 @@ msgstr "میزان استفاده از Swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "سیستم"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "میانگین بار سیستم در طول زمان"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "سیستم‌ها"
@@ -779,13 +901,17 @@ msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
msgid "Temp"
msgstr ""
msgstr "دما"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
msgid "Temperature"
msgstr "دما"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "واحد دما"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "دمای حسگرهای سیستم"
@@ -806,6 +932,10 @@ msgstr "سپس وارد بخش پشتیبان شوید و رمز عبور حسا
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "این کار تمام رکوردهای انتخاب شده را برای همیشه از پایگاه داده حذف خواهد کرد."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "توان عملیاتی {extraFsName}"
@@ -846,13 +976,17 @@ msgstr "توکن‌ها به عامل‌ها اجازه اتصال و ثبت‌
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "توکن‌ها و اثرات انگشت برای احراز هویت اتصالات WebSocket به هاب استفاده می‌شوند."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "هنگامی که میانگین بار ۱ دقیقه‌ای از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "هنگامی که میانگین بار ۱۵ دقیقه‌ای از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "هنگامی که میانگین بار ۵ دقیقه‌ای از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "هنگامی که وضعیت بین بالا و پایین تغییر م
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال می‌شود"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "تنظیمات واحدها"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "توکن جهانی"
@@ -886,7 +1025,7 @@ msgstr "توکن جهانی"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
msgstr "فعال"
#: src/components/systems-table/systems-table.tsx
msgid "Updated in real time. Click on a system to view information."
@@ -898,7 +1037,8 @@ msgstr "آپتایم"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "میزان استفاده"
@@ -908,7 +1048,6 @@ msgstr "میزان استفاده از پارتیشن ریشه"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "استفاده شده"
@@ -917,10 +1056,18 @@ msgstr "استفاده شده"
msgid "Users"
msgstr "کاربران"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "مقدار"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "مشاهده"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "۲۰۰ هشدار اخیر خود را مشاهده کنید."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "فیلدهای قابل مشاهده"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "دستور Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "نوشتن"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# jour} other {# jours}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# heure} other {# heures}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# heure} other {# heures}}"
msgid "1 hour"
msgstr "1 heure"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 semaine"
@@ -39,6 +50,11 @@ msgstr "1 semaine"
msgid "12 hours"
msgstr "12 heures"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 heures"
@@ -47,12 +63,22 @@ msgstr "24 heures"
msgid "30 days"
msgstr "30 jours"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Actions"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Alertes actives"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Tous les systèmes"
msgid "Are you sure you want to delete {name}?"
msgstr "Êtes-vous sûr de vouloir supprimer {name} ?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "La copie automatique nécessite un contexte sécurisé."
@@ -152,11 +188,22 @@ msgstr "Beszel utilise <0>Shoutrrr</0> pour s'intégrer aux services de notifica
msgid "Binary"
msgstr "Binaire"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Tampons"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annuler"
@@ -164,6 +211,14 @@ msgstr "Annuler"
msgid "Caution - potential data loss"
msgstr "Attention - perte de données potentielle"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Modifier les options générales de l'application."
@@ -202,7 +257,12 @@ msgstr "Configurez comment vous recevez les notifications d'alerte."
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuer"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Utilisation du CPU"
@@ -266,6 +326,11 @@ msgstr "Utilisation du CPU"
msgid "Create account"
msgstr "Créer un compte"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Période par défaut"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Supprimer"
@@ -296,6 +362,10 @@ msgstr "Disque"
msgid "Disk I/O"
msgstr "Entrée/Sortie disque"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Documentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Injoignable"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Entrez l'adresse email..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Erreur"
@@ -369,6 +445,10 @@ msgstr "Dépasse {0}{1} dans {2, plural, one {la dernière # minute} other {les
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Les systèmes existants non définis dans <0>config.yml</0> seront supprimés. Veuillez faire des sauvegardes régulières."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Exporter la configuration"
@@ -377,6 +457,10 @@ msgstr "Exporter la configuration"
msgid "Export your current systems configuration."
msgstr "Exportez la configuration actuelle de vos systèmes."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Échec de l'authentification"
@@ -396,6 +480,7 @@ msgstr "Échec de la mise à jour de l'alerte"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtrer..."
@@ -448,16 +533,6 @@ msgstr "Adresse email invalide."
msgid "Kernel"
msgstr "Noyau"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Langue"
@@ -471,14 +546,27 @@ msgstr "Disposition"
msgid "Light"
msgstr "Clair"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Déconnexion"
@@ -527,6 +615,7 @@ msgstr "Utilisation de la mémoire"
msgid "Memory usage of docker containers"
msgstr "Utilisation de la mémoire des conteneurs Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nom"
@@ -543,10 +632,19 @@ msgstr "Trafic réseau des conteneurs Docker"
msgid "Network traffic of public interfaces"
msgstr "Trafic réseau des interfaces publiques"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Aucun résultat trouvé."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Écraser les alertes existantes"
msgid "Page"
msgstr "Page"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Pages / Paramètres"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Clé publique"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lecture"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Reçu"
@@ -679,6 +782,12 @@ msgstr "Reçu"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Reprendre"
@@ -687,6 +796,10 @@ msgstr "Reprendre"
msgid "Rotate token"
msgstr "Faire tourner le token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enregistrez l'adresse en utilisant la touche Entrée ou la virgule. Laissez vide pour désactiver les notifications par email."
@@ -712,8 +825,7 @@ msgstr "Rechercher des systèmes ou des paramètres..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Voir les <0>paramètres de notification</0> pour configurer comment vous recevez les alertes."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Envoyé"
@@ -744,6 +856,11 @@ msgstr "Paramètres SMTP"
msgid "Sort By"
msgstr "Trier par"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Statut"
@@ -759,11 +876,16 @@ msgstr "Utilisation du swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Système"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systèmes"
@@ -786,6 +908,10 @@ msgstr "Temp."
msgid "Temperature"
msgstr "Température"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Températures des capteurs du système"
@@ -806,6 +932,10 @@ msgstr "Ensuite, connectez-vous au backend et réinitialisez le mot de passe de
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Cette action ne peut pas être annulée. Cela supprimera définitivement tous les enregistrements actuels pour {name} de la base de données."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Débit de {extraFsName}"
@@ -846,6 +976,10 @@ msgstr "Les tokens permettent aux agents de se connecter et de s'enregistrer. Le
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Les tokens et les empreintes sont utilisés pour authentifier les connexions WebSocket vers le hub."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Se déclenche lorsque le statut passe de \"Joignable\" à \"Injoignable\
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Déclenchement lorsque l'utilisation de tout disque dépasse un seuil"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Token universel"
@@ -898,7 +1037,8 @@ msgstr "Temps de fonctionnement"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Utilisation"
@@ -908,7 +1048,6 @@ msgstr "Utilisation de la partition racine"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Utilisé"
@@ -917,10 +1056,18 @@ msgstr "Utilisé"
msgid "Users"
msgstr "Utilisateurs"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Vue"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Colonnes visibles"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Commande Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Écriture"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} other {# dani}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# sat} other {# sati}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# sat} other {# sati}}"
msgid "1 hour"
msgstr "1 sat"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 tjedan"
@@ -39,6 +50,11 @@ msgstr "1 tjedan"
msgid "12 hours"
msgstr "12 sati"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 sati"
@@ -47,12 +63,22 @@ msgstr "24 sati"
msgid "30 days"
msgstr "30 dana"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akcije"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktivna upozorenja"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Svi Sistemi"
msgid "Are you sure you want to delete {name}?"
msgstr "Jeste li sigurni da želite izbrisati {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
@@ -152,11 +188,22 @@ msgstr "Beszel koristi <0>Shoutrrr</0> za integraciju sa popularnim servisima za
msgid "Binary"
msgstr "Binarni"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Predmemorija / Međuspremnici"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Otkaži"
@@ -164,6 +211,14 @@ msgstr "Otkaži"
msgid "Caution - potential data loss"
msgstr "Oprez - mogući gubitak podataka"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Promijenite opće opcije aplikacije."
@@ -202,7 +257,12 @@ msgstr "Konfigurirajte način primanja obavijesti upozorenja."
msgid "Confirm password"
msgstr "Potvrdite lozinku"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Nastavite"
@@ -258,7 +318,7 @@ msgstr "Procesor"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Iskorištenost procesora"
@@ -266,6 +326,11 @@ msgstr "Iskorištenost procesora"
msgid "Create account"
msgstr "Napravite račun"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Zadano vremensko razdoblje"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Izbriši"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Unesite email adresu..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Greška"
@@ -369,6 +445,10 @@ msgstr "Premašuje {0}{1} u posljednjih {2, plural, one {# minuta} other {# minu
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Postojeći sistemi koji nisu definirani u <0>config.yml</0> će biti izbrisani. Molimo Vas napravite redovite sigurnosne kopije."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Izvoz konfiguracije"
@@ -377,6 +457,10 @@ msgstr "Izvoz konfiguracije"
msgid "Export your current systems configuration."
msgstr "Izvoz trenutne sistemske konfiguracije."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Provjera autentičnosti nije uspjela"
@@ -396,6 +480,7 @@ msgstr "Ažuriranje upozorenja nije uspjelo"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Nevažeća adresa e-pošte."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Jezik"
@@ -471,14 +546,27 @@ msgstr "Izgled"
msgid "Light"
msgstr "Svijetlo"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Odjava"
@@ -527,6 +615,7 @@ msgstr "Upotreba memorije"
msgid "Memory usage of docker containers"
msgstr "Upotreba memorije Docker spremnika"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Ime"
@@ -543,10 +632,19 @@ msgstr "Mrežni promet Docker spremnika"
msgid "Network traffic of public interfaces"
msgstr "Mrežni promet javnih sučelja"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Nema rezultata."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Prebrišite postojeća upozorenja"
msgid "Page"
msgstr "Stranica"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Stranice / Postavke"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Javni Ključ"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Pročitaj"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Primljeno"
@@ -679,6 +782,12 @@ msgstr "Primljeno"
msgid "Reset Password"
msgstr "Resetiraj Lozinku"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Nastavi"
@@ -687,6 +796,10 @@ msgstr "Nastavi"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Spremite adresu pomoću tipke enter ili zareza. Ostavite prazno kako biste onemogućili obavijesti e-poštom."
@@ -712,8 +825,7 @@ msgstr "Pretraži za sisteme ili postavke..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Pogledajte <0>postavke obavijesti</0> da biste konfigurirali način primanja upozorenja."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Poslano"
@@ -744,6 +856,11 @@ msgstr "SMTP postavke"
msgid "Sort By"
msgstr "Sortiraj po"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap Iskorištenost"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistem"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemi"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzora"
@@ -806,6 +932,10 @@ msgstr "Zatim se prijavite u backend i resetirajte lozinku korisničkog računa
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Ova radnja se ne može poništiti. Ovo će trajno izbrisati sve trenutne zapise za {name} iz baze podataka."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Protok {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Pokreće se kada se status sistema promijeni"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Pokreće se kada iskorištenost bilo kojeg diska premaši prag"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Vrijeme rada"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Iskorištenost"
@@ -908,7 +1048,6 @@ msgstr "Iskorištenost root datotečnog sustava"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Iskorišteno"
@@ -917,10 +1056,18 @@ msgstr "Iskorišteno"
msgid "Users"
msgstr "Korisnici"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Prikaz"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Vidljiva polja"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows naredba"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Piši"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# nap} other {# nap}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# óra} other {# óra}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# óra} other {# óra}}"
msgid "1 hour"
msgstr "1 óra"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 hét"
@@ -39,6 +50,11 @@ msgstr "1 hét"
msgid "12 hours"
msgstr "12 óra"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 óra"
@@ -47,12 +63,22 @@ msgstr "24 óra"
msgid "30 days"
msgstr "30 nap"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Műveletek"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktív riasztások"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Ügynök"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Minden rendszer"
msgid "Are you sure you want to delete {name}?"
msgstr "Biztosan törölni szeretnéd {name}-t?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Az automatikus másolás biztonságos környezetet igényel."
@@ -152,11 +188,22 @@ msgstr "A Beszel a <0>Shoutrrr</0>-t használja a népszerű értesítési szolg
msgid "Binary"
msgstr "Bináris"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Gyorsítótár / Pufferelések"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Mégsem"
@@ -164,6 +211,14 @@ msgstr "Mégsem"
msgid "Caution - potential data loss"
msgstr "Figyelem - potenciális adatvesztés"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Általános alkalmazásbeállítások módosítása."
@@ -202,7 +257,12 @@ msgstr "Konfiguráld, hogyan kapod az értesítéseket."
msgid "Confirm password"
msgstr "Jelszó megerősítése"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Tovább"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU használat"
@@ -266,6 +326,11 @@ msgstr "CPU használat"
msgid "Create account"
msgstr "Fiók létrehozása"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Alapértelmezett időszak"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Törlés"
@@ -296,6 +362,10 @@ msgstr "Lemez"
msgid "Disk I/O"
msgstr "Lemez I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentáció"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Adja meg az e-mail címet..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Hiba"
@@ -369,6 +445,10 @@ msgstr "Túllépi a {0}{1} értéket az elmúlt {2, plural, one {# percben} othe
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "A <0>config.yml</0> fájlban nem definiált meglévő rendszerek törlésre kerülnek. Kérjük, készítsen rendszeres biztonsági mentéseket."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Konfiguráció exportálása"
@@ -377,6 +457,10 @@ msgstr "Konfiguráció exportálása"
msgid "Export your current systems configuration."
msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Hitelesítés sikertelen"
@@ -396,6 +480,7 @@ msgstr "Nem sikerült frissíteni a riasztást"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Szűrő..."
@@ -448,16 +533,6 @@ msgstr "Érvénytelen e-mail cím."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Nyelv"
@@ -471,14 +546,27 @@ msgstr "Elrendezés"
msgid "Light"
msgstr "Világos"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Kijelentkezés"
@@ -527,6 +615,7 @@ msgstr "Memóriahasználat"
msgid "Memory usage of docker containers"
msgstr "Docker konténerek memória használata"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Név"
@@ -543,10 +632,19 @@ msgstr "Docker konténerek hálózati forgalma"
msgid "Network traffic of public interfaces"
msgstr "Nyilvános interfészek hálózati forgalma"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Nincs találat."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Felülírja a meglévő riasztásokat"
msgid "Page"
msgstr "Oldal"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Oldalak / Beállítások"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Nyilvános kulcs"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Olvasás"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Fogadott"
@@ -679,6 +782,12 @@ msgstr "Fogadott"
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Folytatás"
@@ -687,6 +796,10 @@ msgstr "Folytatás"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Mentse el a címet az Enter billentyű vagy a vessző használatával. Hagyja üresen az e-mail értesítések letiltásához."
@@ -712,8 +825,7 @@ msgstr "Keresés rendszerek vagy beállítások után..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Lásd <0>az értesítési beállításokat</0>, hogy konfigurálja, hogyan kap értesítéseket."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Elküldve"
@@ -744,6 +856,11 @@ msgstr "SMTP beállítások"
msgid "Sort By"
msgstr "Rendezés"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Állapot"
@@ -759,11 +876,16 @@ msgstr "Swap használat"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Rendszer"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Rendszer"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Hőmérséklet"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "A rendszer érzékelőinek hőmérséklete"
@@ -806,6 +932,10 @@ msgstr "Ezután jelentkezzen be a backendbe, és állítsa vissza a felhasznál
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Ezt a műveletet nem lehet visszavonni! Véglegesen törli a {name} összes jelenlegi rekordját az adatbázisból!"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "A {extraFsName} átviteli teljesítménye"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Bekapcsol, amikor az állapot fel és le között változik"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Bekapcsol, ha a lemez érzékelő túllép egy küszöbértéket"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Üzemidő"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Használat"
@@ -908,7 +1048,6 @@ msgstr "Root partíció kihasználtsága"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Felhasznált"
@@ -917,10 +1056,18 @@ msgstr "Felhasznált"
msgid "Users"
msgstr "Felhasználók"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Nézet"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Látható mezők"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows parancs"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Írás"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dagur} other {# dagar}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
msgid "1 hour"
msgstr "1 klukkustund"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 vika"
@@ -39,6 +50,11 @@ msgstr "1 vika"
msgid "12 hours"
msgstr "12 klukkustundir"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 klukkustundir"
@@ -47,12 +63,22 @@ msgstr "24 klukkustundir"
msgid "30 days"
msgstr "30 dagar"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Aðgerðir"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Virkar tilkynningar"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr ""
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Öll kerfi"
msgid "Are you sure you want to delete {name}?"
msgstr "Ertu viss um að þú viljir eyða {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Sjálfvisk afritun krefst öruggs samhengis."
@@ -152,11 +188,22 @@ msgstr "Beszel notar <0>Shoutrrr</0> til að tengjast vinsælum tilkynningaþjó
msgid "Binary"
msgstr "Binary"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Skyndiminni / Biðminni"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Hætta við"
@@ -164,6 +211,14 @@ msgstr "Hætta við"
msgid "Caution - potential data loss"
msgstr "Aðvörun - möguleiki á gagnatapi"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Breyta almennum stillingum."
@@ -202,7 +257,12 @@ msgstr "Stilltu hvernig þú vilt fá tilkynningar."
msgid "Confirm password"
msgstr "Staðfestu lykilorð"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Halda áfram"
@@ -258,7 +318,7 @@ msgstr "Örgjörvi"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Örgjörva notkun"
@@ -266,6 +326,11 @@ msgstr "Örgjörva notkun"
msgid "Create account"
msgstr "Búa til aðgang"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Sjálfgefið tímabil"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Eyða"
@@ -296,6 +362,10 @@ msgstr "Diskur"
msgid "Disk I/O"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Skjal"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Settu inn Netfang..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Villa"
@@ -369,6 +445,10 @@ msgstr "Fór yfir {0}{1} á síðustu {2, plural, one {# mínútu} other {# mín
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr ""
@@ -377,6 +457,10 @@ msgstr ""
msgid "Export your current systems configuration."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Villa í auðkenningu"
@@ -396,6 +480,7 @@ msgstr "Mistókst að uppfæra tilkynningu"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Sía..."
@@ -448,16 +533,6 @@ msgstr "Ógilt netfang."
msgid "Kernel"
msgstr ""
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Tungumál"
@@ -471,14 +546,27 @@ msgstr ""
msgid "Light"
msgstr "Ljóst"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Útskrá"
@@ -527,6 +615,7 @@ msgstr "Minnisnotkun"
msgid "Memory usage of docker containers"
msgstr "Minnisnotkun docker kerfa"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nafn"
@@ -543,10 +632,19 @@ msgstr "Net traffík docker kerfa"
msgid "Network traffic of public interfaces"
msgstr ""
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Engar niðurstöður fundust."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Yfirskrifa núverandi tilkynningu"
msgid "Page"
msgstr "Síða"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Síða / Stillingar"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Dreifilykill"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lesa"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Móttekið"
@@ -679,6 +782,12 @@ msgstr "Móttekið"
msgid "Reset Password"
msgstr "Endurstilla lykilorð"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Halda áfram"
@@ -687,6 +796,10 @@ msgstr "Halda áfram"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr ""
@@ -712,8 +825,7 @@ msgstr "Leita að kerfum eða stillingum..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr ""
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Sent"
@@ -744,6 +856,11 @@ msgstr "SMTP stillingar"
msgid "Sort By"
msgstr "Raða eftir"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Staða"
@@ -759,11 +876,16 @@ msgstr "Skipti minni"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Kerfi"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Kerfi"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Hitastig"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Hitastig kerfa skynjara"
@@ -806,6 +932,10 @@ msgstr "Skráðu þig þá inní bakendann og endurstilltu lykilorðið þitt in
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Þessi aðgerð er óafturkvæmanleg. Þetta mun eyða gögnum fyrir {name} varanlega úr gagnagrunninum."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr ""
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Virkjast þegar staða breytist milli virkur og óvirkur"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr ""
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr ""
@@ -908,7 +1048,6 @@ msgstr ""
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Notað"
@@ -917,10 +1056,18 @@ msgstr "Notað"
msgid "Users"
msgstr "Notendur"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Skoða"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Sjáanlegir reitir"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows skipun"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Skrifa"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# giorno} other {# giorni}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ora} other {# ore}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ora} other {# ore}}"
msgid "1 hour"
msgstr "1 ora"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 settimana"
@@ -39,6 +50,11 @@ msgstr "1 settimana"
msgid "12 hours"
msgstr "12 ore"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 ore"
@@ -47,12 +63,22 @@ msgstr "24 ore"
msgid "30 days"
msgstr "30 giorni"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Azioni"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Avvisi Attivi"
@@ -86,6 +112,12 @@ msgstr "Amministratore"
msgid "Agent"
msgstr "Agente"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Tutti i Sistemi"
msgid "Are you sure you want to delete {name}?"
msgstr "Sei sicuro di voler eliminare {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "La copia automatica richiede un contesto sicuro."
@@ -152,11 +188,22 @@ msgstr "Beszel utilizza <0>Shoutrrr</0> per integrarsi con i servizi di notifica
msgid "Binary"
msgstr "Binario"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffer"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annulla"
@@ -164,6 +211,14 @@ msgstr "Annulla"
msgid "Caution - potential data loss"
msgstr "Attenzione - possibile perdita di dati"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Modifica le opzioni generali dell'applicazione."
@@ -202,7 +257,12 @@ msgstr "Configura come ricevere le notifiche di avviso."
msgid "Confirm password"
msgstr "Conferma password"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continua"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Utilizzo CPU"
@@ -266,6 +326,11 @@ msgstr "Utilizzo CPU"
msgid "Create account"
msgstr "Crea account"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Periodo di tempo predefinito"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Elimina"
@@ -296,6 +362,10 @@ msgstr "Disco"
msgid "Disk I/O"
msgstr "I/O Disco"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Documentazione"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Inserisci l'indirizzo email..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Errore"
@@ -369,6 +445,10 @@ msgstr "Supera {0}{1} negli ultimi {2, plural, one {# minuto} other {# minuti}}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "I sistemi esistenti non definiti in <0>config.yml</0> verranno eliminati. Si prega di effettuare backup regolari."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Esporta configurazione"
@@ -377,6 +457,10 @@ msgstr "Esporta configurazione"
msgid "Export your current systems configuration."
msgstr "Esporta la configurazione attuale dei tuoi sistemi."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Autenticazione fallita"
@@ -396,6 +480,7 @@ msgstr "Aggiornamento dell'avviso fallito"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtra..."
@@ -448,16 +533,6 @@ msgstr "Indirizzo email non valido."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Lingua"
@@ -471,14 +546,27 @@ msgstr "Aspetto"
msgid "Light"
msgstr "Chiaro"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Disconnetti"
@@ -527,6 +615,7 @@ msgstr "Utilizzo Memoria"
msgid "Memory usage of docker containers"
msgstr "Utilizzo della memoria dei container Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nome"
@@ -543,10 +632,19 @@ msgstr "Traffico di rete dei container Docker"
msgid "Network traffic of public interfaces"
msgstr "Traffico di rete delle interfacce pubbliche"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Nessun risultato trovato."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Sovrascrivi avvisi esistenti"
msgid "Page"
msgstr "Pagina"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Pagine / Impostazioni"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Chiave Pub"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lettura"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Ricevuto"
@@ -679,6 +782,12 @@ msgstr "Ricevuto"
msgid "Reset Password"
msgstr "Reimposta Password"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Riprendi"
@@ -687,6 +796,10 @@ msgstr "Riprendi"
msgid "Rotate token"
msgstr "Ruota token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Salva l'indirizzo usando il tasto invio o la virgola. Lascia vuoto per disabilitare le notifiche email."
@@ -712,8 +825,7 @@ msgstr "Cerca sistemi o impostazioni..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Vedi <0>impostazioni di notifica</0> per configurare come ricevere gli avvisi."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Inviato"
@@ -744,6 +856,11 @@ msgstr "Impostazioni SMTP"
msgid "Sort By"
msgstr "Ordina per"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Stato"
@@ -759,11 +876,16 @@ msgstr "Utilizzo Swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemi"
@@ -786,6 +908,10 @@ msgstr "Temperatura"
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperature dei sensori di sistema"
@@ -806,6 +932,10 @@ msgstr "Quindi accedi al backend e reimposta la password del tuo account utente
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Questa azione non può essere annullata. Questo eliminerà permanentemente tutti i record attuali per {name} dal database."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Throughput di {extraFsName}"
@@ -846,6 +976,10 @@ msgstr "I token consentono agli agenti di connettersi e registrarsi. Le impronte
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "I token e le impronte digitali vengono utilizzati per autenticare le connessioni WebSocket all'hub."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Attiva quando lo stato passa tra up e down"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Attiva quando l'utilizzo di un disco supera una soglia"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Token universale"
@@ -898,7 +1037,8 @@ msgstr "Tempo di attività"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Utilizzo"
@@ -908,7 +1048,6 @@ msgstr "Utilizzo della partizione root"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Utilizzato"
@@ -917,10 +1056,18 @@ msgstr "Utilizzato"
msgid "Users"
msgstr "Utenti"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Vista"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Colonne visibili"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Comando Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Scrittura"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 日} other {# 日}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{1}行のうち{0}行が選択されました。"
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 時間} other {# 時間}}"
msgid "1 hour"
msgstr "1時間"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1分"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1週間"
@@ -39,6 +50,11 @@ msgstr "1週間"
msgid "12 hours"
msgstr "12時間"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15分"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24時間"
@@ -47,12 +63,22 @@ msgstr "24時間"
msgid "30 days"
msgstr "30日間"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5分"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "アクション"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "アクティブ"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "アクティブなアラート"
@@ -86,6 +112,12 @@ msgstr "管理者"
msgid "Agent"
msgstr "エージェント"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "アラート履歴"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "すべてのシステム"
msgid "Are you sure you want to delete {name}?"
msgstr "{name}を削除してもよろしいですか?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "よろしいですか?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "自動コピーには安全なコンテキストが必要です。"
@@ -152,11 +188,22 @@ msgstr "Beszelは<0>Shoutrrr</0>を使用して、人気のある通知サービ
msgid "Binary"
msgstr "バイナリ"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "ビット (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "バイト (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "キャッシュ / バッファ"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "キャンセル"
@@ -164,6 +211,14 @@ msgstr "キャンセル"
msgid "Caution - potential data loss"
msgstr "注意 - データ損失の可能性"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "セルシウス (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "メトリックの表示単位を変更します。"
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "一般的なアプリケーションオプションを変更します。"
@@ -202,7 +257,12 @@ msgstr "アラート通知の受信方法を設定します。"
msgid "Confirm password"
msgstr "パスワードを確認"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "接続が切断されました"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "続行"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU使用率"
@@ -266,6 +326,11 @@ msgstr "CPU使用率"
msgid "Create account"
msgstr "アカウントを作成"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "作成日"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "デフォルトの期間"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "削除"
@@ -296,6 +362,10 @@ msgstr "ディスク"
msgid "Disk I/O"
msgstr "ディスクI/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "ディスク単位"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "ドキュメント"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "停止"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "期間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "メールアドレスを入力..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "エラー"
@@ -369,6 +445,10 @@ msgstr "過去{2, plural, one {# 分} other {# 分}}で{0}{1}を超えていま
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0>に定義されていない既存のシステムは削除されます。定期的にバックアップを作成してください。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "エクスポート"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "設定をエクスポート"
@@ -377,6 +457,10 @@ msgstr "設定をエクスポート"
msgid "Export your current systems configuration."
msgstr "現在のシステム設定をエクスポートします。"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "認証に失敗しました"
@@ -396,12 +480,13 @@ msgstr "アラートの更新に失敗しました"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "フィルター..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "フィンガープリント"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "無効なメールアドレスです。"
msgid "Kernel"
msgstr "カーネル"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "言語"
@@ -471,13 +546,26 @@ msgstr "レイアウト"
msgid "Light"
msgstr "ライト"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "ロードアベレージ"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "ロードアベレージ (15分)"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "ロードアベレージ (1分)"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "ロードアベレージ (5分)"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "ロードアベレージ"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "メモリ使用率"
msgid "Memory usage of docker containers"
msgstr "Dockerコンテナのメモリ使用率"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "名前"
@@ -543,10 +632,19 @@ msgstr "Dockerコンテナのネットワークトラフィック"
msgid "Network traffic of public interfaces"
msgstr "パブリックインターフェースのネットワークトラフィック"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "ネットワーク単位"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "結果が見つかりませんでした。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "結果がありません。"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "既存のアラートを上書き"
msgid "Page"
msgstr "ページ"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "{1}ページ中{0}ページ目"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "ページ / 設定"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "公開鍵"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "読み取り"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "受信"
@@ -679,6 +782,12 @@ msgstr "受信"
msgid "Reset Password"
msgstr "パスワードをリセット"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "解決済み"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "再開"
@@ -687,6 +796,10 @@ msgstr "再開"
msgid "Rotate token"
msgstr "トークンをローテート"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "ページあたりの行数"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。"
@@ -712,8 +825,7 @@ msgstr "システムまたは設定を検索..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "アラートの受信方法を設定するには<0>通知設定</0>を参照してください。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "送信"
@@ -744,6 +856,11 @@ msgstr "SMTP設定"
msgid "Sort By"
msgstr "並び替え基準"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "状態"
#: src/lib/utils.ts
msgid "Status"
msgstr "ステータス"
@@ -759,11 +876,16 @@ msgstr "スワップ使用量"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "システム"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "システムのロードアベレージの推移"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "システム"
@@ -786,6 +908,10 @@ msgstr "温度"
msgid "Temperature"
msgstr "温度"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "温度単位"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "システムセンサーの温度"
@@ -806,6 +932,10 @@ msgstr "その後、バックエンドにログインして、ユーザーテー
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "これにより、選択したすべてのレコードがデータベースから完全に削除されます。"
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}のスループット"
@@ -846,13 +976,17 @@ msgstr "トークンはエージェントの接続と登録を可能にします
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "トークンとフィンガープリントは、ハブへのWebSocket接続の認証に使用されます。"
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "1分間のロードアベレージがしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "15分間のロードアベレージがしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "5分間のロードアベレージがしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "ステータスが上から下に切り替わるときにトリガーさ
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "単位の設定"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "ユニバーサルトークン"
@@ -898,7 +1037,8 @@ msgstr "稼働時間"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "使用量"
@@ -908,7 +1048,6 @@ msgstr "ルートパーティションの使用量"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "使用中"
@@ -917,10 +1056,18 @@ msgstr "使用中"
msgid "Users"
msgstr "ユーザー"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "値"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "表示"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "直近200件のアラートを表示します。"
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "表示列"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows コマンド"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "書き込み"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 일} other {# 일}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{1}개의 행 중 {0}개가 선택되었습니다."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 시간} other {# 시간}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 시간} other {# 시간}}"
msgid "1 hour"
msgstr "1시간"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1분"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1주"
@@ -39,6 +50,11 @@ msgstr "1주"
msgid "12 hours"
msgstr "12시간"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15분"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24시간"
@@ -47,12 +63,22 @@ msgstr "24시간"
msgid "30 days"
msgstr "30일"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5분"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "작업"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "활성"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "활성화된 알림들"
@@ -86,6 +112,12 @@ msgstr "관리자"
msgid "Agent"
msgstr "에이전트"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "알림 기록"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "모든 시스템"
msgid "Are you sure you want to delete {name}?"
msgstr "{name}을(를) 삭제하시겠습니까?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "확실합니까?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "자동 복사는 안전한 컨텍스트가 필요합니다."
@@ -152,11 +188,22 @@ msgstr "Beszel은 여러 인기 있는 알림 서비스와 연동하기 위해 <
msgid "Binary"
msgstr "실행 파일"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "비트 (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "바이트 (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "캐시 / 버퍼"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "취소"
@@ -164,6 +211,14 @@ msgstr "취소"
msgid "Caution - potential data loss"
msgstr "주의 - 데이터 손실 가능성"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "섭씨 (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "메트릭의 표시 단위를 변경합니다."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "일반 애플리케이션 옵션 변경."
@@ -202,7 +257,12 @@ msgstr "알림을 수신할 방법을 설정하세요."
msgid "Confirm password"
msgstr "비밀번호 확인"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "연결이 끊겼습니다"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "계속"
@@ -225,7 +285,7 @@ msgstr "docker run 복사"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
msgstr "환경 복사"
#: src/components/systems-table/systems-table.tsx
msgid "Copy host"
@@ -242,15 +302,15 @@ msgstr "텍스트 복사"
#: src/components/add-system.tsx
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
msgstr ""
msgstr "아래 에이전트의 설치 명령을 복사하거나 <0>범용 토큰</0>으로 에이전트를 자동으로 등록하세요."
#: src/components/add-system.tsx
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
msgstr ""
msgstr "아래 에이전트의 <0>docker-compose.yml</0> 내용을 복사하거나 <1>범용 토큰</1>으로 에이전트를 자동으로 등록하세요."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Copy YAML"
msgstr ""
msgstr "YAML 복사"
#: src/components/systems-table/systems-table.tsx
msgid "CPU"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU 사용량"
@@ -266,6 +326,11 @@ msgstr "CPU 사용량"
msgid "Create account"
msgstr "계정 생성"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "생성됨"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,12 +346,13 @@ msgid "Default time period"
msgstr "기본 기간"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "삭제"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Delete fingerprint"
msgstr ""
msgstr "지문 삭제"
#: src/components/systems-table/systems-table.tsx
msgid "Disk"
@@ -296,6 +362,10 @@ msgstr "디스크"
msgid "Disk I/O"
msgstr "디스크 I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "디스크 단위"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "문서"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "오프라인"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "기간"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "이메일 주소 입력..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "오류"
@@ -369,6 +445,10 @@ msgstr "마지막 {2, plural, one {# 분} other {# 분}} 동안 {0}{1} 초과"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0>에 정의되지 않은 기존 시스템은 삭제됩니다. 정기적으로 백업을 하세요."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "내보내기"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "구성 내보내기"
@@ -377,6 +457,10 @@ msgstr "구성 내보내기"
msgid "Export your current systems configuration."
msgstr "현재 시스템 구성 내보내기"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "화씨 (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "인증 실패"
@@ -396,12 +480,13 @@ msgstr "알림 수정 실패"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "필터..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "지문"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "잘못된 이메일 주소입니다."
msgid "Kernel"
msgstr "커널"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "언어"
@@ -471,13 +546,26 @@ msgstr "레이아웃"
msgid "Light"
msgstr "밝게"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "부하 평균"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "부하 평균 15분"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "부하 평균 1분"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "부하 평균 5분"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "부하 평균"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "메모리 사용량"
msgid "Memory usage of docker containers"
msgstr "Docker 컨테이너의 메모리 사용량"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "이름"
@@ -543,10 +632,19 @@ msgstr "Docker 컨테이너의 네트워크 트래픽"
msgid "Network traffic of public interfaces"
msgstr "공용 인터페이스의 네트워크 트래픽"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "네트워크 단위"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "결과가 없습니다."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "결과 없음."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "기존 알림 덮어쓰기"
msgid "Page"
msgstr "페이지"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "{1}페이지 중 {0}페이지"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "페이지 / 설정"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "공개 키"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "읽기"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "수신됨"
@@ -679,13 +782,23 @@ msgstr "수신됨"
msgid "Reset Password"
msgstr "비밀번호 재설정"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "해결됨"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "재개"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Rotate token"
msgstr ""
msgstr "토큰 회전"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "페이지당 행 수"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
@@ -712,8 +825,7 @@ msgstr "시스템 또는 설정 검색..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "보냄"
@@ -744,6 +856,11 @@ msgstr "SMTP 설정"
msgid "Sort By"
msgstr "정렬 기준"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "상태"
#: src/lib/utils.ts
msgid "Status"
msgstr "상태"
@@ -759,11 +876,16 @@ msgstr "스왑 사용량"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "시스템"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "시간에 따른 시스템 부하 평균"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "시스템"
@@ -786,6 +908,10 @@ msgstr "온도"
msgid "Temperature"
msgstr "온도"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "온도 단위"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "시스템 센서의 온도"
@@ -806,6 +932,10 @@ msgstr "그런 다음 백엔드에 로그인하여 사용자 테이블에서 사
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "선택한 모든 레코드를 데이터베이스에서 영구적으로 삭제합니다."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}의 처리량"
@@ -830,29 +960,33 @@ msgstr "테마 전환"
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Token"
msgstr ""
msgstr "토큰"
#: src/components/command-palette.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/layout.tsx
msgid "Tokens & Fingerprints"
msgstr ""
msgstr "토큰 및 지문"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
msgstr ""
msgstr "토큰은 에이전트가 연결하고 등록할 수 있도록 합니다. 지문은 첫 연결 시 설정되는 각 시스템의 고유한 안정적인 식별자입니다."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
msgstr "토큰과 지문은 허브에 대한 WebSocket 연결을 인증하는 데 사용됩니다."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "1분 부하 평균이 임계값을 초과하면 트리거됩니다."
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "15분 부하 평균이 임계값을 초과하면 트리거됩니다."
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "5분 부하 평균이 임계값을 초과하면 트리거됩니다."
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,9 +1012,14 @@ msgstr "시스템의 전원이 켜지거나 꺼질때 트리거됩니다."
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "디스크 사용량이 임계값을 초과할 때 트리거됩니다."
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "단위 기본 설정"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
msgstr "범용 토큰"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
@@ -898,7 +1037,8 @@ msgstr "가동 시간"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "사용량"
@@ -908,7 +1048,6 @@ msgstr "루트 파티션의 사용량"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "사용됨"
@@ -917,10 +1056,18 @@ msgstr "사용됨"
msgid "Users"
msgstr "사용자"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "값"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "보기"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "최근 200개의 알림을 봅니다."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "표시할 열"
@@ -939,7 +1086,7 @@ msgstr "Webhook / 푸시 알림"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
msgstr ""
msgstr "활성화하면 이 토큰을 통해 에이전트가 사전 시스템 생성 없이 자체 등록할 수 있습니다. 1시간 후 또는 허브 재시작 시 만료됩니다."
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows 명령어"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "쓰기"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dagen}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# uur} other {# uren}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# uur} other {# uren}}"
msgid "1 hour"
msgstr "1 uur"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 week"
@@ -39,6 +50,11 @@ msgstr "1 week"
msgid "12 hours"
msgstr "12 uren"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 uren"
@@ -47,12 +63,22 @@ msgstr "24 uren"
msgid "30 days"
msgstr "30 dagen"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Acties"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Actieve waarschuwingen"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Alle systemen"
msgid "Are you sure you want to delete {name}?"
msgstr "Weet je zeker dat je {name} wilt verwijderen?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatisch kopiëren vereist een veilige context."
@@ -152,11 +188,22 @@ msgstr "Beszel gebruikt <0>Shoutrr</0> om te integreren met populaire meldingsdi
msgid "Binary"
msgstr "Binair"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annuleren"
@@ -164,6 +211,14 @@ msgstr "Annuleren"
msgid "Caution - potential data loss"
msgstr "Opgelet - potentieel gegevensverlies"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Wijzig algemene applicatie opties."
@@ -202,7 +257,12 @@ msgstr "Configureer hoe je waarschuwingsmeldingen ontvangt."
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Volgende"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Processorgebruik"
@@ -266,6 +326,11 @@ msgstr "Processorgebruik"
msgid "Create account"
msgstr "Account aanmaken"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Standaard tijdsduur"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Verwijderen"
@@ -296,6 +362,10 @@ msgstr "Schijf"
msgid "Disk I/O"
msgstr "Schijf I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Documentatie"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Voer een e-mailadres in..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Fout"
@@ -369,6 +445,10 @@ msgstr "Overschrijdt {0}{1} in de laatste {2, plural, one {# minuut} other {# mi
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Bestaande systemen die niet gedefinieerd zijn in <0>config.yml</0> zullen worden verwijderd. Maak regelmatige backups."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Configuratie exporteren"
@@ -377,6 +457,10 @@ msgstr "Configuratie exporteren"
msgid "Export your current systems configuration."
msgstr "Exporteer je huidige systeemconfiguratie."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Authenticatie mislukt"
@@ -396,6 +480,7 @@ msgstr "Bijwerken waarschuwing mislukt"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Ongeldig e-mailadres."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Taal"
@@ -471,14 +546,27 @@ msgstr "Indeling"
msgid "Light"
msgstr "Licht"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Afmelden"
@@ -527,6 +615,7 @@ msgstr "Geheugengebruik"
msgid "Memory usage of docker containers"
msgstr "Geheugengebruik van docker containers"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Naam"
@@ -543,10 +632,19 @@ msgstr "Netwerkverkeer van docker containers"
msgid "Network traffic of public interfaces"
msgstr "Netwerkverkeer van publieke interfaces"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Geen resultaten gevonden."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Overschrijf bestaande waarschuwingen"
msgid "Page"
msgstr "Pagina"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Pagina's / Instellingen"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Publieke sleutel"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lezen"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Ontvangen"
@@ -679,6 +782,12 @@ msgstr "Ontvangen"
msgid "Reset Password"
msgstr "Wachtwoord resetten"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Hervatten"
@@ -687,6 +796,10 @@ msgstr "Hervatten"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Bewaar het adres met de enter-toets of komma. Laat leeg om e-mailmeldingen uit te schakelen."
@@ -712,8 +825,7 @@ msgstr "Zoek naar systemen of instellingen..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Zie <0>notificatie-instellingen</0> om te configureren hoe je meldingen ontvangt."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Verzonden"
@@ -744,6 +856,11 @@ msgstr "SMTP-instellingen"
msgid "Sort By"
msgstr "Sorteren op"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap gebruik"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Systeem"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systemen"
@@ -786,6 +908,10 @@ msgstr "Temperatuur"
msgid "Temperature"
msgstr "Temperatuur"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperatuur van systeem sensoren"
@@ -806,6 +932,10 @@ msgstr "Log vervolgens in op de backend en reset het wachtwoord van je gebruiker
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Deze actie kan niet ongedaan worden gemaakt. Dit zal alle huidige records voor {name} permanent verwijderen uit de database."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Doorvoer van {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Triggert wanneer de status schakelt tussen up en down"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Triggert wanneer het gebruik van een schijf een drempelwaarde overschrijdt"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Actief"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Gebruik"
@@ -908,7 +1048,6 @@ msgstr "Gebruik van root-partitie"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Gebruikt"
@@ -917,10 +1056,18 @@ msgstr "Gebruikt"
msgid "Users"
msgstr "Gebruikers"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Weergave"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Zichtbare kolommen"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows-commando"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Schrijven"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dager}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# time} other {# timer}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# time} other {# timer}}"
msgid "1 hour"
msgstr "1 time"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 uke"
@@ -39,6 +50,11 @@ msgstr "1 uke"
msgid "12 hours"
msgstr "12 timer"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 timer"
@@ -47,12 +63,22 @@ msgstr "24 timer"
msgid "30 days"
msgstr "30 dager"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Handlinger"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktive Alarmer"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Alle Systemer"
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på at du vil slette {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering krever en sikker kontekst."
@@ -152,11 +188,22 @@ msgstr "Beszel bruker <0>Shoutrrr</0> for integrering mot populære meldingstjen
msgid "Binary"
msgstr "Binær"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Avbryt"
@@ -164,6 +211,14 @@ msgstr "Avbryt"
msgid "Caution - potential data loss"
msgstr "Advarsel - potensielt tap av data"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Endre generelle program-innstillinger."
@@ -202,7 +257,12 @@ msgstr "Konfigurer hvordan du vil motta alarmvarsler."
msgid "Confirm password"
msgstr "Bekreft passord"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortsett"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU-bruk"
@@ -266,6 +326,11 @@ msgstr "CPU-bruk"
msgid "Create account"
msgstr "Opprett konto"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Slett"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentasjon"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nede"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Skriv inn e-postadresse..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Feil"
@@ -369,6 +445,10 @@ msgstr "Overstiger {0}{1} {2, plural, one {det siste minuttet} other {de siste #
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Eksisterende systemer som ikke er er definert i <0>config.yml</0> vil bli slettet. Vennligst ta jevnlige sikkerhetskopier."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Eksporter konfigurasjon"
@@ -377,6 +457,10 @@ msgstr "Eksporter konfigurasjon"
msgid "Export your current systems configuration."
msgstr "Eksporter din nåværende systemkonfigurasjon"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Autentisering mislyktes"
@@ -396,6 +480,7 @@ msgstr "Kunne ikke oppdatere alarm"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Ugyldig e-postadresse."
msgid "Kernel"
msgstr "Kjerne"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Språk"
@@ -471,14 +546,27 @@ msgstr "Layout"
msgid "Light"
msgstr "Lyst"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Logg Ut"
@@ -527,6 +615,7 @@ msgstr "Minnebruk"
msgid "Memory usage of docker containers"
msgstr "Minnebruk av docker-konteinere"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Navn"
@@ -543,10 +632,19 @@ msgstr "Nettverkstrafikk av docker-konteinere"
msgid "Network traffic of public interfaces"
msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Ingen resultater funnet."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Overskriv eksisterende alarmer"
msgid "Page"
msgstr "Side"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Sider / Innstillinger"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Offentlig Nøkkel"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Lesing"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Mottatt"
@@ -679,6 +782,12 @@ msgstr "Mottatt"
msgid "Reset Password"
msgstr "Nullstill Passord"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Gjenoppta"
@@ -687,6 +796,10 @@ msgstr "Gjenoppta"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Lagre adressen med Enter-tasten eller komma. La feltet være tomt for å deaktivere e-postvarsler."
@@ -712,8 +825,7 @@ msgstr "Søk etter systemer eller innstillinger..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Se <0>varslingsinnstillingene</0> for å konfigurere hvordan du vil motta varsler."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Sendt"
@@ -744,6 +856,11 @@ msgstr "SMTP-innstillinger"
msgid "Sort By"
msgstr "Sorter Etter"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap-bruk"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systemer"
@@ -786,6 +908,10 @@ msgstr "Temp"
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturer på system-sensorer"
@@ -806,6 +932,10 @@ msgstr "Logg deretter inn i backend og nullstill passordet på din konto i users
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Denne handlingen kan ikke omgjøres. Dette vil slette alle poster for {name} permanent fra databasen."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Gjennomstrømning av {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Slår inn når statusen veksler mellom oppe og nede"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Slår inn når forbruk av hvilken som helst disk overstiger en grenseverdi"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Oppetid"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Forbruk"
@@ -908,7 +1048,6 @@ msgstr "Forbruk av rot-partisjon"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Brukt"
@@ -917,10 +1056,18 @@ msgstr "Brukt"
msgid "Users"
msgstr "Brukere"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Visning"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Synlige Felter"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows-kommando"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Skriving"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {# godziny}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {#
msgid "1 hour"
msgstr "1 godzina"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 tydzień"
@@ -39,6 +50,11 @@ msgstr "1 tydzień"
msgid "12 hours"
msgstr "12 godzin"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 godziny"
@@ -47,12 +63,22 @@ msgstr "24 godziny"
msgid "30 days"
msgstr "30 dni"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akcje"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktywne alerty"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Wszystkie systemy"
msgid "Are you sure you want to delete {name}?"
msgstr "Czy na pewno chcesz usunąć {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
@@ -152,11 +188,22 @@ msgstr "Beszel używa <0>Shoutrrr</0> do integracji z popularnych serwisami powi
msgid "Binary"
msgstr "Plik binarny"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Pamięć podręczna / Bufory"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Anuluj"
@@ -164,6 +211,14 @@ msgstr "Anuluj"
msgid "Caution - potential data loss"
msgstr "Uwaga- potencjalna utrata danych."
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Zmiana ogólnych ustawień aplikacji."
@@ -202,7 +257,12 @@ msgstr "Skonfiguruj sposób otrzymywania powiadomień."
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Kontynuuj"
@@ -258,7 +318,7 @@ msgstr "Procesor"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Użycie procesora"
@@ -266,6 +326,11 @@ msgstr "Użycie procesora"
msgid "Create account"
msgstr "Utwórz konto"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Domyślny przedział czasu"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Usuń"
@@ -296,6 +362,10 @@ msgstr "Dysk"
msgid "Disk I/O"
msgstr "Dysk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentacja"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Wprowadź adres e-mail..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Błąd"
@@ -369,6 +445,10 @@ msgstr "Przekracza {0}{1} w ciągu ostatnich {2, plural, one {# minuty} other {#
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Istniejące systemy, które nie są zdefiniowane w <0>config.yml</0>, zostaną usunięte. Proszę regularnie tworzyć kopie zapasowe."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Eksportuj konfigurację"
@@ -377,6 +457,10 @@ msgstr "Eksportuj konfigurację"
msgid "Export your current systems configuration."
msgstr "Eksportuj aktualną konfigurację systemów."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Błąd autoryzacji"
@@ -396,6 +480,7 @@ msgstr "Nie udało się zaktualizować powiadomienia"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtruj..."
@@ -448,16 +533,6 @@ msgstr "Nieprawidłowy adres e-mail."
msgid "Kernel"
msgstr "Jądro"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Język"
@@ -471,14 +546,27 @@ msgstr "Układ"
msgid "Light"
msgstr "Jasny"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Wyloguj"
@@ -527,6 +615,7 @@ msgstr "Wykorzystanie pamięci"
msgid "Memory usage of docker containers"
msgstr "Użycie pamięci przez kontenery Docker."
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nazwa"
@@ -543,10 +632,19 @@ msgstr "Ruch sieciowy kontenerów Docker."
msgid "Network traffic of public interfaces"
msgstr "Ruch sieciowy interfejsów publicznych"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Brak wyników."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Nadpisz istniejące alerty"
msgid "Page"
msgstr "Strona"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Strony / Ustawienia"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Klucz publiczny"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Czytaj"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Otrzymane"
@@ -679,6 +782,12 @@ msgstr "Otrzymane"
msgid "Reset Password"
msgstr "Resetuj hasło"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Wznów"
@@ -687,6 +796,10 @@ msgstr "Wznów"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Zapisz adres, używając klawisza enter lub przecinka. Pozostaw puste, aby wyłączyć powiadomienia e-mail."
@@ -712,8 +825,7 @@ msgstr "Szukaj systemów lub ustawień..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Zobacz <0>ustawienia powiadomień</0>, aby skonfigurować sposób, w jaki otrzymujesz powiadomienia."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Wysłane"
@@ -744,6 +856,11 @@ msgstr "Ustawienia SMTP"
msgid "Sort By"
msgstr "Sortuj według"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Użycie pamięci wymiany"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Systemy"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperatury czujników systemowych."
@@ -806,6 +932,10 @@ msgstr "Następnie zaloguj się do panelu administracyjnego i zresetuj hasło d
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tej akcji nie można cofnąć. Spowoduje to trwałe usunięcie wszystkich bieżących rekordów dla {name} z bazy danych."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Przepustowość {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Wyzwalane, gdy status przełącza się między stanem aktywnym a nieakty
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Wyzwalane, gdy wykorzystanie któregokolwiek dysku przekroczy ustalony próg"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Czas pracy"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Wykorzystanie"
@@ -908,7 +1048,6 @@ msgstr "Użycie partycji głównej"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Używane"
@@ -917,10 +1056,18 @@ msgstr "Używane"
msgid "Users"
msgstr "Użytkownicy"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Widok"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Widoczne kolumny"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Polecenie Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Napisz"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dia} other {# dias}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# hora} other {# horas}}"
msgid "1 hour"
msgstr "1 hora"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 semana"
@@ -39,6 +50,11 @@ msgstr "1 semana"
msgid "12 hours"
msgstr "12 horas"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 horas"
@@ -47,12 +63,22 @@ msgstr "24 horas"
msgid "30 days"
msgstr "30 dias"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Ações"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Alertas Ativos"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agente"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Todos os Sistemas"
msgid "Are you sure you want to delete {name}?"
msgstr "Tem certeza de que deseja excluir {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "A cópia automática requer um contexto seguro."
@@ -152,11 +188,22 @@ msgstr "Beszel usa <0>Shoutrrr</0> para integrar com serviços de notificação
msgid "Binary"
msgstr "Binário"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancelar"
@@ -164,6 +211,14 @@ msgstr "Cancelar"
msgid "Caution - potential data loss"
msgstr "Cuidado - possível perda de dados"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Alterar opções gerais do aplicativo."
@@ -202,7 +257,12 @@ msgstr "Configure como você recebe notificações de alerta."
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuar"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Uso de CPU"
@@ -266,6 +326,11 @@ msgstr "Uso de CPU"
msgid "Create account"
msgstr "Criar conta"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Período de tempo padrão"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Excluir"
@@ -296,6 +362,10 @@ msgstr "Disco"
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Documentação"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Digite o endereço de email..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Erro"
@@ -369,6 +445,10 @@ msgstr "Excede {0}{1} no último {2, plural, one {# minuto} other {# minutos}}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Sistemas existentes não definidos em <0>config.yml</0> serão excluídos. Faça backups regulares."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Exportar configuração"
@@ -377,6 +457,10 @@ msgstr "Exportar configuração"
msgid "Export your current systems configuration."
msgstr "Exporte a configuração atual dos seus sistemas."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Falha na autenticação"
@@ -396,6 +480,7 @@ msgstr "Falha ao atualizar alerta"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtrar..."
@@ -448,16 +533,6 @@ msgstr "Endereço de email inválido."
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Idioma"
@@ -471,14 +546,27 @@ msgstr "Aspeto"
msgid "Light"
msgstr "Claro"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Sair"
@@ -527,6 +615,7 @@ msgstr "Uso de Memória"
msgid "Memory usage of docker containers"
msgstr "Uso de memória dos contêineres Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Nome"
@@ -543,10 +632,19 @@ msgstr "Tráfego de rede dos contêineres Docker"
msgid "Network traffic of public interfaces"
msgstr "Tráfego de rede das interfaces públicas"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Nenhum resultado encontrado."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Sobrescrever alertas existentes"
msgid "Page"
msgstr "Página"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Páginas / Configurações"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Chave Pública"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Ler"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Recebido"
@@ -679,6 +782,12 @@ msgstr "Recebido"
msgid "Reset Password"
msgstr "Redefinir Senha"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Retomar"
@@ -687,6 +796,10 @@ msgstr "Retomar"
msgid "Rotate token"
msgstr "Rotacionar token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Salve o endereço usando a tecla enter ou vírgula. Deixe em branco para desativar notificações por email."
@@ -712,8 +825,7 @@ msgstr "Pesquisar por sistemas ou configurações..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Veja <0>configurações de notificação</0> para configurar como você recebe alertas."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Enviado"
@@ -744,6 +856,11 @@ msgstr "Configurações SMTP"
msgid "Sort By"
msgstr "Ordenar Por"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemas"
@@ -786,6 +908,10 @@ msgstr "Temp"
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturas dos sensores do sistema"
@@ -806,6 +932,10 @@ msgstr "Em seguida, faça login no backend e redefina a senha da sua conta de us
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Esta ação não pode ser desfeita. Isso excluirá permanentemente todos os registros atuais de {name} do banco de dados."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Taxa de transferência de {extraFsName}"
@@ -846,6 +976,10 @@ msgstr "Os tokens permitem que os agentes se conectem e registrem. As impressõe
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Tokens e impressões digitais são usados para autenticar conexões WebSocket ao hub."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Dispara quando o status alterna entre ativo e inativo"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Dispara quando o uso de qualquer disco excede um limite"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Token universal"
@@ -898,7 +1037,8 @@ msgstr "Tempo de Atividade"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Uso"
@@ -908,7 +1048,6 @@ msgstr "Uso da partição raiz"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Usado"
@@ -917,10 +1056,18 @@ msgstr "Usado"
msgid "Users"
msgstr "Usuários"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Visual"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Campos Visíveis"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Comando Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Escrever"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# день} other {# дней}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часов}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# час} other {# часов}}"
msgid "1 hour"
msgstr "1 час"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 неделя"
@@ -39,6 +50,11 @@ msgstr "1 неделя"
msgid "12 hours"
msgstr "12 часов"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 часа"
@@ -47,12 +63,22 @@ msgstr "24 часа"
msgid "30 days"
msgstr "30 дней"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Действия"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Активные оповещения"
@@ -86,6 +112,12 @@ msgstr "Администратор"
msgid "Agent"
msgstr "Агент"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Все системы"
msgid "Are you sure you want to delete {name}?"
msgstr "Вы уверены, что хотите удалить {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Автоматическое копирование требует безопасного контекста."
@@ -152,11 +188,22 @@ msgstr "Beszel использует <0>Shoutrrr</0> для интеграции
msgid "Binary"
msgstr "Двоичный"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Кэш / Буферы"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Отмена"
@@ -164,6 +211,14 @@ msgstr "Отмена"
msgid "Caution - potential data loss"
msgstr "Внимание - возможная потеря данных"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Изменить общие параметры приложения."
@@ -202,7 +257,12 @@ msgstr "Настройте, как вы получаете уведомлени
msgid "Confirm password"
msgstr "Подтвердите пароль"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продолжить"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Использование CPU"
@@ -266,6 +326,11 @@ msgstr "Использование CPU"
msgid "Create account"
msgstr "Создать аккаунт"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Период по умолчанию"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Удалить"
@@ -296,6 +362,10 @@ msgstr "Диск"
msgid "Disk I/O"
msgstr "Дисковый ввод/вывод"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Не в сети"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Введите адрес электронной почты..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Ошибка"
@@ -369,6 +445,10 @@ msgstr "Превышает {0}{1} за последние {2, plural, one {# м
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Существующие системы, не определенные в <0>config.yml</0>, будут удалены. Пожалуйста, делайте регулярные резервные копии."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Экспорт конфигурации"
@@ -377,6 +457,10 @@ msgstr "Экспорт конфигурации"
msgid "Export your current systems configuration."
msgstr "Экспортируйте текущую конфигурацию систем."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Не удалось аутентифицировать"
@@ -396,6 +480,7 @@ msgstr "Не удалось обновить оповещение"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Фильтр..."
@@ -448,16 +533,6 @@ msgstr "Неверный адрес электронной почты."
msgid "Kernel"
msgstr "Ядро"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Язык"
@@ -471,14 +546,27 @@ msgstr "Макет"
msgid "Light"
msgstr "Светлая"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Выйти"
@@ -527,6 +615,7 @@ msgstr "Использование памяти"
msgid "Memory usage of docker containers"
msgstr "Использование памяти контейнерами Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Имя"
@@ -543,10 +632,19 @@ msgstr "Сетевой трафик контейнеров Docker"
msgid "Network traffic of public interfaces"
msgstr "Сетевой трафик публичных интерфейсов"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Результаты не найдены."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Перезаписать существующие оповещения"
msgid "Page"
msgstr "Страница"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Страницы / Настройки"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Ключ"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Чтение"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Получено"
@@ -679,6 +782,12 @@ msgstr "Получено"
msgid "Reset Password"
msgstr "Сбросить пароль"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Возобновить"
@@ -687,6 +796,10 @@ msgstr "Возобновить"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Сохраните адрес, используя клавишу ввода или запятую. Оставьте пустым, чтобы отключить уведомления по электронной почте."
@@ -712,8 +825,7 @@ msgstr "Поиск систем или настроек..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Смотрите <0>настройки уведомлений</0>, чтобы настроить, как вы получаете оповещения."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Отправлено"
@@ -744,6 +856,11 @@ msgstr "Настройки SMTP"
msgid "Sort By"
msgstr "Сортировать по"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Статус"
@@ -759,11 +876,16 @@ msgstr "Использование подкачки"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системы"
@@ -786,6 +908,10 @@ msgstr "Темп"
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Температуры датчиков системы"
@@ -806,6 +932,10 @@ msgstr "Затем войдите в бэкенд и сбросьте парол
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Это действие не может быть отменено. Это навсегда удалит все текущие записи для {name} из базы данных."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Пропускная способность {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Срабатывает, когда статус переключаетс
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Срабатывает, когда использование любого диска превышает порог"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Время работы"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Использование"
@@ -908,7 +1048,6 @@ msgstr "Использование корневого раздела"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Использовано"
@@ -917,10 +1056,18 @@ msgstr "Использовано"
msgid "Users"
msgstr "Пользователи"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Вид"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Видимые столбцы"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Команда Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Запись"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
msgid "1 hour"
msgstr "1 ura"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 teden"
@@ -39,6 +50,11 @@ msgstr "1 teden"
msgid "12 hours"
msgstr "12 ur"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 ur"
@@ -47,12 +63,22 @@ msgstr "24 ur"
msgid "30 days"
msgstr "30 dni"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Dejanja"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktivna opozorila"
@@ -86,6 +112,12 @@ msgstr "Administrator"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Vsi sistemi"
msgid "Are you sure you want to delete {name}?"
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Za samodejno kopiranje je potreben varen kontekst."
@@ -152,11 +188,22 @@ msgstr "Beszel uporablja <0>Shoutrrr</0> za integracijo s priljubljenimi storitv
msgid "Binary"
msgstr "Binarno"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Predpomnilnik / medpomnilniki"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Prekliči"
@@ -164,6 +211,14 @@ msgstr "Prekliči"
msgid "Caution - potential data loss"
msgstr "Pozor - možna izguba podatkov"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Spremeni splošne možnosti aplikacije."
@@ -202,7 +257,12 @@ msgstr "Nastavi način prejemanja opozorilnih obvestil."
msgid "Confirm password"
msgstr "Potrdite geslo"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Nadaljuj"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU poraba"
@@ -266,6 +326,11 @@ msgstr "CPU poraba"
msgid "Create account"
msgstr "Ustvari račun"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Privzeto časovno obdobje"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Izbriši"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Vnesite e-poštni naslov..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Napaka"
@@ -369,6 +445,10 @@ msgstr "Preseženo {0}{1} v zadnjih {2, plural, one {# minuti} other {# minutah}
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Obstoječi sistemi, ki niso definirani v <0>config.yml</0>, bodo izbrisani. Prosimo, naredite redne varnostne kopije."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Izvozi nastavitve"
@@ -377,6 +457,10 @@ msgstr "Izvozi nastavitve"
msgid "Export your current systems configuration."
msgstr "Izvozi trenutne nastavitve sistema."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Preverjanje pristnosti ni uspelo"
@@ -396,6 +480,7 @@ msgstr "Opozorila ni bilo mogoče posodobiti"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filter..."
@@ -448,16 +533,6 @@ msgstr "Napačen e-poštni naslov."
msgid "Kernel"
msgstr "Jedro"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Jezik"
@@ -471,14 +546,27 @@ msgstr "Postavitev"
msgid "Light"
msgstr "Svetlo"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Odjava"
@@ -527,6 +615,7 @@ msgstr "Poraba pomnilnika"
msgid "Memory usage of docker containers"
msgstr "Poraba pomnilnika docker kontejnerjev"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Naziv"
@@ -543,10 +632,19 @@ msgstr "Omrežni promet docker kontejnerjev"
msgid "Network traffic of public interfaces"
msgstr "Omrežni promet javnih vmesnikov"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Ni rezultatov."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Prepiši obstoječe alarme"
msgid "Page"
msgstr "Stran"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Strani / Nastavitve"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Javni ključ"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Preberano"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Prejeto"
@@ -679,6 +782,12 @@ msgstr "Prejeto"
msgid "Reset Password"
msgstr "Ponastavi geslo"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Nadaljuj"
@@ -687,6 +796,10 @@ msgstr "Nadaljuj"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočite e-poštna obvestila."
@@ -712,8 +825,7 @@ msgstr "Iskanje sistemov ali nastavitev..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Glejte <0>nastavitve obvestil</0>, da nastavite način prejemanja opozoril."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Poslano"
@@ -744,6 +856,11 @@ msgstr "SMTP nastavitve"
msgid "Sort By"
msgstr "Razvrsti po"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap uporaba"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistemsko"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemi"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzorjev"
@@ -806,6 +932,10 @@ msgstr "Nato se prijavite v zaledni sistem in ponastavite geslo svojega uporabni
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tega dejanja ni mogoče razveljaviti. To bo trajno izbrisalo vse trenutne zapise za {name} iz zbirke podatkov."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Prepustnost {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Sproži se, ko se stanje preklaplja med gor in dol"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Sproži se, ko uporaba katerega koli diska preseže prag"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Čas delovanja"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Uporaba"
@@ -908,7 +1048,6 @@ msgstr "Uporaba korenske particije"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Uporabljeno"
@@ -917,10 +1056,18 @@ msgstr "Uporabljeno"
msgid "Users"
msgstr "Uporabniki"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Pogled"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Vidna polja"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Ukaz Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Pisanje"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dagar}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# timme} other {# timmar}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# timme} other {# timmar}}"
msgid "1 hour"
msgstr "1 timme"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 vecka"
@@ -39,6 +50,11 @@ msgstr "1 vecka"
msgid "12 hours"
msgstr "12 timmar"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 timmar"
@@ -47,12 +63,22 @@ msgstr "24 timmar"
msgid "30 days"
msgstr "30 dagar"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Åtgärder"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktiva larm"
@@ -86,6 +112,12 @@ msgstr "Admin"
msgid "Agent"
msgstr "Agent"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Alla system"
msgid "Are you sure you want to delete {name}?"
msgstr "Är du säker på att du vill ta bort {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kräver en säker kontext."
@@ -152,11 +188,22 @@ msgstr "Beszel använder <0>Shoutrrr</0> för att integrera med populära aviser
msgid "Binary"
msgstr "Binär"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / Buffertar"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Avbryt"
@@ -164,6 +211,14 @@ msgstr "Avbryt"
msgid "Caution - potential data loss"
msgstr "Varning - potentiell dataförlust"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Ändra allmänna programalternativ."
@@ -202,7 +257,12 @@ msgstr "Konfigurera hur du tar emot larmaviseringar."
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortsätt"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU-användning"
@@ -266,6 +326,11 @@ msgstr "CPU-användning"
msgid "Create account"
msgstr "Skapa konto"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Standardtidsperiod"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Ta bort"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Ange e-postadress..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Fel"
@@ -369,6 +445,10 @@ msgstr "Överskrider {0}{1} under de senaste {2, plural, one {# minuten} other {
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Befintliga system som inte definieras i <0>config.yml</0> kommer att tas bort. Gör regelbundna säkerhetskopior."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Exportera konfiguration"
@@ -377,6 +457,10 @@ msgstr "Exportera konfiguration"
msgid "Export your current systems configuration."
msgstr "Exportera din nuvarande systemkonfiguration."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Autentisering misslyckades"
@@ -396,6 +480,7 @@ msgstr "Kunde inte uppdatera larm"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtrera..."
@@ -448,16 +533,6 @@ msgstr "Ogiltig e-postadress."
msgid "Kernel"
msgstr "Kärna"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Språk"
@@ -471,14 +546,27 @@ msgstr "Layout"
msgid "Light"
msgstr "Ljust"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr ""
#: src/components/navbar.tsx
msgid "Log Out"
msgstr "Logga ut"
@@ -527,6 +615,7 @@ msgstr "Minnesanvändning"
msgid "Memory usage of docker containers"
msgstr "Minnesanvändning för dockercontainrar"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Namn"
@@ -543,10 +632,19 @@ msgstr "Nätverkstrafik för dockercontainrar"
msgid "Network traffic of public interfaces"
msgstr "Nätverkstrafik för publika gränssnitt"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Inga resultat hittades."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Skriv över befintliga larm"
msgid "Page"
msgstr "Sida"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Sidor / Inställningar"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Offentlig nyckel"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Läs"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Mottaget"
@@ -679,6 +782,12 @@ msgstr "Mottaget"
msgid "Reset Password"
msgstr "Återställ lösenord"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Återuppta"
@@ -687,6 +796,10 @@ msgstr "Återuppta"
msgid "Rotate token"
msgstr ""
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Spara adressen med Enter-tangenten eller komma. Lämna tomt för att inaktivera e-postaviseringar."
@@ -712,8 +825,7 @@ msgstr "Sök efter system eller inställningar..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Se <0>aviseringsinställningar</0> för att konfigurera hur du tar emot larm."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Skickat"
@@ -744,6 +856,11 @@ msgstr "SMTP-inställningar"
msgid "Sort By"
msgstr "Sortera efter"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
#: src/lib/utils.ts
msgid "Status"
msgstr "Status"
@@ -759,11 +876,16 @@ msgstr "Swap-användning"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
#: src/components/navbar.tsx
msgid "Systems"
msgstr "System"
@@ -786,6 +908,10 @@ msgstr ""
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Temperaturer för systemsensorer"
@@ -806,6 +932,10 @@ msgstr "Logga sedan in på backend och återställ ditt användarkontos lösenor
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Den här åtgärden kan inte ångras. Detta kommer permanent att ta bort alla aktuella poster för {name} från databasen."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Genomströmning av {extraFsName}"
@@ -846,6 +976,10 @@ msgstr ""
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
@@ -878,6 +1012,11 @@ msgstr "Utlöses när status växlar mellan upp och ner"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Utlöses när användningen av någon disk överskrider ett tröskelvärde"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
@@ -898,7 +1037,8 @@ msgstr "Drifttid"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Användning"
@@ -908,7 +1048,6 @@ msgstr "Användning av rotpartitionen"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Använt"
@@ -917,10 +1056,18 @@ msgstr "Använt"
msgid "Users"
msgstr "Användare"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Visa"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Synliga fält"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows-kommando"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Skriv"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# gün} other {# gün}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "{1} satırdan {0} tanesi seçildi."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# saat} other {# saat}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# saat} other {# saat}}"
msgid "1 hour"
msgstr "1 saat"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 dk"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 hafta"
@@ -39,6 +50,11 @@ msgstr "1 hafta"
msgid "12 hours"
msgstr "12 saat"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 dk"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 saat"
@@ -47,12 +63,22 @@ msgstr "24 saat"
msgid "30 days"
msgstr "30 gün"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 dk"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Eylemler"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "Aktif"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Aktif Uyarılar"
@@ -86,6 +112,12 @@ msgstr "Yönetici"
msgid "Agent"
msgstr "Aracı"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "Uyarı Geçmişi"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Tüm Sistemler"
msgid "Are you sure you want to delete {name}?"
msgstr "{name} silmek istediğinizden emin misiniz?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "Emin misiniz?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Otomatik kopyalama güvenli bir bağlam gerektirir."
@@ -152,11 +188,22 @@ msgstr "Beszel, popüler bildirim hizmetleriyle entegre olmak için <0>Shoutrrr<
msgid "Binary"
msgstr "İkili"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "Bit (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "Bayt (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Önbellek / Tamponlar"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "İptal"
@@ -164,6 +211,14 @@ msgstr "İptal"
msgid "Caution - potential data loss"
msgstr "Dikkat - potansiyel veri kaybı"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "Santigrat (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "Metrikler için görüntüleme birimlerini değiştirin."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Genel uygulama seçeneklerini değiştirin."
@@ -202,7 +257,12 @@ msgstr "Uyarı bildirimlerini nasıl alacağınızı yapılandırın."
msgid "Confirm password"
msgstr "Şifreyi onayla"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "Bağlantı kesildi"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Devam et"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU Kullanımı"
@@ -266,6 +326,11 @@ msgstr "CPU Kullanımı"
msgid "Create account"
msgstr "Hesap oluştur"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "Oluşturuldu"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Varsayılan zaman dilimi"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Sil"
@@ -296,6 +362,10 @@ msgstr "Disk"
msgid "Disk I/O"
msgstr "Disk G/Ç"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "Disk birimi"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,15 +394,20 @@ msgstr "Dokümantasyon"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
msgstr "Kapalı"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "Süre"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
msgstr ""
msgstr "Düzenle"
#: src/components/login/forgot-pass-form.tsx
#: src/components/login/auth-form.tsx
@@ -354,6 +429,7 @@ msgstr "E-posta adresini girin..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Hata"
@@ -369,6 +445,10 @@ msgstr "Son {2, plural, one {# dakika} other {# dakika}} içinde {0}{1} aşıyor
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "<0>config.yml</0> içinde tanımlanmayan mevcut sistemler silinecektir. Lütfen düzenli yedekler alın."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "Dışa aktar"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Yapılandırmayı dışa aktar"
@@ -377,6 +457,10 @@ msgstr "Yapılandırmayı dışa aktar"
msgid "Export your current systems configuration."
msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "Fahrenhayt (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Kimlik doğrulama başarısız"
@@ -396,12 +480,13 @@ msgstr "Uyarı güncellenemedi"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Filtrele..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "Parmak izi"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "Geçersiz e-posta adresi."
msgid "Kernel"
msgstr "Çekirdek"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Dil"
@@ -471,13 +546,26 @@ msgstr "Düzen"
msgid "Light"
msgstr "Açık"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "Yük Ortalaması"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "Yük Ortalaması 15d"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "Yük Ortalaması 1d"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "Yük Ortalaması 5d"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "Yük Ort."
#: src/components/navbar.tsx
msgid "Log Out"
@@ -507,7 +595,7 @@ msgstr "Görüntüleme ve bildirim tercihlerini yönetin."
#: src/components/add-system.tsx
msgid "Manual setup instructions"
msgstr ""
msgstr "Manuel kurulum talimatları"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx
@@ -527,6 +615,7 @@ msgstr "Bellek Kullanımı"
msgid "Memory usage of docker containers"
msgstr "Docker konteynerlerinin bellek kullanımı"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Ad"
@@ -543,10 +632,19 @@ msgstr "Docker konteynerlerinin ağ trafiği"
msgid "Network traffic of public interfaces"
msgstr "Genel arayüzlerin ağ trafiği"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "Ağ birimi"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Sonuç bulunamadı."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "Sonuç yok."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Mevcut uyarıların üzerine yaz"
msgid "Page"
msgstr "Sayfa"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "Sayfa {0} / {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Sayfalar / Ayarlar"
@@ -599,7 +703,7 @@ msgstr "Şifre en az 8 karakter olmalıdır."
#: src/components/login/auth-form.tsx
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "Parola 72 bayttan küçük olmalıdır."
#: src/components/login/forgot-pass-form.tsx
msgid "Password reset request received"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Genel Anahtar"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Oku"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Alındı"
@@ -679,6 +782,12 @@ msgstr "Alındı"
msgid "Reset Password"
msgstr "Şifreyi Sıfırla"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "Çözüldü"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Devam et"
@@ -687,6 +796,10 @@ msgstr "Devam et"
msgid "Rotate token"
msgstr "Token'ı döndür"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "Sayfa başına satır"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresleri enter tuşu veya virgül ile kaydedin. E-posta bildirimlerini devre dışı bırakmak için boş bırakın."
@@ -698,7 +811,7 @@ msgstr "Ayarları Kaydet"
#: src/components/add-system.tsx
msgid "Save system"
msgstr ""
msgstr "Sistemi kaydet"
#: src/components/navbar.tsx
msgid "Search"
@@ -712,8 +825,7 @@ msgstr "Sistemler veya ayarlar için ara..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Uyarıları nasıl alacağınızı yapılandırmak için <0>bildirim ayarlarını</0> inceleyin."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Gönderildi"
@@ -744,6 +856,11 @@ msgstr "SMTP ayarları"
msgid "Sort By"
msgstr "Sıralama Ölçütü"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "Durum"
#: src/lib/utils.ts
msgid "Status"
msgstr "Durum"
@@ -759,11 +876,16 @@ msgstr "Takas Kullanımı"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistem"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "Zaman içindeki sistem yükü ortalamaları"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Sistemler"
@@ -779,13 +901,17 @@ msgstr "Tablo"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
msgid "Temp"
msgstr ""
msgstr "Sıc"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
msgid "Temperature"
msgstr "Sıcaklık"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "Sıcaklık birimi"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Sistem sensörlerinin sıcaklıkları"
@@ -806,6 +932,10 @@ msgstr "Ardından arka uca giriş yapın ve kullanıcılar tablosunda kullanıc
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Bu işlem geri alınamaz. Bu, veritabanından {name} için tüm mevcut kayıtları kalıcı olarak silecektir."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "Bu, seçilen tüm kayıtları veritabanından kalıcı olarak silecektir."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName} verimliliği"
@@ -846,13 +976,17 @@ msgstr "Token'lar agentların bağlanıp kaydolmasına izin verir. Parmak izleri
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Token'lar ve parmak izleri hub'a WebSocket bağlantılarını doğrulamak için kullanılır."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "1 dakikalık yük ortalaması bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "15 dakikalık yük ortalaması bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "5 dakikalık yük ortalaması bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "Durum yukarı ve aşağı arasında değiştiğinde tetiklenir"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Herhangi bir diskin kullanımı bir eşiği aştığında tetiklenir"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "Birim tercihleri"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Evrensel token"
@@ -886,7 +1025,7 @@ msgstr "Evrensel token"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
msgstr "ık"
#: src/components/systems-table/systems-table.tsx
msgid "Updated in real time. Click on a system to view information."
@@ -898,7 +1037,8 @@ msgstr "Çalışma Süresi"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Kullanım"
@@ -908,7 +1048,6 @@ msgstr "Kök bölümün kullanımı"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Kullanıldı"
@@ -917,10 +1056,18 @@ msgstr "Kullanıldı"
msgid "Users"
msgstr "Kullanıcılar"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "Değer"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Görüntüle"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "En son 200 uyarınızı görüntüleyin."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Görünür Alanlar"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows komutu"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Yaz"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# день} few {# дні} many {# днів} other {# дня}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "Вибрано {0} з {1} рядків."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# година} few {# години} many {# годин} other {# години}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# година} few {# години} many {# год
msgid "1 hour"
msgstr "1 година"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 хв"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 тиждень"
@@ -39,6 +50,11 @@ msgstr "1 тиждень"
msgid "12 hours"
msgstr "12 годин"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 хв"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 години"
@@ -47,12 +63,22 @@ msgstr "24 години"
msgid "30 days"
msgstr "30 днів"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 хв"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Дії"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "Активне"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Активні сповіщення"
@@ -86,6 +112,12 @@ msgstr "Адміністратор"
msgid "Agent"
msgstr "Агент"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "Історія сповіщень"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Всі системи"
msgid "Are you sure you want to delete {name}?"
msgstr "Ви впевнені, що хочете видалити {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "Ви впевнені?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Автоматичне копіювання вимагає безпечного контексту."
@@ -152,11 +188,22 @@ msgstr "Beszel використовує <0>Shoutrrr</0> для інтеграц
msgid "Binary"
msgstr "Двійковий"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "Біти (Кбіт/с, Мбіт/с, Гбіт/с)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "Байти (КБ/с, МБ/с, ГБ/с)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Скасувати"
@@ -164,6 +211,14 @@ msgstr "Скасувати"
msgid "Caution - potential data loss"
msgstr "Увага - можливе втрата даних"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "Цельсій (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "Змінити одиниці вимірювання для метрик."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Змінити загальні параметри програми."
@@ -202,7 +257,12 @@ msgstr "Налаштуйте, як ви отримуєте сповіщення
msgid "Confirm password"
msgstr "Підтвердьте пароль"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "З'єднання розірвано"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продовжити"
@@ -258,7 +318,7 @@ msgstr "ЦП"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Використання ЦП"
@@ -266,6 +326,11 @@ msgstr "Використання ЦП"
msgid "Create account"
msgstr "Створити обліковий запис"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "Створено"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "Стандартний період часу"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Видалити"
@@ -296,6 +362,10 @@ msgstr "Диск"
msgid "Disk I/O"
msgstr "Дисковий ввід/вивід"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "Одиниця виміру диска"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "Документація"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Не працює"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "Тривалість"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "Введіть адресу електронної пошти..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Помилка"
@@ -369,6 +445,10 @@ msgstr "Перевищує {0}{1} протягом {2, plural, one {останн
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Існуючі системи, не визначені в <0>config.yml</0>, будуть видалені. Будь ласка, робіть регулярні резервні копії."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "Експорт"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Експорт конфігурації"
@@ -377,6 +457,10 @@ msgstr "Експорт конфігурації"
msgid "Export your current systems configuration."
msgstr "Експортуйте поточну конфігурацію систем."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "Фаренгейт (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Не вдалося автентифікувати"
@@ -396,12 +480,13 @@ msgstr "Не вдалося оновити сповіщення"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Фільтр..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "Відбиток"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "Неправильна адреса електронної пошти."
msgid "Kernel"
msgstr "Ядро"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Мова"
@@ -471,13 +546,26 @@ msgstr "Макет"
msgid "Light"
msgstr "Світлий"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "Середнє навантаження"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "Середнє навантаження за 15 хв"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "Середнє навантаження за 1 хв"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "Середнє навантаження за 5 хв"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "Сер. навантаження"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "Використання пам'яті"
msgid "Memory usage of docker containers"
msgstr "Використання пам'яті контейнерами Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Ім'я"
@@ -543,10 +632,19 @@ msgstr "Мережевий трафік контейнерів Docker"
msgid "Network traffic of public interfaces"
msgstr "Мережевий трафік публічних інтерфейсів"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "Одиниця виміру мережі"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Результатів не знайдено."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "Немає результатів."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Перезаписати існуючі сповіщення"
msgid "Page"
msgstr "Сторінка"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "Сторінка {0} з {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Сторінки / Налаштування"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Ключ"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Читання"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Отримано"
@@ -679,6 +782,12 @@ msgstr "Отримано"
msgid "Reset Password"
msgstr "Скинути пароль"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "Вирішено"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Відновити"
@@ -687,6 +796,10 @@ msgstr "Відновити"
msgid "Rotate token"
msgstr "Оновити токен"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "Рядків на сторінку"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Збережіть адресу, використовуючи клавішу Enter або кому. Залиште порожнім, щоб вимкнути сповіщення електронною поштою."
@@ -712,8 +825,7 @@ msgstr "Шукати системи або налаштування..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Перегляньте <0>налаштування сповіщень</0>, щоб налаштувати, як ви отримуєте сповіщення."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Відправлено"
@@ -744,6 +856,11 @@ msgstr "Налаштування SMTP"
msgid "Sort By"
msgstr "Сортувати за"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "Стан"
#: src/lib/utils.ts
msgid "Status"
msgstr "Статус"
@@ -759,11 +876,16 @@ msgstr "Використання підкачки"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "Середнє навантаження системи з часом"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Системи"
@@ -786,6 +908,10 @@ msgstr "Температура"
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "Одиниця вимірювання температури"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Температури датчиків системи"
@@ -806,6 +932,10 @@ msgstr "Потім увійдіть у бекенд і скиньте парол
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Цю дію не можна скасувати. Це назавжди видалить всі поточні записи для {name} з бази даних."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "Це назавжди видалить усі вибрані записи з бази даних."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Пропускна здатність {extraFsName}"
@@ -846,13 +976,17 @@ msgstr "Токени дозволяють агентам підключатис
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "Токени та відбитки використовуються для автентифікації WebSocket з'єднань до хабу."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "Спрацьовує, коли середнє навантаження за 1 хвилину перевищує поріг"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "Спрацьовує, коли середнє навантаження за 15 хвилин перевищує поріг"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "Спрацьовує, коли середнє навантаження за 5 хвилин перевищує поріг"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "Спрацьовує, коли статус перемикається
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Спрацьовує, коли використання будь-якого диска перевищує поріг"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "Налаштування одиниць вимірювання"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "Універсальний токен"
@@ -898,7 +1037,8 @@ msgstr "Час роботи"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Використання"
@@ -908,7 +1048,6 @@ msgstr "Використання кореневого розділу"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Використано"
@@ -917,10 +1056,18 @@ msgstr "Використано"
msgid "Users"
msgstr "Користувачі"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "Значення"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Вигляд"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "Переглянути 200 останніх сповіщень."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Видимі стовпці"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Команда Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Запис"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ngày} other {# ngày}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "Đã chọn {0} trên {1} hàng."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# giờ} other {# giờ}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# giờ} other {# giờ}}"
msgid "1 hour"
msgstr "1 giờ"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 phút"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1 tuần"
@@ -39,6 +50,11 @@ msgstr "1 tuần"
msgid "12 hours"
msgstr "12 giờ"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 phút"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24 giờ"
@@ -47,12 +63,22 @@ msgstr "24 giờ"
msgid "30 days"
msgstr "30 ngày"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 phút"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Hành động"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "Hoạt động"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "Cảnh báo hoạt động"
@@ -86,6 +112,12 @@ msgstr "Quản trị viên"
msgid "Agent"
msgstr "Tác nhân"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "Lịch sử Cảnh báo"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "Tất cả Hệ thống"
msgid "Are you sure you want to delete {name}?"
msgstr "Bạn có chắc chắn muốn xóa {name} không?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "Bạn có chắc không?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "Sao chép tự động yêu cầu một ngữ cảnh an toàn."
@@ -119,7 +155,7 @@ msgstr "Trung bình vượt quá <0>{value}{0}</0>"
#: src/components/routes/system.tsx
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Tiêu thụ điện năng trung bình của GPU"
#: src/components/routes/system.tsx
msgid "Average system-wide CPU utilization"
@@ -128,7 +164,7 @@ msgstr "Sử dụng CPU trung bình toàn hệ thống"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx
msgid "Average utilization of {0}"
msgstr ""
msgstr "Mức sử dụng trung bình của {0}"
#: src/components/navbar.tsx
#: src/components/command-palette.tsx
@@ -152,11 +188,22 @@ msgstr "Beszel sử dụng <0>Shoutrrr</0> để tích hợp với các dịch v
msgid "Binary"
msgstr "Nhị phân"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "Bit (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "Byte (KB/giây, MB/giây, GB/giây)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Bộ nhớ đệm / Bộ đệm"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Hủy bỏ"
@@ -164,6 +211,14 @@ msgstr "Hủy bỏ"
msgid "Caution - potential data loss"
msgstr "Cẩn thận - có thể mất dữ liệu"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "Độ C (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "Thay đổi đơn vị hiển thị cho các chỉ số."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "Thay đổi các tùy chọn ứng dụng chung."
@@ -202,7 +257,12 @@ msgstr "Cấu hình cách bạn nhận thông báo cảnh báo."
msgid "Confirm password"
msgstr "Xác nhận mật khẩu"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "Mất kết nối"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Tiếp tục"
@@ -225,7 +285,7 @@ msgstr "Sao chép docker run"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
msgstr "Sao chép môi trường"
#: src/components/systems-table/systems-table.tsx
msgid "Copy host"
@@ -242,15 +302,15 @@ msgstr "Sao chép văn bản"
#: src/components/add-system.tsx
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
msgstr ""
msgstr "Sao chép lệnh cài đặt cho tác nhân bên dưới hoặc tự động đăng ký tác nhân bằng <0>token chung</0>."
#: src/components/add-system.tsx
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
msgstr ""
msgstr "Sao chép nội dung <0>docker-compose.yml</0> cho tác nhân bên dưới hoặc tự động đăng ký tác nhân bằng <1>token chung</1>."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Copy YAML"
msgstr ""
msgstr "Sao chép YAML"
#: src/components/systems-table/systems-table.tsx
msgid "CPU"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "Sử dụng CPU"
@@ -266,6 +326,11 @@ msgstr "Sử dụng CPU"
msgid "Create account"
msgstr "Tạo tài khoản"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "Đã tạo"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,12 +346,13 @@ msgid "Default time period"
msgstr "Thời gian mặc định"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Xóa"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Delete fingerprint"
msgstr ""
msgstr "Xóa vân tay"
#: src/components/systems-table/systems-table.tsx
msgid "Disk"
@@ -296,6 +362,10 @@ msgstr "Đĩa"
msgid "Disk I/O"
msgstr "Đĩa I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "Đơn vị đĩa"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,15 +394,20 @@ msgstr "Tài liệu"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
msgstr "Mất kết nối"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "Thời lượng"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
msgstr ""
msgstr "Chỉnh sửa"
#: src/components/login/forgot-pass-form.tsx
#: src/components/login/auth-form.tsx
@@ -354,6 +429,7 @@ msgstr "Nhập địa chỉ email..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "Lỗi"
@@ -369,6 +445,10 @@ msgstr "Vượt quá {0}{1} trong {2, plural, one {# phút} other {# phút}} qua
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Các hệ thống hiện có không được định nghĩa trong <0>config.yml</0> sẽ bị xóa. Vui lòng sao lưu thường xuyên."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "Xuất"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "Xuất cấu hình"
@@ -377,6 +457,10 @@ msgstr "Xuất cấu hình"
msgid "Export your current systems configuration."
msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "Độ F (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "Xác thực thất bại"
@@ -396,12 +480,13 @@ msgstr "Cập nhật cảnh báo thất bại"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "Lọc..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "Vân tay"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -419,7 +504,7 @@ msgstr "Chung"
#: src/components/routes/system.tsx
msgid "GPU Power Draw"
msgstr ""
msgstr "Mức tiêu thụ điện của GPU"
#: src/components/systems-table/systems-table.tsx
msgid "Grid"
@@ -429,7 +514,7 @@ msgstr "Lưới"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgctxt "Button to copy install command"
msgid "Homebrew command"
msgstr ""
msgstr "Lệnh Homebrew"
#: src/components/add-system.tsx
msgid "Host / IP"
@@ -448,16 +533,6 @@ msgstr "Địa chỉ email không hợp lệ."
msgid "Kernel"
msgstr "Nhân"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "Ngôn ngữ"
@@ -471,13 +546,26 @@ msgstr "Bố cục"
msgid "Light"
msgstr "Sáng"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "Tải trung bình"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "Tải trung bình 15 phút"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "Tải trung bình 1 phút"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "Tải trung bình 5 phút"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "Tải TB"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -507,7 +595,7 @@ msgstr "Quản lý tùy chọn hiển thị và thông báo."
#: src/components/add-system.tsx
msgid "Manual setup instructions"
msgstr ""
msgstr "Hướng dẫn cài đặt thủ công"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx
@@ -527,6 +615,7 @@ msgstr "Sử dụng Bộ nhớ"
msgid "Memory usage of docker containers"
msgstr "Sử dụng bộ nhớ của các container Docker"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "Tên"
@@ -543,10 +632,19 @@ msgstr "Lưu lượng mạng của các container Docker"
msgid "Network traffic of public interfaces"
msgstr "Lưu lượng mạng của các giao diện công cộng"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "Đơn vị mạng"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "Không tìm thấy kết quả."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "Không có kết quả."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "Ghi đè các cảnh báo hiện có"
msgid "Page"
msgstr "Trang"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "Trang {0} trên {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "Trang / Cài đặt"
@@ -599,7 +703,7 @@ msgstr "Mật khẩu phải có ít nhất 8 ký tự."
#: src/components/login/auth-form.tsx
msgid "Password must be less than 72 bytes."
msgstr ""
msgstr "Mật khẩu phải nhỏ hơn 72 byte."
#: src/components/login/forgot-pass-form.tsx
msgid "Password reset request received"
@@ -611,7 +715,7 @@ msgstr "Tạm dừng"
#: src/components/systems-table/systems-table.tsx
msgid "Paused"
msgstr ""
msgstr "Đã tạm dừng"
#: src/components/routes/settings/notifications.tsx
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "Khóa"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "Đọc"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "Đã nhận"
@@ -679,13 +782,23 @@ msgstr "Đã nhận"
msgid "Reset Password"
msgstr "Đặt lại Mật khẩu"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "Đã giải quyết"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "Tiếp tục"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Rotate token"
msgstr ""
msgstr "Xoay vòng token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "Số hàng mỗi trang"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
@@ -698,7 +811,7 @@ msgstr "Lưu Cài đặt"
#: src/components/add-system.tsx
msgid "Save system"
msgstr ""
msgstr "Lưu hệ thống"
#: src/components/navbar.tsx
msgid "Search"
@@ -712,8 +825,7 @@ msgstr "Tìm kiếm hệ thống hoặc cài đặt..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Xem <0>cài đặt thông báo</0> để cấu hình cách bạn nhận cảnh báo."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "Đã gửi"
@@ -744,6 +856,11 @@ msgstr "Cài đặt SMTP"
msgid "Sort By"
msgstr "Sắp xếp theo"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "Trạng thái"
#: src/lib/utils.ts
msgid "Status"
msgstr "Trạng thái"
@@ -759,11 +876,16 @@ msgstr "Sử dụng Hoán đổi"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Hệ thống"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "Tải trung bình của hệ thống theo thời gian"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "Các hệ thống"
@@ -779,13 +901,17 @@ msgstr "Bảng"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
msgid "Temp"
msgstr ""
msgstr "Nhiệt độ"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
msgid "Temperature"
msgstr "Nhiệt độ"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "Đơn vị nhiệt độ"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "Nhiệt độ của các cảm biến hệ thống"
@@ -806,6 +932,10 @@ msgstr "Sau đó đăng nhập vào backend và đặt lại mật khẩu tài k
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Hành động này không thể hoàn tác. Điều này sẽ xóa vĩnh viễn tất cả các bản ghi hiện tại cho {name} khỏi cơ sở dữ liệu."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "Thao tác này sẽ xóa vĩnh viễn tất cả các bản ghi đã chọn khỏi cơ sở dữ liệu."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "Thông lượng của {extraFsName}"
@@ -830,29 +960,33 @@ msgstr "Chuyển đổi chủ đề"
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Token"
msgstr ""
msgstr "Token"
#: src/components/command-palette.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/layout.tsx
msgid "Tokens & Fingerprints"
msgstr ""
msgstr "Token & Vân tay"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
msgstr ""
msgstr "Token cho phép các tác nhân kết nối và đăng ký. Vân tay là các định danh ổn định duy nhất cho mỗi hệ thống, được đặt khi kết nối lần đầu."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
msgstr "Token và vân tay được sử dụng để xác thực các kết nối WebSocket đến trung tâm."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "Kích hoạt khi tải trung bình 1 phút vượt quá ngưỡng"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "Kích hoạt khi tải trung bình 15 phút vượt quá ngưỡng"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "Kích hoạt khi tải trung bình 5 phút vượt quá ngưỡng"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,15 +1012,20 @@ msgstr "Kích hoạt khi trạng thái chuyển đổi giữa lên và xuống"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Kích hoạt khi sử dụng bất kỳ đĩa nào vượt quá ngưỡng"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "Tùy chọn đơn vị"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
msgstr "Token chung"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
msgstr "Hoạt động"
#: src/components/systems-table/systems-table.tsx
msgid "Updated in real time. Click on a system to view information."
@@ -898,7 +1037,8 @@ msgstr "Thời gian hoạt động"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "Sử dụng"
@@ -908,7 +1048,6 @@ msgstr "Sử dụng phân vùng gốc"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "Đã sử dụng"
@@ -917,10 +1056,18 @@ msgstr "Đã sử dụng"
msgid "Users"
msgstr "Người dùng"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "Giá trị"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "Xem"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "Xem 200 cảnh báo gần đây nhất của bạn."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "Các cột hiển thị"
@@ -939,17 +1086,17 @@ msgstr "Thông báo Webhook / Push"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
msgstr ""
msgstr "Khi được bật, token này cho phép các tác nhân tự đăng ký mà không cần tạo hệ thống trước. Hết hạn sau một giờ hoặc khi khởi động lại trung tâm."
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgctxt "Button to copy install command"
msgid "Windows command"
msgstr ""
msgstr "Lệnh Windows"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "Ghi"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "已选择 {0} / {1} 行"
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小时} other {# 小时}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 小时} other {# 小时}}"
msgid "1 hour"
msgstr "1小时"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1分钟"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1周"
@@ -39,6 +50,11 @@ msgstr "1周"
msgid "12 hours"
msgstr "12小时"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15分钟"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24小时"
@@ -47,12 +63,22 @@ msgstr "24小时"
msgid "30 days"
msgstr "30天"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5分钟"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "活跃"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "启用的警报"
@@ -86,6 +112,12 @@ msgstr "管理员"
msgid "Agent"
msgstr "客户端"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "警报历史"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "所有客户端"
msgid "Are you sure you want to delete {name}?"
msgstr "您确定要删除{name}吗?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "您确定吗?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "自动复制所需的安全上下文。"
@@ -152,11 +188,22 @@ msgstr "Beszel使用<0>Shoutrrr</0>以实现与常见的通知服务集成。"
msgid "Binary"
msgstr "二进制"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "比特 (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "字节 (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "缓存/缓冲区"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -164,6 +211,14 @@ msgstr "取消"
msgid "Caution - potential data loss"
msgstr "注意 - 数据可能已经丢失"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "摄氏度 (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "更改指标的显示单位。"
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "更改常规应用程序选项。"
@@ -202,7 +257,12 @@ msgstr "配置您接收警报通知的方式。"
msgid "Confirm password"
msgstr "确认密码"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "连接已断开"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "继续"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU使用率"
@@ -266,6 +326,11 @@ msgstr "CPU使用率"
msgid "Create account"
msgstr "创建账户"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "创建时间"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "默认时间段"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "删除"
@@ -296,6 +362,10 @@ msgstr "磁盘"
msgid "Disk I/O"
msgstr "磁盘I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "磁盘单位"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,11 +394,16 @@ msgstr "文档"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "停止"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "持续时间"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
msgid "Edit"
@@ -354,6 +429,7 @@ msgstr "输入电子邮件地址..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "错误"
@@ -369,6 +445,10 @@ msgstr "在过去的{2, plural, one {# 分钟} other {# 分钟}}中超过{0}{1}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "未在<0>config.yml</0>中定义的客户端将被删除。请定期备份。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "导出"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "导出配置"
@@ -377,6 +457,10 @@ msgstr "导出配置"
msgid "Export your current systems configuration."
msgstr "导出您当前的系统配置。"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "华氏度 (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "认证失败"
@@ -396,12 +480,13 @@ msgstr "更新警报失败"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "过滤..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "指纹"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "无效的电子邮件地址。"
msgid "Kernel"
msgstr "内核"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "语言"
@@ -471,13 +546,26 @@ msgstr "布局"
msgid "Light"
msgstr "浅色模式"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "系统负载"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "15分钟负载平均值"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "1分钟负载平均值"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "5分钟负载平均值"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "负载"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "内存使用"
msgid "Memory usage of docker containers"
msgstr "Docker 容器的内存使用"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "名称"
@@ -543,10 +632,19 @@ msgstr "Docker 容器的网络流量"
msgid "Network traffic of public interfaces"
msgstr "公共接口的网络流量"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "网络单位"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "未找到结果。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "无结果。"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "覆盖现有警报"
msgid "Page"
msgstr "页面"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "第 {0} 页,共 {1} 页"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "页面/设置"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "公钥"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "读取"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "接收"
@@ -679,6 +782,12 @@ msgstr "接收"
msgid "Reset Password"
msgstr "重置密码"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "已解决"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "恢复"
@@ -687,6 +796,10 @@ msgstr "恢复"
msgid "Rotate token"
msgstr "轮换令牌"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "每页行数"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "使用回车键或逗号保存地址。留空以禁用电子邮件通知。"
@@ -712,8 +825,7 @@ msgstr "搜索系统或设置..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "查看<0>通知设置</0>以配置您接收警报的方式。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "发送"
@@ -744,6 +856,11 @@ msgstr "SMTP设置"
msgid "Sort By"
msgstr "排序依据"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "状态"
#: src/lib/utils.ts
msgid "Status"
msgstr "状态"
@@ -759,11 +876,16 @@ msgstr "SWAP 使用"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系统"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "系统负载平均值随时间变化"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系统"
@@ -786,6 +908,10 @@ msgstr "温度"
msgid "Temperature"
msgstr "温度"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "温度单位"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "系统传感器的温度"
@@ -806,6 +932,10 @@ msgstr "然后登录到后台并在用户表中重置您的用户账户密码。
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作无法撤销。这将永久删除数据库中{name}的所有当前记录。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "这将永久删除数据库中所有选定的记录。"
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的吞吐量"
@@ -846,13 +976,17 @@ msgstr "令牌允许客户端连接和注册。指纹是每个系统唯一的稳
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌和指纹用于验证到中心的WebSocket连接。"
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "当1分钟负载平均值超过阈值时触发"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "当15分钟负载平均值超过阈值时触发"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "当5分钟负载平均值超过阈值时触发"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "当状态在上线与掉线之间切换时触发"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "当任何磁盘的使用率超过阈值时触发"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "单位偏好"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "通用令牌"
@@ -898,7 +1037,8 @@ msgstr "正常运行时间"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "使用"
@@ -908,7 +1048,6 @@ msgstr "根分区的使用"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "已用"
@@ -917,10 +1056,18 @@ msgstr "已用"
msgid "Users"
msgstr "用户"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "值"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "视图"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "查看您最近的200个警报。"
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "可见列"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows 安装命令"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "写入"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "已選擇 {1} 個項目中的 {0} 個"
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小時} other {# 小時}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 小時} other {# 小時}}"
msgid "1 hour"
msgstr "1小時"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 分鐘"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1週"
@@ -39,6 +50,11 @@ msgstr "1週"
msgid "12 hours"
msgstr "12小時"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 分鐘"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24小時"
@@ -47,12 +63,22 @@ msgstr "24小時"
msgid "30 days"
msgstr "30天"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 分鐘"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "啟用中"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "活動警報"
@@ -86,6 +112,12 @@ msgstr "管理員"
msgid "Agent"
msgstr "客户端"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "警報歷史"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "所有系統"
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "您確定嗎?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "自動複製需要安全的上下文。"
@@ -152,11 +188,22 @@ msgstr "Beszel 使用 <0>Shoutrrr</0> 與流行的通知服務集成。"
msgid "Binary"
msgstr "執行檔"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "位元 (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "位元組 (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "快取 / 緩衝區"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -164,6 +211,14 @@ msgstr "取消"
msgid "Caution - potential data loss"
msgstr "注意 - 可能遺失資料"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "攝氏 (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "更改指標的顯示單位。"
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "更改一般應用選項。"
@@ -202,7 +257,12 @@ msgstr "配置您接收警報通知的方式。"
msgid "Confirm password"
msgstr "確認密碼"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "連線中斷"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "繼續"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU 使用率"
@@ -266,6 +326,11 @@ msgstr "CPU 使用率"
msgid "Create account"
msgstr "創建帳戶"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "已建立"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "刪除"
@@ -296,6 +362,10 @@ msgstr "磁碟"
msgid "Disk I/O"
msgstr "磁碟 I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "磁碟單位"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,10 +394,15 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
msgstr "中斷"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "持續時間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
@@ -354,6 +429,7 @@ msgstr "輸入電子郵件地址..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "錯誤"
@@ -369,6 +445,10 @@ msgstr "在過去的{2, plural, one {# 分鐘} other {# 分鐘}}中超過{0}{1}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "未在<0>config.yml</0>中定義的現有系統將被刪除。請定期備份。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "匯出"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "匯出設定"
@@ -377,6 +457,10 @@ msgstr "匯出設定"
msgid "Export your current systems configuration."
msgstr "匯出您現在的系統設定。"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "認證失敗"
@@ -396,12 +480,13 @@ msgstr "更新警報失敗"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "篩選..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "指紋"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "無效的電子郵件地址。"
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "語言"
@@ -471,13 +546,26 @@ msgstr "版面配置"
msgid "Light"
msgstr "淺色"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "平均負載"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "15分鐘平均負載"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "1分鐘平均負載"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "5分鐘平均負載"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "平均負載"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "記憶體使用"
msgid "Memory usage of docker containers"
msgstr "Docker 容器的記憶體使用量"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "名稱"
@@ -543,10 +632,19 @@ msgstr "Docker 容器的網絡流量"
msgid "Network traffic of public interfaces"
msgstr "公共接口的網絡流量"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "網路單位"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "未找到結果。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "沒有結果。"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "覆蓋現有警報"
msgid "Page"
msgstr "頁面"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "第 {0} 頁,共 {1} 頁"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "頁面 / 設定"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "公鑰"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "讀取"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "接收"
@@ -679,6 +782,12 @@ msgstr "接收"
msgid "Reset Password"
msgstr "重設密碼"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "已解決"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "恢復"
@@ -687,6 +796,10 @@ msgstr "恢復"
msgid "Rotate token"
msgstr "輪換令牌"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "每頁行數"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "使用回車鍵或逗號保存地址。留空以禁用電子郵件通知。"
@@ -712,8 +825,7 @@ msgstr "搜索系統或設置..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "查看<0>通知設置</0>以配置您接收警報的方式。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "發送"
@@ -744,6 +856,11 @@ msgstr "SMTP設置"
msgid "Sort By"
msgstr "排序依據"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "狀態"
#: src/lib/utils.ts
msgid "Status"
msgstr "狀態"
@@ -759,11 +876,16 @@ msgstr "交換使用"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系統"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "系統平均負載隨時間變化"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系統"
@@ -786,6 +908,10 @@ msgstr "溫度"
msgid "Temperature"
msgstr "溫度"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "溫度單位"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "系統傳感器的溫度"
@@ -806,6 +932,10 @@ msgstr "然後登錄到後端並在用戶表中重置您的用戶帳戶密碼。
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法撤銷。這將永久刪除數據庫中{name}的所有當前記錄。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "這將從資料庫中永久刪除所有選定的記錄。"
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的吞吐量"
@@ -846,13 +976,17 @@ msgstr "令牌允許代理程式連接和註冊。指紋是每個系統唯一的
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "當 1 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "當 15 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "當 5 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "當狀態在上和下之間切換時觸發"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "當任何磁碟的使用超過閾值時觸發"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "單位偏好"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "通用令牌"
@@ -886,7 +1025,7 @@ msgstr "通用令牌"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
msgstr "上線"
#: src/components/systems-table/systems-table.tsx
msgid "Updated in real time. Click on a system to view information."
@@ -898,7 +1037,8 @@ msgstr "正常運行時間"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "使用"
@@ -908,7 +1048,6 @@ msgstr "根分區的使用"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "已用"
@@ -917,10 +1056,18 @@ msgstr "已用"
msgid "Users"
msgstr "用戶"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "值"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "檢視"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "檢視最近 200 則警報。"
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "可見欄位"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows 指令"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "寫入"

View File

@@ -23,6 +23,12 @@ msgstr ""
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#. placeholder {0}: table.getFilteredSelectedRowModel().rows.length
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr "已選取 {1} 個項目中的 {0} 個"
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小時} other {# 小時}}"
@@ -31,6 +37,11 @@ msgstr "{hours, plural, one {# 小時} other {# 小時}}"
msgid "1 hour"
msgstr "1小時"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr "1 分鐘"
#: src/lib/utils.ts
msgid "1 week"
msgstr "1週"
@@ -39,6 +50,11 @@ msgstr "1週"
msgid "12 hours"
msgstr "12小時"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr "15 分鐘"
#: src/lib/utils.ts
msgid "24 hours"
msgstr "24小時"
@@ -47,12 +63,22 @@ msgstr "24小時"
msgid "30 days"
msgstr "30天"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr "5 分鐘"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr "啟用中"
#: src/components/routes/home.tsx
msgid "Active Alerts"
msgstr "活動警報"
@@ -86,6 +112,12 @@ msgstr "管理員"
msgid "Agent"
msgstr "代理"
#: src/components/command-palette.tsx
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr "警報歷史"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
msgid "Alerts"
@@ -100,6 +132,10 @@ msgstr "所有系統"
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr "您確定嗎?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
msgstr "只有在受保護的環境才能自動複製。"
@@ -152,11 +188,22 @@ msgstr "Beszel 以 <0>Shoutrrr</0> 整合常用的通知服務。"
msgid "Binary"
msgstr "執行檔"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr "位元 (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr "位元組 (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "快取/緩衝"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -164,6 +211,14 @@ msgstr "取消"
msgid "Caution - potential data loss"
msgstr "注意 - 可能遺失資料"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr "攝氏 (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr "更改指標的顯示單位。"
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
msgstr "修改一般應用程式選項。"
@@ -202,7 +257,12 @@ msgstr "設定您要如何接收警報通知"
msgid "Confirm password"
msgstr "確認密碼"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr "連線中斷"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "繼續"
@@ -258,7 +318,7 @@ msgstr "CPU"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "CPU Usage"
msgstr "CPU 使用率"
@@ -266,6 +326,11 @@ msgstr "CPU 使用率"
msgid "Create account"
msgstr "建立帳號"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr "已建立"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -281,6 +346,7 @@ msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "刪除"
@@ -296,6 +362,10 @@ msgstr "磁碟"
msgid "Disk I/O"
msgstr "磁碟 I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr "磁碟單位"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
#: src/components/charts/disk-chart.tsx
@@ -324,10 +394,15 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
msgstr "中斷"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr "持續時間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
@@ -354,6 +429,7 @@ msgstr "輸入電子郵件地址..."
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/notifications.tsx
#: src/components/routes/settings/config-yaml.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
#: src/components/login/auth-form.tsx
msgid "Error"
msgstr "錯誤"
@@ -369,6 +445,10 @@ msgstr "在過去的{2, plural, one {# 分鐘} other {# 分鐘}}中超過{0}{1}"
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "未在 <0>config.yml</0> 中定義的現有系統將會被刪除。請定期備份。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr "匯出"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
msgstr "匯出設定"
@@ -377,6 +457,10 @@ msgstr "匯出設定"
msgid "Export your current systems configuration."
msgstr "匯出您現在的系統設定。"
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr "華氏 (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
msgstr "認證失敗"
@@ -396,12 +480,13 @@ msgstr "更新警報失敗"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Filter..."
msgstr "篩選..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "指紋"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -448,16 +533,6 @@ msgstr "無效的電子郵件地址。"
msgid "Kernel"
msgstr "Kernel"
#. Load average 15 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L15"
msgstr ""
#. Load average 5 minutes
#: src/components/systems-table/systems-table.tsx
msgid "L5"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Language"
msgstr "語言"
@@ -471,13 +546,26 @@ msgstr "版面配置"
msgid "Light"
msgstr "淺色"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr "平均負載"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "15分鐘平均負載"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr "1分鐘平均負載"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "5分鐘平均負載"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
msgid "Load Avg"
msgstr "平均負載"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -527,6 +615,7 @@ msgstr "記憶體使用量"
msgid "Memory usage of docker containers"
msgstr "Docker 容器的記憶體使用量"
#: src/components/alerts-history-columns.tsx
#: src/components/add-system.tsx
msgid "Name"
msgstr "名稱"
@@ -543,10 +632,19 @@ msgstr "Docker 容器的網路流量"
msgid "Network traffic of public interfaces"
msgstr "公開介面的網路流量"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr "網路單位"
#: src/components/command-palette.tsx
msgid "No results found."
msgstr "找不到結果。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr "沒有結果。"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
msgid "No systems found."
@@ -584,6 +682,12 @@ msgstr "覆蓋現有警報"
msgid "Page"
msgstr "頁面"
#. placeholder {0}: table.getState().pagination.pageIndex + 1
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr "第 {0} 頁,共 {1} 頁"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
msgstr "頁面 / 設定"
@@ -665,13 +769,12 @@ msgid "Public Key"
msgstr "公鑰"
#. Disk read
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Read"
msgstr "讀取"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Received"
msgstr "接收"
@@ -679,6 +782,12 @@ msgstr "接收"
msgid "Reset Password"
msgstr "重設密碼"
#: src/components/alerts-history-columns.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr "已解決"
#: src/components/systems-table/systems-table.tsx
msgid "Resume"
msgstr "繼續"
@@ -687,6 +796,10 @@ msgstr "繼續"
msgid "Rotate token"
msgstr "輪換令牌"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr "每頁列數"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "使用 Enter 鍵或逗號儲存地址。留空以停用電子郵件通知。"
@@ -712,8 +825,7 @@ msgstr "在設定或系統中搜尋..."
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "查看<0>通知設定</0>以設定您如何接收警報。"
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
msgid "Sent"
msgstr "傳送"
@@ -744,6 +856,11 @@ msgstr "SMTP 設定"
msgid "Sort By"
msgstr "排序"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr "狀態"
#: src/lib/utils.ts
msgid "Status"
msgstr "狀態"
@@ -759,11 +876,16 @@ msgstr "虛擬記憶體使用量"
#. System theme
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系統"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr "系統平均負載隨時間變化"
#: src/components/navbar.tsx
msgid "Systems"
msgstr "系統"
@@ -786,6 +908,10 @@ msgstr "溫度"
msgid "Temperature"
msgstr "溫度"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr "溫度單位"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
msgstr "系統感應器的溫度"
@@ -806,6 +932,10 @@ msgstr "然後登入後台並在使用者列表中重設您的帳號密碼。"
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法復原。這將永久刪除資料庫中{name}的所有當前記錄。"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr "這將從資料庫中永久刪除所有選定的記錄。"
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的傳輸速率"
@@ -846,13 +976,17 @@ msgstr "令牌允許代理程式連接和註冊。指紋是每個系統唯一的
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr "令牌和指紋用於驗證到中心的WebSocket連接。"
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr "當 1 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "當 15 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "當 5 分鐘平均負載超過閾值時觸發"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -878,6 +1012,11 @@ msgstr "當連線和離線時觸發"
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "當任何磁碟使用率超過閾值時觸發"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr "單位偏好"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr "通用令牌"
@@ -886,7 +1025,7 @@ msgstr "通用令牌"
#: src/components/systems-table/systems-table.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
msgstr "上線"
#: src/components/systems-table/systems-table.tsx
msgid "Updated in real time. Click on a system to view information."
@@ -898,7 +1037,8 @@ msgstr "運行時間"
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Usage"
msgstr "使用量"
@@ -908,7 +1048,6 @@ msgstr "Root 分區的使用量"
#: src/components/charts/swap-chart.tsx
#: src/components/charts/mem-chart.tsx
#: src/components/charts/area-chart.tsx
msgid "Used"
msgstr "已使用"
@@ -917,10 +1056,18 @@ msgstr "已使用"
msgid "Users"
msgstr "使用者"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr "值"
#: src/components/systems-table/systems-table.tsx
msgid "View"
msgstr "檢視"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr "檢視最近 200 則警報。"
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
msgstr "顯示欄位"
@@ -948,8 +1095,8 @@ msgid "Windows command"
msgstr "Windows 命令"
#. Disk write
#: src/components/charts/area-chart.tsx
#: src/components/charts/area-chart.tsx
#: src/components/routes/system.tsx
#: src/components/routes/system.tsx
msgid "Write"
msgstr "寫入"

View File

@@ -1,5 +1,5 @@
import { RecordModel } from "pocketbase"
import { DataUnit, Os, TemperatureUnit } from "./lib/enums"
import { Unit, Os } from "./lib/enums"
// global window properties
declare global {
@@ -22,17 +22,6 @@ export interface FingerprintRecord extends RecordModel {
}
}
// Unit conversion result types
export interface TemperatureConversion {
value: number
unit: string
}
export interface DataUnitConversion {
value: number
unit: string
}
export interface SystemRecord extends RecordModel {
name: string
host: string
@@ -55,6 +44,8 @@ export interface SystemInfo {
c: number
/** cpu model */
m: string
/** load average 1 minute */
l1?: number
/** load average 5 minutes */
l5?: number
/** load average 15 minutes */
@@ -69,6 +60,8 @@ export interface SystemInfo {
dp: number
/** bandwidth (mb) */
b: number
/** bandwidth bytes */
bb?: number
/** agent version */
v: string
/** system is using podman */
@@ -124,10 +117,14 @@ export interface SystemStats {
ns: number
/** network received (mb) */
nr: number
/** bandwidth bytes [sent, recv] */
b?: [number, number]
/** max network sent (mb) */
nsm?: number
/** max network received (mb) */
nrm?: number
/** max network sent (bytes) */
bm?: [number, number]
/** temperatures */
t?: Record<string, number>
/** extra filesystems */
@@ -198,6 +195,16 @@ export interface AlertRecord extends RecordModel {
// user: string
}
export interface AlertsHistoryRecord extends RecordModel {
alert: string
user: string
system: string
name: string
val: number
created: string
resolved?: string | null
}
export type ChartTimes = "1h" | "12h" | "24h" | "1w" | "30d"
export interface ChartTimeData {
@@ -211,14 +218,14 @@ export interface ChartTimeData {
}
}
export type UserSettings = {
export interface UserSettings {
// lang?: string
chartTime: ChartTimes
emails?: string[]
webhooks?: string[]
unitTemp?: TemperatureUnit
unitNet?: DataUnit
unitDisk?: DataUnit
unitTemp?: Unit
unitNet?: Unit
unitDisk?: Unit
}
type ChartDataContainer = {

View File

@@ -91,6 +91,7 @@ module.exports = {
},
},
plugins: [
require("@tailwindcss/container-queries"),
require("tailwindcss-animate"),
require("tailwindcss-rtl"),
function ({ addVariant }) {

View File

@@ -3,8 +3,8 @@ package beszel
import "github.com/blang/semver"
const (
Version = "0.12.0-beta2"
Version = "0.12.0"
AppName = "beszel"
)
var MinVersionCbor = semver.MustParse("0.12.0-beta2")
var MinVersionCbor = semver.MustParse("0.12.0")

View File

@@ -27,7 +27,7 @@ It has a friendly web interface, simple configuration, and is ready to use out o
Beszel consists of two main components: the **hub** and the **agent**.
- **Hub**: A web application built on [PocketBase](https://pocketbase.io/) that provides a dashboard for viewing and managing connected systems.
- **Agent**: Runs on each system you want to monitor, creating a minimal SSH server to communicate system metrics to the hub.
- **Agent**: Runs on each system you want to monitor and communicates system metrics to the hub.
## Getting started
@@ -46,6 +46,7 @@ The [quick start guide](https://beszel.dev/guide/getting-started) and other docu
- **Disk usage** - Host system. Supports multiple partitions and devices.
- **Disk I/O** - Host system. Supports multiple partitions and devices.
- **Network usage** - Host system and containers.
- **Load average** - Host system.
- **Temperature** - Host system sensors.
- **GPU usage / temperature / power draw** - Nvidia and AMD only. Must use binary agent.

View File

@@ -1,605 +0,0 @@
param (
[switch]$Elevated,
[Parameter(Mandatory=$true)]
[string]$Key,
[Parameter(Mandatory=$true)]
[string]$Token,
[Parameter(Mandatory=$true)]
[string]$Url,
[int]$Port = 45876,
[string]$AgentPath = "",
[string]$NSSMPath = ""
)
# Check if required parameters are provided
if ([string]::IsNullOrWhiteSpace($Key)) {
Write-Host "ERROR: SSH Key is required." -ForegroundColor Red
Write-Host "Usage: .\install-agent.ps1 -Key 'your-ssh-key-here' -Token 'your-token-here' -Url 'your-hub-url-here' [-Port port-number]" -ForegroundColor Yellow
exit 1
}
if ([string]::IsNullOrWhiteSpace($Token)) {
Write-Host "ERROR: Token is required." -ForegroundColor Red
Write-Host "Usage: .\install-agent.ps1 -Key 'your-ssh-key-here' -Token 'your-token-here' -Url 'your-hub-url-here' [-Port port-number]" -ForegroundColor Yellow
exit 1
}
if ([string]::IsNullOrWhiteSpace($Url)) {
Write-Host "ERROR: Hub URL is required." -ForegroundColor Red
Write-Host "Usage: .\install-agent.ps1 -Key 'your-ssh-key-here' -Token 'your-token-here' -Url 'your-hub-url-here' [-Port port-number]" -ForegroundColor Yellow
exit 1
}
# Stop on first error
$ErrorActionPreference = "Stop"
#region Utility Functions
# Function to check if running as admin
function Test-Admin {
return ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
# Function to check if a command exists
function Test-CommandExists {
param (
[Parameter(Mandatory=$true)]
[string]$Command
)
return (Get-Command $Command -ErrorAction SilentlyContinue)
}
# Function to find beszel-agent in common installation locations
function Find-BeszelAgent {
# First check if it's in PATH
$agentCmd = Get-Command "beszel-agent" -ErrorAction SilentlyContinue
if ($agentCmd) {
return $agentCmd.Source
}
# Common installation paths to check
$commonPaths = @(
"$env:USERPROFILE\scoop\apps\beszel-agent\current\beszel-agent.exe",
"$env:ProgramData\scoop\apps\beszel-agent\current\beszel-agent.exe",
"$env:LOCALAPPDATA\Microsoft\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"$env:ProgramFiles\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"${env:ProgramFiles(x86)}\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"$env:ProgramFiles\beszel-agent\beszel-agent.exe",
"$env:ProgramFiles(x86)\beszel-agent\beszel-agent.exe",
"$env:SystemDrive\Users\*\scoop\apps\beszel-agent\current\beszel-agent.exe"
)
foreach ($path in $commonPaths) {
# Handle wildcard paths
if ($path.Contains("*")) {
$foundPaths = Get-ChildItem -Path $path -ErrorAction SilentlyContinue
if ($foundPaths) {
return $foundPaths[0].FullName
}
} else {
if (Test-Path $path) {
return $path
}
}
}
return $null
}
# Function to find NSSM in common installation locations
function Find-NSSM {
# First check if it's in PATH
$nssmCmd = Get-Command "nssm" -ErrorAction SilentlyContinue
if ($nssmCmd) {
return $nssmCmd.Source
}
# Common installation paths to check
$commonPaths = @(
"$env:USERPROFILE\scoop\apps\nssm\current\nssm.exe",
"$env:ProgramData\scoop\apps\nssm\current\nssm.exe",
"$env:LOCALAPPDATA\Microsoft\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"$env:ProgramFiles\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"${env:ProgramFiles(x86)}\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"$env:SystemDrive\Users\*\scoop\apps\nssm\current\nssm.exe"
)
foreach ($path in $commonPaths) {
# Handle wildcard paths
if ($path.Contains("*")) {
$foundPaths = Get-ChildItem -Path $path -ErrorAction SilentlyContinue
if ($foundPaths) {
return $foundPaths[0].FullName
}
} else {
if (Test-Path $path) {
return $path
}
}
}
return $null
}
#endregion
#region Installation Methods
# Function to install Scoop
function Install-Scoop {
Write-Host "Installing Scoop..."
# Check if running as admin - Scoop should not be installed as admin
if (Test-Admin) {
throw "Scoop cannot be installed with administrator privileges. Please run this script as a regular user first to install Scoop and beszel-agent, then run as admin to configure the service."
}
try {
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
if (-not (Test-CommandExists "scoop")) {
throw "Failed to install Scoop - command not available after installation"
}
Write-Host "Scoop installed successfully."
}
catch {
throw "Failed to install Scoop: $($_.Exception.Message)"
}
}
# Function to install Git via Scoop
function Install-Git {
if (Test-CommandExists "git") {
Write-Host "Git is already installed."
return
}
Write-Host "Installing Git..."
scoop install git
if (-not (Test-CommandExists "git")) {
throw "Failed to install Git"
}
}
# Function to install NSSM
function Install-NSSM {
param (
[string]$Method = "Scoop" # Default to Scoop method
)
if (Test-CommandExists "nssm") {
Write-Host "NSSM is already installed."
return
}
Write-Host "Installing NSSM..."
if ($Method -eq "Scoop") {
scoop install nssm
}
elseif ($Method -eq "WinGet") {
winget install -e --id NSSM.NSSM --accept-source-agreements --accept-package-agreements
# Refresh PATH environment variable to make NSSM available in current session
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
}
else {
throw "Unsupported installation method: $Method"
}
if (-not (Test-CommandExists "nssm")) {
throw "Failed to install NSSM"
}
}
# Function to install beszel-agent with Scoop
function Install-BeszelAgentWithScoop {
Write-Host "Adding beszel bucket..."
scoop bucket add beszel https://github.com/henrygd/beszel-scoops | Out-Null
Write-Host "Installing / updating beszel-agent..."
scoop install beszel-agent
if (-not (Test-CommandExists "beszel-agent")) {
throw "Failed to install beszel-agent"
}
return $(Join-Path -Path $(scoop prefix beszel-agent) -ChildPath "beszel-agent.exe")
}
# Function to install beszel-agent with WinGet
function Install-BeszelAgentWithWinGet {
Write-Host "Installing / updating beszel-agent..."
# Temporarily change ErrorActionPreference to allow WinGet to complete and show output
$originalErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = "Continue"
# Use call operator (&) and capture exit code properly
& winget install --exact --id henrygd.beszel-agent --accept-source-agreements --accept-package-agreements | Out-Null
$wingetExitCode = $LASTEXITCODE
# Restore original ErrorActionPreference
$ErrorActionPreference = $originalErrorActionPreference
# WinGet exit codes:
# 0 = Success
# -1978335212 (0x8A150014) = No applicable upgrade found (package is up to date)
# -1978335189 (0x8A15002B) = Another "no upgrade needed" variant
# Other codes indicate actual errors
if ($wingetExitCode -eq -1978335212 -or $wingetExitCode -eq -1978335189) {
Write-Host "Package is already up to date." -ForegroundColor Green
} elseif ($wingetExitCode -ne 0) {
Write-Host "WinGet exit code: $wingetExitCode" -ForegroundColor Yellow
}
# Refresh PATH environment variable to make beszel-agent available in current session
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
# Find the path to the beszel-agent executable
$agentPath = (Get-Command beszel-agent -ErrorAction SilentlyContinue).Source
if (-not $agentPath) {
throw "Could not find beszel-agent executable path after installation"
}
return $agentPath
}
# Function to install using Scoop
function Install-WithScoop {
param (
[string]$Key,
[int]$Port
)
try {
# Ensure Scoop is installed
if (-not (Test-CommandExists "scoop")) {
Install-Scoop | Out-Null
}
else {
Write-Host "Scoop is already installed."
}
# Install Git (required for Scoop buckets)
Install-Git | Out-Null
# Install NSSM
Install-NSSM -Method "Scoop" | Out-Null
# Install beszel-agent
$agentPath = Install-BeszelAgentWithScoop
return $agentPath
}
catch {
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Installation failed. Please check the error message above." -ForegroundColor Red
Write-Host "Press any key to exit..." -ForegroundColor Red
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit 1
}
}
# Function to install using WinGet
function Install-WithWinGet {
param (
[string]$Key,
[int]$Port
)
try {
# Install NSSM
Install-NSSM -Method "WinGet" | Out-Null
# Install beszel-agent
$agentPath = Install-BeszelAgentWithWinGet
return $agentPath
}
catch {
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Installation failed. Please check the error message above." -ForegroundColor Red
Write-Host "Press any key to exit..." -ForegroundColor Red
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
exit 1
}
}
#endregion
#region Service Configuration
# Function to install and configure the NSSM service
function Install-NSSMService {
param (
[Parameter(Mandatory=$true)]
[string]$AgentPath,
[Parameter(Mandatory=$true)]
[string]$Key,
[Parameter(Mandatory=$true)]
[string]$Token,
[Parameter(Mandatory=$true)]
[string]$HubUrl,
[Parameter(Mandatory=$true)]
[int]$Port,
[string]$NSSMPath = ""
)
Write-Host "Installing beszel-agent service..."
# Determine the NSSM executable to use
$nssmCommand = "nssm"
if ($NSSMPath -and (Test-Path $NSSMPath)) {
$nssmCommand = $NSSMPath
Write-Host "Using NSSM from: $NSSMPath"
} elseif (-not (Test-CommandExists "nssm")) {
throw "NSSM is not available in PATH and no valid NSSMPath was provided"
}
# Check if service already exists
$existingService = Get-Service -Name "beszel-agent" -ErrorAction SilentlyContinue
if ($existingService) {
Write-Host "Service already exists. Stopping and removing existing service..."
try {
& $nssmCommand stop beszel-agent
& $nssmCommand remove beszel-agent confirm
} catch {
Write-Host "Warning: Failed to remove existing service: $($_.Exception.Message)" -ForegroundColor Yellow
}
}
& $nssmCommand install beszel-agent $AgentPath
if ($LASTEXITCODE -ne 0) {
throw "Failed to install beszel-agent service"
}
Write-Host "Configuring service environment variables..."
& $nssmCommand set beszel-agent AppEnvironmentExtra "+KEY=$Key"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+TOKEN=$Token"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+HUB_URL=$HubUrl"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+PORT=$Port"
# Configure log files
$logDir = "$env:ProgramData\beszel-agent\logs"
if (-not (Test-Path $logDir)) {
New-Item -ItemType Directory -Path $logDir -Force | Out-Null
}
$logFile = "$logDir\beszel-agent.log"
& $nssmCommand set beszel-agent AppStdout $logFile
& $nssmCommand set beszel-agent AppStderr $logFile
}
# Function to configure firewall rules
function Configure-Firewall {
param (
[Parameter(Mandatory=$true)]
[int]$Port
)
# Create a firewall rule if it doesn't exist
$ruleName = "Allow beszel-agent"
$existingRule = Get-NetFirewallRule -DisplayName $ruleName -ErrorAction SilentlyContinue
# Remove existing rule if found
if ($existingRule) {
Write-Host "Removing existing firewall rule..."
try {
Remove-NetFirewallRule -DisplayName $ruleName
Write-Host "Existing firewall rule removed successfully."
} catch {
Write-Host "Warning: Failed to remove existing firewall rule: $($_.Exception.Message)" -ForegroundColor Yellow
}
}
# Create new rule with current settings
Write-Host "Creating firewall rule for beszel-agent on port $Port..."
try {
New-NetFirewallRule -DisplayName $ruleName -Direction Inbound -Action Allow -Protocol TCP -LocalPort $Port
Write-Host "Firewall rule created successfully."
} catch {
Write-Host "Warning: Failed to create firewall rule: $($_.Exception.Message)" -ForegroundColor Yellow
Write-Host "You may need to manually create a firewall rule for port $Port." -ForegroundColor Yellow
}
}
# Function to start and monitor the service
function Start-BeszelAgentService {
param (
[string]$NSSMPath = ""
)
Write-Host "Starting beszel-agent service..."
# Determine the NSSM executable to use
$nssmCommand = "nssm"
if ($NSSMPath -and (Test-Path $NSSMPath)) {
$nssmCommand = $NSSMPath
} elseif (-not (Test-CommandExists "nssm")) {
throw "NSSM is not available in PATH and no valid NSSMPath was provided"
}
& $nssmCommand start beszel-agent
$startResult = $LASTEXITCODE
# Only enter the status check loop if the NSSM start command failed
if ($startResult -ne 0) {
Write-Host "NSSM start command returned error code: $startResult" -ForegroundColor Yellow
Write-Host "This could be due to 'SERVICE_START_PENDING' state. Checking service status..."
# Allow up to 10 seconds for the service to start, checking every second
$maxWaitTime = 10 # seconds
$elapsedTime = 0
$serviceStarted = $false
while (-not $serviceStarted -and $elapsedTime -lt $maxWaitTime) {
Start-Sleep -Seconds 1
$elapsedTime += 1
$serviceStatus = & $nssmCommand status beszel-agent
if ($serviceStatus -eq "SERVICE_RUNNING") {
$serviceStarted = $true
Write-Host "Success! The beszel-agent service is now running." -ForegroundColor Green
}
elseif ($serviceStatus -like "*PENDING*") {
Write-Host "Service is still starting (status: $serviceStatus)... waiting" -ForegroundColor Yellow
}
else {
Write-Host "Warning: The service status is '$serviceStatus' instead of 'SERVICE_RUNNING'." -ForegroundColor Yellow
Write-Host "You may need to troubleshoot the service installation." -ForegroundColor Yellow
break
}
}
if (-not $serviceStarted) {
Write-Host "Service did not reach running state." -ForegroundColor Yellow
Write-Host "You can check status manually with 'nssm status beszel-agent'" -ForegroundColor Yellow
}
} else {
# NSSM start command was successful
Write-Host "Success! The beszel-agent service is running properly." -ForegroundColor Green
}
}
#endregion
#region Main Script Execution
# Check if we're running as admin
$isAdmin = Test-Admin
try {
# First: Install the agent (doesn't require admin)
if (-not $AgentPath) {
# Check for problematic case: running as admin and need Scoop
if ($isAdmin -and -not (Test-CommandExists "scoop") -and -not (Test-CommandExists "winget")) {
Write-Host "ERROR: You're running as administrator but neither Scoop nor WinGet is available." -ForegroundColor Red
Write-Host "Scoop should be installed without admin privileges." -ForegroundColor Red
Write-Host ""
Write-Host "Please either:" -ForegroundColor Yellow
Write-Host "1. Run this script again without administrator privileges" -ForegroundColor Yellow
Write-Host "2. Install WinGet and run this script again" -ForegroundColor Yellow
exit 1
}
if (Test-CommandExists "scoop") {
Write-Host "Using Scoop for installation..."
$AgentPath = Install-WithScoop -Key $Key -Port $Port
}
elseif (Test-CommandExists "winget") {
Write-Host "Using WinGet for installation..."
$AgentPath = Install-WithWinGet -Key $Key -Port $Port
}
else {
Write-Host "Neither Scoop nor WinGet is installed. Installing Scoop..."
$AgentPath = Install-WithScoop -Key $Key -Port $Port
}
}
if (-not $AgentPath) {
throw "Could not find beszel-agent executable. Make sure it was properly installed."
}
# Find NSSM path if not already provided
if (-not $NSSMPath) {
$NSSMPath = Find-NSSM
if (-not $NSSMPath -and (Test-CommandExists "nssm")) {
$NSSMPath = (Get-Command "nssm" -ErrorAction SilentlyContinue).Source
}
# If we still don't have NSSM, try to install it if we have package managers
if (-not $NSSMPath) {
if (Test-CommandExists "winget") {
Write-Host "NSSM not found. Attempting to install via WinGet..."
try {
Install-NSSM -Method "WinGet"
$NSSMPath = Find-NSSM
if (-not $NSSMPath -and (Test-CommandExists "nssm")) {
$NSSMPath = (Get-Command "nssm" -ErrorAction SilentlyContinue).Source
}
} catch {
Write-Host "Failed to install NSSM via WinGet: $($_.Exception.Message)" -ForegroundColor Yellow
}
} elseif (Test-CommandExists "scoop") {
Write-Host "NSSM not found. Attempting to install via Scoop..."
try {
Install-NSSM -Method "Scoop"
$NSSMPath = Find-NSSM
if (-not $NSSMPath -and (Test-CommandExists "nssm")) {
$NSSMPath = (Get-Command "nssm" -ErrorAction SilentlyContinue).Source
}
} catch {
Write-Host "Failed to install NSSM via Scoop: $($_.Exception.Message)" -ForegroundColor Yellow
}
}
# Final check - if we still don't have NSSM and we're admin, we have a problem
if (-not $NSSMPath -and ($isAdmin -or $Elevated)) {
throw "NSSM is required for service installation but was not found and could not be installed. Please install NSSM manually or run as a regular user to install it."
}
}
}
# Second: If we need admin rights for service installation and we don't have them, relaunch
if (-not $isAdmin -and -not $Elevated) {
Write-Host "Admin privileges required for service installation. Relaunching as admin..." -ForegroundColor Yellow
Write-Host "Check service status with 'nssm status beszel-agent'"
Write-Host "Edit service configuration with 'nssm edit beszel-agent'"
# Prepare arguments for the elevated script
$argumentList = @(
"-ExecutionPolicy", "Bypass",
"-File", "`"$PSCommandPath`"",
"-Elevated",
"-Key", "`"$Key`"",
"-Token", "`"$Token`"",
"-Url", "`"$Url`"",
"-Port", $Port,
"-AgentPath", "`"$AgentPath`""
)
# Add NSSMPath if we found it
if ($NSSMPath) {
$argumentList += "-NSSMPath"
$argumentList += "`"$NSSMPath`""
}
# Relaunch the script with the -Elevated switch and pass parameters
Start-Process powershell.exe -Verb RunAs -ArgumentList $argumentList
exit
}
# Third: If we have admin rights, install service and configure firewall
if ($isAdmin -or $Elevated) {
# Install the service
Install-NSSMService -AgentPath $AgentPath -Key $Key -Token $Token -HubUrl $Url -Port $Port -NSSMPath $NSSMPath
# Configure firewall
Configure-Firewall -Port $Port
# Start the service
Start-BeszelAgentService -NSSMPath $NSSMPath
# Pause to see results if this is an elevated window
if ($Elevated) {
Write-Host "Press any key to exit..." -ForegroundColor Cyan
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
}
}
catch {
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Installation failed. Please check the error message above." -ForegroundColor Red
# Pause if this is likely a new window
if ($Elevated -or (-not $isAdmin)) {
Write-Host "Press any key to exit..." -ForegroundColor Red
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
exit 1
}
#endregion

View File

@@ -1,757 +0,0 @@
#!/bin/sh
is_alpine() {
[ -f /etc/alpine-release ]
}
is_openwrt() {
cat /etc/os-release | grep -q "OpenWrt"
}
# If SELinux is enabled, set the context of the binary
set_selinux_context() {
# Check if SELinux is enabled and in enforcing or permissive mode
if command -v getenforce >/dev/null 2>&1; then
SELINUX_MODE=$(getenforce)
if [ "$SELINUX_MODE" != "Disabled" ]; then
echo "SELinux is enabled (${SELINUX_MODE} mode). Setting appropriate context..."
# First try to set persistent context if semanage is available
if command -v semanage >/dev/null 2>&1; then
echo "Attempting to set persistent SELinux context..."
if semanage fcontext -a -t bin_t "/opt/beszel-agent/beszel-agent" >/dev/null 2>&1; then
restorecon -v /opt/beszel-agent/beszel-agent >/dev/null 2>&1
else
echo "Warning: Failed to set persistent context, falling back to temporary context."
fi
fi
# Fall back to chcon if semanage failed or isn't available
if command -v chcon >/dev/null 2>&1; then
# Set context for both the directory and binary
chcon -t bin_t /opt/beszel-agent/beszel-agent || echo "Warning: Failed to set SELinux context for binary."
chcon -R -t bin_t /opt/beszel-agent || echo "Warning: Failed to set SELinux context for directory."
else
if [ "$SELINUX_MODE" = "Enforcing" ]; then
echo "Warning: SELinux is in enforcing mode but chcon command not found. The service may fail to start."
echo "Consider installing the policycoreutils package or temporarily setting SELinux to permissive mode."
else
echo "Warning: SELinux is in permissive mode but chcon command not found."
fi
fi
fi
fi
}
# Clean up SELinux contexts if they were set
cleanup_selinux_context() {
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
echo "Cleaning up SELinux contexts..."
# Remove persistent context if semanage is available
if command -v semanage >/dev/null 2>&1; then
semanage fcontext -d "/opt/beszel-agent/beszel-agent" 2>/dev/null || true
fi
fi
}
# Ensure the proxy URL ends with a /
ensure_trailing_slash() {
if [ -n "$1" ]; then
case "$1" in
*/) echo "$1" ;;
*) echo "$1/" ;;
esac
else
echo "$1"
fi
}
# Default values
PORT=45876
UNINSTALL=false
GITHUB_URL="https://github.com"
GITHUB_API_URL="https://api.github.com" # not blocked in China currently
GITHUB_PROXY_URL=""
KEY=""
TOKEN=""
HUB_URL=""
AUTO_UPDATE_FLAG="" # empty string means prompt, "true" means auto-enable, "false" means skip
VERSION="latest"
# Check for help flag
case "$1" in
-h | --help)
printf "Beszel Agent installation script\n\n"
printf "Usage: ./install-agent.sh [options]\n\n"
printf "Options: \n"
printf " -k : SSH key (required, or interactive if not provided)\n"
printf " -p : Port (default: $PORT)\n"
printf " -t : Token (required, or interactive if not provided)\n"
printf " -url : Hub URL (required, or interactive if not provided)\n"
printf " -v, --version : Version to install (default: latest)\n"
printf " -u : Uninstall Beszel Agent\n"
printf " --auto-update [VALUE] : Control automatic daily updates\n"
printf " VALUE can be true (enable) or false (disable). If not specified, will prompt.\n"
printf " --china-mirrors [URL] : Use GitHub proxy to resolve network timeout issues in mainland China\n"
printf " URL: optional custom proxy URL (default: https://gh.beszel.dev)\n"
printf " -h, --help : Display this help message\n"
exit 0
;;
esac
# Build sudo args by properly quoting everything
build_sudo_args() {
QUOTED_ARGS=""
while [ $# -gt 0 ]; do
if [ -n "$QUOTED_ARGS" ]; then
QUOTED_ARGS="$QUOTED_ARGS "
fi
QUOTED_ARGS="$QUOTED_ARGS'$(echo "$1" | sed "s/'/'\\\\''/g")'"
shift
done
echo "$QUOTED_ARGS"
}
# Check if running as root and re-execute with sudo if needed
if [ "$(id -u)" != "0" ]; then
if command -v sudo >/dev/null 2>&1; then
SUDO_ARGS=$(build_sudo_args "$@")
eval "exec sudo $0 $SUDO_ARGS"
else
echo "This script must be run as root. Please either:"
echo "1. Run this script as root (su root)"
echo "2. Install sudo and run with sudo"
exit 1
fi
fi
# Parse arguments
while [ $# -gt 0 ]; do
case "$1" in
-k)
shift
KEY="$1"
;;
-p)
shift
PORT="$1"
;;
-t)
shift
TOKEN="$1"
;;
-url)
shift
HUB_URL="$1"
;;
-v | --version)
shift
VERSION="$1"
;;
-u)
UNINSTALL=true
;;
--china-mirrors*)
# Check if there's a value after the = sign
if echo "$1" | grep -q "="; then
# Extract the value after =
CUSTOM_PROXY=$(echo "$1" | cut -d'=' -f2)
if [ -n "$CUSTOM_PROXY" ]; then
GITHUB_PROXY_URL="$CUSTOM_PROXY"
GITHUB_URL="$(ensure_trailing_slash "$CUSTOM_PROXY")https://github.com"
else
GITHUB_PROXY_URL="https://gh.beszel.dev"
GITHUB_URL="$GITHUB_PROXY_URL"
fi
elif [ "$2" != "" ] && ! echo "$2" | grep -q '^-'; then
# use custom proxy URL provided as next argument
GITHUB_PROXY_URL="$2"
GITHUB_URL="$(ensure_trailing_slash "$2")https://github.com"
shift
else
# No value specified, use default
GITHUB_PROXY_URL="https://gh.beszel.dev"
GITHUB_URL="$GITHUB_PROXY_URL"
fi
;;
--auto-update*)
# Check if there's a value after the = sign
if echo "$1" | grep -q "="; then
# Extract the value after =
AUTO_UPDATE_VALUE=$(echo "$1" | cut -d'=' -f2)
if [ "$AUTO_UPDATE_VALUE" = "true" ]; then
AUTO_UPDATE_FLAG="true"
elif [ "$AUTO_UPDATE_VALUE" = "false" ]; then
AUTO_UPDATE_FLAG="false"
else
echo "Invalid value for --auto-update flag: $AUTO_UPDATE_VALUE. Using default (prompt)."
fi
elif [ "$2" = "true" ] || [ "$2" = "false" ]; then
# Value provided as next argument
AUTO_UPDATE_FLAG="$2"
shift
else
# No value specified, use true
AUTO_UPDATE_FLAG="true"
fi
;;
*)
echo "Invalid option: $1" >&2
exit 1
;;
esac
shift
done
# Uninstall process
if [ "$UNINSTALL" = true ]; then
# Clean up SELinux contexts before removing files
cleanup_selinux_context
if is_alpine; then
echo "Stopping and disabling the agent service..."
rc-service beszel-agent stop
rc-update del beszel-agent default
echo "Removing the OpenRC service files..."
rm -f /etc/init.d/beszel-agent
# Remove the update service if it exists
echo "Removing the daily update service..."
rc-service beszel-agent-update stop 2>/dev/null
rc-update del beszel-agent-update default 2>/dev/null
rm -f /etc/init.d/beszel-agent-update
# Remove log files
echo "Removing log files..."
rm -f /var/log/beszel-agent.log /var/log/beszel-agent.err
elif is_openwrt; then
echo "Stopping and disabling the agent service..."
service beszel-agent stop
service beszel-agent disable
echo "Removing the OpenWRT service files..."
rm -f /etc/init.d/beszel-agent
# Remove the update service if it exists
echo "Removing the daily update service..."
rm -f /etc/crontabs/beszel
else
echo "Stopping and disabling the agent service..."
systemctl stop beszel-agent.service
systemctl disable beszel-agent.service
echo "Removing the systemd service file..."
rm /etc/systemd/system/beszel-agent.service
# Remove the update timer and service if they exist
echo "Removing the daily update service and timer..."
systemctl stop beszel-agent-update.timer 2>/dev/null
systemctl disable beszel-agent-update.timer 2>/dev/null
rm -f /etc/systemd/system/beszel-agent-update.service
rm -f /etc/systemd/system/beszel-agent-update.timer
systemctl daemon-reload
fi
echo "Removing the Beszel Agent directory..."
rm -rf /opt/beszel-agent
echo "Removing the dedicated user for the agent service..."
killall beszel-agent 2>/dev/null
if is_alpine || is_openwrt; then
deluser beszel 2>/dev/null
else
userdel beszel 2>/dev/null
fi
echo "Beszel Agent has been uninstalled successfully!"
exit 0
fi
# Confirm the use of GitHub mirrors for downloads
if [ -n "$GITHUB_PROXY_URL" ]; then
printf "\nConfirm use of GitHub mirror (%s) for downloading beszel-agent?\nThis helps to install properly in mainland China. (Y/n): " "$GITHUB_PROXY_URL"
read USE_MIRROR
USE_MIRROR=${USE_MIRROR:-Y}
if [ "$USE_MIRROR" = "Y" ] || [ "$USE_MIRROR" = "y" ]; then
echo "Using GitHub Mirror ($GITHUB_PROXY_URL) for downloads..."
else
GITHUB_URL="https://github.com"
fi
fi
# Check if a package is installed
package_installed() {
command -v "$1" >/dev/null 2>&1
}
# Check for package manager and install necessary packages if not installed
if is_alpine; then
if ! package_installed tar || ! package_installed curl || ! package_installed coreutils; then
apk update
apk add tar curl coreutils shadow
fi
elif is_openwrt; then
if ! package_installed tar || ! package_installed curl || ! package_installed coreutils; then
opkg update
opkg install tar curl coreutils
fi
elif package_installed apt-get; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
apt-get update
apt-get install -y tar curl coreutils
fi
elif package_installed yum; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
yum install -y tar curl coreutils
fi
elif package_installed pacman; then
if ! package_installed tar || ! package_installed curl || ! package_installed sha256sum; then
pacman -Sy --noconfirm tar curl coreutils
fi
else
echo "Warning: Please ensure 'tar' and 'curl' and 'sha256sum (coreutils)' are installed."
fi
# If no SSH key is provided, ask for the SSH key interactively
if [ -z "$KEY" ]; then
printf "Enter your SSH key: "
read KEY
fi
# If no token is provided, ask for the token interactively
if [ -z "$TOKEN" ]; then
printf "Enter your token: "
read TOKEN
fi
# If no hub URL is provided, ask for the hub URL interactively
if [ -z "$HUB_URL" ]; then
printf "Enter your hub URL: "
read HUB_URL
fi
# Verify checksum
if command -v sha256sum >/dev/null; then
CHECK_CMD="sha256sum"
elif command -v md5 >/dev/null; then
CHECK_CMD="md5 -q"
else
echo "No MD5 checksum utility found"
exit 1
fi
# Create a dedicated user for the service if it doesn't exist
if is_alpine; then
if ! id -u beszel >/dev/null 2>&1; then
echo "Creating a dedicated group for the Beszel Agent service..."
addgroup beszel
echo "Creating a dedicated user for the Beszel Agent service..."
adduser -S -D -H -s /sbin/nologin -G beszel beszel
fi
# Add the user to the docker group to allow access to the Docker socket if group docker exists
if getent group docker; then
echo "Adding beszel to docker group"
usermod -aG docker beszel
fi
else
if ! id -u beszel >/dev/null 2>&1; then
echo "Creating a dedicated user for the Beszel Agent service..."
useradd --system --home-dir /nonexistent --shell /bin/false beszel
fi
# Add the user to the docker group to allow access to the Docker socket if group docker exists
if getent group docker; then
echo "Adding beszel to docker group"
usermod -aG docker beszel
fi
fi
# Create the directory for the Beszel Agent
if [ ! -d "/opt/beszel-agent" ]; then
echo "Creating the directory for the Beszel Agent..."
mkdir -p /opt/beszel-agent
chown beszel:beszel /opt/beszel-agent
chmod 755 /opt/beszel-agent
fi
# Download and install the Beszel Agent
echo "Downloading and installing the agent..."
OS=$(uname -s | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
ARCH=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/' -e 's/mips/mipsle/')
FILE_NAME="beszel-agent_${OS}_${ARCH}.tar.gz"
# Determine version to install
if [ "$VERSION" = "latest" ]; then
INSTALL_VERSION=$(curl -s "$GITHUB_API_URL""/repos/henrygd/beszel/releases/latest" | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4 | tr -d 'v')
if [ -z "$INSTALL_VERSION" ]; then
echo "Failed to get latest version"
exit 1
fi
else
INSTALL_VERSION="$VERSION"
# Remove 'v' prefix if present
INSTALL_VERSION=$(echo "$INSTALL_VERSION" | sed 's/^v//')
fi
echo "Downloading and installing agent version ${INSTALL_VERSION} from ${GITHUB_URL} ..."
# Download checksums file
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR" || exit 1
CHECKSUM=$(curl -sL "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/beszel_${INSTALL_VERSION}_checksums.txt" | grep "$FILE_NAME" | cut -d' ' -f1)
if [ -z "$CHECKSUM" ] || ! echo "$CHECKSUM" | grep -qE "^[a-fA-F0-9]{64}$"; then
echo "Failed to get checksum or invalid checksum format"
exit 1
fi
if ! curl -#L "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME" -o "$FILE_NAME"; then
echo "Failed to download the agent from ""$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME"
rm -rf "$TEMP_DIR"
exit 1
fi
if [ "$($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1)" != "$CHECKSUM" ]; then
echo "Checksum verification failed: $($CHECK_CMD "$FILE_NAME" | cut -d' ' -f1) & $CHECKSUM"
rm -rf "$TEMP_DIR"
exit 1
fi
if ! tar -xzf "$FILE_NAME" beszel-agent; then
echo "Failed to extract the agent"
rm -rf "$TEMP_DIR"
exit 1
fi
mv beszel-agent /opt/beszel-agent/beszel-agent
chown beszel:beszel /opt/beszel-agent/beszel-agent
chmod 755 /opt/beszel-agent/beszel-agent
# Set SELinux context if needed
set_selinux_context
# Cleanup
rm -rf "$TEMP_DIR"
# Check for NVIDIA GPUs and grant device permissions for systemd service
detect_nvidia_devices() {
local devices=""
for i in /dev/nvidia*; do
if [ -e "$i" ]; then
devices="${devices}DeviceAllow=$i rw\n"
fi
done
echo "$devices"
}
# Modify service installation part, add Alpine check before systemd service creation
if is_alpine; then
echo "Creating OpenRC service for Alpine Linux..."
cat >/etc/init.d/beszel-agent <<EOF
#!/sbin/openrc-run
name="beszel-agent"
description="Beszel Agent Service"
command="/opt/beszel-agent/beszel-agent"
command_user="beszel"
command_background="yes"
pidfile="/run/\${RC_SVCNAME}.pid"
output_log="/var/log/beszel-agent.log"
error_log="/var/log/beszel-agent.err"
start_pre() {
checkpath -f -m 0644 -o beszel:beszel "\$output_log" "\$error_log"
}
export PORT="$PORT"
export KEY="$KEY"
export TOKEN="$TOKEN"
export HUB_URL="$HUB_URL"
depend() {
need net
after firewall
}
EOF
chmod +x /etc/init.d/beszel-agent
rc-update add beszel-agent default
# Create log files with proper permissions
touch /var/log/beszel-agent.log /var/log/beszel-agent.err
chown beszel:beszel /var/log/beszel-agent.log /var/log/beszel-agent.err
# Start the service
rc-service beszel-agent restart
# Check if service started successfully
sleep 2
if ! rc-service beszel-agent status | grep -q "started"; then
echo "Error: The Beszel Agent service failed to start. Checking logs..."
tail -n 20 /var/log/beszel-agent.err
exit 1
fi
# Auto-update service for Alpine
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
else
printf "\nWould you like to enable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
cat >/etc/init.d/beszel-agent-update <<EOF
#!/sbin/openrc-run
name="beszel-agent-update"
description="Update beszel-agent if needed"
depend() {
need beszel-agent
}
start() {
ebegin "Checking for beszel-agent updates"
if /opt/beszel-agent/beszel-agent update | grep -q "Successfully updated"; then
rc-service beszel-agent restart
fi
eend $?
}
EOF
chmod +x /etc/init.d/beszel-agent-update
rc-update add beszel-agent-update default
rc-service beszel-agent-update start
printf "\nAutomatic daily updates have been enabled.\n"
;;
esac
# Check service status
if ! rc-service beszel-agent status >/dev/null 2>&1; then
echo "Error: The Beszel Agent service is not running."
rc-service beszel-agent status
exit 1
fi
elif is_openwrt; then
echo "Creating procd init script service for OpenWRT..."
cat >/etc/init.d/beszel-agent <<EOF
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
start_service() {
procd_open_instance
procd_set_param command /opt/beszel-agent/beszel-agent
procd_set_param user beszel
procd_set_param pidfile /var/run/beszel-agent.pid
procd_set_param env PORT="$PORT"
procd_set_param env KEY="$KEY"
procd_set_param env TOKEN="$TOKEN"
procd_set_param env HUB_URL="$HUB_URL"
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
}
stop_service() {
killall beszel-agent
}
# Extra command to trigger agent update
EXTRA_COMMANDS="update"
EXTRA_HELP=" update Update the Beszel agent"
update() {
if /opt/beszel-agent/beszel-agent update | grep -q "Successfully updated"; then
start_service
fi
}
EOF
# Enable the service
chmod +x /etc/init.d/beszel-agent
service beszel-agent enable
# Start the service
service beszel-agent restart
# Auto-update service for OpenWRT using a crontab job
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
sleep 1 # give time for the service to start
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
sleep 1 # give time for the service to start
else
printf "\nWould you like to enable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
cat >/etc/crontabs/beszel <<EOF
0 0 * * * /etc/init.d/beszel-agent update
EOF
/etc/init.d/cron restart
printf "\nAutomatic daily updates have been enabled.\n"
;;
esac
# Check service status
if ! service beszel-agent running >/dev/null 2>&1; then
echo "Error: The Beszel Agent service is not running."
service beszel-agent status
exit 1
fi
else
# Original systemd service installation code
echo "Creating the systemd service for the agent..."
# Detect NVIDIA devices and grant device permissions
NVIDIA_DEVICES=$(detect_nvidia_devices)
cat >/etc/systemd/system/beszel-agent.service <<EOF
[Unit]
Description=Beszel Agent Service
Wants=network-online.target
After=network-online.target
[Service]
Environment="PORT=$PORT"
Environment="KEY=$KEY"
Environment="TOKEN=$TOKEN"
Environment="HUB_URL=$HUB_URL"
# Environment="EXTRA_FILESYSTEMS=sdb"
ExecStart=/opt/beszel-agent/beszel-agent
User=beszel
Restart=on-failure
RestartSec=5
StateDirectory=beszel-agent
# Security/sandboxing settings
KeyringMode=private
LockPersonality=yes
NoNewPrivileges=yes
ProtectClock=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true
$(if [ -n "$NVIDIA_DEVICES" ]; then printf "%b" "# NVIDIA device permissions\n${NVIDIA_DEVICES}"; fi)
[Install]
WantedBy=multi-user.target
EOF
# Load and start the service
printf "\nLoading and starting the agent service...\n"
systemctl daemon-reload
systemctl enable beszel-agent.service
systemctl start beszel-agent.service
# Create the update script
echo "Creating the update script..."
cat >/opt/beszel-agent/run-update.sh <<'EOF'
#!/bin/sh
set -e
if /opt/beszel-agent/beszel-agent update | grep -q "Successfully updated"; then
echo "Update found, checking SELinux context."
if command -v getenforce >/dev/null 2>&1 && [ "$(getenforce)" != "Disabled" ]; then
echo "SELinux enabled, applying context..."
if command -v chcon >/dev/null 2>&1; then
chcon -t bin_t /opt/beszel-agent/beszel-agent || echo "Warning: chcon command failed to apply context."
fi
if command -v restorecon >/dev/null 2>&1; then
restorecon -v /opt/beszel-agent/beszel-agent >/dev/null 2>&1 || echo "Warning: restorecon command failed to apply context."
fi
fi
echo "Restarting beszel-agent service..."
systemctl restart beszel-agent
echo "Update process finished."
else
echo "No updates found or applied."
fi
exit 0
EOF
chown root:root /opt/beszel-agent/run-update.sh
chmod +x /opt/beszel-agent/run-update.sh
# Prompt for auto-update setup
if [ "$AUTO_UPDATE_FLAG" = "true" ]; then
AUTO_UPDATE="y"
sleep 1 # give time for the service to start
elif [ "$AUTO_UPDATE_FLAG" = "false" ]; then
AUTO_UPDATE="n"
sleep 1 # give time for the service to start
else
printf "\nWould you like to enable automatic daily updates for beszel-agent? (y/n): "
read AUTO_UPDATE
fi
case "$AUTO_UPDATE" in
[Yy]*)
echo "Setting up daily automatic updates for beszel-agent..."
# Create systemd service for the daily update
cat >/etc/systemd/system/beszel-agent-update.service <<EOF
[Unit]
Description=Update beszel-agent if needed
Wants=beszel-agent.service
[Service]
Type=oneshot
ExecStart=/opt/beszel-agent/run-update.sh
EOF
# Create systemd timer for the daily update
cat >/etc/systemd/system/beszel-agent-update.timer <<EOF
[Unit]
Description=Run beszel-agent update daily
[Timer]
OnCalendar=daily
Persistent=true
RandomizedDelaySec=4h
[Install]
WantedBy=timers.target
EOF
systemctl daemon-reload
systemctl enable --now beszel-agent-update.timer
printf "\nAutomatic daily updates have been enabled.\n"
;;
esac
# Wait for the service to start or fail
if [ "$(systemctl is-active beszel-agent.service)" != "active" ]; then
echo "Error: The Beszel Agent service is not running."
echo "$(systemctl status beszel-agent.service)"
exit 1
fi
fi
printf "\n\033[32mBeszel Agent has been installed successfully! It is now running on port $PORT.\033[0m\n"

View File

@@ -1,104 +0,0 @@
#!/bin/bash
PORT=45876
KEY=""
TOKEN=""
HUB_URL=""
usage() {
printf "Beszel Agent homebrew installation script\n\n"
printf "Usage: ./install-agent-brew.sh [options]\n\n"
printf "Options: \n"
printf " -k SSH key (required, or interactive if not provided)\n"
printf " -p Port (default: $PORT)\n"
printf " -t Token (required, or interactive if not provided)\n"
printf " -url Hub URL (required, or interactive if not provided)\n"
printf " -h, --help Display this help message\n"
exit 0
}
# Handle --help explicitly since getopts doesn't handle long options
if [ "$1" = "--help" ]; then
usage
fi
# Parse arguments (handling both short and long options)
while [ $# -gt 0 ]; do
case "$1" in
-k)
shift
KEY="$1"
;;
-p)
shift
PORT="$1"
;;
-t)
shift
TOKEN="$1"
;;
-url)
shift
HUB_URL="$1"
;;
-h | --help)
usage
;;
*)
echo "Invalid option: $1" >&2
usage
;;
esac
shift
done
# Check if brew is installed, prompt to install if not
if ! command -v brew &>/dev/null; then
read -p "Homebrew is not installed. Would you like to install it now? (y/n): " install_brew
if [[ $install_brew =~ ^[Yy]$ ]]; then
echo "Installing Homebrew..."
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# Verify installation was successful
if ! command -v brew &>/dev/null; then
echo "Homebrew installation failed. Please install manually and try again."
exit 1
fi
echo "Homebrew installed successfully."
else
echo "Homebrew is required. Please install Homebrew and try again."
exit 1
fi
fi
if [ -z "$KEY" ]; then
read -p "Enter SSH key: " KEY
fi
if [ -z "$TOKEN" ]; then
read -p "Enter token: " TOKEN
fi
if [ -z "$HUB_URL" ]; then
read -p "Enter hub URL: " HUB_URL
fi
mkdir -p ~/.config/beszel ~/.cache/beszel
echo "KEY=\"$KEY\"" >~/.config/beszel/beszel-agent.env
echo "LISTEN=$PORT" >>~/.config/beszel/beszel-agent.env
echo "TOKEN=\"$TOKEN\"" >>~/.config/beszel/beszel-agent.env
echo "HUB_URL=\"$HUB_URL\"" >>~/.config/beszel/beszel-agent.env
brew tap henrygd/beszel
brew install beszel-agent
brew services start beszel-agent
printf "\nCheck status: brew services info beszel-agent\n"
echo "Stop: brew services stop beszel-agent"
echo "Start: brew services start beszel-agent"
echo "Restart: brew services restart beszel-agent"
echo "Upgrade: brew upgrade beszel-agent"
echo "Uninstall: brew uninstall beszel-agent"
echo "View logs in ~/.cache/beszel/beszel-agent.log"
printf "Change environment variables in ~/.config/beszel/beszel-agent.env\n"

View File

@@ -2,6 +2,8 @@
PORT=45876
KEY=""
TOKEN=""
HUB_URL=""
usage() {
printf "Beszel Agent homebrew installation script\n\n"
@@ -9,36 +11,40 @@ usage() {
printf "Options: \n"
printf " -k SSH key (required, or interactive if not provided)\n"
printf " -p Port (default: $PORT)\n"
printf " -t Token (optional for backwards compatibility)\n"
printf " -url Hub URL (optional for backwards compatibility)\n"
printf " -h, --help Display this help message\n"
exit 0
}
# Handle --help explicitly since getopts doesn't handle long options
if [ "$1" = "--help" ]; then
usage
fi
# Parse arguments with getopts
while getopts "k:p:h" opt; do
case ${opt} in
k)
KEY="$OPTARG"
# Parse arguments
while [ $# -gt 0 ]; do
case "$1" in
-k)
shift
KEY="$1"
;;
p)
PORT="$OPTARG"
-p)
shift
PORT="$1"
;;
h)
-t)
shift
TOKEN="$1"
;;
-url)
shift
HUB_URL="$1"
;;
-h | --help)
usage
;;
\?)
echo "Invalid option: -$OPTARG" >&2
usage
;;
:)
echo "Option -$OPTARG requires an argument." >&2
*)
echo "Invalid option: $1" >&2
usage
;;
esac
shift
done
# Check if brew is installed, prompt to install if not
@@ -64,11 +70,20 @@ if [ -z "$KEY" ]; then
read -p "Enter SSH key: " KEY
fi
# TOKEN and HUB_URL are optional for backwards compatibility - no interactive prompts
mkdir -p ~/.config/beszel ~/.cache/beszel
echo "KEY=\"$KEY\"" >~/.config/beszel/beszel-agent.env
echo "LISTEN=$PORT" >>~/.config/beszel/beszel-agent.env
if [ -n "$TOKEN" ]; then
echo "TOKEN=\"$TOKEN\"" >>~/.config/beszel/beszel-agent.env
fi
if [ -n "$HUB_URL" ]; then
echo "HUB_URL=\"$HUB_URL\"" >>~/.config/beszel/beszel-agent.env
fi
brew tap henrygd/beszel
brew install beszel-agent
brew services start beszel-agent

View File

@@ -2,15 +2,18 @@ param (
[switch]$Elevated,
[Parameter(Mandatory=$true)]
[string]$Key,
[string]$Token = "",
[string]$Url = "",
[int]$Port = 45876,
[string]$AgentPath = "",
[string]$NSSMPath = ""
)
# Check if key is provided or empty
# Check if required parameters are provided
if ([string]::IsNullOrWhiteSpace($Key)) {
Write-Host "ERROR: SSH Key is required." -ForegroundColor Red
Write-Host "Usage: .\install-agent.ps1 -Key 'your-ssh-key-here' [-Port port-number]" -ForegroundColor Yellow
Write-Host "Usage: .\install-agent.ps1 -Key 'your-ssh-key-here' [-Token 'your-token-here'] [-Url 'your-hub-url-here'] [-Port port-number]" -ForegroundColor Yellow
Write-Host "Note: Token and Url are optional for backwards compatibility with older hub versions." -ForegroundColor Yellow
exit 1
}
@@ -302,6 +305,8 @@ function Install-NSSMService {
[string]$AgentPath,
[Parameter(Mandatory=$true)]
[string]$Key,
[string]$Token = "",
[string]$HubUrl = "",
[Parameter(Mandatory=$true)]
[int]$Port,
[string]$NSSMPath = ""
@@ -321,7 +326,24 @@ function Install-NSSMService {
# Check if service already exists
$existingService = Get-Service -Name "beszel-agent" -ErrorAction SilentlyContinue
if ($existingService) {
Write-Host "Service already exists. Stopping and removing existing service..."
Write-Host "Service already exists. Checking if path update is needed..."
# Get current service path
try {
$currentPath = & $nssmCommand get beszel-agent Application
if ($LASTEXITCODE -eq 0 -and $currentPath.Trim() -eq $AgentPath) {
Write-Host "Service already configured with correct path. Skipping service recreation." -ForegroundColor Green
return
}
Write-Host "Service path needs updating. Stopping and removing existing service..."
Write-Host " Current path: $($currentPath.Trim())"
Write-Host " New path: $AgentPath"
} catch {
Write-Host "Could not retrieve current service path, will recreate service: $($_.Exception.Message)" -ForegroundColor Yellow
Write-Host "Service path needs updating. Stopping and removing existing service..."
}
try {
& $nssmCommand stop beszel-agent
& $nssmCommand remove beszel-agent confirm
@@ -337,6 +359,8 @@ function Install-NSSMService {
Write-Host "Configuring service environment variables..."
& $nssmCommand set beszel-agent AppEnvironmentExtra "+KEY=$Key"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+TOKEN=$Token"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+HUB_URL=$HubUrl"
& $nssmCommand set beszel-agent AppEnvironmentExtra "+PORT=$Port"
# Configure log files
@@ -533,6 +557,8 @@ try {
"-File", "`"$PSCommandPath`"",
"-Elevated",
"-Key", "`"$Key`"",
"-Token", "`"$Token`"",
"-Url", "`"$Url`"",
"-Port", $Port,
"-AgentPath", "`"$AgentPath`""
)
@@ -551,7 +577,7 @@ try {
# Third: If we have admin rights, install service and configure firewall
if ($isAdmin -or $Elevated) {
# Install the service
Install-NSSMService -AgentPath $AgentPath -Key $Key -Port $Port -NSSMPath $NSSMPath
Install-NSSMService -AgentPath $AgentPath -Key $Key -Token $Token -HubUrl $Url -Port $Port -NSSMPath $NSSMPath
# Configure firewall
Configure-Firewall -Port $Port

View File

@@ -73,7 +73,10 @@ GITHUB_URL="https://github.com"
GITHUB_API_URL="https://api.github.com" # not blocked in China currently
GITHUB_PROXY_URL=""
KEY=""
TOKEN=""
HUB_URL=""
AUTO_UPDATE_FLAG="" # empty string means prompt, "true" means auto-enable, "false" means skip
VERSION="latest"
# Check for help flag
case "$1" in
@@ -83,6 +86,9 @@ case "$1" in
printf "Options: \n"
printf " -k : SSH key (required, or interactive if not provided)\n"
printf " -p : Port (default: $PORT)\n"
printf " -t : Token (optional for backwards compatibility)\n"
printf " -url : Hub URL (optional for backwards compatibility)\n"
printf " -v, --version : Version to install (default: latest)\n"
printf " -u : Uninstall Beszel Agent\n"
printf " --auto-update [VALUE] : Control automatic daily updates\n"
printf " VALUE can be true (enable) or false (disable). If not specified, will prompt.\n"
@@ -130,6 +136,18 @@ while [ $# -gt 0 ]; do
shift
PORT="$1"
;;
-t)
shift
TOKEN="$1"
;;
-url)
shift
HUB_URL="$1"
;;
-v | --version)
shift
VERSION="$1"
;;
-u)
UNINSTALL=true
;;
@@ -303,6 +321,9 @@ if [ -z "$KEY" ]; then
read KEY
fi
# TOKEN and HUB_URL are optional for backwards compatibility - no interactive prompts
# They will be set as empty environment variables if not provided
# Verify checksum
if command -v sha256sum >/dev/null; then
CHECK_CMD="sha256sum"
@@ -351,27 +372,35 @@ fi
echo "Downloading and installing the agent..."
OS=$(uname -s | sed -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
ARCH=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/')
ARCH=$(uname -m | sed -e 's/x86_64/amd64/' -e 's/armv6l/arm/' -e 's/armv7l/arm/' -e 's/aarch64/arm64/' -e 's/mips/mipsle/')
FILE_NAME="beszel-agent_${OS}_${ARCH}.tar.gz"
LATEST_VERSION=$(curl -s "$GITHUB_API_URL""/repos/henrygd/beszel/releases/latest" | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4 | tr -d 'v')
if [ -z "$LATEST_VERSION" ]; then
echo "Failed to get latest version"
exit 1
# Determine version to install
if [ "$VERSION" = "latest" ]; then
INSTALL_VERSION=$(curl -s "$GITHUB_API_URL""/repos/henrygd/beszel/releases/latest" | grep -o '"tag_name": "v[^"]*"' | cut -d'"' -f4 | tr -d 'v')
if [ -z "$INSTALL_VERSION" ]; then
echo "Failed to get latest version"
exit 1
fi
else
INSTALL_VERSION="$VERSION"
# Remove 'v' prefix if present
INSTALL_VERSION=$(echo "$INSTALL_VERSION" | sed 's/^v//')
fi
echo "Downloading and installing agent version ${LATEST_VERSION} from ${GITHUB_URL} ..."
echo "Downloading and installing agent version ${INSTALL_VERSION} from ${GITHUB_URL} ..."
# Download checksums file
TEMP_DIR=$(mktemp -d)
cd "$TEMP_DIR" || exit 1
CHECKSUM=$(curl -sL "$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/beszel_${LATEST_VERSION}_checksums.txt" | grep "$FILE_NAME" | cut -d' ' -f1)
CHECKSUM=$(curl -sL "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/beszel_${INSTALL_VERSION}_checksums.txt" | grep "$FILE_NAME" | cut -d' ' -f1)
if [ -z "$CHECKSUM" ] || ! echo "$CHECKSUM" | grep -qE "^[a-fA-F0-9]{64}$"; then
echo "Failed to get checksum or invalid checksum format"
exit 1
fi
if ! curl -#L "$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/$FILE_NAME" -o "$FILE_NAME"; then
echo "Failed to download the agent from ""$GITHUB_URL/henrygd/beszel/releases/download/v${LATEST_VERSION}/$FILE_NAME"
if ! curl -#L "$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME" -o "$FILE_NAME"; then
echo "Failed to download the agent from ""$GITHUB_URL/henrygd/beszel/releases/download/v${INSTALL_VERSION}/$FILE_NAME"
rm -rf "$TEMP_DIR"
exit 1
fi
@@ -430,6 +459,8 @@ start_pre() {
export PORT="$PORT"
export KEY="$KEY"
export TOKEN="$TOKEN"
export HUB_URL="$HUB_URL"
depend() {
need net
@@ -517,6 +548,8 @@ start_service() {
procd_set_param pidfile /var/run/beszel-agent.pid
procd_set_param env PORT="$PORT"
procd_set_param env KEY="$KEY"
procd_set_param env TOKEN="$TOKEN"
procd_set_param env HUB_URL="$HUB_URL"
procd_set_param stdout 1
procd_set_param stderr 1
procd_close_instance
@@ -593,6 +626,8 @@ After=network-online.target
[Service]
Environment="PORT=$PORT"
Environment="KEY=$KEY"
Environment="TOKEN=$TOKEN"
Environment="HUB_URL=$HUB_URL"
# Environment="EXTRA_FILESYSTEMS=sdb"
ExecStart=/opt/beszel-agent/beszel-agent
User=beszel
@@ -611,7 +646,6 @@ ProtectKernelLogs=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true
SystemCallArchitectures=native
$(if [ -n "$NVIDIA_DEVICES" ]; then printf "%b" "# NVIDIA device permissions\n${NVIDIA_DEVICES}"; fi)

View File

@@ -0,0 +1,82 @@
param (
[switch]$Elevated
)
# Beszel Agent Upgrade Wrapper
# This script downloads and executes the latest upgrade script from GitHub
$ErrorActionPreference = "Stop"
try {
Write-Host "Beszel Agent Upgrade Wrapper" -ForegroundColor Cyan
Write-Host "============================" -ForegroundColor Cyan
Write-Host ""
# Define the URL for the latest upgrade script
$scriptUrl = "https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/upgrade-agent.ps1"
$tempScriptPath = "$env:TEMP\beszel-upgrade-agent-$(Get-Date -Format 'yyyyMMdd-HHmmss').ps1"
Write-Host "Downloading latest upgrade script..." -ForegroundColor Yellow
Write-Host "From: $scriptUrl"
Write-Host "To: $tempScriptPath"
# Download the latest upgrade script
try {
Invoke-WebRequest -Uri $scriptUrl -OutFile $tempScriptPath -UseBasicParsing
Write-Host "Download completed successfully." -ForegroundColor Green
}
catch {
Write-Host "Failed to download upgrade script: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Please check your internet connection and try again." -ForegroundColor Red
exit 1
}
# Verify the script was downloaded
if (-not (Test-Path $tempScriptPath)) {
Write-Host "ERROR: Downloaded script not found at $tempScriptPath" -ForegroundColor Red
exit 1
}
Write-Host ""
Write-Host "Executing upgrade script..." -ForegroundColor Yellow
# Execute the downloaded script with the same parameters
if ($Elevated) {
& $tempScriptPath -Elevated
} else {
& $tempScriptPath
}
$scriptExitCode = $LASTEXITCODE
Write-Host ""
Write-Host "Cleaning up temporary files..." -ForegroundColor Yellow
# Clean up the temporary script
try {
Remove-Item $tempScriptPath -Force -ErrorAction SilentlyContinue
Write-Host "Cleanup completed." -ForegroundColor Green
}
catch {
Write-Host "Warning: Could not remove temporary script: $tempScriptPath" -ForegroundColor Yellow
}
# Exit with the same code as the upgrade script
exit $scriptExitCode
}
catch {
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Upgrade wrapper failed. Please check the error message above." -ForegroundColor Red
# Clean up on error
if ($tempScriptPath -and (Test-Path $tempScriptPath)) {
try {
Remove-Item $tempScriptPath -Force -ErrorAction SilentlyContinue
}
catch {
# Ignore cleanup errors
}
}
exit 1
}

View File

@@ -0,0 +1,397 @@
param (
[switch]$Elevated
)
# Stop on first error
$ErrorActionPreference = "Stop"
#region Utility Functions
# Function to check if running as admin
function Test-Admin {
return ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
# Function to check if a command exists
function Test-CommandExists {
param (
[Parameter(Mandatory=$true)]
[string]$Command
)
return (Get-Command $Command -ErrorAction SilentlyContinue)
}
# Function to find beszel-agent in common installation locations
function Find-BeszelAgent {
# First check if it's in PATH
$agentCmd = Get-Command "beszel-agent" -ErrorAction SilentlyContinue
if ($agentCmd) {
return $agentCmd.Source
}
# Common installation paths to check
$commonPaths = @(
"$env:USERPROFILE\scoop\apps\beszel-agent\current\beszel-agent.exe",
"$env:ProgramData\scoop\apps\beszel-agent\current\beszel-agent.exe",
"$env:LOCALAPPDATA\Microsoft\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"$env:ProgramFiles\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"${env:ProgramFiles(x86)}\WinGet\Packages\henrygd.beszel-agent*\beszel-agent.exe",
"$env:ProgramFiles\beszel-agent\beszel-agent.exe",
"$env:ProgramFiles(x86)\beszel-agent\beszel-agent.exe",
"$env:SystemDrive\Users\*\scoop\apps\beszel-agent\current\beszel-agent.exe"
)
foreach ($path in $commonPaths) {
# Handle wildcard paths
if ($path.Contains("*")) {
$foundPaths = Get-ChildItem -Path $path -ErrorAction SilentlyContinue
if ($foundPaths) {
return $foundPaths[0].FullName
}
} else {
if (Test-Path $path) {
return $path
}
}
}
return $null
}
# Function to find NSSM in common installation locations
function Find-NSSM {
# First check if it's in PATH
$nssmCmd = Get-Command "nssm" -ErrorAction SilentlyContinue
if ($nssmCmd) {
return $nssmCmd.Source
}
# Common installation paths to check
$commonPaths = @(
"$env:USERPROFILE\scoop\apps\nssm\current\nssm.exe",
"$env:ProgramData\scoop\apps\nssm\current\nssm.exe",
"$env:LOCALAPPDATA\Microsoft\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"$env:ProgramFiles\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"${env:ProgramFiles(x86)}\WinGet\Packages\NSSM.NSSM*\nssm.exe",
"$env:SystemDrive\Users\*\scoop\apps\nssm\current\nssm.exe"
)
foreach ($path in $commonPaths) {
# Handle wildcard paths
if ($path.Contains("*")) {
$foundPaths = Get-ChildItem -Path $path -ErrorAction SilentlyContinue
if ($foundPaths) {
return $foundPaths[0].FullName
}
} else {
if (Test-Path $path) {
return $path
}
}
}
return $null
}
#endregion
#region Upgrade Functions
# Function to upgrade beszel-agent with Scoop
function Upgrade-BeszelAgentWithScoop {
Write-Host "Upgrading beszel-agent with Scoop..."
scoop update beszel-agent
if (-not (Test-CommandExists "beszel-agent")) {
throw "Failed to upgrade beszel-agent with Scoop"
}
return $(Join-Path -Path $(scoop prefix beszel-agent) -ChildPath "beszel-agent.exe")
}
# Function to upgrade beszel-agent with WinGet
function Upgrade-BeszelAgentWithWinGet {
Write-Host "Upgrading beszel-agent with WinGet..."
# Temporarily change ErrorActionPreference to allow WinGet to complete and show output
$originalErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = "Continue"
# Use call operator (&) and capture exit code properly
& winget upgrade --exact --id henrygd.beszel-agent --accept-source-agreements --accept-package-agreements | Out-Null
$wingetExitCode = $LASTEXITCODE
# Restore original ErrorActionPreference
$ErrorActionPreference = $originalErrorActionPreference
# WinGet exit codes:
# 0 = Success
# -1978335212 (0x8A150014) = No applicable upgrade found (package is up to date)
# -1978335189 (0x8A15002B) = Another "no upgrade needed" variant
# Other codes indicate actual errors
if ($wingetExitCode -eq -1978335212 -or $wingetExitCode -eq -1978335189) {
Write-Host "Package is already up to date." -ForegroundColor Green
} elseif ($wingetExitCode -ne 0) {
Write-Host "WinGet exit code: $wingetExitCode" -ForegroundColor Yellow
}
# Refresh PATH environment variable to make beszel-agent available in current session
$env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User")
# Find the path to the beszel-agent executable
$agentPath = (Get-Command beszel-agent -ErrorAction SilentlyContinue).Source
if (-not $agentPath) {
# Try to find it using our search function
$agentPath = Find-BeszelAgent
if (-not $agentPath) {
throw "Could not find beszel-agent executable path after upgrade"
}
}
return $agentPath
}
# Function to get current service configuration
function Get-ServiceConfiguration {
param (
[string]$NSSMPath = ""
)
# Determine the NSSM executable to use
$nssmCommand = "nssm"
if ($NSSMPath -and (Test-Path $NSSMPath)) {
$nssmCommand = $NSSMPath
} elseif (-not (Test-CommandExists "nssm")) {
throw "NSSM is not available in PATH and no valid NSSMPath was provided"
}
# Check if service exists
$existingService = Get-Service -Name "beszel-agent" -ErrorAction SilentlyContinue
if (-not $existingService) {
throw "beszel-agent service does not exist. Please run the installation script first."
}
# Get current service configuration
$config = @{}
try {
# Get current application path
$currentPath = & $nssmCommand get beszel-agent Application
if ($LASTEXITCODE -eq 0) {
$config.CurrentPath = $currentPath.Trim()
}
# Get environment variables
$envVars = & $nssmCommand get beszel-agent AppEnvironmentExtra
if ($LASTEXITCODE -eq 0 -and $envVars) {
$config.EnvironmentVars = $envVars
}
Write-Host "Current service configuration retrieved successfully."
Write-Host "Current agent path: $($config.CurrentPath)"
return $config
}
catch {
throw "Failed to retrieve current service configuration: $($_.Exception.Message)"
}
}
# Function to update service path
function Update-ServicePath {
param (
[Parameter(Mandatory=$true)]
[string]$NewAgentPath,
[string]$NSSMPath = ""
)
Write-Host "Updating beszel-agent service path..."
# Determine the NSSM executable to use
$nssmCommand = "nssm"
if ($NSSMPath -and (Test-Path $NSSMPath)) {
$nssmCommand = $NSSMPath
Write-Host "Using NSSM from: $NSSMPath"
} elseif (-not (Test-CommandExists "nssm")) {
throw "NSSM is not available in PATH and no valid NSSMPath was provided"
}
# Stop the service
Write-Host "Stopping beszel-agent service..."
& $nssmCommand stop beszel-agent
if ($LASTEXITCODE -ne 0) {
Write-Host "Warning: Failed to stop service, continuing anyway..." -ForegroundColor Yellow
}
# Update the application path
& $nssmCommand set beszel-agent Application $NewAgentPath
if ($LASTEXITCODE -ne 0) {
throw "Failed to update beszel-agent service path"
}
Write-Host "Service path updated to: $NewAgentPath"
# Start the service
Write-Host "Starting beszel-agent service..."
& $nssmCommand start beszel-agent
$startResult = $LASTEXITCODE
# Only enter the status check loop if the NSSM start command failed
if ($startResult -ne 0) {
Write-Host "NSSM start command returned error code: $startResult" -ForegroundColor Yellow
Write-Host "This could be due to 'SERVICE_START_PENDING' state. Checking service status..."
# Allow up to 10 seconds for the service to start, checking every second
$maxWaitTime = 10 # seconds
$elapsedTime = 0
$serviceStarted = $false
while (-not $serviceStarted -and $elapsedTime -lt $maxWaitTime) {
Start-Sleep -Seconds 1
$elapsedTime += 1
$serviceStatus = & $nssmCommand status beszel-agent
if ($serviceStatus -eq "SERVICE_RUNNING") {
$serviceStarted = $true
Write-Host "Success! The beszel-agent service is now running with the updated path." -ForegroundColor Green
}
elseif ($serviceStatus -like "*PENDING*") {
Write-Host "Service is still starting (status: $serviceStatus)... waiting" -ForegroundColor Yellow
}
else {
Write-Host "Warning: The service status is '$serviceStatus' instead of 'SERVICE_RUNNING'." -ForegroundColor Yellow
Write-Host "You may need to troubleshoot the service installation." -ForegroundColor Yellow
break
}
}
if (-not $serviceStarted) {
Write-Host "Service did not reach running state." -ForegroundColor Yellow
Write-Host "You can check status manually with 'nssm status beszel-agent'" -ForegroundColor Yellow
}
} else {
# NSSM start command was successful
Write-Host "Success! The beszel-agent service is running with the updated path." -ForegroundColor Green
}
}
#endregion
#region Main Script Execution
# Check if we're running as admin
$isAdmin = Test-Admin
try {
Write-Host "Beszel Agent Upgrade Script" -ForegroundColor Cyan
Write-Host "===========================" -ForegroundColor Cyan
Write-Host ""
# First: Check if service exists (doesn't require admin)
$existingService = Get-Service -Name "beszel-agent" -ErrorAction SilentlyContinue
if (-not $existingService) {
Write-Host "ERROR: beszel-agent service does not exist." -ForegroundColor Red
Write-Host "Please run the installation script first before attempting to upgrade." -ForegroundColor Red
exit 1
}
# Find current NSSM and agent paths
$nssmPath = Find-NSSM
if (-not $nssmPath -and (Test-CommandExists "nssm")) {
$nssmPath = (Get-Command "nssm" -ErrorAction SilentlyContinue).Source
}
if (-not $nssmPath) {
Write-Host "ERROR: NSSM not found. Cannot manage the service without NSSM." -ForegroundColor Red
exit 1
}
# Get current service configuration (doesn't require admin)
Write-Host "Retrieving current service configuration..."
$currentConfig = Get-ServiceConfiguration -NSSMPath $nssmPath
# Upgrade the agent (doesn't require admin)
Write-Host "Upgrading beszel-agent..."
$newAgentPath = $null
if (Test-CommandExists "scoop") {
Write-Host "Using Scoop for upgrade..."
$newAgentPath = Upgrade-BeszelAgentWithScoop
}
elseif (Test-CommandExists "winget") {
Write-Host "Using WinGet for upgrade..."
$newAgentPath = Upgrade-BeszelAgentWithWinGet
}
else {
Write-Host "ERROR: Neither Scoop nor WinGet is available for upgrading." -ForegroundColor Red
exit 1
}
if (-not $newAgentPath) {
$newAgentPath = Find-BeszelAgent
if (-not $newAgentPath) {
throw "Could not find beszel-agent executable after upgrade."
}
}
Write-Host "New agent path: $newAgentPath"
# Check if the path has changed
if ($currentConfig.CurrentPath -eq $newAgentPath) {
Write-Host "Agent path has not changed. Service update not needed." -ForegroundColor Green
Write-Host "Upgrade completed successfully!" -ForegroundColor Green
exit 0
}
Write-Host "Agent path has changed from:" -ForegroundColor Yellow
Write-Host " Old: $($currentConfig.CurrentPath)" -ForegroundColor Yellow
Write-Host " New: $newAgentPath" -ForegroundColor Yellow
Write-Host ""
# If we need admin rights for service update and we don't have them, relaunch
if (-not $isAdmin -and -not $Elevated) {
Write-Host "Admin privileges required for service path update. Relaunching as admin..." -ForegroundColor Yellow
# Prepare arguments for the elevated script
$argumentList = @(
"-ExecutionPolicy", "Bypass",
"-File", "`"$PSCommandPath`"",
"-Elevated"
)
# Relaunch the script with the -Elevated switch
Start-Process powershell.exe -Verb RunAs -ArgumentList $argumentList
exit
}
# Update service path (requires admin)
if ($isAdmin -or $Elevated) {
Update-ServicePath -NewAgentPath $newAgentPath -NSSMPath $nssmPath
Write-Host ""
Write-Host "Upgrade completed successfully!" -ForegroundColor Green
Write-Host "The beszel-agent service has been updated to use the new executable path." -ForegroundColor Green
# Pause to see results if this is an elevated window
if ($Elevated) {
Write-Host ""
Write-Host "Press any key to exit..." -ForegroundColor Cyan
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
}
}
catch {
Write-Host "ERROR: $($_.Exception.Message)" -ForegroundColor Red
Write-Host "Upgrade failed. Please check the error message above." -ForegroundColor Red
# Pause if this is likely a new window
if ($Elevated -or (-not $isAdmin)) {
Write-Host "Press any key to exit..." -ForegroundColor Red
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
exit 1
}
#endregion