Compare commits

..

169 Commits

Author SHA1 Message Date
henrygd
ac1b408d5b fix translation 2025-02-27 01:07:37 -05:00
henrygd
81d3d8ba5c feat: downtime for status alerts 2025-02-27 00:35:50 -05:00
henrygd
a864b6f275 move supportstitle to global var 2025-02-26 18:58:08 -05:00
henrygd
c22b57ce67 refactor(dev): use ENV var to enable hub dev mode 2025-02-26 18:42:34 -05:00
hank
23bee0aa7c build: add go patch version in go.mod 2025-02-26 15:21:54 -05:00
henrygd
0c2629f57e i18n: update language files 2025-02-23 21:07:25 -05:00
harupong
a4b689e8f1 i18n: new Japanese translations 2025-02-23 21:05:52 -05:00
Roy W. Andersen
0c5841133b i18n: new Norwegian translations 2025-02-23 21:03:47 -05:00
henrygd
78a645fa05 i18n: Portuguese translations by PoetaGA 2025-02-23 21:02:24 -05:00
aronov
f1208a9f00 i18n: progress on Icelandic 2025-02-23 20:55:14 -05:00
Alexander Mnich
aeb5f1424b i18n: update German 2025-02-23 20:54:08 -05:00
henrygd
4a1fb513c5 i18n: update language files 2025-02-23 20:53:08 -05:00
henrygd
e5a66cc156 feat(add-system): add link to binary install docs in copy button 2025-02-23 20:39:57 -05:00
Alexander Mnich
aef3b3e610 publish docker images to ghcr.io (#615) 2025-02-22 17:58:49 -05:00
henrygd
1d13ecd8ec ui: truncate full path of host if using unix socket 2025-02-22 17:58:30 -05:00
henrygd
6404895a47 refactor: centralize chart max/avg value state to global store 2025-02-22 15:28:07 -05:00
henrygd
ba7db28e80 test(gpu): add case for AMD multi-GPU and different power property (#414) 2025-02-22 12:45:47 -05:00
henrygd
6b41a98338 gpu: add tests and refactor to support amd on windows 2025-02-21 00:56:40 -05:00
henrygd
b958e9eefe fix: agent network not set to unix if addr provided by env var 2025-02-21 00:56:22 -05:00
henrygd
baf56fe83b fix: refresh interfaces if agent starts before network online (#466) 2025-02-21 00:21:47 -05:00
henrygd
96f9128d1a agent: add lock for gatherStats 2025-02-21 00:20:41 -05:00
henrygd
1fb60e05d7 i18n: add Norwegian to web ui 2025-02-19 21:54:35 -05:00
Roy W. Andersen
a9a9a932a6 New translations (Norwegian) 2025-02-19 21:42:53 -05:00
henrygd
e0a1a49a8f chore: update language files 2025-02-19 21:06:55 -05:00
henrygd
79eb42d04d add CGO_ENABLED=0 back to docker images / goreleaser config 2025-02-19 21:05:31 -05:00
henrygd
25b70af196 feat: add unix socket support for system connections 2025-02-19 20:29:45 -05:00
henrygd
c12b27afb5 refactor: update system table and improve add-system dialog 2025-02-19 20:28:45 -05:00
henrygd
7485f79071 refactor(agent): refactor option parsing logic for agent command 2025-02-19 19:39:24 -05:00
henrygd
d170e7a00d feat(agent): NETWORK env var and support for multiple keys
- merges agent.Run with agent.NewAgent
- separates StartServer method
- bumps go version to 1.24
- add tests
2025-02-19 00:32:27 -05:00
Alexander Mnich
1a6a2a64f2 implement agent startup arguments and help message (#581) 2025-02-19 00:19:49 -05:00
henrygd
646b899851 i18n: add hungarian
Co-authored-by: mathis <37186532+maaaathis@users.noreply.github.com>
2025-02-14 21:08:49 -05:00
Roland
821e2e3a78 New translations (Hungarian)
Co-authored-by: skidoodle <contact@albert.lol>
2025-02-14 20:47:15 -05:00
ikumasudo
9be3fcb8ca New translations (Japanese) 2025-02-14 20:36:48 -05:00
henrygd
f271b5a56c issues: add note about zfs to bug report template
a
2025-02-14 14:59:04 -05:00
Kal McFate
4f80a58929 Update add-system.tsx docker-compose.yml template. (#565)
Adding `version: "3"` makes this compatible with more recent docker tools.
2025-02-13 19:52:49 -05:00
henrygd
2ab2cc83de refactor(hub): embed pocketbase fields in hub struct 2025-02-11 19:18:36 -05:00
henrygd
3376a97bea refactor(hub): replace sync.map with app.store 2025-02-11 19:18:28 -05:00
henrygd
0c54f95546 feat: auto-login if one oauth provider and password auth disabled 2025-02-11 17:44:18 -05:00
henrygd
5ea6eb08a1 feat: PRIMARY_SENSOR env var to choose dashboard temp 2025-02-11 15:11:46 -05:00
henrygd
6b2a9463ca feat: edit system dialog in dashboard 2025-02-11 14:12:25 -05:00
henrygd
a94cfff965 fix: web ui should only respond to get requests 2025-02-11 11:04:19 -05:00
Daniel Nikoloski
1f69937572 Initial beszel-hub k8s chart (#537)
* Initial beszel-hub k8s chart

* Moved beszel-hub chart in supplemental
2025-02-10 18:29:52 -05:00
henrygd
aa3de511b9 refactor: get rid of console warnings on dashboard 2025-02-08 19:40:32 -05:00
henrygd
3afab00937 feat: display peak GPU usage in dashboard 2025-02-08 19:24:38 -05:00
henrygd
e6054058b9 feat: add temperatures to dashboard
- Refactor temperature related code and move to standalone function
2025-02-07 21:27:15 -05:00
Henry Dollman
31d52d5e15 update style of add system dialog 2025-02-06 20:01:04 -05:00
Venipa
44d930a700 feat(AddAgent): added docker run command copy (#534) 2025-02-06 19:41:01 -05:00
Henry Dollman
d7ada1b1c5 add manifest.json with icon for home screen (closes #525) 2025-02-05 20:27:23 -05:00
Henry Dollman
1daf35406a auth: ensure realtime subscriptions are cleared on logout 2025-02-05 20:24:39 -05:00
Henry Dollman
2216e40f04 chore: update go and js deps 2025-02-05 20:22:37 -05:00
Henry Dollman
f4480c7aa7 refactor: updateSystemList function 2025-02-05 20:21:57 -05:00
ompathak2004
5b478c11eb fix: prevent multiple concurrent fetches in updateSystemList function
fix: correctly reset isFetchingSystems flag in updateSystemList function
2025-02-05 19:04:18 -05:00
Henry Dollman
58085bf300 feature: support serving from subpath (#33)
Co-authored-by: Karthik T <karthikt.holmes+github@gmail.com>
2025-02-04 21:22:40 -05:00
Henry Dollman
ce171cf375 systemd: remove ProtectKernel=yes from unit file (invalid option) 2025-02-03 19:12:33 -05:00
Daniel Lo Nigro
e689f547ef Create Debian package for beszel-agent (#497)
* Add Debian package to build

Signed-off-by: Daniel Lo Nigro <git@d.sb>

* Fix Lintian issues

Signed-off-by: Daniel Lo Nigro <git@d.sb>

* - Add prerm script to stop and disable service
- Add security/sandboxing options to systemd unit

Signed-off-by: Daniel Lo Nigro <git@d.sb>

---------

Signed-off-by: Daniel Lo Nigro <git@d.sb>
2025-02-03 19:08:01 -05:00
Henry Dollman
5a8e8c1512 agent-install: add security options to systemd unit file 2025-02-03 19:06:03 -05:00
Henry Dollman
ff5eb07716 users: remove unused username field and require email (#24) 2025-02-03 18:29:02 -05:00
Henry Dollman
fdbbbc77b0 auth-form: red field border on error + firefox ux improvement (#24) 2025-02-03 17:59:39 -05:00
ompathak2004
20cba1b695 feat: update password max length to 72 characters 2025-02-04 01:48:25 +05:30
Henry Dollman
207d58a07e build: remove CGO_ENABLED=0 from docker build 2025-01-31 17:33:49 -05:00
Henry Dollman
0759a3607c supress pocketbase auto cancellation error 2025-01-31 17:16:21 -05:00
Henry Dollman
0b4742d064 update instructions for resetting password via docker 2025-01-31 15:19:18 -05:00
Henry Dollman
4557f18195 fix: only show GPU power chart if power data exists 2025-01-30 20:30:40 -05:00
Henry Dollman
83668e5727 fix(gpu): handle power for dedicated amd gpus (#414) 2025-01-30 20:28:31 -05:00
Henry Dollman
120aff0d18 config: prefix environment variables with BESZEL_AGENT_ (#502) 2025-01-29 20:13:07 -05:00
Henry Dollman
7170b24160 config: prefix environment variables with BESZEL_HUB_ (#502) 2025-01-29 19:25:12 -05:00
Henry Dollman
3441b39a02 update password reset instructions 2025-01-29 18:55:17 -05:00
Henry Dollman
31d306f8be Merge branch 'jetson' 2025-01-24 23:21:48 -05:00
hank
76347f25e5 fix(gpu): prevent nvidia-smi from running on tegra devices 2025-01-24 23:12:39 -05:00
hank
c157f38957 gpu: Add closure for Jetson and improve compatibility 2025-01-24 22:07:37 -05:00
Links
d185dfdef8 get Jetson GPU Information 2025-01-24 19:17:33 -05:00
hank
319a9895b0 New Crowdin updates (#462)
* New translations en.po (Korean)

* New translations en.po (Hungarian)

* New translations en.po (Chinese Traditional, Hong Kong)

Co-authored-by: skidoodle <contact@albert.lol>
Co-authored-by: Tony <TonyRL@users.noreply.github.com>
Co-authored-by: aroxu <30624945+aroxu@users.noreply.github.com>
2025-01-23 22:34:24 -05:00
Mikael Silvén
68dae3967d feat(release): add riscv agent builds to goreleaser config (#480)
This change adds a riscv build config to for the agent to goreleaser.
As far as I am aware, only freebsd and linux supports this, so ignore
mac and windows.
2025-01-23 15:54:10 -05:00
Henry Dollman
0a331524cc feat(release): add windows agent to goreleaser config 2025-01-22 16:19:33 -05:00
Henry Dollman
5b625db57c fix(systemd): Ensure agent starts after network is online (#466) 2025-01-21 20:25:07 -05:00
Henry Dollman
0943e01b71 feat(install): Default to gh.beszel.dev GitHub proxy for mainland China
- also removes CHINA_MAINLAND variable
2025-01-21 20:20:36 -05:00
Henry Dollman
cfda7d0740 Merge branch 'main' of https://github.com/Oaklight/beszel 2025-01-21 18:51:34 -05:00
Henry Dollman
4e3d198b7b fix(navigation): Update systems collection link to use collection name 2025-01-21 18:21:46 -05:00
Henry Dollman
a6a9719565 config(issues): Remove alternatives field in feature request 2025-01-20 13:22:23 -05:00
Peng Ding
ddb4f1c8f8 fix compatibility issue with sh. 2025-01-20 05:38:50 -06:00
Peng Ding
55d13c551a Enhance proxy handling in install scripts for GitHub mirrors 2025-01-20 05:27:58 -06:00
hank
fef30b1750 config(issues): Remove report vuln link since it's added automatically 2025-01-19 20:18:36 -05:00
hank
0cee9e4e4b docs(config): Update issue and discussion templates 2025-01-19 20:14:50 -05:00
hank
90378d09a3 Merge branch 'main' of https://github.com/svenvg93/beszel 2025-01-19 20:09:51 -05:00
Henry Dollman
7adf7ef549 config(goreleaser): rm CGO_ENABLED=0 and set releases to draft by default 2025-01-18 19:01:09 -05:00
Henry Dollman
ee6a456b66 chore(install-agent): formatting + rm unused variable 2025-01-18 18:09:02 -05:00
Nicolás Martínez Van der Looven
4789f48ad0 Add OpenWRT support for binary quick script installation (#445) 2025-01-18 17:41:21 -05:00
Sven van Ginkel
ea098fd61c Remove label 2025-01-18 10:16:25 +01:00
Sven van Ginkel
e7c214799a Add OS option 2025-01-18 10:16:01 +01:00
Sven van Ginkel
9cabc103e5 Add Templates 2025-01-18 10:12:28 +01:00
hank
be955e0122 New Crowdin updates (#409)
* New translations en.po (Italian)

* New translations en.po (Korean)

Co-authored-by: davtur19 <dav.tur19@gmail.com>
Co-authored-by: aroxu <30624945+aroxu@users.noreply.github.com>
2025-01-17 16:49:33 -05:00
Henry Dollman
8a0f2d61a8 style(auth-form): remove redundant placeholder class from password inputs 2025-01-17 16:45:12 -05:00
Alexander Mnich
48ed4abc02 remove lowercase of placeholders in auth-form 2025-01-17 11:46:59 +00:00
Henry Dollman
e8c680bda7 refactor: streamline key retrieval logic in agent.go 2025-01-16 17:49:20 -05:00
Henry Dollman
37c7a32c10 add funding.yml 2025-01-16 17:48:49 -05:00
Ben Morgenstren
1c4533f1f2 adding reading agent ssh key from file 2025-01-14 22:13:36 -05:00
Henry Dollman
5d88599c9a beszel-agent-update.service: avoid non-zero exit status and add logging (#397) 2025-01-14 20:31:50 -05:00
Henry Dollman
73427306d1 add zh-tw 2025-01-14 19:56:36 -05:00
hank
f24a7313d6 New Crowdin updates (#404)
* New translations en.po (Chinese Traditional)

Co-authored-by: Kin Lo <kinabcd@gmail.com>
2025-01-14 12:13:19 -05:00
Henry Dollman
ad55d1ca88 add Bulgarian and update locale references 2025-01-13 19:26:01 -05:00
hank
9c669d8833 New Crowdin updates (#372)
* New translations en.po (Bulgarian)

* New translations en.po (German)

Co-authored-by: vetyp <176803899+vetyp@users.noreply.github.com>
2025-01-10 15:39:01 -05:00
Henry Dollman
81fa4f16d6 ui: grey meters in systems table if system is not up (#370) 2025-01-06 13:22:51 -05:00
Henry Dollman
40cc1a875e release 0.9.1 2025-01-05 18:03:03 -05:00
Henry Dollman
1ac165d7d3 include stats in error log when encoding stats fails 2025-01-05 17:58:38 -05:00
Henry Dollman
9619e6cf89 update go dependencies 2025-01-05 17:57:43 -05:00
Henry Dollman
fc31cefd4c update initial settings with minimum log level and use new SetRandomPassword method 2025-01-05 17:56:42 -05:00
Henry Dollman
5fd9010b39 add slovenian and danish 2025-01-05 17:43:19 -05:00
hank
c2e3dd5ab1 New Crowdin updates (#352)
* New translations en.po (French)

* New translations en.po (Polish)

* New translations en.po (Spanish)

* New translations en.po (Danish)

Co-authored-by: Morten Johansen <mj@emsg.net>
Co-authored-by: Kamil <32385799+nkkfs@users.noreply.github.com>
2025-01-05 17:13:25 -05:00
Henry Dollman
8e531e6b3c fix: handle duplicate GPU names (#361) 2025-01-05 16:40:22 -05:00
Henry Dollman
527e6b57d5 remove CGO_ENABLED from build commands in Makefile 2025-01-05 12:27:53 -05:00
Chuangbo Li
245fa538e9 chore: upgrade gopsutil to fix memory leak on ARM Mac (#367) 2025-01-04 18:16:57 -05:00
Henry Dollman
e14a851398 fix: armv6l detection in install-agent script (#364) 2025-01-02 17:10:21 -05:00
Chuangbo Li
0c9bc47a3a refactor: simplify startSystemUpdateTicker using time.Tick (#347)
According to the Go 1.23 documentation, the garbage collector can now recover unreferenced tickers created with time.Tick, making time.NewTicker method unnecessary in most cases.

Reference:

* time.Tick: https://pkg.go.dev/time#Tick
2024-12-28 17:07:32 -05:00
Chuangbo Li
19b4477a75 fix: json.Unmarshal not resetting struct fields (#345)
The json.Unmarshal function was not properly resetting the Stats struct fields between iterations in the loop. This caused incorrect values to be retained from previous iterations, leading to unexpected behavior.

This commit fixes the issue by zero the struct in each loop iteration, ensures that each unmarshaling operation starts with a clean struct, preventing value carryover.
2024-12-28 17:06:37 -05:00
hank
558d051c42 New Crowdin updates (#330)
* New translations en.po (Slovenian)
* New translations en.po (Swedish)
* New translations en.po (Ukrainian)

Co-authored-by: thehijacker <thehijacker@gmail.com>
Co-authored-by: stanol <stanol777@gmail.com>
2024-12-27 11:11:05 -05:00
Arsierl
9c8528bae1 Update install-agent.sh script to support Alpine (OpenRC) (#320)
* Partial amendment

* Update install-agent.sh

* Update install-agent.sh

Fix if is_alpine function with user creation and permission issues

* Update install-agent.sh

Adding an Uninstallation Process to Alpine
Using deluser instead of userdel in Alpine
2024-12-18 17:41:15 -05:00
Henry Dollman
229ef19376 update readme 2024-12-17 20:00:16 -05:00
Henry Dollman
e5fb4d611a release 0.9.0 2024-12-17 18:55:02 -05:00
Henry Dollman
bc9dc9704c remove log from initial-settings migration 2024-12-17 18:54:52 -05:00
Henry Dollman
e88eb1a884 update docs link in command palette 2024-12-17 17:42:58 -05:00
Henry Dollman
d8f3206e8b update go dependencies 2024-12-17 17:25:01 -05:00
Henry Dollman
729d306157 update js dependencies 2024-12-17 17:24:38 -05:00
Henry Dollman
c35df48754 update language files 2024-12-17 17:20:44 -05:00
hank
0f97f37a79 New Crowdin updates (#329)
* New translations en.po (Russian)

* New translations en.po (Turkish)

* New translations en.po (Ukrainian)

* New translations en.po (Czech)

* New translations en.po (French)

* New translations en.po (Spanish)

* New translations en.po (Arabic)

* New translations en.po (German)

* New translations en.po (Italian)

* New translations en.po (Japanese)

* New translations en.po (Korean)

* New translations en.po (Dutch)

* New translations en.po (Polish)

* New translations en.po (Portuguese)

* New translations en.po (Chinese Simplified)

* New translations en.po (Vietnamese)

* New translations en.po (Croatian)

* New translations en.po (Chinese Traditional, Hong Kong)

* New translations en.po (Persian)
2024-12-17 17:17:33 -05:00
Henry Dollman
b08219dacf refactor agent gpu code to make it easier to add intel / jetson 2024-12-17 17:12:58 -05:00
Henry Dollman
dd10fb97c0 web ui style tweaks 2024-12-17 15:47:49 -05:00
Henry Dollman
87354df2de update po files, add farsi and swedish 2024-12-17 15:36:09 -05:00
hank
1bd04498b9 New Crowdin updates (#322) 2024-12-17 15:31:28 -05:00
Henry Dollman
52394bc99b update security policy 2024-12-16 14:42:10 -05:00
Henry Dollman
add85e9747 add generate-locales to makefile 2024-12-16 13:48:17 -05:00
Henry Dollman
e82986adff add dev tasks to makefile 2024-12-15 15:35:16 -05:00
Henry Dollman
f201267e4e generate first user username from email 2024-12-09 17:34:04 -05:00
Henry Dollman
9db41f8830 update translations 2024-12-09 17:29:03 -05:00
Henry Dollman
ba64c59632 add autoComplete="off" to login honeypot field 2024-12-09 17:07:43 -05:00
Henry Dollman
d2626d8337 update translations 2024-12-09 17:04:40 -05:00
hank
ded1090190 New Crowdin updates (#318)
* New translations en.po (Arabic)

* New translations en.po (Dutch)

Co-authored-by: Mathy Vandersmissen <mathy.vds@gmail.com>
2024-12-09 16:24:45 -05:00
hank
1114baaaa0 New Crowdin updates (#313)
* New translations en.po (German)

* New translations en.po (Czech)

Co-authored-by: doluk <69309597+doluk@users.noreply.github.com>
Co-authored-by: NickAss512 <143963746+NickAss512@users.noreply.github.com>
2024-12-08 18:18:53 -05:00
Henry Dollman
cf13c1c671 Merge branch '0xMMMMMM-main' 2024-12-08 18:09:20 -05:00
Henry Dollman
e70de6a59e systems table updates
- component refactoring
- style updates for "view" menu and grid
2024-12-08 18:08:54 -05:00
0xMMMMMM
5110eaf10f refactor: reorganize systems table options into single dropdown
Combines view type, sort by and visible fields into a single dropdown menu for better organization.
2024-12-08 06:26:12 +07:00
0xMMMMMM
0234682720 feat: add grid view option for systems table
- Add toggle button to switch between table and grid layouts
- Implement card-based grid view with system metrics
- Add sort dropdown menu for grid view
- Display system status, metrics with icons and labels
- Improve handling of long system names
- Maintain consistent sorting and filtering between views
- Persist view preference in localStorage
2024-12-06 15:09:37 +07:00
Henry Dollman
80a7322fa1 update readme screenshot 2024-12-04 18:10:27 -05:00
Henry Dollman
59bdc0ce0d add USER_CREATION env var and update migrations 2024-12-04 17:36:36 -05:00
Spedon
a288d0925b chore: enhance script usability (#311)
- Add a `RestartSec` directive to the service configuration for both agent and hub scripts

Signed-off-by: Spedon Wen <realsped0n@outlook.com>
2024-12-03 17:29:19 -05:00
hank
e7d2f0d82b New Crowdin updates (#308)
* New translations en.po

Co-authored-by: NickAss512 <143963746+NickAss512@users.noreply.github.com>
2024-12-02 15:14:20 -05:00
Henry Dollman
825d8269ff add Czech language and update locale files 2024-12-01 18:21:34 -05:00
hank
f7775d173a New Crowdin updates (#301)
* New translations en.po (Turkish)

* New translations en.po (Czech)

Co-authored-by: Ramazan Sancar <ramazansancar4545@gmail.com>
Co-authored-by: NickAss512 <@NickAss512>
2024-12-01 16:11:25 -05:00
Henry Dollman
58bced5f09 rm 'auth providers' links - dedicated page removed from pocketbase 2024-11-29 17:24:42 -05:00
Henry Dollman
6e08507dde remove todo comments 2024-11-29 17:16:40 -05:00
Henry Dollman
617a03fc15 upgrade go deps 2024-11-29 17:08:59 -05:00
Henry Dollman
f86bda304d pocketbase js updates 2024-11-29 17:03:31 -05:00
Henry Dollman
1d414e659b use auth logos from pocketbase 2024-11-29 16:57:18 -05:00
Henry Dollman
87f7390eca use new batch api for setting global alerts 2024-11-27 17:07:44 -05:00
Henry Dollman
ed01752546 update admin creation for pocketbase 0.23.0 2024-11-27 16:32:23 -05:00
Henry Dollman
46002a2171 remove echo dependency 2024-11-24 18:34:42 -05:00
Henry Dollman
14716d36a6 refactor go code for pocketbase 0.23.0 (#300) 2024-11-24 18:15:24 -05:00
Henry Dollman
b4bc8a31aa add check / reset for invalid disk i/o rates 2024-11-24 15:56:12 -05:00
hank
b01fc316c3 New Crowdin updates (#293)
* New translations en.po (Turkish)

* New translations en.po (Russian)

* New translations en.po (Ukrainian)

Co-authored-by: zoixc <113115585+zoixc@users.noreply.github.com>
Co-authored-by: stanol <stanol777@gmail.com>
2024-11-22 13:11:26 -05:00
Henry Dollman
4479249ac7 feat: add --china-mirrors flag when locale is zh-CN in install command 2024-11-19 14:42:56 -05:00
Henry Dollman
0529837ac8 update agent install script arg parsing 2024-11-19 14:31:50 -05:00
Henry Dollman
d51ffa17ed Merge branch 'main' of https://github.com/Alice39s/beszel 2024-11-19 13:45:50 -05:00
al1cE
c434a44bc4 feat: use --china-mirrors instead of -c 2024-11-19 13:30:40 +09:00
al1cE
7b5ac23a4b feat(install): enhance install-agent.sh with China mirror support
- Add `-c` flag to use GitHub mirror (ghp.ci) for mainland China users
- Implement checksum verification for downloaded files
- Add progress bar for file downloads

This change improves installation reliability and user experience,
especially for users in regions (China mainland etc.) with limited GitHub access.
2024-11-19 12:56:35 +09:00
Henry Dollman
87ef769086 Merge branch 'main' of https://github.com/wwng2333/beszel 2024-11-17 11:23:06 -05:00
D
bcefb8e43c fix IPv6 connection problem
use net.JoinHostPort to fix ipv6 address at createSystemConnection
2024-11-17 16:34:05 +08:00
Henry Dollman
a1641c5bcc change ssh related timeouts from 5s to 4s 2024-11-15 16:29:36 -05:00
Henry Dollman
e6839480d9 use sync.Map for system connections 2024-11-15 15:35:26 -05:00
hank
4e64d9efad New Crowdin updates (#285)
* New translations en.po (Dutch)

* New translations en.po (Ukrainian)

* New translations en.po (German)

Co-authored-by: Mathy Vandersmissen <mathy.vds@gmail.com>
Co-authored-by: stanol <stanol777@gmail.com>
Co-authored-by: Henry <henry@obamium.net>
2024-11-14 15:28:38 -05:00
hank
d68f4514cc New Crowdin updates (#282)
* New translations en.po (Chinese Simplified)

Co-authored-by: Sliots <Sliots@hotmail.com>
2024-11-13 12:02:29 -05:00
133 changed files with 19105 additions and 6801 deletions

61
.github/DISCUSSION_TEMPLATE/support.yml vendored Normal file
View File

@@ -0,0 +1,61 @@
body:
- type: markdown
attributes:
value: |
### Before opening a discussion:
- Check the [common issues guide](https://beszel.dev/guide/common-issues).
- Search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
- type: textarea
id: description
attributes:
label: Description
description: A clear and concise description of the issue or question. If applicable, add screenshots to help explain your problem.
validations:
required: true
- type: input
id: system
attributes:
label: OS / Architecture
placeholder: linux/amd64 (agent), freebsd/arm64 (hub)
validations:
required: true
- type: input
id: version
attributes:
label: Beszel version
placeholder: 0.9.1
validations:
required: true
- type: dropdown
id: install-method
attributes:
label: Installation method
options:
- Docker
- Binary
- Nix
- Unraid
- Coolify
- Other (please describe above)
validations:
required: true
- type: textarea
id: config
attributes:
label: Configuration
description: Please provide any relevant service configuration
render: yaml
- type: textarea
id: hub-logs
attributes:
label: Hub Logs
description: Check the logs page in PocketBase (`/_/#/logs`) for relevant errors (copy JSON).
render: json
- type: textarea
id: agent-logs
attributes:
label: Agent Logs
description: Please provide any logs from the agent, if relevant. Use `LOG_LEVEL=debug` for more info.
render: shell

91
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,91 @@
name: 🐛 Bug report
description: Report a new bug or issue.
title: '[Bug]: '
labels: ['bug']
body:
- type: markdown
attributes:
value: |
### Thanks for taking the time to fill out this bug report!
- For more general support, please [start a support thread](https://github.com/henrygd/beszel/discussions/new?category=support).
- To request a change or feature, use the [feature request form](https://github.com/henrygd/beszel/issues/new?template=feature_request.yml).
- Please do not submit bugs that are specific to ZFS. We plan to add integration with ZFS utilities in the near future.
### Before submitting a bug report:
- Check the [common issues guide](https://beszel.dev/guide/common-issues).
- Search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
- type: textarea
id: description
attributes:
label: Description
description: Explain the issue you experienced clearly and concisely.
placeholder: I went to the coffee pot and it was empty.
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: Expected Behavior
description: In a perfect world, what should have happened?
placeholder: When I got to the coffee pot, it should have been full.
validations:
required: true
- type: textarea
id: steps-to-reproduce
attributes:
label: Steps to Reproduce
description: Describe how to reproduce the issue in repeatable steps.
placeholder: |
1. Go to the coffee pot.
2. Make more coffee.
3. Pour it into a cup.
validations:
required: true
- type: input
id: system
attributes:
label: OS / Architecture
placeholder: linux/amd64 (agent), freebsd/arm64 (hub)
validations:
required: true
- type: input
id: version
attributes:
label: Beszel version
placeholder: 0.9.1
validations:
required: true
- type: dropdown
id: install-method
attributes:
label: Installation method
default: 0
options:
- Docker
- Binary
- Nix
- Unraid
- Coolify
- Other (please describe above)
validations:
required: true
- type: textarea
id: config
attributes:
label: Configuration
description: Please provide any relevant service configuration
render: yaml
- type: textarea
id: hub-logs
attributes:
label: Hub Logs
description: Check the logs page in PocketBase (`/_/#/logs`) for relevant errors (copy JSON).
render: json
- type: textarea
id: agent-logs
attributes:
label: Agent Logs
description: Please provide any logs from the agent, if relevant. Use `LOG_LEVEL=debug` for more info.
render: shell

8
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: 💬 Support and questions
url: https://github.com/henrygd/beszel/discussions
about: Ask and answer questions here.
- name: View the Common Issues page
url: https://beszel.dev/guide/common-issues
about: Find information about commonly encountered problems.

View File

@@ -0,0 +1,18 @@
name: 🚀 Feature request
description: Request a new feature or change.
title: "[Feature]: "
labels: ["enhancement"]
body:
- type: markdown
attributes:
value: Before submitting, please search existing [issues](https://github.com/henrygd/beszel/issues) and [discussions](https://github.com/henrygd/beszel/discussions) (including closed).
- type: textarea
attributes:
label: Describe the feature you would like to see
validations:
required: true
- type: textarea
attributes:
label: Describe how you would like to see this feature implemented
validations:
required: true

1
.github/funding.yml vendored Normal file
View File

@@ -0,0 +1 @@
buy_me_a_coffee: henrygd

View File

@@ -15,9 +15,27 @@ jobs:
- image: henrygd/beszel
context: ./beszel
dockerfile: ./beszel/dockerfile_Hub
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
- image: henrygd/beszel-agent
context: ./beszel
dockerfile: ./beszel/dockerfile_Agent
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
- image: ghcr.io/${{ github.repository }}/beszel
context: ./beszel
dockerfile: ./beszel/dockerfile_Hub
registry: ghcr.io
username: ${{ github.actor }}
password_secret: GITHUB_TOKEN
- image: ghcr.io/${{ github.repository }}/beszel-agent
context: ./beszel
dockerfile: ./beszel/dockerfile_Agent
registry: ghcr.io
username: ${{ github.actor }}
password_secret: GITHUB_TOKEN
permissions:
contents: read
packages: write
@@ -57,8 +75,9 @@ jobs:
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
username: ${{ matrix.username || secrets[matrix.username_secret] }}
password: ${{ secrets[matrix.password_secret] }}
registry: ${{ matrix.registry }}
# Build and push Docker image with Buildx (don't push on PR)
# https://github.com/docker/build-push-action

View File

@@ -2,8 +2,6 @@
## Reporting a Vulnerability
If you find a vulnerability in the latest version, please email me directly at hank@henrygd.me, or [submit a private advisory](https://github.com/henrygd/beszel/security/advisories/new).
If you find a vulnerability in the latest version, please [submit a private advisory](https://github.com/henrygd/beszel/security/advisories/new).
If you submit an advisory, open an empty issue as well to let me know that you did (or email me), as I'm not sure if I get notifications for that.
If the issue is low severity (use best judgement) you may open an issue for it instead of contacting me directly.
If it's low severity (use best judgement) you may open an issue instead of an advisory.

View File

@@ -29,14 +29,22 @@ builds:
- linux
- darwin
- freebsd
- windows
goarch:
- amd64
- arm64
- arm
- mips64
- riscv64
ignore:
- goos: freebsd
goarch: arm
- goos: windows
goarch: arm
- goos: darwin
goarch: riscv64
- goos: windows
goarch: riscv64
archives:
- id: beszel
@@ -47,6 +55,10 @@ archives:
{{ .Binary }}_
{{- .Os }}_
{{- .Arch }}
format_overrides:
- goos: windows
format: zip
- id: beszel-agent
format: tar.gz
builds:
@@ -55,10 +67,52 @@ archives:
{{ .Binary }}_
{{- .Os }}_
{{- .Arch }}
# use zip for windows archives
# format_overrides:
# - goos: windows
# format: zip
nfpms:
- id: beszel-agent
package_name: beszel-agent
description: |-
Agent for Beszel
Beszel is a lightweight server monitoring platform that includes Docker
statistics, historical data, and alert functions. It has a friendly web
interface, simple configuration, and is ready to use out of the box.
It supports automatic backup, multi-user, OAuth authentication, and
API access.
maintainer: henrygd <hank@henrygd.me>
section: net
builds:
- beszel-agent
formats:
- deb
# don't think this is needed with CGO_ENABLED=0
# dependencies:
# - libc6
contents:
- src: ../supplemental/debian/beszel-agent.service
dst: lib/systemd/system/beszel-agent.service
packager: deb
- src: ../supplemental/debian/copyright
dst: usr/share/doc/beszel-agent/copyright
packager: deb
- src: ../supplemental/debian/lintian-overrides
dst: usr/share/lintian/overrides/beszel-agent
packager: deb
scripts:
postinstall: ../supplemental/debian/postinstall.sh
preremove: ../supplemental/debian/prerm.sh
postremove: ../supplemental/debian/postrm.sh
deb:
predepends:
- adduser
- debconf
scripts:
templates: ../supplemental/debian/templates
# Currently broken due to a bug in goreleaser
# https://github.com/goreleaser/goreleaser/issues/5487
#config: ../supplemental/debian/config.sh
release:
draft: true
changelog:
disable: true

View File

@@ -4,9 +4,16 @@ ARCH ?= $(shell go env GOARCH)
# Skip building the web UI if true
SKIP_WEB ?= false
.PHONY: tidy build-agent build-hub build clean lint
.PHONY: tidy build-agent build-hub build clean lint dev-server dev-agent dev-hub dev generate-locales
.DEFAULT_GOAL := build
clean:
go clean
rm -rf ./build
lint:
golangci-lint run
tidy:
go mod tidy
@@ -20,16 +27,42 @@ build-web-ui:
fi
build-agent: tidy
CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel-agent_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/agent
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel-agent_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/agent
build-hub: tidy $(if $(filter false,$(SKIP_WEB)),build-web-ui)
CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/hub
GOOS=$(OS) GOARCH=$(ARCH) go build -o ./build/beszel_$(OS)_$(ARCH) -ldflags "-w -s" beszel/cmd/hub
build: build-agent build-hub
clean:
go clean
rm -rf ./build
generate-locales:
@if [ ! -f ./site/src/locales/en/en.ts ]; then \
echo "Generating locales..."; \
command -v bun >/dev/null 2>&1 && cd ./site && bun install && bun run sync || cd ./site && npm install && npm run sync; \
fi
lint:
golangci-lint run
dev-server: generate-locales
cd ./site
@if command -v bun >/dev/null 2>&1; then \
cd ./site && bun run dev; \
else \
cd ./site && npm run dev; \
fi
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/*.go ./internal/{alerts,hub,records,users}/*.go | entr -r -s "cd ./cmd/hub && go run . serve"; \
else \
cd ./cmd/hub && go run . serve; \
fi
dev-agent:
@if command -v entr >/dev/null 2>&1; then \
find ./cmd/agent/*.go ./internal/agent/*.go | entr -r go run beszel/cmd/agent; \
else \
go run beszel/cmd/agent; \
fi
# KEY="..." make -j dev
dev: dev-server dev-hub dev-agent

View File

@@ -3,39 +3,134 @@ package main
import (
"beszel"
"beszel/internal/agent"
"flag"
"fmt"
"log"
"os"
"strings"
"golang.org/x/crypto/ssh"
)
func main() {
// handle flags / subcommands
if len(os.Args) > 1 {
switch os.Args[1] {
case "-v":
fmt.Println(beszel.AppName+"-agent", beszel.Version)
case "update":
agent.Update()
}
// cli options
type cmdOptions struct {
key string // key is the public key(s) for SSH authentication.
addr string // addr is the address or port to listen on.
}
// parseFlags parses the command line flags and populates the config struct.
func (opts *cmdOptions) parseFlags() {
flag.StringVar(&opts.key, "key", "", "Public key(s) for SSH authentication")
flag.StringVar(&opts.addr, "addr", "", "Address or port to listen on")
flag.Usage = func() {
fmt.Printf("Usage: %s [options] [subcommand]\n", os.Args[0])
fmt.Println("\nOptions:")
flag.PrintDefaults()
fmt.Println("\nSubcommands:")
fmt.Println(" version Display the version")
fmt.Println(" help Display this help message")
fmt.Println(" update Update the agent to the latest version")
}
}
// handleSubcommand handles subcommands such as version, help, and update.
// It returns true if a subcommand was handled, false otherwise.
func handleSubcommand() bool {
if len(os.Args) <= 1 {
return false
}
switch os.Args[1] {
case "version", "-v":
fmt.Println(beszel.AppName+"-agent", beszel.Version)
os.Exit(0)
case "help":
flag.Usage()
os.Exit(0)
case "update":
agent.Update()
os.Exit(0)
}
var pubKey []byte
if pubKeyEnv, exists := os.LookupEnv("KEY"); exists {
pubKey = []byte(pubKeyEnv)
} else {
log.Fatal("KEY environment variable is not set")
}
addr := ":45876"
if portEnvVar, exists := os.LookupEnv("PORT"); exists {
// allow passing an address in the form of "127.0.0.1:45876"
if !strings.Contains(portEnvVar, ":") {
portEnvVar = ":" + portEnvVar
}
addr = portEnvVar
}
agent.NewAgent().Run(pubKey, addr)
return false
}
// loadPublicKeys loads the public keys from the command line flag, environment variable, or key file.
func (opts *cmdOptions) loadPublicKeys() ([]ssh.PublicKey, error) {
// Try command line flag first
if opts.key != "" {
return agent.ParseKeys(opts.key)
}
// Try environment variable
if key, ok := agent.GetEnv("KEY"); ok && key != "" {
return agent.ParseKeys(key)
}
// Try key file
keyFile, ok := agent.GetEnv("KEY_FILE")
if !ok {
return nil, fmt.Errorf("no key provided: must set -key flag, KEY env var, or KEY_FILE env var. Use 'beszel-agent help' for usage")
}
pubKey, err := os.ReadFile(keyFile)
if err != nil {
return nil, fmt.Errorf("failed to read key file: %w", err)
}
return agent.ParseKeys(string(pubKey))
}
// getAddress gets the address to listen on from the command line flag, environment variable, or default value.
func (opts *cmdOptions) getAddress() string {
// Try command line flag first
if opts.addr != "" {
return opts.addr
}
// Try environment variables
if addr, ok := agent.GetEnv("ADDR"); ok && addr != "" {
return addr
}
// Legacy PORT environment variable support
if port, ok := agent.GetEnv("PORT"); ok && port != "" {
return port
}
return ":45876"
}
// getNetwork returns the network type to use for the server.
func (opts *cmdOptions) getNetwork() string {
if network, _ := agent.GetEnv("NETWORK"); network != "" {
return network
}
if strings.HasPrefix(opts.addr, "/") {
return "unix"
}
return "tcp"
}
func main() {
var opts cmdOptions
opts.parseFlags()
if handleSubcommand() {
return
}
flag.Parse()
opts.addr = opts.getAddress()
var serverConfig agent.ServerOptions
var err error
serverConfig.Keys, err = opts.loadPublicKeys()
if err != nil {
log.Fatal("Failed to load public keys:", err)
}
serverConfig.Addr = opts.addr
serverConfig.Network = opts.getNetwork()
agent := agent.NewAgent()
if err := agent.StartServer(serverConfig); err != nil {
log.Fatal("Failed to start server:", err)
}
}

View File

@@ -0,0 +1,302 @@
package main
import (
"crypto/ed25519"
"flag"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
)
func TestGetAddress(t *testing.T) {
tests := []struct {
name string
opts cmdOptions
envVars map[string]string
expected string
}{
{
name: "default port when no config",
opts: cmdOptions{},
expected: ":45876",
},
{
name: "use address from flag",
opts: cmdOptions{
addr: "8080",
},
expected: "8080",
},
{
name: "use unix socket from flag",
opts: cmdOptions{
addr: "/tmp/beszel.sock",
},
expected: "/tmp/beszel.sock",
},
{
name: "use ADDR env var",
opts: cmdOptions{},
envVars: map[string]string{
"ADDR": "1.2.3.4:9090",
},
expected: "1.2.3.4:9090",
},
{
name: "use legacy PORT env var",
opts: cmdOptions{},
envVars: map[string]string{
"PORT": "7070",
},
expected: "7070",
},
{
name: "use unix socket from env var",
opts: cmdOptions{
addr: "",
},
envVars: map[string]string{
"ADDR": "/tmp/beszel.sock",
},
expected: "/tmp/beszel.sock",
},
{
name: "flag takes precedence over env vars",
opts: cmdOptions{
addr: ":8080",
},
envVars: map[string]string{
"ADDR": ":9090",
"PORT": "7070",
},
expected: ":8080",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Setup environment
for k, v := range tt.envVars {
t.Setenv(k, v)
}
addr := tt.opts.getAddress()
assert.Equal(t, tt.expected, addr)
})
}
}
func TestLoadPublicKeys(t *testing.T) {
// Generate a test key
_, priv, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
signer, err := ssh.NewSignerFromKey(priv)
require.NoError(t, err)
pubKey := ssh.MarshalAuthorizedKey(signer.PublicKey())
tests := []struct {
name string
opts cmdOptions
envVars map[string]string
setupFiles map[string][]byte
wantErr bool
errContains string
}{
{
name: "load key from flag",
opts: cmdOptions{
key: string(pubKey),
},
},
{
name: "load key from env var",
envVars: map[string]string{
"KEY": string(pubKey),
},
},
{
name: "load key from file",
envVars: map[string]string{
"KEY_FILE": "testkey.pub",
},
setupFiles: map[string][]byte{
"testkey.pub": pubKey,
},
},
{
name: "error when no key provided",
wantErr: true,
errContains: "no key provided",
},
{
name: "error on invalid key file",
envVars: map[string]string{
"KEY_FILE": "nonexistent.pub",
},
wantErr: true,
errContains: "failed to read key file",
},
{
name: "error on invalid key data",
opts: cmdOptions{
key: "invalid-key-data",
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Create a temporary directory for test files
if len(tt.setupFiles) > 0 {
tmpDir := t.TempDir()
for name, content := range tt.setupFiles {
path := filepath.Join(tmpDir, name)
err := os.WriteFile(path, content, 0600)
require.NoError(t, err)
if tt.envVars != nil {
tt.envVars["KEY_FILE"] = path
}
}
}
// Set up environment
for k, v := range tt.envVars {
t.Setenv(k, v)
}
keys, err := tt.opts.loadPublicKeys()
if tt.wantErr {
assert.Error(t, err)
if tt.errContains != "" {
assert.Contains(t, err.Error(), tt.errContains)
}
return
}
require.NoError(t, err)
assert.Len(t, keys, 1)
assert.Equal(t, signer.PublicKey().Type(), keys[0].Type())
})
}
}
func TestGetNetwork(t *testing.T) {
tests := []struct {
name string
opts cmdOptions
envVars map[string]string
expected string
}{
{
name: "NETWORK env var",
envVars: map[string]string{
"NETWORK": "tcp4",
},
expected: "tcp4",
},
{
name: "only port",
opts: cmdOptions{addr: "8080"},
expected: "tcp",
},
{
name: "ipv4 address",
opts: cmdOptions{addr: "1.2.3.4:8080"},
expected: "tcp",
},
{
name: "ipv6 address",
opts: cmdOptions{addr: "[2001:db8::1]:8080"},
expected: "tcp",
},
{
name: "unix network",
opts: cmdOptions{addr: "/tmp/beszel.sock"},
expected: "unix",
},
{
name: "env var network",
opts: cmdOptions{addr: ":8080"},
envVars: map[string]string{"NETWORK": "tcp4"},
expected: "tcp4",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Setup environment
for k, v := range tt.envVars {
t.Setenv(k, v)
}
network := tt.opts.getNetwork()
assert.Equal(t, tt.expected, network)
})
}
}
func TestParseFlags(t *testing.T) {
// Save original command line arguments and restore after test
oldArgs := os.Args
defer func() {
os.Args = oldArgs
flag.CommandLine = flag.NewFlagSet(os.Args[0], flag.ExitOnError)
}()
tests := []struct {
name string
args []string
expected cmdOptions
}{
{
name: "no flags",
args: []string{"cmd"},
expected: cmdOptions{
key: "",
addr: "",
},
},
{
name: "key flag only",
args: []string{"cmd", "-key", "testkey"},
expected: cmdOptions{
key: "testkey",
addr: "",
},
},
{
name: "addr flag only",
args: []string{"cmd", "-addr", ":8080"},
expected: cmdOptions{
key: "",
addr: ":8080",
},
},
{
name: "both flags",
args: []string{"cmd", "-key", "testkey", "-addr", ":8080"},
expected: cmdOptions{
key: "testkey",
addr: ":8080",
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Reset flags for each test
flag.CommandLine = flag.NewFlagSet(tt.args[0], flag.ExitOnError)
os.Args = tt.args
var opts cmdOptions
opts.parseFlags()
flag.Parse()
assert.Equal(t, tt.expected, opts)
})
}
}

View File

@@ -1,28 +1,10 @@
package main
import (
"beszel"
"beszel/internal/hub"
_ "beszel/migrations"
"github.com/pocketbase/pocketbase"
"github.com/spf13/cobra"
)
func main() {
app := pocketbase.NewWithConfig(pocketbase.Config{
DefaultDataDir: beszel.AppName + "_data",
})
app.RootCmd.Version = beszel.Version
app.RootCmd.Use = beszel.AppName
app.RootCmd.Short = ""
// add update command
app.RootCmd.AddCommand(&cobra.Command{
Use: "update",
Short: "Update " + beszel.AppName + " to the latest version",
Run: hub.Update,
})
hub.NewHub(app).Run()
hub.NewHub().Run()
}

View File

@@ -1,104 +1,93 @@
module beszel
go 1.22.4
go 1.24.0
require (
github.com/blang/semver v3.5.1+incompatible
github.com/containrrr/shoutrrr v0.8.0
github.com/gliderlabs/ssh v0.3.7
github.com/goccy/go-json v0.10.3
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61
github.com/pocketbase/dbx v1.10.1
github.com/pocketbase/pocketbase v0.22.23
github.com/gliderlabs/ssh v0.3.8
github.com/goccy/go-json v0.10.5
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.25.0
github.com/rhysd/go-github-selfupdate v1.2.3
github.com/shirou/gopsutil/v4 v4.24.10
github.com/spf13/cast v1.7.0
github.com/shirou/gopsutil/v4 v4.25.1
github.com/spf13/cast v1.7.1
github.com/spf13/cobra v1.8.1
golang.org/x/crypto v0.28.0
github.com/stretchr/testify v1.10.0
golang.org/x/crypto v0.32.0
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c
gopkg.in/yaml.v3 v3.0.1
)
require (
github.com/AlecAivazis/survey/v2 v2.3.7 // indirect
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 // indirect
github.com/aws/aws-sdk-go-v2/config v1.28.1 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.42 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 // indirect
github.com/aws/smithy-go v1.22.0 // indirect
github.com/aws/aws-sdk-go-v2 v1.36.1 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 // indirect
github.com/aws/aws-sdk-go-v2/config v1.29.6 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.59 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 // indirect
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 // indirect
github.com/aws/smithy-go v1.22.2 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/disintegration/imaging v1.6.2 // indirect
github.com/domodwyer/mailyak/v3 v3.6.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ebitengine/purego v0.8.1 // indirect
github.com/ebitengine/purego v0.8.2 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
github.com/gabriel-vasile/mimetype v1.4.8 // indirect
github.com/ganigeorgiev/fexpr v0.4.1 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang-jwt/jwt/v5 v5.2.1 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/google/go-github/v30 v30.1.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/googleapis/gax-go/v2 v2.13.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/googleapis/gax-go/v2 v2.14.1 // indirect
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.24 // indirect
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
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.5 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/tcnksm/go-gitconfig v0.1.2 // indirect
github.com/tklauser/go-sysconf v0.3.14 // indirect
github.com/tklauser/numcpus v0.9.0 // indirect
github.com/ulikunitz/xz v0.5.12 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opencensus.io v0.24.0 // indirect
gocloud.dev v0.40.0 // indirect
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
golang.org/x/image v0.21.0 // indirect
golang.org/x/net v0.30.0 // indirect
golang.org/x/oauth2 v0.23.0 // indirect
golang.org/x/sync v0.8.0 // indirect
golang.org/x/sys v0.26.0 // indirect
golang.org/x/term v0.25.0 // indirect
golang.org/x/text v0.19.0 // indirect
golang.org/x/time v0.7.0 // indirect
golang.org/x/image v0.24.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/oauth2 v0.26.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/term v0.29.0 // indirect
golang.org/x/text v0.22.0 // indirect
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
google.golang.org/api v0.204.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
google.golang.org/grpc v1.67.1 // indirect
google.golang.org/protobuf v1.35.1 // indirect
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 // indirect
modernc.org/libc v1.61.0 // indirect
modernc.org/mathutil v1.6.0 // indirect
modernc.org/memory v1.8.0 // indirect
modernc.org/sqlite v1.33.1 // indirect
modernc.org/strutil v1.2.0 // indirect
modernc.org/token v1.1.0 // indirect
google.golang.org/api v0.220.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 // indirect
google.golang.org/grpc v1.70.0 // indirect
google.golang.org/protobuf v1.36.4 // indirect
modernc.org/libc v1.55.3 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.8.2 // indirect
modernc.org/sqlite v1.34.5 // indirect
)

View File

@@ -1,24 +1,20 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.116.0 h1:B3fRrSDkLRt5qSHWe40ERJvhvnQwdZiHu0bJOpldweE=
cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
cloud.google.com/go/auth v0.10.0 h1:tWlkvFAh+wwTOzXIjrwM64karR1iTBZ/GRr0S/DULYo=
cloud.google.com/go/auth v0.10.0/go.mod h1:xxA5AqpDrvS+Gkmo9RqrGGRh6WSNKKOXhY3zNOr38tI=
cloud.google.com/go/auth/oauth2adapt v0.2.5 h1:2p29+dePqsCHPP1bqDJcKj4qxRyYCcbzKpFyKGt3MTk=
cloud.google.com/go/auth/oauth2adapt v0.2.5/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14=
cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU=
cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0=
cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM=
cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M=
cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc=
cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0=
cloud.google.com/go/compute/metadata v0.5.2 h1:UxK4uu/Tn+I3p2dYWTfiX4wva7aYlKixAHn3fyqngqo=
cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k=
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
cloud.google.com/go/iam v1.1.13 h1:7zWBXG9ERbMLrzQBRhFliAV+kjcRToDTgQT3CTwYyv4=
cloud.google.com/go/iam v1.1.13/go.mod h1:K8mY0uSXwEXS30KrnVb+j54LB/ntfZu1dr+4zFMNbus=
cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyXFs=
cloud.google.com/go/storage v1.43.0/go.mod h1:ajvxEa7WmZS1PxvKRq4bq0tFT3vMd502JwstCcYv0Q0=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ=
github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s=
github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg=
@@ -26,44 +22,44 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/aws/aws-sdk-go-v2 v1.32.3 h1:T0dRlFBKcdaUPGNtkBSwHZxrtis8CQU17UpNBZYd0wk=
github.com/aws/aws-sdk-go-v2 v1.32.3/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6 h1:pT3hpW0cOHRJx8Y0DfJUEQuqPild8jRGmSFmBgvydr0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.6/go.mod h1:j/I2++U0xX+cr44QjHay4Cvxj6FUbnxrgmqN3H1jTZA=
github.com/aws/aws-sdk-go-v2/config v1.28.1 h1:oxIvOUXy8x0U3fR//0eq+RdCKimWI900+SV+10xsCBw=
github.com/aws/aws-sdk-go-v2/config v1.28.1/go.mod h1:bRQcttQJiARbd5JZxw6wG0yIK3eLeSCPdg6uqmmlIiI=
github.com/aws/aws-sdk-go-v2/credentials v1.17.42 h1:sBP0RPjBU4neGpIYyx8mkU2QqLPl5u9cmdTWVzIpHkM=
github.com/aws/aws-sdk-go-v2/credentials v1.17.42/go.mod h1:FwZBfU530dJ26rv9saAbxa9Ej3eF/AK0OAY86k13n4M=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18 h1:68jFVtt3NulEzojFesM/WVarlFpCaXLKaBxDpzkQ9OQ=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.18/go.mod h1:Fjnn5jQVIo6VyedMc0/EhPpfNlPl7dHV916O6B+49aE=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35 h1:ihPPdcCVSN0IvBByXwqVp28/l4VosBZ6sDulcvU2J7w=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.35/go.mod h1:JkgEhs3SVF51Dj3m1Bj+yL8IznpxzkwlA3jLg3x7Kls=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 h1:Jw50LwEkVjuVzE1NzkhNKkBf9cRN7MtE1F/b2cOKTUM=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22/go.mod h1:Y/SmAyPcOTmpeVaWSzSKiILfXTVJwrGmYZhcRbhWuEY=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 h1:981MHwBaRZM7+9QSR6XamDzF/o7ouUGxFzr+nVSIhrs=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22/go.mod h1:1RA1+aBEfn+CAB/Mh0MB6LsdCYCnjZm7tKXtnk499ZQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22 h1:yV+hCAHZZYJQcwAaszoBNwLbPItHvApxT0kVIw6jRgs=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.22/go.mod h1:kbR1TL8llqB1eGnVbybcA4/wgScxdylOdyAd51yxPdw=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0 h1:TToQNkvGguu209puTojY/ozlqy2d/SFNcoLIqTFi42g=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.0/go.mod h1:0jp+ltwkf+SwG2fm/PKo8t4y8pJSgOCO4D8Lz3k0aHQ=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3 h1:kT6BcZsmMtNkP/iYMcRG+mIEA/IbeiUimXtGmqF39y0=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.3/go.mod h1:Z8uGua2k4PPaGOYn66pK02rhMrot3Xk3tpBuUFPomZU=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3 h1:qcxX0JYlgWH3hpPUnd6U0ikcl6LLA9sLkXE2w1fpMvY=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.3/go.mod h1:cLSNEmI45soc+Ef8K/L+8sEA3A3pYFEYf5B5UI+6bH4=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3 h1:ZC7Y/XgKUxwqcdhO5LE8P6oGP1eh6xlQReWNKfhvJno=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.3/go.mod h1:WqfO7M9l9yUAw0HcHaikwRd/H6gzYdz7vjejCA5e2oY=
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2 h1:p9TNFL8bFUMd+38YIpTAXpoxyz0MxC7FlbFEH4P4E1U=
github.com/aws/aws-sdk-go-v2/service/s3 v1.66.2/go.mod h1:fNjyo0Coen9QTwQLWeV6WO2Nytwiu+cCcWaTdKCAqqE=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3 h1:UTpsIf0loCIWEbrqdLb+0RxnTXfWh2vhw4nQmFi4nPc=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.3/go.mod h1:FZ9j3PFHHAR+w0BSEjK955w5YD2UwB/l/H0yAK3MJvI=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3 h1:2YCmIXv3tmiItw0LlYf6v7gEHebLY45kBEnPezbUKyU=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.3/go.mod h1:u19stRyNPxGhj6dRm+Cdgu6N75qnbW7+QN0q0dsAk58=
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3 h1:wVnQ6tigGsRqSWDEEyH6lSAJ9OyFUsSnbaUWChuSGzs=
github.com/aws/aws-sdk-go-v2/service/sts v1.32.3/go.mod h1:VZa9yTFyj4o10YGsmDO4gbQJUvvhY72fhumT8W4LqsE=
github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM=
github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E=
github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8 h1:zAxi9p3wsZMIaVCdoiQp2uZ9k1LsZvmAnoTBeZPXom0=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.8/go.mod h1:3XkePX5dSaxveLAYY7nsbsZZrKxCyEuE5pM4ziFxyGg=
github.com/aws/aws-sdk-go-v2/config v1.29.6 h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg=
github.com/aws/aws-sdk-go-v2/config v1.29.6/go.mod h1:Ft+WLODzDQmCTHDvqAH1JfC2xxbZ0MxpZAcJqmE1LTQ=
github.com/aws/aws-sdk-go-v2/credentials v1.17.59 h1:9btwmrt//Q6JcSdgJOLI98sdr5p7tssS9yAsGe8aKP4=
github.com/aws/aws-sdk-go-v2/credentials v1.17.59/go.mod h1:NM8fM6ovI3zak23UISdWidyZuI1ghNe2xjzUZAyT+08=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 h1:KwsodFKVQTlI5EyhRSugALzsV6mG/SGrdjlMXSZSdso=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28/go.mod h1:EY3APf9MzygVhKuPXAc5H+MkGb8k/DOSQjWS0LgkKqI=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59 h1:5Vsrfdlf9KQP3leGX1dD7VwZq/3HAerEFoXAII4t6zo=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.59/go.mod h1:7XTNs3NYApJjkx6A2Fk9qq23qBuBnIU58k3fKC2Fr1I=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 h1:BjUcr3X3K0wZPGFg2bxOWW3VPN8rkE3/61zhP+IHviA=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32/go.mod h1:80+OGC/bgzzFFTUmcuwD0lb4YutwQeKLFpmt6hoWapU=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 h1:m1GeXHVMJsRsUAqG6HjZWx9dj7F5TR+cF1bjyfYyBd4=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32/go.mod h1:IitoQxGfaKdVLNg0hD8/DXmAqNy0H4K2H2Sf91ti8sI=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk=
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32 h1:OIHj/nAhVzIXGzbAE+4XmZ8FPvro3THr6NlqErJc3wY=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.32/go.mod h1:LiBEsDo34OJXqdDlRGsilhlIiXR7DL+6Cx2f4p1EgzI=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6 h1:cCBJaT7EeEojpJ4s7wTDbhZlHVJOgNHN7iw6qVurGaw=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.5.6/go.mod h1:WYH1ABybY7JK9TITPnk6ZlP7gQB8psI4c9qDmMsnLSA=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 h1:SYVGSFQHlchIcy6e7x12bsrxClCXSP5et8cqVhL8cuw=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13/go.mod h1:kizuDaLX37bG5WZaoxGPQR/LNFXpxp0vsUnqfkWXfNE=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13 h1:OBsrtam3rk8NfBEq7OLOMm5HtQ9Yyw32X4UQMya/wjw=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.13/go.mod h1:3U4gFA5pmoCOja7aq4nSaIAGbaOHv2Yl2ug018cmC+Q=
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4 h1:DJYjOvNgC30JAcDCRmtQHoYK4trc7XetDXRTEAReGKA=
github.com/aws/aws-sdk-go-v2/service/s3 v1.75.4/go.mod h1:KuLNrwYJFaC2AVZ+CVVc12k9NyqwgWsoNNHjwqF6QNk=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 h1:/eE3DogBjYlvlbhd2ssWyeuovWunHLxfgw3s/OJa4GQ=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.15/go.mod h1:2PCJYpi7EKeA5SkStAmZlF6fi0uUABuhtF8ILHjGc3Y=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 h1:M/zwXiL2iXUrHputuXgmO94TVNmcenPHxgLXLutodKE=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14/go.mod h1:RVwIw3y/IqxC2YEXSIkAzRDdEU1iRabDPaYjpGCbCGQ=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 h1:TzeR06UCMUq+KA3bDkujxK1GVGy+G8qQN/QVYzGLkQE=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.14/go.mod h1:dspXf/oYWGWo6DEvj98wpaTeqt5+DMidZD0A9BYTizc=
github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ=
github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
@@ -72,8 +68,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX
github.com/containrrr/shoutrrr v0.8.0 h1:mfG2ATzIS7NR2Ec6XL+xyoHzN97H8WPjir8aYzJUSec=
github.com/containrrr/shoutrrr v0.8.0/go.mod h1:ioyQAyu1LJY6sILuNyKaQaw+9Ttik5QePU8atnAdO2o=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI=
github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -84,8 +78,8 @@ github.com/domodwyer/mailyak/v3 v3.6.2 h1:x3tGMsyFhTCaxp6ycgR0FE/bu5QiNp+hetUuCO
github.com/domodwyer/mailyak/v3 v3.6.2/go.mod h1:lOm/u9CyCVWHeaAmHIdF4RiKVxKUT/H5XX10lIKAL6c=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ebitengine/purego v0.8.1 h1:sdRKd6plj7KYW33EH5As6YKfe8m9zbN9JMrOjNVF/BE=
github.com/ebitengine/purego v0.8.1/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z1I=
github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -97,12 +91,12 @@ github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSw
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/gabriel-vasile/mimetype v1.4.6 h1:3+PzJTKLkvgjeTbts6msPJt4DixhT4YtFNf1gtGe3zc=
github.com/gabriel-vasile/mimetype v1.4.6/go.mod h1:JX1qVKqZd40hUPpAfiNTe0Sne7hdfKSbOqqmkq8GCXc=
github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM=
github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8=
github.com/ganigeorgiev/fexpr v0.4.1 h1:hpUgbUEEWIZhSDBtf4M9aUNfQQ0BZkGRaMePy7Gcx5k=
github.com/ganigeorgiev/fexpr v0.4.1/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO2WtJkF5drE=
github.com/gliderlabs/ssh v0.3.7 h1:iV3Bqi942d9huXnzEF2Mt+CY9gLu8DNM4Obd+8bODRE=
github.com/gliderlabs/ssh v0.3.7/go.mod h1:zpHEXBstFnQYtGnB8k8kQLol82umzn/2/snG7alWVD8=
github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c=
github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
@@ -117,14 +111,14 @@ github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpv
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA=
github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
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=
@@ -152,10 +146,10 @@ github.com/google/go-github/v30 v30.1.0/go.mod h1:n8jBpHl45a/rlBUtRJMOG4GhNADUQF
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5 h1:5iH8iuqE5apketRbSFBy+X1V0o+l+8NF1avt4HWl7cA=
github.com/google/pprof v0.0.0-20240827171923-fa2c70bbbfe5/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k=
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
@@ -163,12 +157,8 @@ github.com/google/wire v0.6.0 h1:HBkoIh4BdSxoyo9PveV8giw7ZsaBOvzWKfcg/6MrVwI=
github.com/google/wire v0.6.0/go.mod h1:F4QhpQ9EDIdJ1Mbop/NZBRB+5yrR6qg3BnctaoUk6NA=
github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s=
github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog=
github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68=
github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q=
github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf h1:WfD7VjIE6z8dIvMsI4/s+1qr5EL+zoIGev1BQj1eoJ8=
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf/go.mod h1:hyb9oH7vZsitZCiBt0ZvifOrB+qc8PS5IiilCIb87rg=
@@ -178,8 +168,6 @@ github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nu
github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
@@ -187,22 +175,12 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61 h1:FwuzbVh87iLiUQj1+uQUsuw9x5t9m5n5g7rG7o4svW4=
github.com/labstack/echo/v5 v5.0.0-20230722203903-ec5b858dab61/go.mod h1:paQfF1YtHe+GrGg5fOgjsjoCX/UKDr9bc1DoWpZfns8=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM=
github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI=
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw=
@@ -215,10 +193,10 @@ github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+q
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.10.1 h1:cw+vsyfCJD8YObOVeqb93YErnlxwYMkNZ4rwN0G0AaA=
github.com/pocketbase/dbx v1.10.1/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.22.23 h1:cnjSiBcMf7VIhXmoBmZCAV8qKYkOubHCOQQPZMKFBAk=
github.com/pocketbase/pocketbase v0.22.23/go.mod h1:h2ojT2pqBWH9LLl1aiawkwXiICKtzZA/kjM/8VhydR4=
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.25.0 h1:/4YQq1hd0muvhzbERyUTVNh88N0BCj5diqK0jtLN6k8=
github.com/pocketbase/pocketbase v0.25.0/go.mod h1:tOtOv7f3vJhAiyUluIwV9JPuKeknZRQ9F6uJE3W/ntI=
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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
@@ -229,24 +207,24 @@ github.com/rhysd/go-github-selfupdate v1.2.3/go.mod h1:mp/N8zj6jFfBQy/XMYoWsmfzx
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shirou/gopsutil/v4 v4.24.10 h1:7VOzPtfw/5YDU+jLEoBwXwxJbQetULywoSV4RYY7HkM=
github.com/shirou/gopsutil/v4 v4.24.10/go.mod h1:s4D/wg+ag4rG0WO7AiTj2BeYCRhym0vM7DHbZRxnIT8=
github.com/spf13/cast v1.7.0 h1:ntdiHjuueXFgm5nzDRdOS4yfT43P5Fnud6DH50rz/7w=
github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/shirou/gopsutil/v4 v4.25.1 h1:QSWkTc+fu9LTAWfkZwZ6j8MSUk4A2LV7rbH0ZqmLjXs=
github.com/shirou/gopsutil/v4 v4.25.1/go.mod h1:RoUCUpndaJFtT+2zsZzzmhvbfGoDCJ7nFXKJf8GqJbI=
github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tcnksm/go-gitconfig v0.1.2 h1:iiDhRitByXAEyjgBqsKi9QU4o2TNtv9kPP3RgPgXBPw=
github.com/tcnksm/go-gitconfig v0.1.2/go.mod h1:/8EhP4H7oJZdIPyT+/UIsG87kTzrzM4UsLGSItWYCpE=
github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU=
@@ -256,45 +234,44 @@ github.com/tklauser/numcpus v0.9.0/go.mod h1:SN6Nq1O3VychhC1npsWostA+oW+VOQTxZrS
github.com/ulikunitz/xz v0.5.9/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw=
go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8=
go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc=
go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4=
go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0 h1:PS8wXpbyaDJQ2VDHHncMe9Vct0Zn1fEjpsjrLxGJoSc=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.58.0/go.mod h1:HDBUsEjOuRC0EzKZ1bSaRGZWUBAzo+MhAcUUORSr4D0=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4=
go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU=
go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU=
go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ=
go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
gocloud.dev v0.40.0 h1:f8LgP+4WDqOG/RXoUcyLpeIAGOcAbZrZbDQCUee10ng=
gocloud.dev v0.40.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw=
golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U=
golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c h1:7dEasQXItcW1xKJ2+gg5VOiBnqWrJc+rq0DPKyvvdbY=
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c/go.mod h1:NQtJDoLvd6faHhE7m4T/1IY708gDefGGjR/iUW8yQQ8=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c h1:KL/ZBHXgKGVmuZBZ01Lt57yE5ws8ZPSkkihmEyq7FXc=
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.21.0 h1:c5qV36ajHpdj4Qi0GnE0jUc/yuo33OLFaa0d+crTD5s=
golang.org/x/image v0.21.0/go.mod h1:vUbsLavqK/W303ZroQQVKQ+Af3Yl6Uz1Ppu5J/cLz78=
golang.org/x/image v0.24.0 h1:AN7zRgVsbvmTfNyqIbbOraYL8mSwcKncEj8ofjgzcMQ=
golang.org/x/image v0.24.0/go.mod h1:4b/ITuLfqYq1hqZcjofwctIhi7sZh2WaCjvsBNjjya8=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.22.0 h1:D4nJWe9zXqHOmWqj4VMOJhvzj7bEZg4wEYa759z1pH4=
golang.org/x/mod v0.22.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -302,70 +279,53 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r
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.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4=
golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU=
golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
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.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs=
golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24=
golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M=
golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU=
golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM=
golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
golang.org/x/time v0.7.0 h1:ntUhktv3OPE6TgYxXWv9vKvUSJyIFJlyohwbkEwPrKQ=
golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
google.golang.org/api v0.204.0 h1:3PjmQQEDkR/ENVZZwIYB4W/KzYtN8OrqnNcHWpeR8E4=
google.golang.org/api v0.204.0/go.mod h1:69y8QSoKIbL9F94bWgWAq6wGqGwyjBgi2y8rAK8zLag=
google.golang.org/api v0.220.0 h1:3oMI4gdBgB72WFVwE1nerDD8W3HUOS4kypK6rRLbGns=
google.golang.org/api v0.220.0/go.mod h1:26ZAlY6aN/8WgpCzjPNy18QpYaz7Zgg1h0qe1GkZEmY=
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=
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -373,19 +333,19 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38 h1:Q3nlH8iSQSRUwOskjbcSMcF2jiYMNiQYZ0c2KEJLKKU=
google.golang.org/genproto v0.0.0-20241021214115-324edc3d5d38/go.mod h1:xBI+tzfqGGN2JBeSebfKXFSdBpWVQ7sLW40PTupVRm4=
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8=
google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 h1:zciRKQ4kBpFgpfC5QQCVtnnNAcLIqweL7plyZRQHVpI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI=
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM=
google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc=
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q=
google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 h1:5bKytslY8ViY0Cj/ewmRtrWHW64bNF03cAatUUFCdFI=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk=
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E=
google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -395,8 +355,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -411,26 +371,24 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
modernc.org/cc/v4 v4.21.4 h1:3Be/Rdo1fpr8GrQ7IVw9OHtplU4gWbb+wNgeoBMmGLQ=
modernc.org/cc/v4 v4.21.4/go.mod h1:HM7VJTZbUCR3rV8EYBi9wxnJ0ZBRiGE5OeGXNA0IsLQ=
modernc.org/ccgo/v4 v4.21.0 h1:kKPI3dF7RIag8YcToh5ZwDcVMIv6VGa0ED5cvh0LMW4=
modernc.org/ccgo/v4 v4.21.0/go.mod h1:h6kt6H/A2+ew/3MW/p6KEoQmrq/i3pr0J/SiwiaF/g0=
modernc.org/ccgo/v4 v4.19.2 h1:lwQZgvboKD0jBwdaeVCTouxhxAyN6iawF3STraAal8Y=
modernc.org/ccgo/v4 v4.19.2/go.mod h1:ysS3mxiMV38XGRTTcgo0DQTeTmAO4oCmJl1nX9VFI3s=
modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE=
modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ=
modernc.org/gc/v2 v2.5.0 h1:bJ9ChznK1L1mUtAQtxi0wi5AtAs5jQuw4PrPHO5pb6M=
modernc.org/gc/v2 v2.5.0/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852 h1:IYXPPTTjjoSHvUClZIYexDiO7g+4x+XveKT4gCIAwiY=
modernc.org/gc/v3 v3.0.0-20241004144649-1aea3fae8852/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/libc v1.61.0 h1:eGFcvWpqlnoGwzZeZe3PWJkkKbM/3SUGyk1DVZQ0TpE=
modernc.org/libc v1.61.0/go.mod h1:DvxVX89wtGTu+r72MLGhygpfi3aUGgZRdAYGCAVVud0=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
modernc.org/gc/v2 v2.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
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.8.2 h1:cL9L4bcoAObu4NkxOlKWBWtNHIsnnACGF/TbqQ6sbcI=
modernc.org/memory v1.8.2/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sortutil v1.2.0 h1:jQiD3PfS2REGJNzNCMMaLSp/wdMNieTbKX920Cqdgqc=
modernc.org/sortutil v1.2.0/go.mod h1:TKU2s7kJMf1AE84OoiGppNHJwvB753OYfNl2WRb++Ss=
modernc.org/sqlite v1.33.1 h1:trb6Z3YYoeM9eDL1O8do81kP+0ejv+YzgyFo+Gwy0nM=
modernc.org/sqlite v1.33.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g=
modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=

View File

@@ -8,11 +8,13 @@ import (
"log/slog"
"os"
"strings"
"sync"
"github.com/shirou/gopsutil/v4/common"
)
type Agent struct {
sync.Mutex // Used to lock agent while collecting data
debug bool // true if LOG_LEVEL is set to debug
zfs bool // true if system has arcstats
memCalc string // Memory calculation formula
@@ -28,19 +30,16 @@ type Agent struct {
}
func NewAgent() *Agent {
return &Agent{
sensorsContext: context.Background(),
memCalc: os.Getenv("MEM_CALC"),
fsStats: make(map[string]*system.FsStats),
agent := &Agent{
fsStats: make(map[string]*system.FsStats),
}
}
agent.memCalc, _ = GetEnv("MEM_CALC")
func (a *Agent) Run(pubKey []byte, addr string) {
// Set up slog with a log level determined by the LOG_LEVEL env var
if logLevelStr, exists := os.LookupEnv("LOG_LEVEL"); exists {
if logLevelStr, exists := GetEnv("LOG_LEVEL"); exists {
switch strings.ToLower(logLevelStr) {
case "debug":
a.debug = true
agent.debug = true
slog.SetLogLoggerLevel(slog.LevelDebug)
case "warn":
slog.SetLogLoggerLevel(slog.LevelWarn)
@@ -52,45 +51,58 @@ func (a *Agent) Run(pubKey []byte, addr string) {
slog.Debug(beszel.Version)
// Set sensors context (allows overriding sys location for sensors)
if sysSensors, exists := os.LookupEnv("SYS_SENSORS"); exists {
if sysSensors, exists := GetEnv("SYS_SENSORS"); exists {
slog.Info("SYS_SENSORS", "path", sysSensors)
a.sensorsContext = context.WithValue(a.sensorsContext,
agent.sensorsContext = context.WithValue(agent.sensorsContext,
common.EnvKey, common.EnvMap{common.HostSysEnvKey: sysSensors},
)
} else {
agent.sensorsContext = context.Background()
}
// Set sensors whitelist
if sensors, exists := os.LookupEnv("SENSORS"); exists {
a.sensorsWhitelist = make(map[string]struct{})
if sensors, exists := GetEnv("SENSORS"); exists {
agent.sensorsWhitelist = make(map[string]struct{})
for _, sensor := range strings.Split(sensors, ",") {
if sensor != "" {
a.sensorsWhitelist[sensor] = struct{}{}
agent.sensorsWhitelist[sensor] = struct{}{}
}
}
}
// initialize system info / docker manager
a.initializeSystemInfo()
a.initializeDiskInfo()
a.initializeNetIoStats()
a.dockerManager = newDockerManager(a)
agent.initializeSystemInfo()
agent.initializeDiskInfo()
agent.initializeNetIoStats()
agent.dockerManager = newDockerManager(agent)
// initialize GPU manager
if gm, err := NewGPUManager(); err != nil {
slog.Debug("GPU", "err", err)
} else {
a.gpuManager = gm
agent.gpuManager = gm
}
// if debugging, print stats
if a.debug {
slog.Debug("Stats", "data", a.gatherStats())
if agent.debug {
slog.Debug("Stats", "data", agent.gatherStats())
}
a.startServer(pubKey, addr)
return agent
}
// GetEnv retrieves an environment variable with a "BESZEL_AGENT_" prefix, or falls back to the unprefixed key.
func GetEnv(key string) (value string, exists bool) {
if value, exists = os.LookupEnv("BESZEL_AGENT_" + key); exists {
return value, exists
}
// Fallback to the old unprefixed key
return os.LookupEnv(key)
}
func (a *Agent) gatherStats() system.CombinedData {
a.Lock()
defer a.Unlock()
slog.Debug("Getting stats")
systemData := system.CombinedData{
Stats: a.getSystemStats(),

View File

@@ -3,18 +3,17 @@ package agent
import (
"beszel/internal/entities/system"
"log/slog"
"time"
"os"
"path/filepath"
"strings"
"time"
"github.com/shirou/gopsutil/v4/disk"
)
// Sets up the filesystems to monitor for disk usage and I/O.
func (a *Agent) initializeDiskInfo() {
filesystem := os.Getenv("FILESYSTEM")
filesystem, _ := GetEnv("FILESYSTEM")
efPath := "/extra-filesystems"
hasRoot := false
@@ -79,7 +78,7 @@ func (a *Agent) initializeDiskInfo() {
}
// Add EXTRA_FILESYSTEMS env var values to fsStats
if extraFilesystems, exists := os.LookupEnv("EXTRA_FILESYSTEMS"); exists {
if extraFilesystems, exists := GetEnv("EXTRA_FILESYSTEMS"); exists {
for _, fs := range strings.Split(extraFilesystems, ",") {
found := false
for _, p := range partitions {

View File

@@ -208,7 +208,7 @@ func (dm *dockerManager) deleteContainerStatsSync(id string) {
// Creates a new http client for Docker or Podman API
func newDockerManager(a *Agent) *dockerManager {
dockerHost, exists := os.LookupEnv("DOCKER_HOST")
dockerHost, exists := GetEnv("DOCKER_HOST")
if exists {
slog.Info("DOCKER_HOST", "host", dockerHost)
} else {
@@ -242,7 +242,7 @@ func newDockerManager(a *Agent) *dockerManager {
// configurable timeout
timeout := time.Millisecond * 2100
if t, set := os.LookupEnv("DOCKER_TIMEOUT"); set {
if t, set := GetEnv("DOCKER_TIMEOUT"); set {
timeout, err = time.ParseDuration(t)
if err != nil {
slog.Error(err.Error())

View File

@@ -6,6 +6,7 @@ import (
"encoding/json"
"fmt"
"os/exec"
"regexp"
"strconv"
"strings"
"sync"
@@ -14,173 +15,213 @@ import (
"golang.org/x/exp/slog"
)
// GPUManager manages data collection for GPUs (either Nvidia or AMD)
type GPUManager struct {
sync.Mutex
nvidiaSmi bool
rocmSmi bool
tegrastats bool
GpuDataMap map[string]*system.GPUData
mutex sync.Mutex
}
// RocmSmiJson represents the JSON structure of rocm-smi output
type RocmSmiJson struct {
ID string `json:"Device ID"`
Name string `json:"Card series"`
Temperature string `json:"Temperature (Sensor edge) (C)"`
MemoryUsed string `json:"VRAM Total Used Memory (B)"`
MemoryTotal string `json:"VRAM Total Memory (B)"`
Usage string `json:"GPU use (%)"`
Power string `json:"Current Socket Graphics Package Power (W)"`
ID string `json:"GUID"`
Name string `json:"Card series"`
Temperature string `json:"Temperature (Sensor edge) (C)"`
MemoryUsed string `json:"VRAM Total Used Memory (B)"`
MemoryTotal string `json:"VRAM Total Memory (B)"`
Usage string `json:"GPU use (%)"`
PowerPackage string `json:"Average Graphics Package Power (W)"`
PowerSocket string `json:"Current Socket Graphics Package Power (W)"`
}
// startNvidiaCollector oversees collectNvidiaStats and restarts nvidia-smi if it fails
func (gm *GPUManager) startNvidiaCollector() error {
// gpuCollector defines a collector for a specific GPU management utility (nvidia-smi or rocm-smi)
type gpuCollector struct {
name string
cmdArgs []string
parse func([]byte) bool // returns true if valid data was found
buf []byte
}
var errNoValidData = fmt.Errorf("no valid GPU data found") // Error for missing data
// starts and manages the ongoing collection of GPU data for the specified GPU management utility
func (c *gpuCollector) start() {
for {
if err := gm.collectNvidiaStats(); err != nil {
slog.Warn("Restarting nvidia-smi", "err", err)
time.Sleep(time.Second) // Wait before retrying
err := c.collect()
if err != nil {
if err == errNoValidData {
slog.Warn(c.name + " found no valid GPU data, stopping")
break
}
slog.Warn(c.name+" failed, restarting", "err", err)
time.Sleep(time.Second * 5)
continue
}
}
}
// collectNvidiaStats runs nvidia-smi in a loop and passes the output to parseNvidiaData
func (gm *GPUManager) collectNvidiaStats() error {
// Set up the command
cmd := exec.Command("nvidia-smi", "-l", "4", "--query-gpu=index,name,temperature.gpu,memory.used,memory.total,utilization.gpu,power.draw", "--format=csv,noheader,nounits")
// Set up a pipe to capture stdout
// collect executes the command, parses output with the assigned parser function
func (c *gpuCollector) collect() error {
cmd := exec.Command(c.name, c.cmdArgs...)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
// Start the command
if err := cmd.Start(); err != nil {
return err
}
// Use a scanner to read each line of output
scanner := bufio.NewScanner(stdout)
buf := make([]byte, 0, 8*1024) // 8KB buffer
scanner.Buffer(buf, bufio.MaxScanTokenSize)
if c.buf == nil {
c.buf = make([]byte, 0, 4*1024)
}
scanner.Buffer(c.buf, bufio.MaxScanTokenSize)
for scanner.Scan() {
line := scanner.Bytes()
gm.parseNvidiaData(line) // Run your function on each new line
hasValidData := c.parse(scanner.Bytes())
if !hasValidData {
return errNoValidData
}
}
// Check for any errors encountered during scanning
if err := scanner.Err(); err != nil {
return err
return fmt.Errorf("scanner error: %w", err)
}
// Wait for the command to complete
return cmd.Wait()
}
// getJetsonParser returns a function to parse the output of tegrastats and update the GPUData map
func (gm *GPUManager) getJetsonParser() func(output []byte) bool {
// use closure to avoid recompiling the regex
ramPattern := regexp.MustCompile(`RAM (\d+)/(\d+)MB`)
gr3dPattern := regexp.MustCompile(`GR3D_FREQ (\d+)%`)
tempPattern := regexp.MustCompile(`tj@(\d+\.?\d*)C`)
// Orin Nano / NX do not have GPU specific power monitor
// TODO: Maybe use VDD_IN for Nano / NX and add a total system power chart
powerPattern := regexp.MustCompile(`(GPU_SOC|CPU_GPU_CV) (\d+)mW`)
return func(output []byte) bool {
gm.Lock()
defer gm.Unlock()
// we get gpu name from the intitial run of nvidia-smi, so return if it hasn't been initialized
gpuData, ok := gm.GpuDataMap["0"]
if !ok {
return true
}
data := string(output)
// Parse RAM usage
ramMatches := ramPattern.FindStringSubmatch(data)
if ramMatches != nil {
gpuData.MemoryUsed, _ = strconv.ParseFloat(ramMatches[1], 64)
gpuData.MemoryTotal, _ = strconv.ParseFloat(ramMatches[2], 64)
}
// Parse GR3D (GPU) usage
gr3dMatches := gr3dPattern.FindStringSubmatch(data)
if gr3dMatches != nil {
gpuData.Usage, _ = strconv.ParseFloat(gr3dMatches[1], 64)
}
// Parse temperature
tempMatches := tempPattern.FindStringSubmatch(data)
if tempMatches != nil {
gpuData.Temperature, _ = strconv.ParseFloat(tempMatches[1], 64)
}
// Parse power usage
powerMatches := powerPattern.FindStringSubmatch(data)
if powerMatches != nil {
power, _ := strconv.ParseFloat(powerMatches[2], 64)
gpuData.Power = power / 1000
}
gpuData.Count++
return true
}
}
// parseNvidiaData parses the output of nvidia-smi and updates the GPUData map
func (gm *GPUManager) parseNvidiaData(output []byte) {
gm.mutex.Lock()
defer gm.mutex.Unlock()
lines := strings.Split(string(output), "\n")
for _, line := range lines {
if line != "" {
fields := strings.Split(line, ", ")
if len(fields) >= 7 {
id := fields[0]
temp, _ := strconv.ParseFloat(fields[2], 64)
memoryUsage, _ := strconv.ParseFloat(fields[3], 64)
totalMemory, _ := strconv.ParseFloat(fields[4], 64)
usage, _ := strconv.ParseFloat(fields[5], 64)
power, _ := strconv.ParseFloat(fields[6], 64)
// add gpu if not exists
if _, ok := gm.GpuDataMap[id]; !ok {
name := strings.TrimPrefix(fields[1], "NVIDIA ")
gm.GpuDataMap[id] = &system.GPUData{Name: strings.TrimSuffix(name, " Laptop GPU")}
}
// update gpu data
gpu := gm.GpuDataMap[id]
gpu.Temperature = temp
gpu.MemoryUsed = memoryUsage / 1.024
gpu.MemoryTotal = totalMemory / 1.024
gpu.Usage += usage
gpu.Power += power
gpu.Count++
func (gm *GPUManager) parseNvidiaData(output []byte) bool {
gm.Lock()
defer gm.Unlock()
var valid bool
for line := range strings.Lines(string(output)) {
fields := strings.Split(strings.TrimSpace(line), ", ")
if len(fields) < 7 {
continue
}
valid = true
id := fields[0]
temp, _ := strconv.ParseFloat(fields[2], 64)
memoryUsage, _ := strconv.ParseFloat(fields[3], 64)
totalMemory, _ := strconv.ParseFloat(fields[4], 64)
usage, _ := strconv.ParseFloat(fields[5], 64)
power, _ := strconv.ParseFloat(fields[6], 64)
// add gpu if not exists
if _, ok := gm.GpuDataMap[id]; !ok {
name := strings.TrimPrefix(fields[1], "NVIDIA ")
gm.GpuDataMap[id] = &system.GPUData{Name: strings.TrimSuffix(name, " Laptop GPU")}
// check if tegrastats is active - if so we will only use nvidia-smi to get gpu name
// - nvidia-smi does not provide metrics for tegra / jetson devices
// this will end the nvidia-smi collector
if gm.tegrastats {
return false
}
}
// update gpu data
gpu := gm.GpuDataMap[id]
gpu.Temperature = temp
gpu.MemoryUsed = memoryUsage / 1.024
gpu.MemoryTotal = totalMemory / 1.024
gpu.Usage += usage
gpu.Power += power
gpu.Count++
}
}
// startAmdCollector oversees collectAmdStats and restarts rocm-smi if it fails
func (gm *GPUManager) startAmdCollector() {
for {
if err := gm.collectAmdStats(); err != nil {
slog.Warn("Restarting rocm-smi", "err", err)
time.Sleep(time.Second) // Wait before retrying
continue
} else {
// break if no error (command runs but no card found)
break
}
}
}
// collectAmdStats runs rocm-smi in a loop and passes the output to parseAmdData
func (gm *GPUManager) collectAmdStats() error {
cmd := exec.Command("/bin/sh", "-c", "while true; do rocm-smi --showid --showtemp --showuse --showpower --showproductname --showmeminfo vram --json; sleep 4.3; done")
// Set up a pipe to capture stdout
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
// Start the command
if err := cmd.Start(); err != nil {
return err
}
// Use a scanner to read each line of output
scanner := bufio.NewScanner(stdout)
buf := make([]byte, 0, 8*1024) // 8KB buffer
scanner.Buffer(buf, bufio.MaxScanTokenSize)
for scanner.Scan() {
var rocmSmiInfo map[string]RocmSmiJson
if err := json.Unmarshal(scanner.Bytes(), &rocmSmiInfo); err != nil {
return err
}
if len(rocmSmiInfo) > 0 {
// slog.Info("rocm-smi", "data", rocmSmiInfo)
gm.parseAmdData(&rocmSmiInfo)
} else {
slog.Warn("rocm-smi returned no GPU")
return nil
}
}
if err := scanner.Err(); err != nil {
return err
}
return cmd.Wait()
return valid
}
// parseAmdData parses the output of rocm-smi and updates the GPUData map
func (gm *GPUManager) parseAmdData(rocmSmiInfo *map[string]RocmSmiJson) {
for _, v := range *rocmSmiInfo {
temp, _ := strconv.ParseFloat(v.Temperature, 64)
func (gm *GPUManager) parseAmdData(output []byte) bool {
var rocmSmiInfo map[string]RocmSmiJson
if err := json.Unmarshal(output, &rocmSmiInfo); err != nil || len(rocmSmiInfo) == 0 {
return false
}
gm.Lock()
defer gm.Unlock()
for _, v := range rocmSmiInfo {
var power float64
if v.PowerPackage != "" {
power, _ = strconv.ParseFloat(v.PowerPackage, 64)
} else {
power, _ = strconv.ParseFloat(v.PowerSocket, 64)
}
memoryUsage, _ := strconv.ParseFloat(v.MemoryUsed, 64)
totalMemory, _ := strconv.ParseFloat(v.MemoryTotal, 64)
usage, _ := strconv.ParseFloat(v.Usage, 64)
power, _ := strconv.ParseFloat(v.Power, 64)
memoryUsage = bytesToMegabytes(memoryUsage)
totalMemory = bytesToMegabytes(totalMemory)
if _, ok := gm.GpuDataMap[v.ID]; !ok {
gm.GpuDataMap[v.ID] = &system.GPUData{Name: v.Name}
}
gpu := gm.GpuDataMap[v.ID]
gpu.Temperature = temp
gpu.MemoryUsed = memoryUsage
gpu.MemoryTotal = totalMemory
gpu.Temperature, _ = strconv.ParseFloat(v.Temperature, 64)
gpu.MemoryUsed = bytesToMegabytes(memoryUsage)
gpu.MemoryTotal = bytesToMegabytes(totalMemory)
gpu.Usage += usage
gpu.Power += power
gpu.Count++
}
return true
}
// sums and resets the current GPU utilization data since the last update
func (gm *GPUManager) GetCurrentData() map[string]system.GPUData {
gm.mutex.Lock()
defer gm.mutex.Unlock()
gm.Lock()
defer gm.Unlock()
// check for GPUs with the same name
nameCounts := make(map[string]int)
for _, gpu := range gm.GpuDataMap {
nameCounts[gpu.Name]++
}
// copy / reset the data
gpuData := make(map[string]system.GPUData, len(gm.GpuDataMap))
for id, gpu := range gm.GpuDataMap {
@@ -190,40 +231,91 @@ func (gm *GPUManager) GetCurrentData() map[string]system.GPUData {
gpu.MemoryTotal = twoDecimals(gpu.MemoryTotal)
gpu.Usage = twoDecimals(gpu.Usage / gpu.Count)
gpu.Power = twoDecimals(gpu.Power / gpu.Count)
gpuData[id] = *gpu
// reset the count
gpu.Count = 1
// dereference to avoid overwriting anything else
gpuCopy := *gpu
// append id to the name if there are multiple GPUs with the same name
if nameCounts[gpu.Name] > 1 {
gpuCopy.Name = fmt.Sprintf("%s %s", gpu.Name, id)
}
gpuData[id] = gpuCopy
}
return gpuData
}
// detectGPU returns the GPU brand (nvidia or amd) or an error if none is found
// todo: make sure there's actually a GPU, not just if the command exists
func (gm *GPUManager) detectGPU() error {
if err := exec.Command("nvidia-smi").Run(); err == nil {
// detectGPUs checks for the presence of GPU management tools (nvidia-smi, rocm-smi, tegrastats)
// in the system path. It sets the corresponding flags in the GPUManager struct if any of these
// tools are found. If none of the tools are found, it returns an error indicating that no GPU
// management tools are available.
func (gm *GPUManager) detectGPUs() error {
if _, err := exec.LookPath("nvidia-smi"); err == nil {
gm.nvidiaSmi = true
}
if err := exec.Command("rocm-smi").Run(); err == nil {
if _, err := exec.LookPath("rocm-smi"); err == nil {
gm.rocmSmi = true
}
if gm.nvidiaSmi || gm.rocmSmi {
if _, err := exec.LookPath("tegrastats"); err == nil {
gm.tegrastats = true
}
if gm.nvidiaSmi || gm.rocmSmi || gm.tegrastats {
return nil
}
return fmt.Errorf("no GPU found - install nvidia-smi or rocm-smi")
return fmt.Errorf("no GPU found - install nvidia-smi, rocm-smi, or tegrastats")
}
// NewGPUManager returns a new GPUManager
// startCollector starts the appropriate GPU data collector based on the command
func (gm *GPUManager) startCollector(command string) {
collector := gpuCollector{
name: command,
}
switch command {
case "nvidia-smi":
collector.cmdArgs = []string{"-l", "4",
"--query-gpu=index,name,temperature.gpu,memory.used,memory.total,utilization.gpu,power.draw",
"--format=csv,noheader,nounits"}
collector.parse = gm.parseNvidiaData
go collector.start()
case "tegrastats":
collector.cmdArgs = []string{"--interval", "3000"}
collector.parse = gm.getJetsonParser()
go collector.start()
case "rocm-smi":
collector.cmdArgs = []string{"--showid", "--showtemp", "--showuse", "--showpower", "--showproductname", "--showmeminfo", "vram", "--json"}
collector.parse = gm.parseAmdData
go func() {
failures := 0
for {
if err := collector.collect(); err != nil {
failures++
if failures > 5 {
break
}
slog.Warn("Error collecting AMD GPU data", "err", err)
}
time.Sleep(4300 * time.Millisecond)
}
}()
}
}
// NewGPUManager creates and initializes a new GPUManager
func NewGPUManager() (*GPUManager, error) {
var gm GPUManager
if err := gm.detectGPU(); err != nil {
if err := gm.detectGPUs(); err != nil {
return nil, err
}
gm.GpuDataMap = make(map[string]*system.GPUData, 1)
gm.GpuDataMap = make(map[string]*system.GPUData)
if gm.nvidiaSmi {
go gm.startNvidiaCollector()
gm.startCollector("nvidia-smi")
}
if gm.rocmSmi {
go gm.startAmdCollector()
gm.startCollector("rocm-smi")
}
if gm.tegrastats {
gm.startCollector("tegrastats")
}
return &gm, nil
}

View File

@@ -0,0 +1,525 @@
package agent
import (
"beszel/internal/entities/system"
"os"
"path/filepath"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestParseNvidiaData(t *testing.T) {
tests := []struct {
name string
input string
wantData map[string]system.GPUData
wantValid bool
}{
{
name: "valid multi-gpu data",
input: "0, NVIDIA GeForce RTX 3050 Ti Laptop GPU, 48, 12, 4096, 26.3, 12.73\n1, NVIDIA A100-PCIE-40GB, 38, 74, 40960, [N/A], 36.79",
wantData: map[string]system.GPUData{
"0": {
Name: "GeForce RTX 3050 Ti",
Temperature: 48.0,
MemoryUsed: 12.0 / 1.024,
MemoryTotal: 4096.0 / 1.024,
Usage: 26.3,
Power: 12.73,
Count: 1,
},
"1": {
Name: "A100-PCIE-40GB",
Temperature: 38.0,
MemoryUsed: 74.0 / 1.024,
MemoryTotal: 40960.0 / 1.024,
Usage: 0.0,
Power: 36.79,
Count: 1,
},
},
wantValid: true,
},
{
name: "empty input",
input: "",
wantData: map[string]system.GPUData{},
wantValid: false,
},
{
name: "malformed data",
input: "bad, data, here",
wantData: map[string]system.GPUData{},
wantValid: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gm := &GPUManager{
GpuDataMap: make(map[string]*system.GPUData),
}
valid := gm.parseNvidiaData([]byte(tt.input))
assert.Equal(t, tt.wantValid, valid)
if tt.wantValid {
for id, want := range tt.wantData {
got := gm.GpuDataMap[id]
require.NotNil(t, got)
assert.Equal(t, want.Name, got.Name)
assert.InDelta(t, want.Temperature, got.Temperature, 0.01)
assert.InDelta(t, want.MemoryUsed, got.MemoryUsed, 0.01)
assert.InDelta(t, want.MemoryTotal, got.MemoryTotal, 0.01)
assert.InDelta(t, want.Usage, got.Usage, 0.01)
assert.InDelta(t, want.Power, got.Power, 0.01)
assert.Equal(t, want.Count, got.Count)
}
}
})
}
}
func TestParseAmdData(t *testing.T) {
tests := []struct {
name string
input string
wantData map[string]system.GPUData
wantValid bool
}{
{
name: "valid single gpu data",
input: `{
"card0": {
"GUID": "34756",
"Temperature (Sensor edge) (C)": "47.0",
"Current Socket Graphics Package Power (W)": "9.215",
"GPU use (%)": "0",
"VRAM Total Memory (B)": "536870912",
"VRAM Total Used Memory (B)": "482263040",
"Card Series": "Rembrandt [Radeon 680M]"
}
}`,
wantData: map[string]system.GPUData{
"34756": {
Name: "Rembrandt [Radeon 680M]",
Temperature: 47.0,
MemoryUsed: 482263040.0 / (1024 * 1024),
MemoryTotal: 536870912.0 / (1024 * 1024),
Usage: 0.0,
Power: 9.215,
Count: 1,
},
},
wantValid: true,
},
{
name: "valid multi gpu data",
input: `{
"card0": {
"GUID": "34756",
"Temperature (Sensor edge) (C)": "47.0",
"Current Socket Graphics Package Power (W)": "9.215",
"GPU use (%)": "0",
"VRAM Total Memory (B)": "536870912",
"VRAM Total Used Memory (B)": "482263040",
"Card Series": "Rembrandt [Radeon 680M]"
},
"card1": {
"GUID": "38294",
"Temperature (Sensor edge) (C)": "49.0",
"Temperature (Sensor junction) (C)": "49.0",
"Temperature (Sensor memory) (C)": "62.0",
"Average Graphics Package Power (W)": "19.0",
"GPU use (%)": "20.3",
"VRAM Total Memory (B)": "25753026560",
"VRAM Total Used Memory (B)": "794341376",
"Card Series": "Navi 31 [Radeon RX 7900 XT]"
}
}`,
wantData: map[string]system.GPUData{
"34756": {
Name: "Rembrandt [Radeon 680M]",
Temperature: 47.0,
MemoryUsed: 482263040.0 / (1024 * 1024),
MemoryTotal: 536870912.0 / (1024 * 1024),
Usage: 0.0,
Power: 9.215,
Count: 1,
},
"38294": {
Name: "Navi 31 [Radeon RX 7900 XT]",
Temperature: 49.0,
MemoryUsed: 794341376.0 / (1024 * 1024),
MemoryTotal: 25753026560.0 / (1024 * 1024),
Usage: 20.3,
Power: 19.0,
Count: 1,
},
},
wantValid: true,
},
{
name: "invalid json",
input: "{bad json",
},
{
name: "invalid json",
input: "{bad json",
wantData: map[string]system.GPUData{},
wantValid: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
gm := &GPUManager{
GpuDataMap: make(map[string]*system.GPUData),
}
valid := gm.parseAmdData([]byte(tt.input))
assert.Equal(t, tt.wantValid, valid)
if tt.wantValid {
for id, want := range tt.wantData {
got := gm.GpuDataMap[id]
require.NotNil(t, got)
assert.Equal(t, want.Name, got.Name)
assert.InDelta(t, want.Temperature, got.Temperature, 0.01)
assert.InDelta(t, want.MemoryUsed, got.MemoryUsed, 0.01)
assert.InDelta(t, want.MemoryTotal, got.MemoryTotal, 0.01)
assert.InDelta(t, want.Usage, got.Usage, 0.01)
assert.InDelta(t, want.Power, got.Power, 0.01)
assert.Equal(t, want.Count, got.Count)
}
}
})
}
}
func TestParseJetsonData(t *testing.T) {
tests := []struct {
name string
input string
gm *GPUManager
wantMetrics *system.GPUData
}{
{
name: "valid data",
input: "RAM 4300/30698MB GR3D_FREQ 45% tj@52.468C VDD_GPU_SOC 2171mW",
wantMetrics: &system.GPUData{
Name: "Jetson",
MemoryUsed: 4300.0,
MemoryTotal: 30698.0,
Usage: 45.0,
Temperature: 52.468,
Power: 2.171,
Count: 1,
},
},
{
name: "missing temperature",
input: "RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
wantMetrics: &system.GPUData{
Name: "Jetson",
MemoryUsed: 4300.0,
MemoryTotal: 30698.0,
Usage: 45.0,
Power: 2.171,
Count: 1,
},
},
{
name: "no gpu defined by nvidia-smi",
input: "RAM 4300/30698MB GR3D_FREQ 45% VDD_GPU_SOC 2171mW",
gm: &GPUManager{
GpuDataMap: map[string]*system.GPUData{},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.gm != nil {
// should return if no gpu set by nvidia-smi
assert.Empty(t, tt.gm.GpuDataMap)
return
}
tt.gm = &GPUManager{
GpuDataMap: map[string]*system.GPUData{
"0": {Name: "Jetson"},
},
}
parser := tt.gm.getJetsonParser()
valid := parser([]byte(tt.input))
assert.Equal(t, true, valid)
got := tt.gm.GpuDataMap["0"]
require.NotNil(t, got)
assert.Equal(t, tt.wantMetrics.Name, got.Name)
assert.InDelta(t, tt.wantMetrics.MemoryUsed, got.MemoryUsed, 0.01)
assert.InDelta(t, tt.wantMetrics.MemoryTotal, got.MemoryTotal, 0.01)
assert.InDelta(t, tt.wantMetrics.Usage, got.Usage, 0.01)
if tt.wantMetrics.Temperature > 0 {
assert.InDelta(t, tt.wantMetrics.Temperature, got.Temperature, 0.01)
}
assert.InDelta(t, tt.wantMetrics.Power, got.Power, 0.01)
assert.Equal(t, tt.wantMetrics.Count, got.Count)
})
}
}
func TestGetCurrentData(t *testing.T) {
gm := &GPUManager{
GpuDataMap: map[string]*system.GPUData{
"0": {
Name: "GPU1",
Temperature: 50,
MemoryUsed: 2048,
MemoryTotal: 4096,
Usage: 100, // 100 over 2 counts = 50 avg
Power: 200, // 200 over 2 counts = 100 avg
Count: 2,
},
"1": {
Name: "GPU1",
Temperature: 60,
MemoryUsed: 3072,
MemoryTotal: 8192,
Usage: 30,
Power: 60,
Count: 1,
},
},
}
result := gm.GetCurrentData()
// Verify name disambiguation
assert.Equal(t, "GPU1 0", result["0"].Name)
assert.Equal(t, "GPU1 1", result["1"].Name)
// Check averaged values
assert.InDelta(t, 50.0, result["0"].Usage, 0.01)
assert.InDelta(t, 100.0, result["0"].Power, 0.01)
assert.InDelta(t, 30.0, result["1"].Usage, 0.01)
assert.InDelta(t, 60.0, result["1"].Power, 0.01)
// Verify reset counts
assert.Equal(t, float64(1), gm.GpuDataMap["0"].Count)
assert.Equal(t, float64(1), gm.GpuDataMap["1"].Count)
}
func TestDetectGPUs(t *testing.T) {
// Save original PATH
origPath := os.Getenv("PATH")
defer os.Setenv("PATH", origPath)
// Set up temp dir with the commands
tempDir := t.TempDir()
os.Setenv("PATH", tempDir)
tests := []struct {
name string
setupCommands func() error
wantNvidiaSmi bool
wantRocmSmi bool
wantTegrastats bool
wantErr bool
}{
{
name: "nvidia-smi not available",
setupCommands: func() error {
return nil
},
wantNvidiaSmi: false,
wantRocmSmi: false,
wantTegrastats: false,
wantErr: true,
},
{
name: "nvidia-smi available",
setupCommands: func() error {
path := filepath.Join(tempDir, "nvidia-smi")
script := `#!/bin/sh
echo "test"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
wantNvidiaSmi: true,
wantTegrastats: false,
wantRocmSmi: false,
wantErr: false,
},
{
name: "rocm-smi available",
setupCommands: func() error {
path := filepath.Join(tempDir, "rocm-smi")
script := `#!/bin/sh
echo "test"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
wantNvidiaSmi: true,
wantRocmSmi: true,
wantTegrastats: false,
wantErr: false,
},
{
name: "tegrastats available",
setupCommands: func() error {
path := filepath.Join(tempDir, "tegrastats")
script := `#!/bin/sh
echo "test"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
wantNvidiaSmi: true,
wantRocmSmi: true,
wantTegrastats: true,
wantErr: false,
},
{
name: "no gpu tools available",
setupCommands: func() error {
os.Setenv("PATH", "")
return nil
},
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := tt.setupCommands(); err != nil {
t.Fatal(err)
}
gm := &GPUManager{}
err := gm.detectGPUs()
t.Logf("nvidiaSmi: %v, rocmSmi: %v, tegrastats: %v", gm.nvidiaSmi, gm.rocmSmi, gm.tegrastats)
if tt.wantErr {
assert.Error(t, err)
return
}
assert.NoError(t, err)
assert.Equal(t, tt.wantNvidiaSmi, gm.nvidiaSmi)
assert.Equal(t, tt.wantRocmSmi, gm.rocmSmi)
assert.Equal(t, tt.wantTegrastats, gm.tegrastats)
})
}
}
func TestStartCollector(t *testing.T) {
// Save original PATH
origPath := os.Getenv("PATH")
defer os.Setenv("PATH", origPath)
// Set up temp dir with the commands
dir := t.TempDir()
os.Setenv("PATH", dir)
tests := []struct {
name string
command string
setup func(t *testing.T) error
validate func(t *testing.T, gm *GPUManager)
gm *GPUManager
}{
{
name: "nvidia-smi collector",
command: "nvidia-smi",
setup: func(t *testing.T) error {
path := filepath.Join(dir, "nvidia-smi")
script := `#!/bin/sh
echo "0, NVIDIA Test GPU, 50, 1024, 4096, 25, 100"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
validate: func(t *testing.T, gm *GPUManager) {
gpu, exists := gm.GpuDataMap["0"]
assert.True(t, exists)
if exists {
assert.Equal(t, "Test GPU", gpu.Name)
assert.Equal(t, 50.0, gpu.Temperature)
}
},
},
{
name: "rocm-smi collector",
command: "rocm-smi",
setup: func(t *testing.T) error {
path := filepath.Join(dir, "rocm-smi")
script := `#!/bin/sh
echo '{"card0": {"Temperature (Sensor edge) (C)": "49.0", "Current Socket Graphics Package Power (W)": "28.159", "GPU use (%)": "0", "VRAM Total Memory (B)": "536870912", "VRAM Total Used Memory (B)": "445550592", "Card Series": "Rembrandt [Radeon 680M]", "Card Model": "0x1681", "Card Vendor": "Advanced Micro Devices, Inc. [AMD/ATI]", "Card SKU": "REMBRANDT", "Subsystem ID": "0x8a22", "Device Rev": "0xc8", "Node ID": "1", "GUID": "34756", "GFX Version": "gfx1035"}}'`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
validate: func(t *testing.T, gm *GPUManager) {
gpu, exists := gm.GpuDataMap["34756"]
assert.True(t, exists)
if exists {
assert.Equal(t, "Rembrandt [Radeon 680M]", gpu.Name)
assert.InDelta(t, 49.0, gpu.Temperature, 0.01)
assert.InDelta(t, 28.159, gpu.Power, 0.01)
}
},
},
{
name: "tegrastats collector",
command: "tegrastats",
setup: func(t *testing.T) error {
path := filepath.Join(dir, "tegrastats")
script := `#!/bin/sh
echo "RAM 1024/4096MB GR3D_FREQ 80% tj@70C VDD_GPU_SOC 1000mW"`
if err := os.WriteFile(path, []byte(script), 0755); err != nil {
return err
}
return nil
},
validate: func(t *testing.T, gm *GPUManager) {
gpu, exists := gm.GpuDataMap["0"]
assert.True(t, exists)
if exists {
assert.InDelta(t, 70.0, gpu.Temperature, 0.1)
}
},
gm: &GPUManager{
GpuDataMap: map[string]*system.GPUData{
"0": {},
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if err := tt.setup(t); err != nil {
t.Fatal(err)
}
if tt.gm == nil {
tt.gm = &GPUManager{
GpuDataMap: make(map[string]*system.GPUData),
}
}
tt.gm.startCollector(tt.command)
time.Sleep(50 * time.Millisecond) // Give collector time to run
tt.validate(t, tt.gm)
})
}
}

View File

@@ -2,7 +2,6 @@ package agent
import (
"log/slog"
"os"
"strings"
"time"
@@ -15,7 +14,7 @@ func (a *Agent) initializeNetIoStats() {
// map of network interface names passed in via NICS env var
var nicsMap map[string]struct{}
nics, nicsEnvExists := os.LookupEnv("NICS")
nics, nicsEnvExists := GetEnv("NICS")
if nicsEnvExists {
nicsMap = make(map[string]struct{}, 0)
for _, nic := range strings.Split(nics, ",") {

View File

@@ -2,33 +2,96 @@ package agent
import (
"encoding/json"
"fmt"
"log/slog"
"net"
"os"
"strings"
sshServer "github.com/gliderlabs/ssh"
"golang.org/x/crypto/ssh"
)
func (a *Agent) startServer(pubKey []byte, addr string) {
type ServerOptions struct {
Addr string
Network string
Keys []ssh.PublicKey
}
func (a *Agent) StartServer(opts ServerOptions) error {
sshServer.Handle(a.handleSession)
slog.Info("Starting SSH server", "address", addr)
if err := sshServer.ListenAndServe(addr, nil, sshServer.NoPty(),
sshServer.PublicKeyAuth(func(ctx sshServer.Context, key sshServer.PublicKey) bool {
allowed, _, _, _, _ := sshServer.ParseAuthorizedKey(pubKey)
return sshServer.KeysEqual(key, allowed)
}),
); err != nil {
slog.Error("Error starting SSH server", "err", err)
os.Exit(1)
slog.Info("Starting SSH server", "addr", opts.Addr, "network", opts.Network)
switch opts.Network {
case "unix":
// remove existing socket file if it exists
if err := os.Remove(opts.Addr); err != nil && !os.IsNotExist(err) {
return err
}
default:
// prefix with : if only port was provided
if !strings.Contains(opts.Addr, ":") {
opts.Addr = ":" + opts.Addr
}
}
// Listen on the address
ln, err := net.Listen(opts.Network, opts.Addr)
if err != nil {
return err
}
defer ln.Close()
// Start SSH server on the listener
err = sshServer.Serve(ln, nil, sshServer.NoPty(),
sshServer.PublicKeyAuth(func(ctx sshServer.Context, key sshServer.PublicKey) bool {
for _, pubKey := range opts.Keys {
if sshServer.KeysEqual(key, pubKey) {
return true
}
}
return false
}),
)
if err != nil {
return err
}
return nil
}
func (a *Agent) handleSession(s sshServer.Session) {
// slog.Debug("connection", "remoteaddr", s.RemoteAddr(), "user", s.User())
stats := a.gatherStats()
if err := json.NewEncoder(s).Encode(stats); err != nil {
slog.Error("Error encoding stats", "err", err)
slog.Error("Error encoding stats", "err", err, "stats", stats)
s.Exit(1)
return
}
s.Exit(0)
}
// ParseKeys parses a string containing SSH public keys in authorized_keys format.
// It returns a slice of ssh.PublicKey and an error if any key fails to parse.
func ParseKeys(input string) ([]ssh.PublicKey, error) {
var parsedKeys []ssh.PublicKey
for line := range strings.Lines(input) {
line = strings.TrimSpace(line)
// Skip empty lines or comments
if len(line) == 0 || strings.HasPrefix(line, "#") {
continue
}
// Parse the key
parsedKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte(line))
if err != nil {
return nil, fmt.Errorf("failed to parse key: %s, error: %w", line, err)
}
// Append the parsed key to the list
parsedKeys = append(parsedKeys, parsedKey)
}
return parsedKeys, nil
}

View File

@@ -0,0 +1,289 @@
package agent
import (
"crypto/ed25519"
"fmt"
"os"
"path/filepath"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
)
func TestStartServer(t *testing.T) {
// Generate a test key pair
pubKey, privKey, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
signer, err := ssh.NewSignerFromKey(privKey)
require.NoError(t, err)
sshPubKey, err := ssh.NewPublicKey(pubKey)
require.NoError(t, err)
// Generate a different key pair for bad key test
badPubKey, badPrivKey, err := ed25519.GenerateKey(nil)
require.NoError(t, err)
badSigner, err := ssh.NewSignerFromKey(badPrivKey)
require.NoError(t, err)
sshBadPubKey, err := ssh.NewPublicKey(badPubKey)
require.NoError(t, err)
socketFile := filepath.Join(t.TempDir(), "beszel-test.sock")
tests := []struct {
name string
config ServerOptions
wantErr bool
errContains string
setup func() error
cleanup func() error
}{
{
name: "tcp port only",
config: ServerOptions{
Network: "tcp",
Addr: "45987",
Keys: []ssh.PublicKey{sshPubKey},
},
},
{
name: "tcp with ipv4",
config: ServerOptions{
Network: "tcp4",
Addr: "127.0.0.1:45988",
Keys: []ssh.PublicKey{sshPubKey},
},
},
{
name: "tcp with ipv6",
config: ServerOptions{
Network: "tcp6",
Addr: "[::1]:45989",
Keys: []ssh.PublicKey{sshPubKey},
},
},
{
name: "unix socket",
config: ServerOptions{
Network: "unix",
Addr: socketFile,
Keys: []ssh.PublicKey{sshPubKey},
},
setup: func() error {
// Create a socket file that should be removed
f, err := os.Create(socketFile)
if err != nil {
return err
}
return f.Close()
},
cleanup: func() error {
return os.Remove(socketFile)
},
},
{
name: "bad key should fail",
config: ServerOptions{
Network: "tcp",
Addr: "45987",
Keys: []ssh.PublicKey{sshBadPubKey},
},
wantErr: true,
errContains: "ssh: handshake failed",
},
{
name: "good key still good",
config: ServerOptions{
Network: "tcp",
Addr: "45987",
Keys: []ssh.PublicKey{sshPubKey},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if tt.setup != nil {
err := tt.setup()
require.NoError(t, err)
}
if tt.cleanup != nil {
defer tt.cleanup()
}
agent := NewAgent()
// Start server in a goroutine since it blocks
errChan := make(chan error, 1)
go func() {
errChan <- agent.StartServer(tt.config)
}()
// Add a short delay to allow the server to start
time.Sleep(100 * time.Millisecond)
// Try to connect to verify server is running
var client *ssh.Client
var err error
// Choose the appropriate signer based on the test case
testSigner := signer
if tt.name == "bad key should fail" {
testSigner = badSigner
}
sshClientConfig := &ssh.ClientConfig{
User: "a",
Auth: []ssh.AuthMethod{
ssh.PublicKeys(testSigner),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: 4 * time.Second,
}
switch tt.config.Network {
case "unix":
client, err = ssh.Dial("unix", tt.config.Addr, sshClientConfig)
default:
if !strings.Contains(tt.config.Addr, ":") {
tt.config.Addr = ":" + tt.config.Addr
}
client, err = ssh.Dial("tcp", tt.config.Addr, sshClientConfig)
}
if tt.wantErr {
assert.Error(t, err)
if tt.errContains != "" {
assert.Contains(t, err.Error(), tt.errContains)
}
return
}
require.NoError(t, err)
require.NotNil(t, client)
client.Close()
})
}
}
/////////////////////////////////////////////////////////////////
//////////////////// ParseKeys Tests ////////////////////////////
/////////////////////////////////////////////////////////////////
// Helper function to generate a temporary file with content
func createTempFile(content string) (string, error) {
tmpFile, err := os.CreateTemp("", "ssh_keys_*.txt")
if err != nil {
return "", fmt.Errorf("failed to create temp file: %w", err)
}
defer tmpFile.Close()
if _, err := tmpFile.WriteString(content); err != nil {
return "", fmt.Errorf("failed to write to temp file: %w", err)
}
return tmpFile.Name(), nil
}
// Test case 1: String with a single SSH key
func TestParseSingleKeyFromString(t *testing.T) {
input := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKCBM91kukN7hbvFKtbpEeo2JXjCcNxXcdBH7V7ADMBo"
keys, err := ParseKeys(input)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if len(keys) != 1 {
t.Fatalf("Expected 1 key, got %d keys", len(keys))
}
if keys[0].Type() != "ssh-ed25519" {
t.Fatalf("Expected key type 'ssh-ed25519', got '%s'", keys[0].Type())
}
}
// Test case 2: String with multiple SSH keys
func TestParseMultipleKeysFromString(t *testing.T) {
input := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKCBM91kukN7hbvFKtbpEeo2JXjCcNxXcdBH7V7ADMBo\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJDMtAOQfxDlCxe+A5lVbUY/DHxK1LAF2Z3AV0FYv36D \n #comment\n ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJDMtAOQfxDlCxe+A5lVbUY/DHxK1LAF2Z3AV0FYv36D"
keys, err := ParseKeys(input)
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if len(keys) != 3 {
t.Fatalf("Expected 3 keys, got %d keys", len(keys))
}
if keys[0].Type() != "ssh-ed25519" || keys[1].Type() != "ssh-ed25519" || keys[2].Type() != "ssh-ed25519" {
t.Fatalf("Unexpected key types: %s, %s, %s", keys[0].Type(), keys[1].Type(), keys[2].Type())
}
}
// Test case 3: File with a single SSH key
func TestParseSingleKeyFromFile(t *testing.T) {
content := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKCBM91kukN7hbvFKtbpEeo2JXjCcNxXcdBH7V7ADMBo"
filePath, err := createTempFile(content)
if err != nil {
t.Fatalf("Failed to create temp file: %v", err)
}
defer os.Remove(filePath) // Clean up the file after the test
// Read the file content
fileContent, err := os.ReadFile(filePath)
if err != nil {
t.Fatalf("Failed to read temp file: %v", err)
}
// Parse the keys
keys, err := ParseKeys(string(fileContent))
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if len(keys) != 1 {
t.Fatalf("Expected 1 key, got %d keys", len(keys))
}
if keys[0].Type() != "ssh-ed25519" {
t.Fatalf("Expected key type 'ssh-ed25519', got '%s'", keys[0].Type())
}
}
// Test case 4: File with multiple SSH keys
func TestParseMultipleKeysFromFile(t *testing.T) {
content := "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKCBM91kukN7hbvFKtbpEeo2JXjCcNxXcdBH7V7ADMBo\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJDMtAOQfxDlCxe+A5lVbUY/DHxK1LAF2Z3AV0FYv36D \n #comment\n ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJDMtAOQfxDlCxe+A5lVbUY/DHxK1LAF2Z3AV0FYv36D"
filePath, err := createTempFile(content)
if err != nil {
t.Fatalf("Failed to create temp file: %v", err)
}
// defer os.Remove(filePath) // Clean up the file after the test
// Read the file content
fileContent, err := os.ReadFile(filePath)
if err != nil {
t.Fatalf("Failed to read temp file: %v", err)
}
// Parse the keys
keys, err := ParseKeys(string(fileContent))
if err != nil {
t.Fatalf("Expected no error, got: %v", err)
}
if len(keys) != 3 {
t.Fatalf("Expected 3 keys, got %d keys", len(keys))
}
if keys[0].Type() != "ssh-ed25519" || keys[1].Type() != "ssh-ed25519" || keys[2].Type() != "ssh-ed25519" {
t.Fatalf("Unexpected key types: %s, %s, %s", keys[0].Type(), keys[1].Type(), keys[2].Type())
}
}
// Test case 5: Invalid SSH key input
func TestParseInvalidKey(t *testing.T) {
input := "invalid-key-data"
_, err := ParseKeys(input)
if err == nil {
t.Fatalf("Expected an error for invalid key, got nil")
}
expectedErrMsg := "failed to parse key"
if !strings.Contains(err.Error(), expectedErrMsg) {
t.Fatalf("Expected error message to contain '%s', got: %v", expectedErrMsg, err)
}
}

View File

@@ -116,11 +116,17 @@ func (a *Agent) getSystemStats() system.Stats {
continue
}
secondsElapsed := time.Since(stats.Time).Seconds()
readPerSecond := float64(d.ReadBytes-stats.TotalRead) / secondsElapsed
writePerSecond := float64(d.WriteBytes-stats.TotalWrite) / secondsElapsed
readPerSecond := bytesToMegabytes(float64(d.ReadBytes-stats.TotalRead) / secondsElapsed)
writePerSecond := bytesToMegabytes(float64(d.WriteBytes-stats.TotalWrite) / secondsElapsed)
// check for invalid values and reset stats if so
if readPerSecond < 0 || writePerSecond < 0 || readPerSecond > 50_000 || writePerSecond > 50_000 {
slog.Warn("Invalid disk I/O. Resetting.", "name", d.Name, "read", readPerSecond, "write", writePerSecond)
a.initializeDiskIoStats(ioCounters)
break
}
stats.Time = time.Now()
stats.DiskReadPs = bytesToMegabytes(readPerSecond)
stats.DiskWritePs = bytesToMegabytes(writePerSecond)
stats.DiskReadPs = readPerSecond
stats.DiskWritePs = writePerSecond
stats.TotalRead = d.ReadBytes
stats.TotalWrite = d.WriteBytes
// if root filesystem, update system stats
@@ -132,6 +138,13 @@ func (a *Agent) getSystemStats() system.Stats {
}
// network stats
if len(a.netInterfaces) == 0 {
// if no network interfaces, initialize again
// this is a fix if agent started before network is online (#466)
// maybe refactor this in the future to not cache interface names at all so we
// don't miss an interface that's been added after agent started in any circumstance
a.initializeNetIoStats()
}
if netIO, err := psutilNet.IOCounters(true); err == nil {
secondsElapsed := time.Since(a.netIoStats.Time).Seconds()
a.netIoStats.Time = time.Now()
@@ -153,7 +166,7 @@ func (a *Agent) getSystemStats() system.Stats {
networkRecvPs := bytesToMegabytes(recvPerSecond)
// add check for issue (#150) where sent is a massive number
if networkSentPs > 10_000 || networkRecvPs > 10_000 {
slog.Warn("Invalid network stats. Resetting.", "sent", networkSentPs, "recv", networkRecvPs)
slog.Warn("Invalid net stats. Resetting.", "sent", networkSentPs, "recv", networkRecvPs)
for _, v := range netIO {
if _, exists := a.netInterfaces[v.Name]; !exists {
continue
@@ -172,44 +185,19 @@ func (a *Agent) getSystemStats() system.Stats {
}
// temperatures (skip if sensors whitelist is set to empty string)
if a.sensorsWhitelist != nil && len(a.sensorsWhitelist) == 0 {
slog.Debug("Skipping temperature collection")
} else {
temps, err := sensors.TemperaturesWithContext(a.sensorsContext)
if err != nil {
slog.Debug("Sensor error", "err", err)
}
slog.Debug("Temperature", "sensors", temps)
if len(temps) > 0 {
systemStats.Temperatures = make(map[string]float64, len(temps))
for i, sensor := range temps {
// skip if temperature is 0
if sensor.Temperature <= 0 || sensor.Temperature >= 200 {
continue
}
if _, ok := systemStats.Temperatures[sensor.SensorKey]; ok {
// if key already exists, append int to key
systemStats.Temperatures[sensor.SensorKey+"_"+strconv.Itoa(i)] = twoDecimals(sensor.Temperature)
} else {
systemStats.Temperatures[sensor.SensorKey] = twoDecimals(sensor.Temperature)
}
}
// remove sensors from systemStats if whitelist exists and sensor is not in whitelist
// (do this here instead of in initial loop so we have correct keys if int was appended)
if a.sensorsWhitelist != nil {
for key := range systemStats.Temperatures {
if _, nameInWhitelist := a.sensorsWhitelist[key]; !nameInWhitelist {
delete(systemStats.Temperatures, key)
}
}
}
}
err = a.updateTemperatures(&systemStats)
if err != nil {
slog.Error("Error getting temperatures", "err", err)
}
// GPU data
if a.gpuManager != nil {
// reset high gpu percent
a.systemInfo.GpuPct = 0
// get current GPU data
if gpuData := a.gpuManager.GetCurrentData(); len(gpuData) > 0 {
systemStats.GPUData = gpuData
// add temperatures
if systemStats.Temperatures == nil {
systemStats.Temperatures = make(map[string]float64, len(gpuData))
@@ -218,6 +206,8 @@ func (a *Agent) getSystemStats() system.Stats {
if gpu.Temperature > 0 {
systemStats.Temperatures[gpu.Name] = gpu.Temperature
}
// update high gpu percent for dashboard
a.systemInfo.GpuPct = max(a.systemInfo.GpuPct, gpu.Usage)
}
}
}
@@ -233,6 +223,60 @@ func (a *Agent) getSystemStats() system.Stats {
return systemStats
}
func (a *Agent) updateTemperatures(systemStats *system.Stats) error {
// skip if sensors whitelist is set to empty string
if a.sensorsWhitelist != nil && len(a.sensorsWhitelist) == 0 {
slog.Debug("Skipping temperature collection")
return nil
}
primarySensor, primarySensorIsDefined := GetEnv("PRIMARY_SENSOR")
// reset high temp
a.systemInfo.DashboardTemp = 0
// get sensor data
temps, err := sensors.TemperaturesWithContext(a.sensorsContext)
if err != nil {
return err
}
slog.Debug("Temperature", "sensors", temps)
// return if no sensors
if len(temps) == 0 {
return nil
}
systemStats.Temperatures = make(map[string]float64, len(temps))
for i, sensor := range temps {
// skip if temperature is unreasonable
if sensor.Temperature <= 0 || sensor.Temperature >= 200 {
continue
}
sensorName := sensor.SensorKey
if _, ok := systemStats.Temperatures[sensorName]; ok {
// if key already exists, append int to key
sensorName = sensorName + "_" + strconv.Itoa(i)
}
// skip if not in whitelist
if a.sensorsWhitelist != nil {
if _, nameInWhitelist := a.sensorsWhitelist[sensorName]; !nameInWhitelist {
continue
}
}
// set dashboard temperature
if primarySensorIsDefined {
if sensorName == primarySensor {
a.systemInfo.DashboardTemp = sensor.Temperature
}
} else {
a.systemInfo.DashboardTemp = max(a.systemInfo.DashboardTemp, sensor.Temperature)
}
systemStats.Temperatures[sensorName] = twoDecimals(sensor.Temperature)
}
return nil
}
// Returns the size of the ZFS ARC memory cache in bytes
func getARCSize() (uint64, error) {
file, err := os.Open("/proc/spl/kstat/zfs/arcstats")

View File

@@ -2,27 +2,24 @@
package alerts
import (
"beszel/internal/entities/system"
"fmt"
"net/mail"
"net/url"
"strings"
"sync"
"time"
"github.com/containrrr/shoutrrr"
"github.com/goccy/go-json"
"github.com/labstack/echo/v5"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/mailer"
"github.com/pocketbase/pocketbase/tools/types"
"github.com/spf13/cast"
)
type AlertManager struct {
app *pocketbase.PocketBase
app core.App
alertQueue chan alertTask
stopChan chan struct{}
pendingAlerts sync.Map
}
type AlertMessageData struct {
@@ -48,8 +45,8 @@ type SystemAlertStats struct {
}
type SystemAlertData struct {
systemRecord *models.Record
alertRecord *models.Record
systemRecord *core.Record
alertRecord *core.Record
name string
unit string
val float64
@@ -62,351 +59,43 @@ type SystemAlertData struct {
descriptor string // override descriptor in notification body (for temp sensor, disk partition, etc)
}
func NewAlertManager(app *pocketbase.PocketBase) *AlertManager {
return &AlertManager{
app: app,
}
// notification services that support title param
var supportsTitle = map[string]struct{}{
"bark": {},
"discord": {},
"gotify": {},
"ifttt": {},
"join": {},
"matrix": {},
"ntfy": {},
"opsgenie": {},
"pushbullet": {},
"pushover": {},
"slack": {},
"teams": {},
"telegram": {},
"zulip": {},
}
func (am *AlertManager) HandleSystemAlerts(systemRecord *models.Record, systemInfo system.Info, temperatures map[string]float64, extraFs map[string]*system.FsStats) error {
// start := time.Now()
// defer func() {
// log.Println("alert stats took", time.Since(start))
// }()
alertRecords, err := am.app.Dao().FindRecordsByExpr("alerts",
dbx.NewExp("system={:system}", dbx.Params{"system": systemRecord.Id}),
)
if err != nil || len(alertRecords) == 0 {
// log.Println("no alerts found for system")
return nil
// NewAlertManager creates a new AlertManager instance.
func NewAlertManager(app core.App) *AlertManager {
am := &AlertManager{
app: app,
alertQueue: make(chan alertTask),
stopChan: make(chan struct{}),
}
var validAlerts []SystemAlertData
now := systemRecord.Updated.Time().UTC()
oldestTime := now
for _, alertRecord := range alertRecords {
name := alertRecord.GetString("name")
var val float64
unit := "%"
switch name {
case "CPU":
val = systemInfo.Cpu
case "Memory":
val = systemInfo.MemPct
case "Bandwidth":
val = systemInfo.Bandwidth
unit = " MB/s"
case "Disk":
maxUsedPct := systemInfo.DiskPct
for _, fs := range extraFs {
usedPct := fs.DiskUsed / fs.DiskTotal * 100
if usedPct > maxUsedPct {
maxUsedPct = usedPct
}
}
val = maxUsedPct
case "Temperature":
if temperatures == nil {
continue
}
for _, temp := range temperatures {
if temp > val {
val = temp
}
}
unit = "°C"
}
triggered := alertRecord.GetBool("triggered")
threshold := alertRecord.GetFloat("value")
// CONTINUE
// IF alert is not triggered and curValue is less than threshold
// OR alert is triggered and curValue is greater than threshold
if (!triggered && val <= threshold) || (triggered && val > threshold) {
// log.Printf("Skipping alert %s: val %f | threshold %f | triggered %v\n", name, val, threshold, triggered)
continue
}
min := max(1, cast.ToUint8(alertRecord.Get("min")))
// add time to alert time to make sure it's slighty after record creation
time := now.Add(-time.Duration(min) * time.Minute)
if time.Before(oldestTime) {
oldestTime = time
}
validAlerts = append(validAlerts, SystemAlertData{
systemRecord: systemRecord,
alertRecord: alertRecord,
name: name,
unit: unit,
val: val,
threshold: threshold,
triggered: triggered,
time: time,
min: min,
})
}
systemStats := []struct {
Stats []byte `db:"stats"`
Created types.DateTime `db:"created"`
}{}
err = am.app.Dao().DB().
Select("stats", "created").
From("system_stats").
Where(dbx.NewExp(
"system={:system} AND type='1m' AND created > {:created}",
dbx.Params{
"system": systemRecord.Id,
// subtract some time to give us a bit of buffer
"created": oldestTime.Add(-time.Second * 90),
},
)).
OrderBy("created").
All(&systemStats)
if err != nil {
return err
}
// get oldest record creation time from first record in the slice
oldestRecordTime := systemStats[0].Created.Time()
// log.Println("oldestRecordTime", oldestRecordTime.String())
// delete from validAlerts if time is older than oldestRecord
for i := 0; i < len(validAlerts); i++ {
if validAlerts[i].time.Before(oldestRecordTime) {
// log.Println("deleting alert - time is older than oldestRecord", validAlerts[i].name, oldestRecordTime, validAlerts[i].time)
validAlerts = append(validAlerts[:i], validAlerts[i+1:]...)
}
}
if len(validAlerts) == 0 {
// log.Println("no valid alerts found")
return nil
}
var stats SystemAlertStats
// we can skip the latest systemStats record since it's the current value
for i := 0; i < len(systemStats); i++ {
stat := systemStats[i]
// subtract 10 seconds to give a small time buffer
systemStatsCreation := stat.Created.Time().Add(-time.Second * 10)
if err := json.Unmarshal(stat.Stats, &stats); err != nil {
return err
}
// log.Println("stats", stats)
for j := range validAlerts {
alert := &validAlerts[j]
// reset alert val on first iteration
if i == 0 {
alert.val = 0
}
// continue if system_stats is older than alert time range
if systemStatsCreation.Before(alert.time) {
continue
}
// add to alert value
switch alert.name {
case "CPU":
alert.val += stats.Cpu
case "Memory":
alert.val += stats.Mem
case "Bandwidth":
alert.val += stats.NetSent + stats.NetRecv
case "Disk":
if alert.mapSums == nil {
alert.mapSums = make(map[string]float32, len(extraFs)+1)
}
// add root disk
if _, ok := alert.mapSums["root"]; !ok {
alert.mapSums["root"] = 0.0
}
alert.mapSums["root"] += float32(stats.Disk)
// add extra disks
for key, fs := range extraFs {
if _, ok := alert.mapSums[key]; !ok {
alert.mapSums[key] = 0.0
}
alert.mapSums[key] += float32(fs.DiskUsed / fs.DiskTotal * 100)
}
case "Temperature":
if alert.mapSums == nil {
alert.mapSums = make(map[string]float32, len(stats.Temperatures))
}
for key, temp := range stats.Temperatures {
if _, ok := alert.mapSums[key]; !ok {
alert.mapSums[key] = float32(0)
}
alert.mapSums[key] += temp
}
default:
continue
}
alert.count++
}
}
// sum up vals for each alert
for _, alert := range validAlerts {
switch alert.name {
case "Disk":
maxPct := float32(0)
for key, value := range alert.mapSums {
sumPct := float32(value)
if sumPct > maxPct {
maxPct = sumPct
alert.descriptor = fmt.Sprintf("Usage of %s", key)
}
}
alert.val = float64(maxPct / float32(alert.count))
case "Temperature":
maxTemp := float32(0)
for key, value := range alert.mapSums {
sumTemp := float32(value) / float32(alert.count)
if sumTemp > maxTemp {
maxTemp = sumTemp
alert.descriptor = fmt.Sprintf("Highest sensor %s", key)
}
}
alert.val = float64(maxTemp)
default:
alert.val = alert.val / float64(alert.count)
}
minCount := float32(alert.min) / 1.2
// log.Println("alert", alert.name, "val", alert.val, "threshold", alert.threshold, "triggered", alert.triggered)
// log.Printf("%s: val %f | count %d | min-count %f | threshold %f\n", alert.name, alert.val, alert.count, minCount, alert.threshold)
// pass through alert if count is greater than or equal to minCount
if float32(alert.count) >= minCount {
if !alert.triggered && alert.val > alert.threshold {
alert.triggered = true
go am.sendSystemAlert(alert)
} else if alert.triggered && alert.val <= alert.threshold {
alert.triggered = false
go am.sendSystemAlert(alert)
}
}
}
return nil
go am.startWorker()
return am
}
func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
// log.Printf("Sending alert %s: val %f | count %d | threshold %f\n", alert.name, alert.val, alert.count, alert.threshold)
systemName := alert.systemRecord.GetString("name")
// change Disk to Disk usage
if alert.name == "Disk" {
alert.name += " usage"
}
// make title alert name lowercase if not CPU
titleAlertName := alert.name
if titleAlertName != "CPU" {
titleAlertName = strings.ToLower(titleAlertName)
}
var subject string
if alert.triggered {
subject = fmt.Sprintf("%s %s above threshold", systemName, titleAlertName)
} else {
subject = fmt.Sprintf("%s %s below threshold", systemName, titleAlertName)
}
minutesLabel := "minute"
if alert.min > 1 {
minutesLabel += "s"
}
if alert.descriptor == "" {
alert.descriptor = alert.name
}
body := fmt.Sprintf("%s averaged %.2f%s for the previous %v %s.", alert.descriptor, alert.val, alert.unit, alert.min, minutesLabel)
alert.alertRecord.Set("triggered", alert.triggered)
if err := am.app.Dao().SaveRecord(alert.alertRecord); err != nil {
// app.Logger().Error("failed to save alert record", "err", err.Error())
return
}
// expand the user relation and send the alert
if errs := am.app.Dao().ExpandRecord(alert.alertRecord, []string{"user"}, nil); len(errs) > 0 {
// app.Logger().Error("failed to expand user relation", "errs", errs)
return
}
if user := alert.alertRecord.ExpandedOne("user"); user != nil {
am.sendAlert(AlertMessageData{
UserID: user.GetId(),
Title: subject,
Message: body,
Link: am.app.Settings().Meta.AppUrl + "/system/" + url.PathEscape(systemName),
LinkText: "View " + systemName,
})
}
}
// todo: allow x minutes downtime before sending alert
func (am *AlertManager) HandleStatusAlerts(newStatus string, oldSystemRecord *models.Record) error {
var alertStatus string
switch newStatus {
case "up":
if oldSystemRecord.GetString("status") == "down" {
alertStatus = "up"
}
case "down":
if oldSystemRecord.GetString("status") == "up" {
alertStatus = "down"
}
}
if alertStatus == "" {
return nil
}
// check if use
alertRecords, err := am.app.Dao().FindRecordsByExpr("alerts",
dbx.HashExp{
"system": oldSystemRecord.GetId(),
"name": "Status",
},
)
if err != nil || len(alertRecords) == 0 {
// log.Println("no alerts found for system")
return nil
}
for _, alertRecord := range alertRecords {
// expand the user relation
if errs := am.app.Dao().ExpandRecord(alertRecord, []string{"user"}, nil); len(errs) > 0 {
return fmt.Errorf("failed to expand: %v", errs)
}
user := alertRecord.ExpandedOne("user")
if user == nil {
return nil
}
emoji := "\U0001F534"
if alertStatus == "up" {
emoji = "\u2705"
}
// send alert
systemName := oldSystemRecord.GetString("name")
am.sendAlert(AlertMessageData{
UserID: user.GetId(),
Title: fmt.Sprintf("Connection to %s is %s %v", systemName, alertStatus, emoji),
Message: fmt.Sprintf("Connection to %s is %s", systemName, alertStatus),
Link: am.app.Settings().Meta.AppUrl + "/system/" + url.PathEscape(systemName),
LinkText: "View " + systemName,
})
}
return nil
}
func (am *AlertManager) sendAlert(data AlertMessageData) {
func (am *AlertManager) SendAlert(data AlertMessageData) error {
// get user settings
record, err := am.app.Dao().FindFirstRecordByFilter(
record, err := am.app.FindFirstRecordByFilter(
"user_settings", "user={:user}",
dbx.Params{"user": data.UserID},
)
if err != nil {
am.app.Logger().Error("Failed to get user settings", "err", err.Error())
return
return err
}
// unmarshal user settings
userAlertSettings := UserNotificationSettings{
@@ -424,8 +113,7 @@ func (am *AlertManager) sendAlert(data AlertMessageData) {
}
// send alerts via email
if len(userAlertSettings.Emails) == 0 {
// log.Println("No email addresses found")
return
return nil
}
addresses := []mail.Address{}
for _, email := range userAlertSettings.Emails {
@@ -440,18 +128,16 @@ func (am *AlertManager) sendAlert(data AlertMessageData) {
Name: am.app.Settings().Meta.SenderName,
},
}
if err := am.app.NewMailClient().Send(&message); err != nil {
am.app.Logger().Error("Failed to send alert: ", "err", err.Error())
} else {
am.app.Logger().Info("Sent email alert", "to", message.To, "subj", message.Subject)
err = am.app.NewMailClient().Send(&message)
if err != nil {
return err
}
am.app.Logger().Info("Sent email alert", "to", message.To, "subj", message.Subject)
return nil
}
// SendShoutrrrAlert sends an alert via a Shoutrrr URL
func (am *AlertManager) SendShoutrrrAlert(notificationUrl, title, message, link, linkText string) error {
// services that support title param
supportsTitle := []string{"bark", "discord", "gotify", "ifttt", "join", "matrix", "ntfy", "opsgenie", "pushbullet", "pushover", "slack", "teams", "telegram", "zulip"}
// Parse the URL
parsedURL, err := url.Parse(notificationUrl)
if err != nil {
@@ -461,7 +147,7 @@ func (am *AlertManager) SendShoutrrrAlert(notificationUrl, title, message, link,
queryParams := parsedURL.Query()
// Add title
if sliceContains(supportsTitle, scheme) {
if _, ok := supportsTitle[scheme]; ok {
queryParams.Add("title", title)
} else if scheme == "mattermost" {
// use markdown title for mattermost
@@ -502,29 +188,19 @@ func (am *AlertManager) SendShoutrrrAlert(notificationUrl, title, message, link,
return nil
}
// Contains checks if a string is present in a slice of strings
func sliceContains(slice []string, item string) bool {
for _, v := range slice {
if v == item {
return true
}
}
return false
}
func (am *AlertManager) SendTestNotification(c echo.Context) error {
requestData := apis.RequestInfo(c)
if requestData.AuthRecord == nil {
func (am *AlertManager) SendTestNotification(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
url := c.QueryParam("url")
url := e.Request.URL.Query().Get("url")
// log.Println("url", url)
if url == "" {
return c.JSON(200, map[string]string{"err": "URL is required"})
return e.JSON(200, map[string]string{"err": "URL is required"})
}
err := am.SendShoutrrrAlert(url, "Test Alert", "This is a notification from Beszel.", am.app.Settings().Meta.AppUrl, "View Beszel")
err := am.SendShoutrrrAlert(url, "Test Alert", "This is a notification from Beszel.", am.app.Settings().Meta.AppURL, "View Beszel")
if err != nil {
return c.JSON(200, map[string]string{"err": err.Error()})
return e.JSON(200, map[string]string{"err": err.Error()})
}
return c.JSON(200, map[string]bool{"err": false})
return e.JSON(200, map[string]bool{"err": false})
}

View File

@@ -0,0 +1,175 @@
package alerts
import (
"fmt"
"net/url"
"strings"
"time"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
)
type alertTask struct {
action string // "schedule" or "cancel"
systemName string
alertRecord *core.Record
delay time.Duration
}
type alertInfo struct {
systemName string
alertRecord *core.Record
expireTime time.Time
}
// startWorker is a long-running goroutine that processes alert tasks
// every x seconds. It must be running to process status alerts.
func (am *AlertManager) startWorker() {
// no special reason for 13 seconds
tick := time.Tick(13 * time.Second)
for {
select {
case <-am.stopChan:
return
case task := <-am.alertQueue:
switch task.action {
case "schedule":
am.pendingAlerts.Store(task.alertRecord.Id, &alertInfo{
systemName: task.systemName,
alertRecord: task.alertRecord,
expireTime: time.Now().Add(task.delay),
})
case "cancel":
am.pendingAlerts.Delete(task.alertRecord.Id)
}
case <-tick:
// Check for expired alerts every tick
now := time.Now()
for key, value := range am.pendingAlerts.Range {
info := value.(*alertInfo)
if now.After(info.expireTime) {
// Downtime delay has passed, process alert
am.sendStatusAlert("down", info.systemName, info.alertRecord)
am.pendingAlerts.Delete(key)
}
}
}
}
}
// StopWorker shuts down the AlertManager.worker goroutine
func (am *AlertManager) StopWorker() {
close(am.stopChan)
}
// HandleStatusAlerts manages the logic when system status changes.
func (am *AlertManager) HandleStatusAlerts(newStatus string, oldSystemRecord *core.Record) error {
switch newStatus {
case "up":
if oldSystemRecord.GetString("status") != "down" {
return nil
}
case "down":
if oldSystemRecord.GetString("status") != "up" {
return nil
}
default:
return nil
}
alertRecords, err := am.getSystemStatusAlerts(oldSystemRecord.Id)
if err != nil {
return err
}
if len(alertRecords) == 0 {
return nil
}
systemName := oldSystemRecord.GetString("name")
if newStatus == "down" {
am.handleSystemDown(systemName, alertRecords)
} else {
am.handleSystemUp(systemName, alertRecords)
}
return nil
}
// getSystemStatusAlerts retrieves all "Status" alert records for a given system ID.
func (am *AlertManager) getSystemStatusAlerts(systemID string) ([]*core.Record, error) {
alertRecords, err := am.app.FindAllRecords("alerts", dbx.HashExp{
"system": systemID,
"name": "Status",
})
if err != nil {
return nil, err
}
return alertRecords, nil
}
// Schedules delayed "down" alerts for each alert record.
func (am *AlertManager) handleSystemDown(systemName string, alertRecords []*core.Record) {
for _, alertRecord := range alertRecords {
// Continue if alert is already scheduled
if _, exists := am.pendingAlerts.Load(alertRecord.Id); exists {
continue
}
// Schedule by adding to queue
min := max(1, alertRecord.GetInt("min"))
am.alertQueue <- alertTask{
action: "schedule",
systemName: systemName,
alertRecord: alertRecord,
delay: time.Duration(min) * time.Minute,
}
}
}
// handleSystemUp manages the logic when a system status changes to "up".
// It cancels any pending alerts and sends "up" alerts.
func (am *AlertManager) handleSystemUp(systemName string, alertRecords []*core.Record) {
for _, alertRecord := range alertRecords {
alertRecordID := alertRecord.Id
// If alert exists for record, delete and continue (down alert not sent)
if _, exists := am.pendingAlerts.Load(alertRecordID); exists {
am.alertQueue <- alertTask{
action: "cancel",
alertRecord: alertRecord,
}
continue
}
// No alert scheduled for this record, send "up" alert
if err := am.sendStatusAlert("up", systemName, alertRecord); err != nil {
am.app.Logger().Error("Failed to send alert", "err", err.Error())
}
}
}
// 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 {
var emoji string
if alertStatus == "up" {
emoji = "\u2705" // Green checkmark emoji
} else {
emoji = "\U0001F534" // Red alert emoji
}
title := fmt.Sprintf("Connection to %s is %s %v", systemName, alertStatus, emoji)
message := strings.TrimSuffix(title, emoji)
if errs := am.app.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,
Title: title,
Message: message,
Link: am.app.Settings().Meta.AppURL + "/system/" + url.PathEscape(systemName),
LinkText: "View " + systemName,
})
}

View File

@@ -0,0 +1,288 @@
package alerts
import (
"beszel/internal/entities/system"
"fmt"
"net/url"
"slices"
"strings"
"time"
"github.com/goccy/go-json"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/types"
"github.com/spf13/cast"
)
func (am *AlertManager) HandleSystemAlerts(systemRecord *core.Record, systemInfo system.Info, temperatures map[string]float64, extraFs map[string]*system.FsStats) error {
alertRecords, err := am.app.FindAllRecords("alerts",
dbx.NewExp("system={:system}", dbx.Params{"system": systemRecord.Id}),
)
if err != nil || len(alertRecords) == 0 {
// log.Println("no alerts found for system")
return nil
}
var validAlerts []SystemAlertData
now := systemRecord.GetDateTime("updated").Time().UTC()
oldestTime := now
for _, alertRecord := range alertRecords {
name := alertRecord.GetString("name")
var val float64
unit := "%"
switch name {
case "CPU":
val = systemInfo.Cpu
case "Memory":
val = systemInfo.MemPct
case "Bandwidth":
val = systemInfo.Bandwidth
unit = " MB/s"
case "Disk":
maxUsedPct := systemInfo.DiskPct
for _, fs := range extraFs {
usedPct := fs.DiskUsed / fs.DiskTotal * 100
if usedPct > maxUsedPct {
maxUsedPct = usedPct
}
}
val = maxUsedPct
case "Temperature":
if temperatures == nil {
continue
}
for _, temp := range temperatures {
if temp > val {
val = temp
}
}
unit = "°C"
}
triggered := alertRecord.GetBool("triggered")
threshold := alertRecord.GetFloat("value")
// CONTINUE
// IF alert is not triggered and curValue is less than threshold
// OR alert is triggered and curValue is greater than threshold
if (!triggered && val <= threshold) || (triggered && val > threshold) {
// log.Printf("Skipping alert %s: val %f | threshold %f | triggered %v\n", name, val, threshold, triggered)
continue
}
min := max(1, cast.ToUint8(alertRecord.Get("min")))
// add time to alert time to make sure it's slighty after record creation
time := now.Add(-time.Duration(min) * time.Minute)
if time.Before(oldestTime) {
oldestTime = time
}
validAlerts = append(validAlerts, SystemAlertData{
systemRecord: systemRecord,
alertRecord: alertRecord,
name: name,
unit: unit,
val: val,
threshold: threshold,
triggered: triggered,
time: time,
min: min,
})
}
systemStats := []struct {
Stats []byte `db:"stats"`
Created types.DateTime `db:"created"`
}{}
err = am.app.DB().
Select("stats", "created").
From("system_stats").
Where(dbx.NewExp(
"system={:system} AND type='1m' AND created > {:created}",
dbx.Params{
"system": systemRecord.Id,
// subtract some time to give us a bit of buffer
"created": oldestTime.Add(-time.Second * 90),
},
)).
OrderBy("created").
All(&systemStats)
if err != nil {
return err
}
// get oldest record creation time from first record in the slice
oldestRecordTime := systemStats[0].Created.Time()
// log.Println("oldestRecordTime", oldestRecordTime.String())
// delete from validAlerts if time is older than oldestRecord
for i := range validAlerts {
if validAlerts[i].time.Before(oldestRecordTime) {
// log.Println("deleting alert - time is older than oldestRecord", validAlerts[i].name, oldestRecordTime, validAlerts[i].time)
validAlerts = slices.Delete(validAlerts, i, i+1)
}
}
if len(validAlerts) == 0 {
// log.Println("no valid alerts found")
return nil
}
var stats SystemAlertStats
// we can skip the latest systemStats record since it's the current value
for i := range systemStats {
stat := systemStats[i]
// subtract 10 seconds to give a small time buffer
systemStatsCreation := stat.Created.Time().Add(-time.Second * 10)
if err := json.Unmarshal(stat.Stats, &stats); err != nil {
return err
}
// log.Println("stats", stats)
for j := range validAlerts {
alert := &validAlerts[j]
// reset alert val on first iteration
if i == 0 {
alert.val = 0
}
// continue if system_stats is older than alert time range
if systemStatsCreation.Before(alert.time) {
continue
}
// add to alert value
switch alert.name {
case "CPU":
alert.val += stats.Cpu
case "Memory":
alert.val += stats.Mem
case "Bandwidth":
alert.val += stats.NetSent + stats.NetRecv
case "Disk":
if alert.mapSums == nil {
alert.mapSums = make(map[string]float32, len(extraFs)+1)
}
// add root disk
if _, ok := alert.mapSums["root"]; !ok {
alert.mapSums["root"] = 0.0
}
alert.mapSums["root"] += float32(stats.Disk)
// add extra disks
for key, fs := range extraFs {
if _, ok := alert.mapSums[key]; !ok {
alert.mapSums[key] = 0.0
}
alert.mapSums[key] += float32(fs.DiskUsed / fs.DiskTotal * 100)
}
case "Temperature":
if alert.mapSums == nil {
alert.mapSums = make(map[string]float32, len(stats.Temperatures))
}
for key, temp := range stats.Temperatures {
if _, ok := alert.mapSums[key]; !ok {
alert.mapSums[key] = float32(0)
}
alert.mapSums[key] += temp
}
default:
continue
}
alert.count++
}
}
// sum up vals for each alert
for _, alert := range validAlerts {
switch alert.name {
case "Disk":
maxPct := float32(0)
for key, value := range alert.mapSums {
sumPct := float32(value)
if sumPct > maxPct {
maxPct = sumPct
alert.descriptor = fmt.Sprintf("Usage of %s", key)
}
}
alert.val = float64(maxPct / float32(alert.count))
case "Temperature":
maxTemp := float32(0)
for key, value := range alert.mapSums {
sumTemp := float32(value) / float32(alert.count)
if sumTemp > maxTemp {
maxTemp = sumTemp
alert.descriptor = fmt.Sprintf("Highest sensor %s", key)
}
}
alert.val = float64(maxTemp)
default:
alert.val = alert.val / float64(alert.count)
}
minCount := float32(alert.min) / 1.2
// log.Println("alert", alert.name, "val", alert.val, "threshold", alert.threshold, "triggered", alert.triggered)
// log.Printf("%s: val %f | count %d | min-count %f | threshold %f\n", alert.name, alert.val, alert.count, minCount, alert.threshold)
// pass through alert if count is greater than or equal to minCount
if float32(alert.count) >= minCount {
if !alert.triggered && alert.val > alert.threshold {
alert.triggered = true
go am.sendSystemAlert(alert)
} else if alert.triggered && alert.val <= alert.threshold {
alert.triggered = false
go am.sendSystemAlert(alert)
}
}
}
return nil
}
func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
// log.Printf("Sending alert %s: val %f | count %d | threshold %f\n", alert.name, alert.val, alert.count, alert.threshold)
systemName := alert.systemRecord.GetString("name")
// change Disk to Disk usage
if alert.name == "Disk" {
alert.name += " usage"
}
// make title alert name lowercase if not CPU
titleAlertName := alert.name
if titleAlertName != "CPU" {
titleAlertName = strings.ToLower(titleAlertName)
}
var subject string
if alert.triggered {
subject = fmt.Sprintf("%s %s above threshold", systemName, titleAlertName)
} else {
subject = fmt.Sprintf("%s %s below threshold", systemName, titleAlertName)
}
minutesLabel := "minute"
if alert.min > 1 {
minutesLabel += "s"
}
if alert.descriptor == "" {
alert.descriptor = alert.name
}
body := fmt.Sprintf("%s averaged %.2f%s for the previous %v %s.", alert.descriptor, alert.val, alert.unit, alert.min, minutesLabel)
alert.alertRecord.Set("triggered", alert.triggered)
if err := am.app.Save(alert.alertRecord); err != nil {
// app.Logger().Error("failed to save alert record", "err", err.Error())
return
}
// expand the user relation and send the alert
if errs := am.app.ExpandRecord(alert.alertRecord, []string{"user"}, nil); len(errs) > 0 {
// app.Logger().Error("failed to expand user relation", "errs", errs)
return
}
if user := alert.alertRecord.ExpandedOne("user"); user != nil {
am.SendAlert(AlertMessageData{
UserID: user.Id,
Title: subject,
Message: body,
Link: am.app.Settings().Meta.AppURL + "/system/" + url.PathEscape(systemName),
LinkText: "View " + systemName,
})
}
}

View File

@@ -75,6 +75,8 @@ type Info struct {
Bandwidth float64 `json:"b"`
AgentVersion string `json:"v"`
Podman bool `json:"p,omitempty"`
GpuPct float64 `json:"g,omitempty"`
DashboardTemp float64 `json:"dt,omitempty"`
}
// Final data structure to return to the hub

View File

@@ -8,10 +8,9 @@ import (
"path/filepath"
"strconv"
"github.com/labstack/echo/v5"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/core"
"github.com/spf13/cast"
"gopkg.in/yaml.v3"
)
@@ -29,7 +28,7 @@ type SystemConfig struct {
// Syncs systems with the config.yml file
func (h *Hub) syncSystemsWithConfig() error {
configPath := filepath.Join(h.app.DataDir(), "config.yml")
configPath := filepath.Join(h.DataDir(), "config.yml")
configData, err := os.ReadFile(configPath)
if err != nil {
return nil
@@ -46,11 +45,11 @@ func (h *Hub) syncSystemsWithConfig() error {
return nil
}
var firstUser *models.Record
var firstUser *core.Record
// Create a map of email to user ID
userEmailToID := make(map[string]string)
users, err := h.app.Dao().FindRecordsByExpr("users", dbx.NewExp("id != ''"))
users, err := h.FindAllRecords("users", dbx.NewExp("id != ''"))
if err != nil {
return err
}
@@ -85,13 +84,13 @@ func (h *Hub) syncSystemsWithConfig() error {
}
// Get existing systems
existingSystems, err := h.app.Dao().FindRecordsByExpr("systems", dbx.NewExp("id != ''"))
existingSystems, err := h.FindAllRecords("systems", dbx.NewExp("id != ''"))
if err != nil {
return err
}
// Create a map of existing systems for easy lookup
existingSystemsMap := make(map[string]*models.Record)
existingSystemsMap := make(map[string]*core.Record)
for _, system := range existingSystems {
key := system.GetString("host") + ":" + system.GetString("port")
existingSystemsMap[key] = system
@@ -105,24 +104,24 @@ func (h *Hub) syncSystemsWithConfig() error {
existingSystem.Set("name", sysConfig.Name)
existingSystem.Set("users", sysConfig.Users)
existingSystem.Set("port", sysConfig.Port)
if err := h.app.Dao().SaveRecord(existingSystem); err != nil {
if err := h.Save(existingSystem); err != nil {
return err
}
delete(existingSystemsMap, key)
} else {
// Create new system
systemsCollection, err := h.app.Dao().FindCollectionByNameOrId("systems")
systemsCollection, err := h.FindCollectionByNameOrId("systems")
if err != nil {
return fmt.Errorf("failed to find systems collection: %v", err)
}
newSystem := models.NewRecord(systemsCollection)
newSystem := core.NewRecord(systemsCollection)
newSystem.Set("name", sysConfig.Name)
newSystem.Set("host", sysConfig.Host)
newSystem.Set("port", sysConfig.Port)
newSystem.Set("users", sysConfig.Users)
newSystem.Set("info", system.Info{})
newSystem.Set("status", "pending")
if err := h.app.Dao().SaveRecord(newSystem); err != nil {
if err := h.Save(newSystem); err != nil {
return fmt.Errorf("failed to create new system: %v", err)
}
}
@@ -130,7 +129,7 @@ func (h *Hub) syncSystemsWithConfig() error {
// Delete systems not in config
for _, system := range existingSystemsMap {
if err := h.app.Dao().DeleteRecord(system); err != nil {
if err := h.Delete(system); err != nil {
return err
}
}
@@ -142,7 +141,7 @@ func (h *Hub) syncSystemsWithConfig() error {
// Generates content for the config.yml file as a YAML string
func (h *Hub) generateConfigYAML() (string, error) {
// Fetch all systems from the database
systems, err := h.app.Dao().FindRecordsByFilter("systems", "id != ''", "name", -1, 0)
systems, err := h.FindRecordsByFilter("systems", "id != ''", "name", -1, 0)
if err != nil {
return "", err
}
@@ -195,7 +194,7 @@ func (h *Hub) generateConfigYAML() (string, error) {
// New helper function to get a map of user IDs to emails
func (h *Hub) getUserEmailMap(userIDs []string) (map[string]string, error) {
users, err := h.app.Dao().FindRecordsByIds("users", userIDs)
users, err := h.FindRecordsByIds("users", userIDs)
if err != nil {
return nil, err
}
@@ -209,14 +208,14 @@ func (h *Hub) getUserEmailMap(userIDs []string) (map[string]string, error) {
}
// Returns the current config.yml file as a JSON object
func (h *Hub) getYamlConfig(c echo.Context) error {
requestData := apis.RequestInfo(c)
if requestData.AuthRecord == nil || requestData.AuthRecord.GetString("role") != "admin" {
func (h *Hub) getYamlConfig(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil || info.Auth.GetString("role") != "admin" {
return apis.NewForbiddenError("Forbidden", nil)
}
configContent, err := h.generateConfigYAML()
if err != nil {
return err
}
return c.JSON(200, map[string]string{"config": configContent})
return e.JSON(200, map[string]string{"config": configContent})
}

View File

@@ -8,193 +8,248 @@ import (
"beszel/internal/records"
"beszel/internal/users"
"beszel/site"
"context"
"crypto/ed25519"
"encoding/pem"
"fmt"
"io/fs"
"log"
"net"
"net/http"
"net/http/httputil"
"net/url"
"os"
"strings"
"sync"
"time"
"github.com/goccy/go-json"
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
"github.com/pocketbase/pocketbase/tools/cron"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh"
)
type Hub struct {
app *pocketbase.PocketBase
connectionLock *sync.Mutex
systemConnections map[string]*ssh.Client
sshClientConfig *ssh.ClientConfig
pubKey string
am *alerts.AlertManager
um *users.UserManager
rm *records.RecordManager
systemStats *models.Collection
containerStats *models.Collection
*pocketbase.PocketBase
sshClientConfig *ssh.ClientConfig
pubKey string
am *alerts.AlertManager
um *users.UserManager
rm *records.RecordManager
systemStats *core.Collection
containerStats *core.Collection
appURL string
}
func NewHub(app *pocketbase.PocketBase) *Hub {
return &Hub{
app: app,
connectionLock: &sync.Mutex{},
systemConnections: make(map[string]*ssh.Client),
am: alerts.NewAlertManager(app),
um: users.NewUserManager(app),
rm: records.NewRecordManager(app),
// NewHub creates a new Hub instance with default configuration
func NewHub() *Hub {
var hub Hub
hub.PocketBase = pocketbase.NewWithConfig(pocketbase.Config{
DefaultDataDir: beszel.AppName + "_data",
})
hub.RootCmd.Version = beszel.Version
hub.RootCmd.Use = beszel.AppName
hub.RootCmd.Short = ""
// add update command
hub.RootCmd.AddCommand(&cobra.Command{
Use: "update",
Short: "Update " + beszel.AppName + " to the latest version",
Run: Update,
})
hub.am = alerts.NewAlertManager(hub)
hub.um = users.NewUserManager(hub)
hub.rm = records.NewRecordManager(hub)
hub.appURL, _ = GetEnv("APP_URL")
return &hub
}
// GetEnv retrieves an environment variable with a "BESZEL_HUB_" prefix, or falls back to the unprefixed key.
func GetEnv(key string) (value string, exists bool) {
if value, exists = os.LookupEnv("BESZEL_HUB_" + key); exists {
return value, exists
}
// Fallback to the old unprefixed key
return os.LookupEnv(key)
}
func (h *Hub) Run() {
// loosely check if it was executed using "go run"
isGoRun := strings.HasPrefix(os.Args[0], os.TempDir())
isDev := os.Getenv("ENV") == "dev"
// enable auto creation of migration files when making collection changes in the Admin UI
migratecmd.MustRegister(h.app, h.app.RootCmd, migratecmd.Config{
// (the isGoRun check is to enable it only during development)
Automigrate: isGoRun,
migratecmd.MustRegister(h, h.RootCmd, migratecmd.Config{
// (the isDev check is to enable it only during development)
Automigrate: isDev,
Dir: "../../migrations",
})
// initial setup
h.app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// create ssh client config
err := h.createSSHClientConfig()
if err != nil {
log.Fatal(err)
}
// set general settings
settings := h.Settings()
// batch requests (for global alerts)
settings.Batch.Enabled = true
// set URL if BASE_URL env is set
if h.appURL != "" {
settings.Meta.AppURL = h.appURL
}
// set auth settings
usersCollection, err := h.app.Dao().FindCollectionByNameOrId("users")
usersCollection, err := h.FindCollectionByNameOrId("users")
if err != nil {
return err
}
usersAuthOptions := usersCollection.AuthOptions()
usersAuthOptions.AllowUsernameAuth = false
if os.Getenv("DISABLE_PASSWORD_AUTH") == "true" {
usersAuthOptions.AllowEmailAuth = false
} else {
usersAuthOptions.AllowEmailAuth = true
// disable email auth if DISABLE_PASSWORD_AUTH env var is set
disablePasswordAuth, _ := GetEnv("DISABLE_PASSWORD_AUTH")
usersCollection.PasswordAuth.Enabled = disablePasswordAuth != "true"
usersCollection.PasswordAuth.IdentityFields = []string{"email"}
// disable oauth if no providers are configured (todo: remove this in post 0.9.0 release)
if usersCollection.OAuth2.Enabled {
usersCollection.OAuth2.Enabled = len(usersCollection.OAuth2.Providers) > 0
}
usersCollection.SetOptions(usersAuthOptions)
if err := h.app.Dao().SaveCollection(usersCollection); err != nil {
// allow oauth user creation if USER_CREATION is set
if userCreation, _ := GetEnv("USER_CREATION"); userCreation == "true" {
cr := "@request.context = 'oauth2'"
usersCollection.CreateRule = &cr
} else {
usersCollection.CreateRule = nil
}
if err := h.Save(usersCollection); err != nil {
return err
}
// sync systems with config
return h.syncSystemsWithConfig()
h.syncSystemsWithConfig()
return se.Next()
})
// serve web ui
h.app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
switch isGoRun {
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
switch isDev {
case true:
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: "localhost:5173",
})
e.Router.Any("/*", echo.WrapHandler(proxy))
default:
csp, cspExists := os.LookupEnv("CSP")
e.Router.Any("/*", func(c echo.Context) error {
if cspExists {
c.Response().Header().Del("X-Frame-Options")
c.Response().Header().Set("Content-Security-Policy", csp)
}
indexFallback := !strings.HasPrefix(c.Request().URL.Path, "/static/")
return apis.StaticDirectoryHandler(site.Dist, indexFallback)(c)
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
proxy.ServeHTTP(e.Response, e.Request)
return nil
})
}
return nil
})
// set up scheduled jobs / ticker for system updates
h.app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
// 15 second ticker for system updates
go h.startSystemUpdateTicker()
// set up cron jobs
scheduler := cron.New()
// delete old records once every hour
scheduler.MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
// create longer records every 10 minutes
scheduler.MustAdd("create longer records", "*/10 * * * *", func() {
if systemStats, containerStats, err := h.getCollections(); err == nil {
h.rm.CreateLongerRecords([]*models.Collection{systemStats, containerStats})
}
})
scheduler.Start()
return nil
})
// custom api routes
h.app.OnBeforeServe().Add(func(e *core.ServeEvent) error {
// returns public key
e.Router.GET("/api/beszel/getkey", func(c echo.Context) error {
requestData := apis.RequestInfo(c)
if requestData.AuthRecord == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
return c.JSON(http.StatusOK, map[string]string{"key": h.pubKey, "v": beszel.Version})
})
// check if first time setup on login page
e.Router.GET("/api/beszel/first-run", func(c echo.Context) error {
adminNum, err := h.app.Dao().TotalAdmins()
default:
// parse app url
parsedURL, err := url.Parse(h.appURL)
if err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]bool{"firstRun": adminNum == 0})
// fix base paths in html if using subpath
basePath := strings.TrimSuffix(parsedURL.Path, "/") + "/"
indexFile, _ := fs.ReadFile(site.DistDirFS, "index.html")
indexContent := strings.ReplaceAll(string(indexFile), "./", basePath)
// set up static asset serving
staticPaths := [2]string{"/static/", "/assets/"}
serveStatic := apis.Static(site.DistDirFS, false)
// get CSP configuration
csp, cspExists := GetEnv("CSP")
// add route
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
// serve static assets if path is in staticPaths
for i := range staticPaths {
if strings.Contains(e.Request.URL.Path, staticPaths[i]) {
e.Response.Header().Set("Cache-Control", "public, max-age=2592000")
return serveStatic(e)
}
}
if cspExists {
e.Response.Header().Del("X-Frame-Options")
e.Response.Header().Set("Content-Security-Policy", csp)
}
return e.HTML(http.StatusOK, indexContent)
})
}
return se.Next()
})
// set up scheduled jobs / ticker for system updates
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// 15 second ticker for system updates
go h.startSystemUpdateTicker()
// set up cron jobs
// delete old 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 * * * *", func() {
if systemStats, containerStats, err := h.getCollections(); err == nil {
h.rm.CreateLongerRecords([]*core.Collection{systemStats, containerStats})
}
})
return se.Next()
})
// custom api routes
h.OnServe().BindFunc(func(se *core.ServeEvent) error {
// returns public key
se.Router.GET("/api/beszel/getkey", func(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
return e.JSON(http.StatusOK, map[string]string{"key": h.pubKey, "v": beszel.Version})
})
// check if first time setup on login page
se.Router.GET("/api/beszel/first-run", func(e *core.RequestEvent) error {
total, err := h.CountRecords("users")
return e.JSON(http.StatusOK, map[string]bool{"firstRun": err == nil && total == 0})
})
// send test notification
e.Router.GET("/api/beszel/send-test-notification", h.am.SendTestNotification)
se.Router.GET("/api/beszel/send-test-notification", h.am.SendTestNotification)
// API endpoint to get config.yml content
e.Router.GET("/api/beszel/config-yaml", h.getYamlConfig)
return nil
se.Router.GET("/api/beszel/config-yaml", h.getYamlConfig)
// create first user endpoint only needed if no users exist
if totalUsers, _ := h.CountRecords("users"); totalUsers == 0 {
se.Router.POST("/api/beszel/create-user", h.um.CreateFirstUser)
}
return se.Next()
})
// system creation defaults
h.app.OnModelBeforeCreate("systems").Add(func(e *core.ModelEvent) error {
record := e.Model.(*models.Record)
record.Set("info", system.Info{})
record.Set("status", "pending")
return nil
h.OnRecordCreate("systems").BindFunc(func(e *core.RecordEvent) error {
e.Record.Set("info", system.Info{})
e.Record.Set("status", "pending")
return e.Next()
})
// immediately create connection for new systems
h.app.OnModelAfterCreate("systems").Add(func(e *core.ModelEvent) error {
go h.updateSystem(e.Model.(*models.Record))
return nil
h.OnRecordAfterCreateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
go h.updateSystem(e.Record)
return e.Next()
})
// handle default values for user / user_settings creation
h.app.OnModelBeforeCreate("users").Add(h.um.InitializeUserRole)
h.app.OnModelBeforeCreate("user_settings").Add(h.um.InitializeUserSettings)
h.OnRecordCreate("users").BindFunc(h.um.InitializeUserRole)
h.OnRecordCreate("user_settings").BindFunc(h.um.InitializeUserSettings)
// empty info for systems that are paused
h.app.OnModelBeforeUpdate("systems").Add(func(e *core.ModelEvent) error {
if e.Model.(*models.Record).GetString("status") == "paused" {
e.Model.(*models.Record).Set("info", system.Info{})
h.OnRecordUpdate("systems").BindFunc(func(e *core.RecordEvent) error {
if e.Record.GetString("status") == "paused" {
e.Record.Set("info", system.Info{})
}
return nil
return e.Next()
})
// do things after a systems record is updated
h.app.OnModelAfterUpdate("systems").Add(func(e *core.ModelEvent) error {
newRecord := e.Model.(*models.Record)
oldRecord := newRecord.OriginalCopy()
h.OnRecordAfterUpdateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
newRecord := e.Record.Fresh()
oldRecord := newRecord.Original()
newStatus := newRecord.GetString("status")
// if system is disconnected and connection exists, remove it
if newStatus == "down" || newStatus == "paused" {
// if system is not up and connection exists, remove it
if newStatus != "up" {
h.deleteSystemConnection(newRecord)
}
@@ -203,33 +258,30 @@ func (h *Hub) Run() {
go h.updateSystem(newRecord)
} else {
h.am.HandleStatusAlerts(newStatus, oldRecord)
}
return nil
return e.Next()
})
// do things after a systems record is deleted
h.app.OnModelAfterDelete("systems").Add(func(e *core.ModelEvent) error {
// if system connection exists, close it
h.deleteSystemConnection(e.Model.(*models.Record))
return nil
// if system is deleted, close connection
h.OnRecordAfterDeleteSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
h.deleteSystemConnection(e.Record)
return e.Next()
})
if err := h.app.Start(); err != nil {
if err := h.Start(); err != nil {
log.Fatal(err)
}
}
func (h *Hub) startSystemUpdateTicker() {
ticker := time.NewTicker(15 * time.Second)
for range ticker.C {
c := time.Tick(15 * time.Second)
for range c {
h.updateSystems()
}
}
func (h *Hub) updateSystems() {
records, err := h.app.Dao().FindRecordsByFilter(
records, err := h.FindRecordsByFilter(
"2hz5ncl8tizk5nx", // systems collection
"status != 'paused'", // filter
"updated", // sort
@@ -238,7 +290,7 @@ func (h *Hub) updateSystems() {
)
// log.Println("records", len(records))
if err != nil || len(records) == 0 {
// h.app.Logger().Error("Failed to query systems")
// h.Logger().Error("Failed to query systems")
return
}
fiftySecondsAgo := time.Now().UTC().Add(-50 * time.Second)
@@ -258,89 +310,87 @@ func (h *Hub) updateSystems() {
}
}
func (h *Hub) updateSystem(record *models.Record) {
func (h *Hub) updateSystem(record *core.Record) {
var client *ssh.Client
var err error
// check if system connection data exists
if _, ok := h.systemConnections[record.Id]; ok {
client = h.systemConnections[record.Id]
// check if system connection exists
if existingClient, ok := h.Store().GetOk(record.Id); ok {
client = existingClient.(*ssh.Client)
} else {
// create system connection
client, err = h.createSystemConnection(record)
if err != nil {
if record.GetString("status") != "down" {
h.app.Logger().Error("Failed to connect:", "err", err.Error(), "system", record.GetString("host"), "port", record.GetString("port"))
h.Logger().Error("Failed to connect:", "err", err.Error(), "system", record.GetString("host"), "port", record.GetString("port"))
h.updateSystemStatus(record, "down")
}
return
}
h.connectionLock.Lock()
h.systemConnections[record.Id] = client
h.connectionLock.Unlock()
h.Store().Set(record.Id, client)
}
// get system stats from agent
var systemData system.CombinedData
if err := h.requestJsonFromAgent(client, &systemData); err != nil {
if err.Error() == "bad client" {
// if previous connection was closed, try again
h.app.Logger().Error("Existing SSH connection closed. Retrying...", "host", record.GetString("host"), "port", record.GetString("port"))
h.Logger().Error("Existing SSH connection closed. Retrying...", "host", record.GetString("host"), "port", record.GetString("port"))
h.deleteSystemConnection(record)
time.Sleep(time.Millisecond * 100)
h.updateSystem(record)
return
}
h.app.Logger().Error("Failed to get system stats: ", "err", err.Error())
h.Logger().Error("Failed to get system stats: ", "err", err.Error())
h.updateSystemStatus(record, "down")
return
}
// update system record
dao := h.app.Dao()
record.Set("status", "up")
record.Set("info", systemData.Info)
if err := dao.SaveRecord(record); err != nil {
h.app.Logger().Error("Failed to update record: ", "err", err.Error())
if err := h.SaveNoValidate(record); err != nil {
h.Logger().Error("Failed to update record: ", "err", err.Error())
}
// add system_stats and container_stats records
if systemStats, containerStats, err := h.getCollections(); err != nil {
h.app.Logger().Error("Failed to get collections: ", "err", err.Error())
h.Logger().Error("Failed to get collections: ", "err", err.Error())
} else {
// add new system_stats record
systemStatsRecord := models.NewRecord(systemStats)
systemStatsRecord := core.NewRecord(systemStats)
systemStatsRecord.Set("system", record.Id)
systemStatsRecord.Set("stats", systemData.Stats)
systemStatsRecord.Set("type", "1m")
if err := dao.SaveRecord(systemStatsRecord); err != nil {
h.app.Logger().Error("Failed to save record: ", "err", err.Error())
if err := h.SaveNoValidate(systemStatsRecord); err != nil {
h.Logger().Error("Failed to save record: ", "err", err.Error())
}
// add new container_stats record
if len(systemData.Containers) > 0 {
containerStatsRecord := models.NewRecord(containerStats)
containerStatsRecord := core.NewRecord(containerStats)
containerStatsRecord.Set("system", record.Id)
containerStatsRecord.Set("stats", systemData.Containers)
containerStatsRecord.Set("type", "1m")
if err := dao.SaveRecord(containerStatsRecord); err != nil {
h.app.Logger().Error("Failed to save record: ", "err", err.Error())
if err := h.SaveNoValidate(containerStatsRecord); err != nil {
h.Logger().Error("Failed to save record: ", "err", err.Error())
}
}
}
// system info alerts (todo: extra fs alerts)
// system info alerts
if err := h.am.HandleSystemAlerts(record, systemData.Info, systemData.Stats.Temperatures, systemData.Stats.ExtraFs); err != nil {
h.app.Logger().Error("System alerts error", "err", err.Error())
h.Logger().Error("System alerts error", "err", err.Error())
}
}
// return system_stats and container_stats collections
func (h *Hub) getCollections() (*models.Collection, *models.Collection, error) {
func (h *Hub) getCollections() (*core.Collection, *core.Collection, error) {
if h.systemStats == nil {
systemStats, err := h.app.Dao().FindCollectionByNameOrId("system_stats")
systemStats, err := h.FindCollectionByNameOrId("system_stats")
if err != nil {
return nil, nil, err
}
h.systemStats = systemStats
}
if h.containerStats == nil {
containerStats, err := h.app.Dao().FindCollectionByNameOrId("container_stats")
containerStats, err := h.FindCollectionByNameOrId("container_stats")
if err != nil {
return nil, nil, err
}
@@ -350,28 +400,34 @@ func (h *Hub) getCollections() (*models.Collection, *models.Collection, error) {
}
// set system to specified status and save record
func (h *Hub) updateSystemStatus(record *models.Record, status string) {
if record.GetString("status") != status {
func (h *Hub) updateSystemStatus(record *core.Record, status string) {
if record.Fresh().GetString("status") != status {
record.Set("status", status)
if err := h.app.Dao().SaveRecord(record); err != nil {
h.app.Logger().Error("Failed to update record: ", "err", err.Error())
if err := h.SaveNoValidate(record); err != nil {
h.Logger().Error("Failed to update record: ", "err", err.Error())
}
}
}
func (h *Hub) deleteSystemConnection(record *models.Record) {
if _, ok := h.systemConnections[record.Id]; ok {
if h.systemConnections[record.Id] != nil {
h.systemConnections[record.Id].Close()
// delete system connection from map and close connection
func (h *Hub) deleteSystemConnection(record *core.Record) {
if client, ok := h.Store().GetOk(record.Id); ok {
if sshClient := client.(*ssh.Client); sshClient != nil {
sshClient.Close()
}
h.connectionLock.Lock()
defer h.connectionLock.Unlock()
delete(h.systemConnections, record.Id)
h.Store().Remove(record.Id)
}
}
func (h *Hub) createSystemConnection(record *models.Record) (*ssh.Client, error) {
client, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", record.GetString("host"), record.GetString("port")), h.sshClientConfig)
func (h *Hub) createSystemConnection(record *core.Record) (*ssh.Client, error) {
network := "tcp"
host := record.GetString("host")
if strings.HasPrefix(host, "/") {
network = "unix"
} else {
host = net.JoinHostPort(host, record.GetString("port"))
}
client, err := ssh.Dial(network, host, h.sshClientConfig)
if err != nil {
return nil, err
}
@@ -381,7 +437,7 @@ func (h *Hub) createSystemConnection(record *models.Record) (*ssh.Client, error)
func (h *Hub) createSSHClientConfig() error {
key, err := h.getSSHKey()
if err != nil {
h.app.Logger().Error("Failed to get SSH key: ", "err", err.Error())
h.Logger().Error("Failed to get SSH key: ", "err", err.Error())
return err
}
@@ -397,14 +453,14 @@ func (h *Hub) createSSHClientConfig() error {
ssh.PublicKeys(signer),
},
HostKeyCallback: ssh.InsecureIgnoreHostKey(),
Timeout: 5 * time.Second,
Timeout: 4 * time.Second,
}
return nil
}
// Fetches system stats from the agent and decodes the json data into the provided struct
func (h *Hub) requestJsonFromAgent(client *ssh.Client, systemData *system.CombinedData) error {
session, err := newSessionWithTimeout(client, 5*time.Second)
session, err := newSessionWithTimeout(client, 4*time.Second)
if err != nil {
return fmt.Errorf("bad client")
}
@@ -458,11 +514,11 @@ func newSessionWithTimeout(client *ssh.Client, timeout time.Duration) (*ssh.Sess
}
func (h *Hub) getSSHKey() ([]byte, error) {
dataDir := h.app.DataDir()
dataDir := h.DataDir()
// check if the key pair already exists
existingKey, err := os.ReadFile(dataDir + "/id_ed25519")
if err == nil {
if pubKey, err := os.ReadFile(h.app.DataDir() + "/id_ed25519.pub"); err == nil {
if pubKey, err := os.ReadFile(h.DataDir() + "/id_ed25519.pub"); err == nil {
h.pubKey = strings.TrimSuffix(string(pubKey), "\n")
}
// return existing private key
@@ -472,27 +528,27 @@ func (h *Hub) getSSHKey() ([]byte, error) {
// Generate the Ed25519 key pair
pubKey, privKey, err := ed25519.GenerateKey(nil)
if err != nil {
// h.app.Logger().Error("Error generating key pair:", "err", err.Error())
// h.Logger().Error("Error generating key pair:", "err", err.Error())
return nil, err
}
// Get the private key in OpenSSH format
privKeyBytes, err := ssh.MarshalPrivateKey(privKey, "")
if err != nil {
// h.app.Logger().Error("Error marshaling private key:", "err", err.Error())
// h.Logger().Error("Error marshaling private key:", "err", err.Error())
return nil, err
}
// Save the private key to a file
privateFile, err := os.Create(dataDir + "/id_ed25519")
if err != nil {
// h.app.Logger().Error("Error creating private key file:", "err", err.Error())
// h.Logger().Error("Error creating private key file:", "err", err.Error())
return nil, err
}
defer privateFile.Close()
if err := pem.Encode(privateFile, privKeyBytes); err != nil {
// h.app.Logger().Error("Error writing private key to file:", "err", err.Error())
// h.Logger().Error("Error writing private key to file:", "err", err.Error())
return nil, err
}
@@ -516,9 +572,9 @@ func (h *Hub) getSSHKey() ([]byte, error) {
return nil, err
}
h.app.Logger().Info("ed25519 SSH key pair generated successfully.")
h.app.Logger().Info("Private key saved to: " + dataDir + "/id_ed25519")
h.app.Logger().Info("Public key saved to: " + dataDir + "/id_ed25519.pub")
h.Logger().Info("ed25519 SSH key pair generated successfully.")
h.Logger().Info("Private key saved to: " + dataDir + "/id_ed25519")
h.Logger().Info("Public key saved to: " + dataDir + "/id_ed25519.pub")
existingKey, err = os.ReadFile(dataDir + "/id_ed25519")
if err == nil {

View File

@@ -10,14 +10,12 @@ import (
"github.com/goccy/go-json"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/daos"
"github.com/pocketbase/pocketbase/models"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/types"
)
type RecordManager struct {
app *pocketbase.PocketBase
app core.App
}
type LongerRecordData struct {
@@ -36,12 +34,12 @@ type RecordStats []struct {
Stats []byte `db:"stats"`
}
func NewRecordManager(app *pocketbase.PocketBase) *RecordManager {
func NewRecordManager(app core.App) *RecordManager {
return &RecordManager{app}
}
// Create longer records by averaging shorter records
func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
func (rm *RecordManager) CreateLongerRecords(collections []*core.Collection) {
// start := time.Now()
longerRecordData := []LongerRecordData{
{
@@ -71,8 +69,8 @@ func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
},
}
// wrap the operations in a transaction
rm.app.Dao().RunInTransaction(func(txDao *daos.Dao) error {
activeSystems, err := txDao.FindRecordsByExpr("systems", dbx.NewExp("status = 'up'"))
rm.app.RunInTransaction(func(txApp core.App) error {
activeSystems, err := txApp.FindAllRecords("systems", dbx.NewExp("status = 'up'"))
if err != nil {
log.Println("failed to get active systems", "err", err.Error())
return err
@@ -92,7 +90,7 @@ func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
for _, collection := range collections {
// check creation time of last longer record if not 10m, since 10m is created every run
if recordData.longerType != "10m" {
lastLongerRecord, err := txDao.FindFirstRecordByFilter(
lastLongerRecord, err := txApp.FindFirstRecordByFilter(
collection.Id,
"type = {:type} && system = {:system} && created > {:created}",
dbx.Params{"type": recordData.longerType, "system": system.Id, "created": longerRecordPeriod},
@@ -106,7 +104,7 @@ func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
// get shorter records from the past x minutes
var stats RecordStats
err := txDao.DB().
err := txApp.DB().
Select("stats").
From(collection.Name).
AndWhere(dbx.NewExp(
@@ -125,7 +123,7 @@ func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
continue
}
// average the shorter records and create longer record
longerRecord := models.NewRecord(collection)
longerRecord := core.NewRecord(collection)
longerRecord.Set("system", system.Id)
longerRecord.Set("type", recordData.longerType)
switch collection.Name {
@@ -134,7 +132,7 @@ func (rm *RecordManager) CreateLongerRecords(collections []*models.Collection) {
case "container_stats":
longerRecord.Set("stats", rm.AverageContainerStats(stats))
}
if err := txDao.SaveRecord(longerRecord); err != nil {
if err := txApp.SaveNoValidate(longerRecord); err != nil {
log.Println("failed to save longer record", "err", err.Error())
}
}
@@ -156,6 +154,7 @@ func (rm *RecordManager) AverageSystemStats(records RecordStats) system.Stats {
var stats system.Stats
for i := range records {
stats = system.Stats{} // Zero the struct before unmarshalling
json.Unmarshal(records[i].Stats, &stats)
sum.Cpu += stats.Cpu
sum.Mem += stats.Mem
@@ -354,7 +353,7 @@ func (rm *RecordManager) DeleteOldRecords() {
retention: 30 * 24 * time.Hour,
},
}
db := rm.app.Dao().NonconcurrentDB()
db := rm.app.NonconcurrentDB()
for _, recordData := range recordData {
for _, collectionSlug := range collections {
formattedDate := time.Now().UTC().Add(-recordData.retention).Format(types.DefaultDateLayout)

View File

@@ -2,15 +2,15 @@
package users
import (
"beszel/migrations"
"log"
"net/http"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/models"
)
type UserManager struct {
app *pocketbase.PocketBase
app core.App
}
type UserSettings struct {
@@ -20,22 +20,23 @@ type UserSettings struct {
// Language string `json:"lang"`
}
func NewUserManager(app *pocketbase.PocketBase) *UserManager {
func NewUserManager(app core.App) *UserManager {
return &UserManager{
app: app,
}
}
func (um *UserManager) InitializeUserRole(e *core.ModelEvent) error {
user := e.Model.(*models.Record)
if user.GetString("role") == "" {
user.Set("role", "user")
// Initialize user role if not set
func (um *UserManager) InitializeUserRole(e *core.RecordEvent) error {
if e.Record.GetString("role") == "" {
e.Record.Set("role", "user")
}
return nil
return e.Next()
}
func (um *UserManager) InitializeUserSettings(e *core.ModelEvent) error {
record := e.Model.(*models.Record)
// Initialize user settings with defaults if not set
func (um *UserManager) InitializeUserSettings(e *core.RecordEvent) error {
record := e.Record
// intialize settings with defaults
settings := UserSettings{
// Language: "en",
@@ -46,7 +47,7 @@ func (um *UserManager) InitializeUserSettings(e *core.ModelEvent) error {
record.UnmarshalJSONField("settings", &settings)
if len(settings.NotificationEmails) == 0 {
// get user email from auth record
if errs := um.app.Dao().ExpandRecord(record, []string{"user"}, nil); len(errs) == 0 {
if errs := um.app.ExpandRecord(record, []string{"user"}, nil); len(errs) == 0 {
// app.Logger().Error("failed to expand user relation", "errs", errs)
if user := record.ExpandedOne("user"); user != nil {
settings.NotificationEmails = []string{user.GetString("email")}
@@ -61,5 +62,54 @@ func (um *UserManager) InitializeUserSettings(e *core.ModelEvent) error {
// settings.NotificationWebhooks = []string{""}
// }
record.Set("settings", settings)
return nil
return e.Next()
}
// Custom API endpoint to create the first user.
// Mimics previous default behavior in PocketBase < 0.23.0 allowing user to be created through the Beszel UI.
func (um *UserManager) CreateFirstUser(e *core.RequestEvent) error {
// check that there are no users
totalUsers, err := um.app.CountRecords("users")
if err != nil || totalUsers > 0 {
return e.JSON(http.StatusForbidden, map[string]string{"err": "Forbidden"})
}
// check that there is only one superuser and the email matches the email of the superuser we set up in initial-settings.go
adminUsers, err := um.app.FindAllRecords(core.CollectionNameSuperusers)
if err != nil || len(adminUsers) != 1 || adminUsers[0].GetString("email") != migrations.TempAdminEmail {
return e.JSON(http.StatusForbidden, map[string]string{"err": "Forbidden"})
}
// create first user using supplied email and password in request body
data := struct {
Email string `json:"email"`
Password string `json:"password"`
}{}
if err := e.BindBody(&data); err != nil {
return e.JSON(http.StatusBadRequest, map[string]string{"err": err.Error()})
}
if data.Email == "" || data.Password == "" {
return e.JSON(http.StatusBadRequest, map[string]string{"err": "Bad request"})
}
collection, _ := um.app.FindCollectionByNameOrId("users")
user := core.NewRecord(collection)
user.SetEmail(data.Email)
user.SetPassword(data.Password)
user.Set("role", "admin")
user.Set("verified", true)
if err := um.app.Save(user); err != nil {
return e.JSON(http.StatusInternalServerError, map[string]string{"err": err.Error()})
}
// create superuser using the email of the first user
collection, _ = um.app.FindCollectionByNameOrId(core.CollectionNameSuperusers)
adminUser := core.NewRecord(collection)
adminUser.SetEmail(data.Email)
adminUser.SetPassword(data.Password)
if err := um.app.Save(adminUser); err != nil {
return e.JSON(http.StatusInternalServerError, map[string]string{"err": err.Error()})
}
// delete the intial superuser
if err := um.app.Delete(adminUsers[0]); err != nil {
return e.JSON(http.StatusInternalServerError, map[string]string{"err": err.Error()})
}
return e.JSON(http.StatusOK, map[string]string{"msg": "User created"})
}

View File

@@ -1,481 +0,0 @@
package migrations
import (
"encoding/json"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
m "github.com/pocketbase/pocketbase/migrations"
"github.com/pocketbase/pocketbase/models"
)
func init() {
m.Register(func(db dbx.Builder) error {
jsonData := `[
{
"id": "2hz5ncl8tizk5nx",
"created": "2024-07-07 16:08:20.979Z",
"updated": "2024-10-12 18:55:51.623Z",
"name": "systems",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "7xloxkwk",
"name": "name",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"system": false,
"id": "waj7seaf",
"name": "status",
"type": "select",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"up",
"down",
"paused",
"pending"
]
}
},
{
"system": false,
"id": "ve781smf",
"name": "host",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"system": false,
"id": "pij0k2jk",
"name": "port",
"type": "text",
"required": true,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": null,
"pattern": ""
}
},
{
"system": false,
"id": "qoq64ntl",
"name": "info",
"type": "json",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSize": 2000000
}
},
{
"system": false,
"id": "jcarjnjj",
"name": "users",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": null,
"displayFields": null
}
}
],
"indexes": [],
"listRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id",
"viewRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id",
"createRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"updateRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"deleteRule": "@request.auth.id != \"\" && users.id ?= @request.auth.id && @request.auth.role != \"readonly\"",
"options": {}
},
{
"id": "ej9oowivz8b2mht",
"created": "2024-07-07 16:09:09.179Z",
"updated": "2024-10-12 18:55:51.623Z",
"name": "system_stats",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "h9sg148r",
"name": "system",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "2hz5ncl8tizk5nx",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "azftn0be",
"name": "stats",
"type": "json",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSize": 2000000
}
},
{
"system": false,
"id": "m1ekhli3",
"name": "type",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"1m",
"10m",
"20m",
"120m",
"480m"
]
}
}
],
"indexes": [
"CREATE INDEX ` + "`" + `idx_GxIee0j` + "`" + ` ON ` + "`" + `system_stats` + "`" + ` (` + "`" + `system` + "`" + `)"
],
"listRule": "@request.auth.id != \"\"",
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {}
},
{
"id": "juohu4jipgc13v7",
"created": "2024-07-07 16:09:57.976Z",
"updated": "2024-10-12 18:55:51.623Z",
"name": "container_stats",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "hutcu6ps",
"name": "system",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "2hz5ncl8tizk5nx",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "r39hhnil",
"name": "stats",
"type": "json",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSize": 2000000
}
},
{
"system": false,
"id": "vo7iuj96",
"name": "type",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"1m",
"10m",
"20m",
"120m",
"480m"
]
}
}
],
"indexes": [],
"listRule": "@request.auth.id != \"\"",
"viewRule": null,
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {}
},
{
"id": "_pb_users_auth_",
"created": "2024-07-14 16:25:18.226Z",
"updated": "2024-10-12 22:27:19.081Z",
"name": "users",
"type": "auth",
"system": false,
"schema": [
{
"system": false,
"id": "qkbp58ae",
"name": "role",
"type": "select",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"user",
"admin",
"readonly"
]
}
},
{
"system": false,
"id": "users_avatar",
"name": "avatar",
"type": "file",
"required": false,
"presentable": false,
"unique": false,
"options": {
"mimeTypes": [
"image/jpeg",
"image/png",
"image/svg+xml",
"image/gif",
"image/webp"
],
"thumbs": null,
"maxSelect": 1,
"maxSize": 5242880,
"protected": false
}
}
],
"indexes": [],
"listRule": "id = @request.auth.id",
"viewRule": "id = @request.auth.id",
"createRule": null,
"updateRule": null,
"deleteRule": null,
"options": {
"allowEmailAuth": true,
"allowOAuth2Auth": true,
"allowUsernameAuth": false,
"exceptEmailDomains": null,
"manageRule": null,
"minPasswordLength": 8,
"onlyEmailDomains": null,
"onlyVerified": true,
"requireEmail": false
}
},
{
"id": "elngm8x1l60zi2v",
"created": "2024-07-15 01:16:04.044Z",
"updated": "2024-10-12 22:27:29.128Z",
"name": "alerts",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "hn5ly3vi",
"name": "user",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "g5sl3jdg",
"name": "system",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "2hz5ncl8tizk5nx",
"cascadeDelete": true,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "zj3ingrv",
"name": "name",
"type": "select",
"required": true,
"presentable": false,
"unique": false,
"options": {
"maxSelect": 1,
"values": [
"Status",
"CPU",
"Memory",
"Disk",
"Temperature",
"Bandwidth"
]
}
},
{
"system": false,
"id": "o2ablxvn",
"name": "value",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": null,
"noDecimal": false
}
},
{
"system": false,
"id": "fstdehcq",
"name": "min",
"type": "number",
"required": false,
"presentable": false,
"unique": false,
"options": {
"min": null,
"max": 60,
"noDecimal": true
}
},
{
"system": false,
"id": "6hgdf6hs",
"name": "triggered",
"type": "bool",
"required": false,
"presentable": false,
"unique": false,
"options": {}
}
],
"indexes": [],
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"viewRule": "",
"createRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"deleteRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"options": {}
},
{
"id": "4afacsdnlu8q8r2",
"created": "2024-09-12 17:42:55.324Z",
"updated": "2024-10-12 18:55:51.624Z",
"name": "user_settings",
"type": "base",
"system": false,
"schema": [
{
"system": false,
"id": "d5vztyxa",
"name": "user",
"type": "relation",
"required": true,
"presentable": false,
"unique": false,
"options": {
"collectionId": "_pb_users_auth_",
"cascadeDelete": false,
"minSelect": null,
"maxSelect": 1,
"displayFields": null
}
},
{
"system": false,
"id": "xcx4qgqq",
"name": "settings",
"type": "json",
"required": false,
"presentable": false,
"unique": false,
"options": {
"maxSize": 2000000
}
}
],
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `idx_30Lwgf2` + "`" + ` ON ` + "`" + `user_settings` + "`" + ` (` + "`" + `user` + "`" + `)"
],
"listRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"viewRule": null,
"createRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"updateRule": "@request.auth.id != \"\" && user.id = @request.auth.id",
"deleteRule": null,
"options": {}
}
]`
collections := []*models.Collection{}
if err := json.Unmarshal([]byte(jsonData), &collections); err != nil {
return err
}
return daos.New(db).ImportCollections(collections, true, nil)
}, func(db dbx.Builder) error {
return nil
})
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,98 @@
package migrations
import (
"encoding/json"
"github.com/pocketbase/pocketbase/core"
m "github.com/pocketbase/pocketbase/migrations"
)
func init() {
m.Register(func(app core.App) error {
collection, err := app.FindCollectionByNameOrId("_pb_users_auth_")
if err != nil {
return err
}
// update collection data
if err := json.Unmarshal([]byte(`{
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__email_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''",
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__tokenKey_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `tokenKey` + "`" + `)"
]
}`), &collection); err != nil {
return err
}
// remove field
collection.Fields.RemoveById("text4166911607")
// update field
if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{
"exceptDomains": null,
"hidden": false,
"id": "email3885137012",
"name": "email",
"onlyDomains": null,
"presentable": false,
"required": true,
"system": true,
"type": "email"
}`)); err != nil {
return err
}
return app.Save(collection)
}, func(app core.App) error {
collection, err := app.FindCollectionByNameOrId("_pb_users_auth_")
if err != nil {
return err
}
// update collection data
if err := json.Unmarshal([]byte(`{
"indexes": [
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__username_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (username COLLATE NOCASE)",
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__email_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''",
"CREATE UNIQUE INDEX ` + "`" + `__pb_users_auth__tokenKey_idx` + "`" + ` ON ` + "`" + `users` + "`" + ` (` + "`" + `tokenKey` + "`" + `)"
]
}`), &collection); err != nil {
return err
}
// add field
if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{
"autogeneratePattern": "users[0-9]{6}",
"hidden": false,
"id": "text4166911607",
"max": 150,
"min": 3,
"name": "username",
"pattern": "^[\\w][\\w\\.\\-]*$",
"presentable": false,
"primaryKey": false,
"required": true,
"system": false,
"type": "text"
}`)); err != nil {
return err
}
// update field
if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{
"exceptDomains": null,
"hidden": false,
"id": "email3885137012",
"name": "email",
"onlyDomains": null,
"presentable": false,
"required": false,
"system": true,
"type": "email"
}`)); err != nil {
return err
}
return app.Save(collection)
})
}

View File

@@ -1,19 +1,29 @@
package migrations
import (
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/daos"
"github.com/pocketbase/pocketbase/core"
m "github.com/pocketbase/pocketbase/migrations"
)
func init() {
m.Register(func(db dbx.Builder) error {
dao := daos.New(db)
var (
TempAdminEmail = "_@b.b"
)
settings, _ := dao.FindSettings()
func init() {
m.Register(func(app core.App) error {
// initial settings
settings := app.Settings()
settings.Meta.AppName = "Beszel"
settings.Meta.HideControls = true
return dao.SaveSettings(settings)
settings.Logs.MinLevel = 4
if err := app.Save(settings); err != nil {
return err
}
// create superuser
collection, _ := app.FindCollectionByNameOrId(core.CollectionNameSuperusers)
user := core.NewRecord(collection)
user.SetEmail(TempAdminEmail)
user.SetRandomPassword()
return app.Save(user)
}, nil)
}

Binary file not shown.

View File

@@ -3,11 +3,11 @@ package site
import (
"embed"
"github.com/labstack/echo/v5"
"io/fs"
)
//go:embed all:dist
var assets embed.FS
var distDir embed.FS
var Dist = echo.MustSubFS(assets, "dist")
// DistDirFS contains the embedded dist directory files (without the "dist" prefix)
var DistDirFS, _ = fs.Sub(distDir, "dist")

View File

@@ -1,10 +1,12 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en" dir="ltr">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/static/favicon.svg" />
<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" />
<title>Beszel</title>
<script>window.BASE_PATH = "%BASE_URL%"</script>
</head>
<body>
<div id="app"></div>

View File

@@ -4,20 +4,30 @@ const config: LinguiConfig = {
locales: [
"en",
"ar",
"bg",
"cs",
"da",
"de",
"es",
"fa",
"fr",
"hr",
"hu",
"it",
"is",
"ja",
"ko",
"nl",
"no",
"pl",
"pt",
"tr",
"ru",
"sl",
"sv",
"uk",
"vi",
"zh",
"zh-CN",
"zh-HK",
],

File diff suppressed because it is too large Load Diff

View File

@@ -12,54 +12,54 @@
},
"dependencies": {
"@henrygd/queue": "^1.0.7",
"@lingui/detect-locale": "^4.13.0",
"@lingui/macro": "^4.13.0",
"@lingui/react": "^4.13.0",
"@lingui/detect-locale": "^4.14.1",
"@lingui/macro": "^4.14.1",
"@lingui/react": "^4.14.1",
"@nanostores/react": "^0.7.3",
"@nanostores/router": "^0.11.0",
"@radix-ui/react-alert-dialog": "^1.1.2",
"@radix-ui/react-checkbox": "^1.1.2",
"@radix-ui/react-dialog": "^1.1.2",
"@radix-ui/react-alert-dialog": "^1.1.6",
"@radix-ui/react-checkbox": "^1.1.4",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-direction": "^1.1.0",
"@radix-ui/react-dropdown-menu": "^2.1.2",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-select": "^2.1.2",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slider": "^1.2.1",
"@radix-ui/react-slot": "^1.1.0",
"@radix-ui/react-switch": "^1.1.1",
"@radix-ui/react-tabs": "^1.1.1",
"@radix-ui/react-toast": "^1.2.2",
"@radix-ui/react-tooltip": "^1.1.3",
"@tanstack/react-table": "^8.20.5",
"class-variance-authority": "^0.7.0",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slider": "^1.2.3",
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-switch": "^1.1.3",
"@radix-ui/react-tabs": "^1.1.3",
"@radix-ui/react-toast": "^1.2.6",
"@radix-ui/react-tooltip": "^1.1.8",
"@tanstack/react-table": "^8.20.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"cmdk": "^1.0.0",
"cmdk": "^1.0.4",
"d3-time": "^3.1.0",
"lucide-react": "^0.452.0",
"nanostores": "^0.11.3",
"pocketbase": "^0.21.5",
"pocketbase": "^0.25.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"recharts": "^2.13.0",
"tailwind-merge": "^2.5.4",
"recharts": "^2.15.1",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"valibot": "^0.36.0"
},
"devDependencies": {
"@lingui/cli": "^4.13.0",
"@lingui/cli": "^4.14.1",
"@lingui/swc-plugin": "^4.1.0",
"@lingui/vite-plugin": "^4.13.0",
"@types/bun": "^1.1.11",
"@types/react": "^18.3.11",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react-swc": "^3.7.1",
"@lingui/vite-plugin": "^4.14.1",
"@types/bun": "^1.2.2",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@vitejs/plugin-react-swc": "^3.7.2",
"autoprefixer": "^10.4.20",
"postcss": "^8.4.47",
"tailwindcss": "^3.4.14",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"tailwindcss-rtl": "^0.9.0",
"typescript": "^5.6.3",
"vite": "^5.4.9"
"typescript": "^5.7.3",
"vite": "^5.4.14"
},
"overrides": {
"@nanostores/router": {

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.2 6.9c-1 0-2.5-1-4-1-2 0-4 1.1-5 3-2 3.6-.5 9 1.5 12 1 1.5 2.3 3.2 3.8 3.1 1.6 0 2.1-1 4-1 1.8 0 2.3 1 4 1 1.6 0 2.6-1.5 3.6-3a13 13 0 0 0 1.7-3.4 5.3 5.3 0 0 1-.6-9.4 5.6 5.6 0 0 0-4.4-2.4C14.8 5.6 13 7 12.2 7zm3.3-3c.9-1 1.4-2.5 1.3-3.9-1.2 0-2.7.8-3.6 1.8A5 5 0 0 0 12 5.5c1.3.1 2.7-.7 3.5-1.7"/></svg>

Before

Width:  |  Height:  |  Size: 378 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M.8 1.2a.8.8 0 0 0-.8 1l3.3 19.7c0 .5.5.9 1 .9h15.6a.8.8 0 0 0 .8-.7l3.3-20a.8.8 0 0 0-.8-.9zm13.7 14.3h-5l-1.3-7h7.5z"/></svg>

Before

Width:  |  Height:  |  Size: 196 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20.3 4.4a19.8 19.8 0 0 0-4.9-1.5L14.7 4C13 4 11.1 4 9.3 4.1L8.6 3a19.7 19.7 0 0 0-5 1.5C.6 9-.4 13.6.1 18.1c2 1.5 4 2.4 6 3h.1c.5-.6.9-1.3 1.2-2l-1.9-1V18l.4-.3c4 1.8 8.2 1.8 12.1 0h.1l.4.3v.1a12.3 12.3 0 0 1-2 1l1.3 2c2-.6 4-1.5 6-3h.1c.5-5.2-.8-9.7-3.6-13.7zM8 15.4c-1.2 0-2.1-1.2-2.1-2.5s1-2.4 2.1-2.4c1.2 0 2.2 1 2.2 2.4 0 1.3-1 2.4-2.2 2.4zm8 0c-1.2 0-2.2-1.2-2.2-2.5s1-2.4 2.2-2.4c1.2 0 2.2 1 2.2 2.4 0 1.3-1 2.4-2.2 2.4Z"/></svg>

Before

Width:  |  Height:  |  Size: 506 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.1 23.7v-8H6.6V12h2.5v-1.5c0-4.1 1.8-6 5.9-6h1.4a8.7 8.7 0 0 1 1.2.3V8a8.6 8.6 0 0 0-.7 0 26.8 26.8 0 0 0-.7 0c-.7 0-1.3 0-1.7.3a1.7 1.7 0 0 0-.7.6c-.2.4-.3 1-.3 1.7V12h3.9l-.4 2.1-.3 1.6h-3.2V24a12 12 0 1 0-4.4-.3Z"/></svg>

Before

Width:  |  Height:  |  Size: 295 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4.2 4.6a4.2 4.2 0 0 0-2.9 1.1C-.4 7.3 0 9.7.1 10.1c0 .4.3 1.6 1.2 2.7C3 15 6.8 15 6.8 15S7.3 16 8 17c1 1.3 2 2.3 2.9 2.4H18s.4 0 1-.4c.6-.3 1-.9 1-.9s.6-.5 1.3-1.7l.5-1s2.1-4.6 2.1-9c0-1.2-.4-1.5-.4-1.5l-.4-.2s-4.5.3-6.8.3h-1.5v4.5l-.6-.3V5h-3.5l-6-.4h-.6zm.4 1.8s.3 2.3.7 3.6c.2 1.1 1 3 1 3l-1.7-.3c-1-.4-1.4-.8-1.4-.8s-.8-.5-1.1-1.5c-.7-1.7 0-2.7 0-2.7s.2-.9 1.4-1.1c.4-.2.9-.2 1-.2zM12.9 9l.5.1.9.4-.6 1.1a.7.7 0 0 0-.6.4.7.7 0 0 0 .1.7l-1 2a.7.7 0 0 0-.6.5.7.7 0 0 0 .3.7.7.7 0 0 0 1-.2.7.7 0 0 0-.2-.8l1-2a.7.7 0 0 0 .2 0 .7.7 0 0 0 .3 0 8.8 8.8 0 0 1 1 .4.8.8 0 0 1 .3.3l-.1.6c0 .3-.7 1.5-.7 1.5a.7.7 0 0 0-.7.5.7.7 0 1 0 1.2-.2l.2-.5.5-1.1c0-.1.2-.4.1-.8a1 1 0 0 0-.5-.7l-1-.6-.1-.2a.7.7 0 0 0-.2-.3l.5-1 3 1.4s.4.2.5.6v.6L16 16.8s-.2.5-.7.5a1 1 0 0 1-.4 0h-.2L10.4 15s-.4-.2-.5-.6l.1-.7 2-4.2s.3-.4.5-.5A.9.9 0 0 1 13 9z"/></svg>

Before

Width:  |  Height:  |  Size: 907 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0A12 12 0 0 0 0 12a12 12 0 0 0 12 12 12 12 0 0 0 12-12A12 12 0 0 0 12 0zm6 5.3c.4 0 .7.3.7.6v1.5a.6.6 0 0 1-.6.6H9.8C8.8 8 8 8.8 8 9.8v5.6c0 .3.3.6.6.6h5.6c1 0 1.8-.8 1.8-1.8V14a.6.6 0 0 0-.6-.6h-4.1a.6.6 0 0 1-.6-.6v-1.4a.6.6 0 0 1 .6-.6H18c.3 0 .6.2.6.6v3.4a4 4 0 0 1-4 4H5.9a.6.6 0 0 1-.6-.6V9.8a4.4 4.4 0 0 1 4.5-4.5H18Z"/></svg>

Before

Width:  |  Height:  |  Size: 406 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 .3a12 12 0 0 0-3.8 23.4c.6.1.8-.3.8-.6v-2c-3.3.7-4-1.6-4-1.6-.6-1.4-1.4-1.8-1.4-1.8-1-.7.1-.7.1-.7 1.2 0 1.9 1.2 1.9 1.2 1 1.8 2.8 1.3 3.5 1 0-.8.4-1.3.7-1.6-2.7-.3-5.5-1.3-5.5-6 0-1.2.5-2.3 1.3-3.1-.2-.4-.6-1.6 0-3.2 0 0 1-.3 3.4 1.2a11.5 11.5 0 0 1 6 0c2.3-1.5 3.3-1.2 3.3-1.2.6 1.6.2 2.8 0 3.2.9.8 1.3 1.9 1.3 3.2 0 4.6-2.8 5.6-5.5 5.9.5.4.9 1 .9 2.2v3.3c0 .3.1.7.8.6A12 12 0 0 0 12 .3"/></svg>

Before

Width:  |  Height:  |  Size: 470 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.6 9.6 20.3 1a.9.9 0 0 0-.3-.4.9.9 0 0 0-1 0 .9.9 0 0 0-.3.5l-2.2 6.7h-9L5.3 1.1A.9.9 0 0 0 5 .6a.9.9 0 0 0-1 0 .9.9 0 0 0-.3.4L.4 9.5a6 6 0 0 0 2 7.1l5 3.8 2.5 1.8 1.5 1.1a1 1 0 0 0 1.2 0l1.5-1 2.5-2 5-3.7a6 6 0 0 0 2-7z"/></svg>

Before

Width:  |  Height:  |  Size: 302 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12.5 11v3.2h7.8a7 7 0 0 1-1.8 4.1 8 8 0 0 1-6 2.4c-4.8 0-8.6-3.9-8.6-8.7a8.6 8.6 0 0 1 14.5-6.4l2.3-2.3C18.7 1.4 16 0 12.5 0 5.9 0 .3 5.4.3 12S6 24 12.5 24a11 11 0 0 0 8.4-3.4c2.1-2.1 2.8-5.2 2.8-7.6 0-.8 0-1.5-.2-2h-11z"/></svg>

Before

Width:  |  Height:  |  Size: 299 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M7 0C5.8.2 5 .4 4.1.7 3.3 1 2.7 1.4 2 2c-.7.7-1 1.4-1.4 2.2C.3 4.9.1 5.8.1 7a84.6 84.6 0 0 0 .5 12.8c.4.8.8 1.4 1.4 2.1.7.7 1.4 1 2.2 1.4.7.3 1.6.5 2.9.5a85 85 0 0 0 12.8-.5c.8-.4 1.4-.8 2.1-1.4.7-.7 1-1.4 1.4-2.2.3-.7.5-1.6.5-2.9a85 85 0 0 0-.5-12.8C23 3.3 22.6 2.7 22 2c-.7-.7-1.4-1-2.2-1.4-.7-.3-1.6-.5-2.9-.5A85.5 85.5 0 0 0 7 0m.2 21.7c-1.2 0-1.8-.3-2.3-.4-.5-.2-1-.5-1.3-1-.5-.3-.7-.7-1-1.3-.1-.4-.3-1-.4-2.2a84.8 84.8 0 0 1 .4-12c.2-.5.5-1 1-1.3.3-.5.7-.7 1.3-1 .4-.1 1-.3 2.2-.4a84.4 84.4 0 0 1 12 .4c.5.3 1 .5 1.3 1 .5.3.7.7 1 1.3.1.4.3 1 .4 2.2a82.7 82.7 0 0 1-.4 12c-.2.5-.5 1-1 1.3-.3.5-.7.7-1.3 1-.4.1-1 .3-2.2.4a84.9 84.9 0 0 1-9.7 0M17 5.6A1.4 1.4 0 1 0 18.4 4 1.4 1.4 0 0 0 17 5.6M5.8 12a6.2 6.2 0 1 0 12.4 0 6.2 6.2 0 0 0-12.4 0M8 12a4 4 0 1 1 4 4 4 4 0 0 1-4-4"/></svg>

Before

Width:  |  Height:  |  Size: 856 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24"><rect width="18" height="11" x="3" y="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/></svg>

Before

Width:  |  Height:  |  Size: 257 B

View File

@@ -0,0 +1,14 @@
{
"name": "Beszel",
"icons": [
{
"src": "icon.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "../",
"display": "standalone",
"background_color": "#202225",
"theme_color": "#202225"
}

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M14.5.9 11 2.7v18.1c-4.1-.5-7.3-2.7-7.3-5.5 0-2.5 2.8-4.7 6.7-5.4V7.6C4.4 8.3 0 11.5 0 15.3c0 4 4.7 7.3 11 7.8l3.5-1.7V.9m.7 6.7V10c1.4.3 2.7.7 3.7 1.3l-2 1.1L24 14l-.5-5.2-1.9 1c-1.7-1-4-1.8-6.4-2z"/></svg>

Before

Width:  |  Height:  |  Size: 276 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23 7.2c0-3-2.4-5.6-5.2-6.5-3.5-1.1-8.1-1-11.4.6-4 2-5.3 6-5.4 10.2C1 15 1.3 24 6.4 24c3.8 0 4.3-4.8 6-7.1 1.3-1.7 3-2.2 4.9-2.7a7.1 7.1 0 0 0 5.7-7Z"/></svg>

Before

Width:  |  Height:  |  Size: 227 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.7 0 12 0zm5.5 17.3c-.2.4-.6.5-1 .3-2.8-1.8-6.4-2.1-10.6-1.2-.4.2-.7-.1-.9-.5 0-.4.2-.8.6-.9 4.5-1 8.5-.6 11.6 1.3.4.2.5.7.3 1zM19 14c-.3.5-.9.6-1.3.3-3.2-2-8.2-2.5-12-1.3-.4 0-1-.2-1-.6-.2-.5 0-1 .5-1.2 4.4-1.3 9.8-.6 13.5 1.6.4.2.6.8.3 1.2zm0-3.3A19.9 19.9 0 0 0 5.3 9.3c-.6.2-1.2-.2-1.4-.7-.2-.6.2-1.2.7-1.4 4.3-1.3 11.3-1 15.7 1.6.6.3.7 1 .4 1.6-.3.4-1 .6-1.5.3z"/></svg>

Before

Width:  |  Height:  |  Size: 495 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m15.4 18-2.1-4.2h-3l5 10.2 5.2-10.2h-3m-7-5.6 2.8 5.6h4.2L10.5 0l-7 13.8h4.1"/></svg>

Before

Width:  |  Height:  |  Size: 154 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.6 4.7h1.7V10h-1.7zm4.7 0H18V10h-1.7zM6 0 1.7 4.3v15.4H7V24l4.2-4.3h3.5l7.7-7.7V0zm14.6 11.1L17 14.6h-3.4l-3 3v-3H7V1.7h13.7Z"/></svg>

Before

Width:  |  Height:  |  Size: 206 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M22.5 6c-.8.3-1.6.6-2.5.7.9-.5 1.6-1.4 1.9-2.4-.8.5-1.8.9-2.7 1a4.3 4.3 0 0 0-7.3 4C8.2 9 5 7.3 3 4.8a4.2 4.2 0 0 0 1.3 5.7c-.7 0-1.3-.2-2-.5 0 2.1 1.6 3.8 3.5 4.2a4.2 4.2 0 0 1-2 .1 4.3 4.3 0 0 0 4 3A8.5 8.5 0 0 1 2.7 19h-1A12.1 12.1 0 0 0 20.3 8.8v-.6c.8-.6 1.5-1.3 2-2.2"/></svg>

Before

Width:  |  Height:  |  Size: 371 B

View File

@@ -8,59 +8,27 @@ import {
DialogTitle,
DialogTrigger,
} from "@/components/ui/dialog"
import { TooltipProvider, Tooltip, TooltipTrigger, TooltipContent } from "@/components/ui/tooltip"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { $publicKey, pb } from "@/lib/stores"
import { Copy, PlusIcon } from "lucide-react"
import { useState, useRef, MutableRefObject } from "react"
import { useStore } from "@nanostores/react"
import { cn, copyToClipboard, isReadOnlyUser } from "@/lib/utils"
import { navigate } from "./router"
import { Trans } from "@lingui/macro"
import { i18n } from "@lingui/core"
import { t, Trans } from "@lingui/macro"
import { useStore } from "@nanostores/react"
import { ChevronDownIcon, Copy, PlusIcon } from "lucide-react"
import { memo, useRef, useState } from "react"
import { basePath, navigate } from "./router"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"
import { SystemRecord } from "@/types"
export function AddSystemButton({ className }: { className?: string }) {
const [open, setOpen] = useState(false)
const port = useRef() as MutableRefObject<HTMLInputElement>
const publicKey = useStore($publicKey)
function copyDockerCompose(port: string) {
copyToClipboard(`services:
beszel-agent:
image: "henrygd/beszel-agent"
container_name: "beszel-agent"
restart: unless-stopped
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# monitor other disks / partitions by mounting a folder in /extra-filesystems
# - /mnt/disk/.beszel:/extra-filesystems/sda1:ro
environment:
PORT: ${port}
KEY: "${publicKey}"`)
}
function copyInstallCommand(port: string) {
copyToClipboard(
`curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/install-agent.sh -o install-agent.sh && chmod +x install-agent.sh && ./install-agent.sh -p ${port} -k "${publicKey}"`
)
}
async function handleSubmit(e: SubmitEvent) {
e.preventDefault()
const formData = new FormData(e.target as HTMLFormElement)
const data = Object.fromEntries(formData) as Record<string, any>
data.users = pb.authStore.model!.id
try {
setOpen(false)
await pb.collection("systems").create(data)
navigate("/")
// console.log(record)
} catch (e) {
console.log(e)
}
let opened = useRef(false)
if (open) {
opened.current = true
}
return (
@@ -76,106 +44,230 @@ export function AddSystemButton({ className }: { className?: string }) {
</Trans>
</Button>
</DialogTrigger>
<DialogContent className="w-[90%] sm:max-w-[440px] rounded-lg">
<Tabs defaultValue="docker">
<DialogHeader>
<DialogTitle className="mb-2">
<Trans>Add New System</Trans>
</DialogTitle>
<TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="docker">Docker</TabsTrigger>
<TabsTrigger value="binary">
<Trans>Binary</Trans>
</TabsTrigger>
</TabsList>
</DialogHeader>
{/* Docker */}
<TabsContent value="docker">
<DialogDescription className="mb-4 leading-normal">
<Trans>
The agent must be running on the system to connect. Copy the
<code className="bg-muted px-1 rounded-sm leading-3">docker-compose.yml</code> for the agent below.
</Trans>
</DialogDescription>
</TabsContent>
{/* Binary */}
<TabsContent value="binary">
<DialogDescription className="mb-4 leading-normal">
<Trans>
The agent must be running on the system to connect. Copy the installation command for the agent below.
</Trans>
</DialogDescription>
</TabsContent>
<form onSubmit={handleSubmit as any}>
<div className="grid xs:grid-cols-[auto_1fr] gap-y-3 gap-x-4 items-center mt-1 mb-4">
<Label htmlFor="name" className="xs:text-end">
<Trans>Name</Trans>
</Label>
<Input id="name" name="name" className="" required />
<Label htmlFor="host" className="xs:text-end">
<Trans>Host / IP</Trans>
</Label>
<Input id="host" name="host" className="" required />
<Label htmlFor="port" className="xs:text-end">
<Trans>Port</Trans>
</Label>
<Input ref={port} name="port" id="port" defaultValue="45876" className="" required />
<Label htmlFor="pkey" className="xs:text-end whitespace-pre">
<Trans comment="Use 'Key' if your language requires many more characters">Public Key</Trans>
</Label>
<div className="relative">
<Input readOnly id="pkey" value={publicKey} className="" required></Input>
<div
className={
"h-6 w-24 bg-gradient-to-r rtl:bg-gradient-to-l from-transparent to-background to-65% absolute top-2 end-1 pointer-events-none"
}
></div>
<TooltipProvider delayDuration={100}>
<Tooltip>
<TooltipTrigger asChild>
<Button
type="button"
variant={"link"}
className="absolute end-0 top-0"
onClick={() => copyToClipboard(publicKey)}
>
<Copy className="h-4 w-4 " />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>
<Trans>Click to copy</Trans>
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
</div>
{/* Docker */}
<TabsContent value="docker">
<DialogFooter className="flex justify-end gap-2 sm:w-[calc(100%+20px)] sm:-ms-[20px]">
<Button type="button" variant={"ghost"} onClick={() => copyDockerCompose(port.current.value)}>
<Trans>Copy</Trans> docker compose
</Button>
<Button>
<Trans>Add system</Trans>
</Button>
</DialogFooter>
</TabsContent>
{/* Binary */}
<TabsContent value="binary">
<DialogFooter className="flex justify-end gap-2 sm:w-[calc(100%+20px)] sm:-ms-[20px]">
<Button type="button" variant={"ghost"} onClick={() => copyInstallCommand(port.current.value)}>
<Trans>Copy Linux command</Trans>
</Button>
<Button>
<Trans>Add system</Trans>
</Button>
</DialogFooter>
</TabsContent>
</form>
</Tabs>
</DialogContent>
{opened.current && <SystemDialog setOpen={setOpen} />}
</Dialog>
)
}
function copyDockerCompose(port = "45876", publicKey: string) {
copyToClipboard(`services:
beszel-agent:
image: "henrygd/beszel-agent"
container_name: "beszel-agent"
restart: unless-stopped
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# monitor other disks / partitions by mounting a folder in /extra-filesystems
# - /mnt/disk/.beszel:/extra-filesystems/sda1:ro
environment:
PORT: ${port}
KEY: "${publicKey}"`)
}
function copyDockerRun(port = "45876", publicKey: string) {
copyToClipboard(
`docker run -d --name beszel-agent --network host --restart unless-stopped -v /var/run/docker.sock:/var/run/docker.sock:ro -e KEY="${publicKey}" -e PORT=${port} henrygd/beszel-agent:latest`
)
}
function copyInstallCommand(port = "45876", publicKey: string) {
let cmd = `curl -sL https://raw.githubusercontent.com/henrygd/beszel/main/supplemental/scripts/install-agent.sh -o install-agent.sh && chmod +x install-agent.sh && ./install-agent.sh -p ${port} -k "${publicKey}"`
// add china mirrors flag if zh-CN
if ((i18n.locale + navigator.language).includes("zh-CN")) {
cmd += ` --china-mirrors`
}
copyToClipboard(cmd)
}
/**
* SystemDialog component for adding or editing a system.
* @param {Object} props - The component props.
* @param {function} props.setOpen - Function to set the open state of the dialog.
* @param {SystemRecord} [props.system] - Optional system record for editing an existing system.
*/
export const SystemDialog = memo(({ setOpen, system }: { setOpen: (open: boolean) => void; system?: SystemRecord }) => {
const publicKey = useStore($publicKey)
const port = useRef<HTMLInputElement>(null)
const [hostValue, setHostValue] = useState(system?.host ?? "")
const isUnixSocket = hostValue.startsWith("/")
async function handleSubmit(e: SubmitEvent) {
e.preventDefault()
const formData = new FormData(e.target as HTMLFormElement)
const data = Object.fromEntries(formData) as Record<string, any>
data.users = pb.authStore.record!.id
try {
setOpen(false)
if (system) {
await pb.collection("systems").update(system.id, { ...data, status: "pending" })
} else {
await pb.collection("systems").create(data)
}
navigate(basePath)
// console.log(record)
} catch (e) {
console.log(e)
}
}
return (
<DialogContent
className="w-[90%] sm:w-auto sm:ns-dialog max-w-full rounded-lg"
onCloseAutoFocus={() => {
setHostValue(system?.host ?? "")
}}
>
<Tabs defaultValue="docker">
<DialogHeader>
<DialogTitle className="mb-2">
{system ? `${t`Edit`} ${system?.name}` : <Trans>Add New System</Trans>}
</DialogTitle>
<TabsList className="grid w-full grid-cols-2">
<TabsTrigger value="docker">Docker</TabsTrigger>
<TabsTrigger value="binary">
<Trans>Binary</Trans>
</TabsTrigger>
</TabsList>
</DialogHeader>
{/* Docker (set tab index to prevent auto focusing content in edit system dialog) */}
<TabsContent value="docker" tabIndex={-1}>
<DialogDescription className="mb-4 leading-normal w-0 min-w-full">
<Trans>
The agent must be running on the system to connect. Copy the
<code className="bg-muted px-1 rounded-sm leading-3">docker-compose.yml</code> for the agent below.
</Trans>
</DialogDescription>
</TabsContent>
{/* Binary */}
<TabsContent value="binary">
<DialogDescription className="mb-4 leading-normal w-0 min-w-full">
<Trans>
The agent must be running on the system to connect. Copy the installation command for the agent below.
</Trans>
</DialogDescription>
</TabsContent>
<form onSubmit={handleSubmit as any}>
<div className="grid xs:grid-cols-[auto_1fr] gap-y-3 gap-x-4 items-center mt-1 mb-4">
<Label htmlFor="name" className="xs:text-end">
<Trans>Name</Trans>
</Label>
<Input id="name" name="name" defaultValue={system?.name} required />
<Label htmlFor="host" className="xs:text-end">
<Trans>Host / IP</Trans>
</Label>
<Input
id="host"
name="host"
value={hostValue}
required
onChange={(e) => {
setHostValue(e.target.value)
}}
/>
<Label htmlFor="port" className={cn("xs:text-end", isUnixSocket && "hidden")}>
<Trans>Port</Trans>
</Label>
<Input
ref={port}
name="port"
id="port"
defaultValue={system?.port || "45876"}
required={!isUnixSocket}
className={cn(isUnixSocket && "hidden")}
/>
<Label htmlFor="pkey" className="xs:text-end whitespace-pre">
<Trans comment="Use 'Key' if your language requires many more characters">Public Key</Trans>
</Label>
<div className="relative">
<Input readOnly id="pkey" value={publicKey} required></Input>
<div
className={
"h-6 w-24 bg-gradient-to-r rtl:bg-gradient-to-l from-transparent to-background to-65% absolute top-2 end-1 pointer-events-none"
}
></div>
<TooltipProvider delayDuration={100}>
<Tooltip>
<TooltipTrigger asChild>
<Button
type="button"
variant={"link"}
className="absolute end-0 top-0"
onClick={() => copyToClipboard(publicKey)}
>
<Copy className="h-4 w-4 " />
</Button>
</TooltipTrigger>
<TooltipContent>
<p>
<Trans>Click to copy</Trans>
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
</div>
<DialogFooter className="flex justify-end gap-x-2 gap-y-3 flex-col mt-5">
{/* Docker */}
<TabsContent value="docker" className="contents">
<CopyButton
text={t`Copy` + " docker compose"}
onClick={() => copyDockerCompose(isUnixSocket ? hostValue : port.current?.value, publicKey)}
dropdownText={t`Copy` + " docker run"}
dropdownOnClick={() => copyDockerRun(isUnixSocket ? hostValue : port.current?.value, publicKey)}
/>
</TabsContent>
{/* Binary */}
<TabsContent value="binary" className="contents">
<CopyButton
text={t`Copy Linux command`}
onClick={() => copyInstallCommand(isUnixSocket ? hostValue : port.current?.value, publicKey)}
dropdownText={t`Manual setup instructions`}
dropdownUrl="https://beszel.dev/guide/agent-installation#binary"
/>
</TabsContent>
{/* Save */}
<Button>{system ? <Trans>Save system</Trans> : <Trans>Add system</Trans>}</Button>
</DialogFooter>
</form>
</Tabs>
</DialogContent>
)
})
interface CopyButtonProps {
text: string
onClick: () => void
dropdownText: string
dropdownOnClick?: () => void
dropdownUrl?: string
}
const CopyButton = memo((props: CopyButtonProps) => {
return (
<div className="flex gap-0 rounded-lg">
<Button type="button" variant="outline" onClick={props.onClick} className="rounded-e-none dark:border-e-0 grow">
{props.text}
</Button>
<div className="w-px h-full bg-muted"></div>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" className={"px-2 rounded-s-none border-s-0"}>
<ChevronDownIcon />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{props.dropdownUrl ? (
<DropdownMenuItem asChild>
<a href={props.dropdownUrl} target="_blank" rel="noopener noreferrer">
{props.dropdownText}
</a>
</DropdownMenuItem>
) : (
<DropdownMenuItem onClick={props.dropdownOnClick}>{props.dropdownText}</DropdownMenuItem>
)}
</DropdownMenuContent>
</DropdownMenu>
</div>
)
})

View File

@@ -5,7 +5,6 @@ import { AlertInfo, AlertRecord, SystemRecord } from "@/types"
import { lazy, Suspense, useRef, useState } from "react"
import { toast } from "../ui/use-toast"
import { RecordOptions } from "pocketbase"
import { newQueue, Queue } from "@henrygd/queue"
import { Trans, t, Plural } from "@lingui/macro"
interface AlertData {
@@ -20,8 +19,6 @@ interface AlertData {
const Slider = lazy(() => import("@/components/ui/slider"))
let queue: Queue
const failedUpdateToast = () =>
toast({
title: t`Failed to update alert`,
@@ -49,7 +46,7 @@ export function SystemAlert({
} else if (checked) {
pb.collection("alerts").create({
system: system.id,
user: pb.authStore.model!.id,
user: pb.authStore.record!.id,
name: data.key,
value: value,
min: min,
@@ -88,11 +85,7 @@ export function SystemAlertGlobal({
data.checked = false
data.val = data.min = 0
data.updateAlert = (checked: boolean, value: number, min: number) => {
if (!queue) {
queue = newQueue(5)
}
data.updateAlert = async (checked: boolean, value: number, min: number) => {
const { set, populatedSet } = systemsWithExistingAlerts.current
// if overwrite checked, make sure all alerts will be overwritten
@@ -105,48 +98,57 @@ export function SystemAlertGlobal({
min,
triggered: false,
}
for (let system of systems) {
// if overwrite is false and system is in set (alert existed), skip
if (!overwrite && set.has(system.id)) {
continue
}
// find matching existing alert
const existingAlert = alerts.find((alert) => alert.system === system.id && data.key === alert.name)
// if first run, add system to set (alert already existed when global panel was opened)
if (existingAlert && !populatedSet && !overwrite) {
set.add(system.id)
continue
}
const requestOptions: RecordOptions = {
requestKey: system.id,
}
// checked - make sure alert is created or updated
if (checked) {
if (existingAlert) {
// console.log('updating', system.name)
queue
.add(() => pb.collection("alerts").update(existingAlert.id, recordData, requestOptions))
.catch(failedUpdateToast)
} else {
// console.log('creating', system.name)
queue
.add(() =>
pb.collection("alerts").create(
{
system: system.id,
user: pb.authStore.model!.id,
name: data.key,
...recordData,
},
requestOptions
)
)
.catch(failedUpdateToast)
// we can only send 50 in one batch
let done = 0
while (done < systems.length) {
const batch = pb.createBatch()
let batchSize = 0
for (let i = done; i < Math.min(done + 50, systems.length); i++) {
const system = systems[i]
// if overwrite is false and system is in set (alert existed), skip
if (!overwrite && set.has(system.id)) {
continue
}
} else if (existingAlert) {
// console.log('deleting', system.name)
queue.add(() => pb.collection("alerts").delete(existingAlert.id)).catch(failedUpdateToast)
// find matching existing alert
const existingAlert = alerts.find((alert) => alert.system === system.id && data.key === alert.name)
// if first run, add system to set (alert already existed when global panel was opened)
if (existingAlert && !populatedSet && !overwrite) {
set.add(system.id)
continue
}
batchSize++
const requestOptions: RecordOptions = {
requestKey: system.id,
}
// checked - make sure alert is created or updated
if (checked) {
if (existingAlert) {
batch.collection("alerts").update(existingAlert.id, recordData, requestOptions)
} else {
batch.collection("alerts").create(
{
system: system.id,
user: pb.authStore.record!.id,
name: data.key,
...recordData,
},
requestOptions
)
}
} else if (existingAlert) {
batch.collection("alerts").delete(existingAlert.id)
}
}
try {
batchSize && batch.send()
} catch (e) {
failedUpdateToast()
} finally {
done += 50
}
}
systemsWithExistingAlerts.current.populatedSet = true
@@ -158,13 +160,11 @@ export function SystemAlertGlobal({
function AlertContent({ data }: { data: AlertData }) {
const { key } = data
const hasSliders = !("single" in data.alert)
const singleDescription = data.alert.singleDesc?.()
const [checked, setChecked] = useState(data.checked || false)
const [min, setMin] = useState(data.min || (hasSliders ? 10 : 0))
const [value, setValue] = useState(data.val || (hasSliders ? 80 : 0))
const showSliders = checked && hasSliders
const [min, setMin] = useState(data.min || 10)
const [value, setValue] = useState(data.val || (singleDescription ? 0 : 80))
const newMin = useRef(min)
const newValue = useRef(value)
@@ -178,14 +178,14 @@ function AlertContent({ data }: { data: AlertData }) {
<label
htmlFor={`s${key}`}
className={cn("flex flex-row items-center justify-between gap-4 cursor-pointer p-4", {
"pb-0": showSliders,
"pb-0": checked,
})}
>
<div className="grid gap-1 select-none">
<p className="font-semibold flex gap-3 items-center">
<Icon className="h-4 w-4 opacity-85" /> {data.alert.name()}
</p>
{!showSliders && <span className="block text-sm text-muted-foreground">{data.alert.desc()}</span>}
{!checked && <span className="block text-sm text-muted-foreground">{data.alert.desc()}</span>}
</div>
<Switch
id={`s${key}`}
@@ -196,9 +196,10 @@ function AlertContent({ data }: { data: AlertData }) {
}}
/>
</label>
{showSliders && (
{checked && (
<div className="grid sm:grid-cols-2 mt-1.5 gap-5 px-4 pb-5 tabular-nums text-muted-foreground">
<Suspense fallback={<div className="h-10" />}>
{!singleDescription && (
<div>
<p id={`v${key}`} className="text-sm block h-8">
<Trans>
@@ -220,8 +221,12 @@ function AlertContent({ data }: { data: AlertData }) {
/>
</div>
</div>
<div>
<p id={`t${key}`} className="text-sm block h-8">
)}
<div className={cn(singleDescription && "col-span-full lowercase")}>
<p id={`t${key}`} className="text-sm block h-8 first-letter:uppercase">
{singleDescription && (
<>{singleDescription}{` `}</>
)}
<Trans>
For <strong className="text-foreground">{min}</strong>{" "}
<Plural value={min} one=" minute" other=" minutes" />

View File

@@ -1,8 +1,7 @@
import {
BookIcon,
DatabaseBackupIcon,
Github,
LayoutDashboard,
LockKeyholeIcon,
LogsIcon,
MailIcon,
Server,
@@ -23,9 +22,10 @@ import {
import { useEffect } from "react"
import { useStore } from "@nanostores/react"
import { $systems } from "@/lib/stores"
import { isAdmin } from "@/lib/utils"
import { navigate } from "./router"
import { getHostDisplayValue, isAdmin } from "@/lib/utils"
import { $router, basePath, navigate } from "./router"
import { Trans, t } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
export default function CommandPalette({ open, setOpen }: { open: boolean; setOpen: (open: boolean) => void }) {
const systems = useStore($systems)
@@ -56,13 +56,13 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
<CommandItem
key={system.id}
onSelect={() => {
navigate(`/system/${encodeURIComponent(system.name)}`)
navigate(getPagePath($router, "system", { name: system.name }))
setOpen(false)
}}
>
<Server className="me-2 h-4 w-4" />
<span>{system.name}</span>
<CommandShortcut>{system.host}</CommandShortcut>
<CommandShortcut>{getHostDisplayValue(system)}</CommandShortcut>
</CommandItem>
))}
</CommandGroup>
@@ -73,7 +73,7 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
<CommandItem
keywords={["home"]}
onSelect={() => {
navigate("/")
navigate(basePath)
setOpen(false)
}}
>
@@ -87,7 +87,7 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
</CommandItem>
<CommandItem
onSelect={() => {
navigate("/settings/general")
navigate(getPagePath($router, "settings", { name: "general" }))
setOpen(false)
}}
>
@@ -102,7 +102,7 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
<CommandItem
keywords={["alerts"]}
onSelect={() => {
navigate("/settings/notifications")
navigate(getPagePath($router, "settings", { name: "notifications" }))
setOpen(false)
}}
>
@@ -115,16 +115,16 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["github"]}
keywords={["help", "oauth", "oidc"]}
onSelect={() => {
window.location.href = "https://github.com/henrygd/beszel/blob/main/readme.md"
window.location.href = "https://beszel.dev/guide/what-is-beszel"
}}
>
<Github className="me-2 h-4 w-4" />
<BookIcon className="me-2 h-4 w-4" />
<span>
<Trans>Documentation</Trans>
</span>
<CommandShortcut>GitHub</CommandShortcut>
<CommandShortcut>beszel.dev</CommandShortcut>
</CommandItem>
</CommandGroup>
{isAdmin() && (
@@ -174,21 +174,6 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["oauth", "oicd"]}
onSelect={() => {
setOpen(false)
window.open("/_/#/settings/auth-providers", "_blank")
}}
>
<LockKeyholeIcon className="me-2 h-4 w-4" />
<span>
<Trans>Auth Providers</Trans>
</span>
<CommandShortcut>
<Trans>Admin</Trans>
</CommandShortcut>
</CommandItem>
<CommandItem
keywords={["email"]}
onSelect={() => {

View File

@@ -2,19 +2,24 @@ import { cn } from "@/lib/utils"
import { buttonVariants } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { LoaderCircle, LockIcon, LogInIcon, MailIcon, UserIcon } from "lucide-react"
import { LoaderCircle, LockIcon, LogInIcon, MailIcon } from "lucide-react"
import { $authenticated, pb } from "@/lib/stores"
import * as v from "valibot"
import { toast } from "../ui/use-toast"
import { Dialog, DialogContent, DialogTrigger, DialogHeader, DialogTitle } from "@/components/ui/dialog"
import { useCallback, useState } from "react"
import { AuthMethodsList, OAuth2AuthConfig } from "pocketbase"
import { Link } from "../router"
import { useCallback, useEffect, useState } from "react"
import { AuthMethodsList, AuthProviderInfo, OAuth2AuthConfig } from "pocketbase"
import { $router, Link, prependBasePath } from "../router"
import { Trans, t } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const honeypot = v.literal("")
const emailSchema = v.pipe(v.string(), v.email(t`Invalid email address.`))
const passwordSchema = v.pipe(v.string(), v.minLength(10, t`Password must be at least 10 characters.`))
const passwordSchema = v.pipe(
v.string(),
v.minLength(8, t`Password must be at least 8 characters.`),
v.maxBytes(72, t`Password must be less than 72 bytes.`)
)
const LoginSchema = v.looseObject({
name: honeypot,
@@ -24,14 +29,6 @@ const LoginSchema = v.looseObject({
const RegisterSchema = v.looseObject({
name: honeypot,
username: v.pipe(
v.string(),
v.regex(
/^(?=.*[a-zA-Z])[a-zA-Z0-9_-]+$/,
"Invalid username. You may use alphanumeric characters, underscores, and hyphens."
),
v.minLength(3, "Username must be at least 3 characters long.")
),
email: emailSchema,
password: passwordSchema,
passwordConfirm: passwordSchema,
@@ -63,6 +60,8 @@ export function UserAuthForm({
async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault()
setIsLoading(true)
// store email for later use if mfa is enabled
let email = ""
try {
const formData = new FormData(e.target as HTMLFormElement)
const data = Object.fromEntries(formData) as Record<string, any>
@@ -78,7 +77,8 @@ export function UserAuthForm({
setErrors(errors)
return
}
const { email, password, passwordConfirm, username } = result.output
const { password, passwordConfirm } = result.output
email = result.output.email
if (isFirstRun) {
// check that passwords match
if (password !== passwordConfirm) {
@@ -86,27 +86,27 @@ export function UserAuthForm({
setErrors({ passwordConfirm: msg })
return
}
await pb.admins.create({
email,
password,
passwordConfirm: password,
})
await pb.admins.authWithPassword(email, password)
await pb.collection("users").create({
username,
email,
password,
passwordConfirm: password,
role: "admin",
verified: true,
await pb.send("/api/beszel/create-user", {
method: "POST",
body: JSON.stringify({ email, password }),
})
await pb.collection("users").authWithPassword(email, password)
} else {
await pb.collection("users").authWithPassword(email, password)
}
$authenticated.set(true)
} catch (e) {
} catch (err: any) {
showLoginFaliedToast()
// todo: implement MFA
// const mfaId = err.response?.mfaId
// if (!mfaId) {
// showLoginFaliedToast()
// throw err
// }
// the user needs to authenticate again with another auth method, for example OTP
// const result = await pb.collection("users").requestOTP(email)
// ... show a modal for users to check their email and to enter the received code ...
// await pb.collection("users").authWithOTP(result.otpId, "EMAIL_CODE", { mfaId: mfaId })
} finally {
setIsLoading(false)
}
@@ -118,34 +118,55 @@ export function UserAuthForm({
return null
}
const authProviders = authMethods.oauth2.providers ?? []
const oauthEnabled = authMethods.oauth2.enabled && authProviders.length > 0
const passwordEnabled = authMethods.password.enabled
function loginWithOauth(provider: AuthProviderInfo, forcePopup = false) {
setIsOauthLoading(true)
const oAuthOpts: OAuth2AuthConfig = {
provider: provider.name,
}
// https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061
if (forcePopup || navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
const authWindow = window.open()
if (!authWindow) {
setIsOauthLoading(false)
toast({
title: t`Error`,
description: t`Please enable pop-ups for this site`,
variant: "destructive",
})
return
}
oAuthOpts.urlCallback = (url) => {
authWindow.location.href = url
}
}
pb.collection("users")
.authWithOAuth2(oAuthOpts)
.then(() => {
$authenticated.set(pb.authStore.isValid)
})
.catch(showLoginFaliedToast)
.finally(() => {
setIsOauthLoading(false)
})
}
useEffect(() => {
// auto login if password disabled and only one auth provider
if (!passwordEnabled && authProviders.length === 1) {
loginWithOauth(authProviders[0], true)
}
}, [])
return (
<div className={cn("grid gap-6", className)} {...props}>
{authMethods.emailPassword && (
{passwordEnabled && (
<>
<form onSubmit={handleSubmit} onChange={() => setErrors({})}>
<div className="grid gap-2.5">
{isFirstRun && (
<div className="grid gap-1 relative">
<UserIcon className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
<Label className="sr-only" htmlFor="username">
<Trans>Username</Trans>
</Label>
<Input
autoFocus={true}
id="username"
name="username"
required
placeholder={t`username`}
type="username"
autoCapitalize="none"
autoComplete="username"
autoCorrect="off"
disabled={isLoading || isOauthLoading}
className="ps-9"
/>
{errors?.username && <p className="px-1 text-xs text-red-600">{errors.username}</p>}
</div>
)}
<div className="grid gap-1 relative">
<MailIcon className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
<Label className="sr-only" htmlFor="email">
@@ -155,13 +176,13 @@ export function UserAuthForm({
id="email"
name="email"
required
placeholder={isFirstRun ? t`email` : "name@example.com"}
type="email"
placeholder="name@example.com"
type="text"
autoCapitalize="none"
autoComplete="email"
autoCorrect="off"
disabled={isLoading || isOauthLoading}
className="ps-9"
className={cn("ps-9", errors?.email && "border-red-500")}
/>
{errors?.email && <p className="px-1 text-xs text-red-600">{errors.email}</p>}
</div>
@@ -178,7 +199,7 @@ export function UserAuthForm({
type="password"
autoComplete="current-password"
disabled={isLoading || isOauthLoading}
className="ps-9 lowercase"
className={cn("ps-9", errors?.password && "border-red-500")}
/>
{errors?.password && <p className="px-1 text-xs text-red-600">{errors.password}</p>}
</div>
@@ -196,7 +217,7 @@ export function UserAuthForm({
type="password"
autoComplete="current-password"
disabled={isLoading || isOauthLoading}
className="ps-9 lowercase"
className={cn("ps-9", errors?.password && "border-red-500")}
/>
{errors?.passwordConfirm && <p className="px-1 text-xs text-red-600">{errors.passwordConfirm}</p>}
</div>
@@ -204,7 +225,7 @@ export function UserAuthForm({
<div className="sr-only">
{/* honeypot */}
<label htmlFor="name"></label>
<input id="name" type="text" name="name" tabIndex={-1} />
<input id="name" type="text" name="name" tabIndex={-1} autoComplete="off" />
</div>
<button className={cn(buttonVariants())} disabled={isLoading}>
{isLoading ? (
@@ -216,7 +237,7 @@ export function UserAuthForm({
</button>
</div>
</form>
{(isFirstRun || authMethods.authProviders.length > 0) && (
{(isFirstRun || oauthEnabled) && (
// only show 'continue with' during onboarding or if we have auth providers
<div className="relative">
<div className="absolute inset-0 flex items-center">
@@ -232,59 +253,29 @@ export function UserAuthForm({
</>
)}
{authMethods.authProviders.length > 0 && (
{oauthEnabled && (
<div className="grid gap-2 -mt-1">
{authMethods.authProviders.map((provider) => (
{authMethods.oauth2.providers.map((provider) => (
<button
key={provider.name}
type="button"
className={cn(buttonVariants({ variant: "outline" }), {
"justify-self-center": !authMethods.emailPassword,
"px-5": !authMethods.emailPassword,
"justify-self-center": !passwordEnabled,
"px-5": !passwordEnabled,
})}
onClick={() => {
setIsOauthLoading(true)
const oAuthOpts: OAuth2AuthConfig = {
provider: provider.name,
}
// https://github.com/pocketbase/pocketbase/discussions/2429#discussioncomment-5943061
if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) {
const authWindow = window.open()
if (!authWindow) {
setIsOauthLoading(false)
toast({
title: t`Error`,
description: t`Please enable pop-ups for this site`,
variant: "destructive",
})
return
}
oAuthOpts.urlCallback = (url) => {
authWindow.location.href = url
}
}
pb.collection("users")
.authWithOAuth2(oAuthOpts)
.then(() => {
$authenticated.set(pb.authStore.isValid)
})
.catch(showLoginFaliedToast)
.finally(() => {
setIsOauthLoading(false)
})
}}
onClick={() => loginWithOauth(provider)}
disabled={isLoading || isOauthLoading}
>
{isOauthLoading ? (
<LoaderCircle className="me-2 h-4 w-4 animate-spin" />
) : (
<img
className="me-2 h-4 w-4 dark:invert"
src={`/static/${provider.name}.svg`}
className="me-2 h-4 w-4 dark:brightness-0 dark:invert"
src={prependBasePath(`/_/images/oauth2/${provider.name}.svg`)}
alt=""
onError={(e) => {
e.currentTarget.src = "/static/lock.svg"
}}
// onError={(e) => {
// e.currentTarget.src = "/static/lock.svg"
// }}
/>
)}
<span className="translate-y-[1px]">{provider.displayName}</span>
@@ -293,12 +284,12 @@ export function UserAuthForm({
</div>
)}
{!authMethods.authProviders.length && isFirstRun && (
{!oauthEnabled && isFirstRun && (
// only show GitHub button / dialog during onboarding
<Dialog>
<DialogTrigger asChild>
<button type="button" className={cn(buttonVariants({ variant: "outline" }))}>
<img className="me-2 h-4 w-4 dark:invert" src="/static/github.svg" alt="" />
<img className="me-2 h-4 w-4 dark:invert" src={prependBasePath("/_/images/oauth2/github.svg")} alt="" />
<span className="translate-y-[1px]">GitHub</span>
</button>
</DialogTrigger>
@@ -316,7 +307,7 @@ export function UserAuthForm({
<Trans>
Please see{" "}
<a
href="https://github.com/henrygd/beszel/blob/main/readme.md#oauth--oidc-integration"
href="https://beszel.dev/guide/oauth"
className={cn(buttonVariants({ variant: "link" }), "p-0 h-auto")}
>
the documentation
@@ -329,9 +320,9 @@ export function UserAuthForm({
</Dialog>
)}
{authMethods.emailPassword && !isFirstRun && (
{passwordEnabled && !isFirstRun && (
<Link
href="/forgot-password"
href={getPagePath($router, "forgot_password")}
className="text-sm mx-auto hover:text-brand underline underline-offset-4 opacity-70 hover:opacity-100 transition-opacity"
>
<Trans>Forgot password?</Trans>

View File

@@ -83,7 +83,7 @@ export default function ForgotPassword() {
<Trans>Command line instructions</Trans>
</button>
</DialogTrigger>
<DialogContent className="max-w-[33em]">
<DialogContent className="max-w-[41em]">
<DialogHeader>
<DialogTitle>
<Trans>Command line instructions</Trans>
@@ -98,7 +98,10 @@ export default function ForgotPassword() {
<Trans>Then log into the backend and reset your user account password in the users table.</Trans>
</p>
<code className="bg-muted rounded-sm py-0.5 px-2.5 me-auto text-sm">
beszel admin update youremail@example.com newpassword
./beszel superuser upsert user@example.com password
</code>
<code className="bg-muted rounded-sm py-0.5 px-2.5 me-auto text-sm">
docker exec beszel /beszel superuser upsert name@example.com password
</code>
</DialogContent>
</Dialog>

View File

@@ -34,7 +34,7 @@ export default function () {
const subtitle = useMemo(() => {
if (isFirstRun) {
return t`Please create an admin account`
} else if (page?.path === "/forgot-password") {
} else if (page?.route === "forgot_password") {
return t`Enter email address to reset password`
} else {
return t`Please sign in to your account`
@@ -59,7 +59,7 @@ export default function () {
</h1>
<p className="text-sm text-muted-foreground">{subtitle}</p>
</div>
{page?.path === "/forgot-password" ? (
{page?.route === "forgot_password" ? (
<ForgotPassword />
) : (
<UserAuthForm isFirstRun={isFirstRun} authMethods={authMethods} />

View File

@@ -2,7 +2,6 @@ import { useState, lazy, Suspense } from "react"
import { Button, buttonVariants } from "@/components/ui/button"
import {
DatabaseBackupIcon,
LockKeyholeIcon,
LogOutIcon,
LogsIcon,
SearchIcon,
@@ -11,12 +10,12 @@ import {
UserIcon,
UsersIcon,
} from "lucide-react"
import { Link } from "./router"
import { $router, basePath, Link, prependBasePath } from "./router"
import { LangToggle } from "./lang-toggle"
import { ModeToggle } from "./mode-toggle"
import { Logo } from "./logo"
import { pb } from "@/lib/stores"
import { cn, isReadOnlyUser, isAdmin } from "@/lib/utils"
import { cn, isReadOnlyUser, isAdmin, logOut } from "@/lib/utils"
import {
DropdownMenu,
DropdownMenuTrigger,
@@ -28,6 +27,7 @@ import {
} from "@/components/ui/dropdown-menu"
import { AddSystemButton } from "./add-system"
import { Trans } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const CommandPalette = lazy(() => import("./command-palette"))
@@ -36,7 +36,7 @@ const isMac = navigator.platform.toUpperCase().indexOf("MAC") >= 0
export default function Navbar() {
return (
<div className="flex items-center h-14 md:h-16 bg-card px-4 pe-3 sm:px-6 border border-border/60 bt-0 rounded-md my-4">
<Link href="/" aria-label="Home" className="p-2 ps-0 me-3">
<Link href={basePath} aria-label="Home" className="p-2 ps-0 me-3">
<Logo className="h-[1.1rem] md:h-5 fill-foreground" />
</Link>
<SearchButton />
@@ -45,7 +45,7 @@ export default function Navbar() {
<LangToggle />
<ModeToggle />
<Link
href="/settings/general"
href={getPagePath($router, "settings", { name: "general" })}
aria-label="Settings"
className={cn("", buttonVariants({ variant: "ghost", size: "icon" }))}
>
@@ -58,13 +58,13 @@ export default function Navbar() {
</button>
</DropdownMenuTrigger>
<DropdownMenuContent align={isReadOnlyUser() ? "end" : "center"} className="min-w-44">
<DropdownMenuLabel>{pb.authStore.model?.email}</DropdownMenuLabel>
<DropdownMenuLabel>{pb.authStore.record?.email}</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuGroup>
{isAdmin() && (
<>
<DropdownMenuItem asChild>
<a href="/_/" target="_blank">
<a href={prependBasePath("/_/")} target="_blank">
<UsersIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Users</Trans>
@@ -72,7 +72,7 @@ export default function Navbar() {
</a>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<a href="/_/#/collections?collectionId=2hz5ncl8tizk5nx" target="_blank">
<a href={prependBasePath("/_/#/collections?collection=systems")} target="_blank">
<ServerIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Systems</Trans>
@@ -80,7 +80,7 @@ export default function Navbar() {
</a>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<a href="/_/#/logs" target="_blank">
<a href={prependBasePath("/_/#/logs")} target="_blank">
<LogsIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Logs</Trans>
@@ -88,26 +88,18 @@ export default function Navbar() {
</a>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<a href="/_/#/settings/backups" target="_blank">
<a href={prependBasePath("/_/#/settings/backups")} target="_blank">
<DatabaseBackupIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Backups</Trans>
</span>
</a>
</DropdownMenuItem>
<DropdownMenuItem asChild>
<a href="/_/#/settings/auth-providers" target="_blank">
<LockKeyholeIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Auth Providers</Trans>
</span>
</a>
</DropdownMenuItem>
<DropdownMenuSeparator />
</>
)}
</DropdownMenuGroup>
<DropdownMenuItem onSelect={() => pb.authStore.clear()}>
<DropdownMenuItem onSelect={logOut}>
<LogOutIcon className="me-2.5 h-4 w-4" />
<span>
<Trans>Log Out</Trans>

View File

@@ -1,16 +1,36 @@
import { createRouter } from "@nanostores/router"
export const $router = createRouter(
{
home: "/",
server: "/system/:name",
settings: "/settings/:name?",
forgot_password: "/forgot-password",
},
{ links: false }
)
const routes = {
home: "/",
system: `/system/:name`,
settings: `/settings/:name?`,
forgot_password: `/forgot-password`,
} as const
/** Navigate to url using router */
/**
* The base path of the application.
* This is used to prepend the base path to all routes.
*/
export const basePath = window.BASE_PATH || ""
/**
* Prepends the base path to the given path.
* @param path The path to prepend the base path to.
* @returns The path with the base path prepended.
*/
export const prependBasePath = (path: string) => (basePath + path).replaceAll("//", "/")
// prepend base path to routes
for (const route in routes) {
// @ts-ignore need as const above to get nanostores to parse types properly
routes[route] = prependBasePath(routes[route])
}
export const $router = createRouter(routes, { links: false })
/** Navigate to url using router
* Base path is automatically prepended if serving from subpath
*/
export const navigate = (urlString: string) => {
$router.open(urlString)
}

View File

@@ -7,8 +7,9 @@ import { Separator } from "../ui/separator"
import { alertInfo, updateRecordList, updateSystemList } from "@/lib/utils"
import { AlertRecord, SystemRecord } from "@/types"
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
import { Link } from "../router"
import { $router, Link } from "../router"
import { Plural, t, Trans } from "@lingui/macro"
import { getPagePath } from "@nanostores/router"
const SystemsTable = lazy(() => import("../systems-table/systems-table"))
@@ -18,7 +19,6 @@ export default function Home() {
const alerts = useStore($alerts)
const systems = useStore($systems)
// todo: maybe remove active alert if changed
const activeAlerts = useMemo(() => {
const activeAlerts = alerts.filter((alert) => {
const active = alert.triggered && alert.name in alertInfo
@@ -84,7 +84,7 @@ export default function Home() {
</Trans>
</AlertDescription>
<Link
href={`/system/${encodeURIComponent(alert.sysname!)}`}
href={getPagePath($router, "system", { name: alert.sysname! })}
className="absolute inset-0 w-full h-full"
aria-label="View system"
></Link>

View File

@@ -4,7 +4,7 @@ import { SidebarNav } from "./sidebar-nav.tsx"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card.tsx"
import { useStore } from "@nanostores/react"
import { $router } from "@/components/router.tsx"
import { redirectPage } from "@nanostores/router"
import { getPagePath, redirectPage } from "@nanostores/router"
import { BellIcon, FileSlidersIcon, SettingsIcon } from "lucide-react"
import { $userSettings, pb } from "@/lib/stores.ts"
import { toast } from "@/components/ui/use-toast.ts"
@@ -49,17 +49,17 @@ export default function SettingsLayout() {
const sidebarNavItems = [
{
title: _(t({ message: `General`, comment: "Context: General settings" })),
href: "/settings/general",
href: getPagePath($router, "settings", { name: "general" }),
icon: SettingsIcon,
},
{
title: t`Notifications`,
href: "/settings/notifications",
href: getPagePath($router, "settings", { name: "notifications" }),
icon: BellIcon,
},
{
title: t`YAML Config`,
href: "/settings/config",
href: getPagePath($router, "settings", { name: "config" }),
icon: FileSlidersIcon,
admin: true,
},
@@ -69,8 +69,8 @@ export default function SettingsLayout() {
useEffect(() => {
document.title = t`Settings` + " / Beszel"
// redirect to account page if no page is specified
if (page?.path === "/settings") {
// @ts-ignore redirect to account page if no page is specified
if (!page?.params?.name) {
redirectPage($router, "settings", { name: "general" })
}
}, [])

View File

@@ -13,6 +13,7 @@ import { saveSettings } from "./layout"
import * as v from "valibot"
import { isAdmin } from "@/lib/utils"
import { Trans, t } from "@lingui/macro"
import { prependBasePath } from "@/components/router"
interface ShoutrrrUrlCardProps {
url: string
@@ -94,7 +95,7 @@ const SettingsNotificationsPage = ({ userSettings }: { userSettings: UserSetting
<p className="text-sm text-muted-foreground leading-relaxed">
<Trans>
Please{" "}
<a href="/_/#/settings/mail" className="link" target="_blank">
<a href={prependBasePath("/_/#/settings/mail")} className="link" target="_blank">
configure an SMTP server
</a>{" "}
to ensure alerts are delivered.
@@ -193,7 +194,7 @@ const ShoutrrrUrlCard = ({ url, onUrlChange, onRemove }: ShoutrrrUrlCardProps) =
}
return (
<Card className="bg-muted/70 p-2 md:p-3">
<Card className="bg-muted/40 p-2 md:p-3">
<div className="flex items-center gap-1">
<Input
type="url"

View File

@@ -22,7 +22,7 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
<>
{/* Mobile View */}
<div className="md:hidden">
<Select onValueChange={(value: string) => navigate(value)} value={page?.path}>
<Select onValueChange={navigate} value={page?.path}>
<SelectTrigger className="w-full my-3.5">
<SelectValue placeholder="Select page" />
</SelectTrigger>

View File

@@ -1,12 +1,20 @@
import { $systems, pb, $chartTime, $containerFilter, $userSettings, $direction } from "@/lib/stores"
import { $systems, pb, $chartTime, $containerFilter, $userSettings, $direction, $maxValues } from "@/lib/stores"
import { ChartData, ChartTimes, ContainerStatsRecord, GPUData, SystemRecord, SystemStatsRecord } from "@/types"
import React, { lazy, useCallback, useEffect, useMemo, useRef, useState } from "react"
import React, { lazy, memo, useCallback, useEffect, useMemo, useRef, useState } from "react"
import { Card, CardHeader, CardTitle, CardDescription } from "../ui/card"
import { useStore } from "@nanostores/react"
import Spinner from "../spinner"
import { ClockArrowUp, CpuIcon, GlobeIcon, LayoutGridIcon, MonitorIcon, XIcon } from "lucide-react"
import ChartTimeSelect from "../charts/chart-time-select"
import { chartTimeData, cn, getPbTimestamp, getSizeAndUnit, toFixedFloat, useLocalStorage } from "@/lib/utils"
import {
chartTimeData,
cn,
getHostDisplayValue,
getPbTimestamp,
getSizeAndUnit,
toFixedFloat,
useLocalStorage,
} from "@/lib/utils"
import { Separator } from "../ui/separator"
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "../ui/tooltip"
import { Button } from "../ui/button"
@@ -98,10 +106,7 @@ export default function SystemDetail({ name }: { name: string }) {
const { _ } = useLingui()
const systems = useStore($systems)
const chartTime = useStore($chartTime)
/** Max CPU toggle value */
const cpuMaxStore = useState(false)
const bandwidthMaxStore = useState(false)
const diskIoMaxStore = useState(false)
const maxValues = useStore($maxValues)
const [grid, setGrid] = useLocalStorage("grid", true)
const [system, setSystem] = useState({} as SystemRecord)
const [systemStats, setSystemStats] = useState([] as SystemStatsRecord[])
@@ -121,9 +126,6 @@ export default function SystemDetail({ name }: { name: string }) {
setContainerData([])
setContainerFilterBar(null)
$containerFilter.set("")
cpuMaxStore[1](false)
bandwidthMaxStore[1](false)
diskIoMaxStore[1](false)
}
}, [name])
@@ -250,7 +252,7 @@ export default function SystemDetail({ name }: { name: string }) {
uptime = <Plural value={Math.trunc(system.info?.u / 86400)} one="# day" other="# days" />
}
return [
{ value: system.host, Icon: GlobeIcon },
{ value: getHostDisplayValue(system), Icon: GlobeIcon },
{
value: system.info.h,
Icon: MonitorIcon,
@@ -291,9 +293,21 @@ export default function SystemDetail({ name }: { name: string }) {
return null
}
// select field for switching between avg and max values
const maxValSelect = isLongerChart ? <SelectAvgMax max={maxValues} /> : null
// if no data, show empty message
const dataEmpty = !chartLoading && chartData.systemStats.length === 0
const hasGpuData = Object.keys(systemStats.at(-1)?.stats.g ?? {}).length > 0
const lastGpuVals = Object.values(systemStats.at(-1)?.stats.g ?? {})
const hasGpuData = lastGpuVals.length > 0
const hasGpuPowerData = lastGpuVals.some((gpu) => gpu.p !== undefined)
let translatedStatus: string = system.status
if (system.status === "up") {
translatedStatus = t({ message: "Up", comment: "Context: System is up" })
} else if (system.status === "down") {
translatedStatus = t({ message: "Down", comment: "Context: System is down" })
}
return (
<>
@@ -321,7 +335,7 @@ export default function SystemDetail({ name }: { name: string }) {
})}
></span>
</span>
{system.status}
{translatedStatus}
</div>
{systemInfo.map(({ value, label, Icon, hide }, i) => {
if (hide || !value) {
@@ -383,9 +397,9 @@ export default function SystemDetail({ name }: { name: string }) {
grid={grid}
title={_(t`CPU Usage`)}
description={t`Average system-wide CPU utilization`}
cornerEl={isLongerChart ? <SelectAvgMax store={cpuMaxStore} /> : null}
cornerEl={maxValSelect}
>
<AreaChartDefault chartData={chartData} chartName="CPU Usage" maxToggled={cpuMaxStore[0]} unit="%" />
<AreaChartDefault chartData={chartData} chartName="CPU Usage" maxToggled={maxValues} unit="%" />
</ChartCard>
{containerFilterBar && (
@@ -430,19 +444,19 @@ export default function SystemDetail({ name }: { name: string }) {
grid={grid}
title={t`Disk I/O`}
description={t`Throughput of root filesystem`}
cornerEl={isLongerChart ? <SelectAvgMax store={diskIoMaxStore} /> : null}
cornerEl={maxValSelect}
>
<AreaChartDefault chartData={chartData} maxToggled={diskIoMaxStore[0]} chartName="dio" />
<AreaChartDefault chartData={chartData} chartName="dio" maxToggled={maxValues} />
</ChartCard>
<ChartCard
empty={dataEmpty}
grid={grid}
title={t`Bandwidth`}
cornerEl={isLongerChart ? <SelectAvgMax store={bandwidthMaxStore} /> : null}
cornerEl={maxValSelect}
description={t`Network traffic of public interfaces`}
>
<AreaChartDefault chartData={chartData} maxToggled={bandwidthMaxStore[0]} chartName="bw" />
<AreaChartDefault chartData={chartData} chartName="bw" maxToggled={maxValues} />
</ChartCard>
{containerFilterBar && containerData.length > 0 && (
@@ -489,7 +503,7 @@ export default function SystemDetail({ name }: { name: string }) {
)}
{/* GPU power draw chart */}
{hasGpuData && (
{hasGpuPowerData && (
<ChartCard
empty={dataEmpty}
grid={grid}
@@ -562,13 +576,9 @@ export default function SystemDetail({ name }: { name: string }) {
grid={grid}
title={`${extraFsName} I/O`}
description={t`Throughput of ${extraFsName}`}
cornerEl={isLongerChart ? <SelectAvgMax store={diskIoMaxStore} /> : null}
cornerEl={maxValSelect}
>
<AreaChartDefault
chartData={chartData}
maxToggled={diskIoMaxStore[0]}
chartName={`efs.${extraFsName}`}
/>
<AreaChartDefault chartData={chartData} chartName={`efs.${extraFsName}`} maxToggled={maxValues} />
</ChartCard>
</div>
)
@@ -610,12 +620,10 @@ function ContainerFilterBar() {
)
}
function SelectAvgMax({ store }: { store: [boolean, React.Dispatch<React.SetStateAction<boolean>>] }) {
const [max, setMax] = store
const SelectAvgMax = memo(({ max }: { max: boolean }) => {
const Icon = max ? ChartMax : ChartAverage
return (
<Select value={max ? "max" : "avg"} onValueChange={(e) => setMax(e === "max")}>
<Select value={max ? "max" : "avg"} onValueChange={(e) => $maxValues.set(e === "max")}>
<SelectTrigger className="relative ps-10 pe-5">
<Icon className="h-4 w-4 absolute start-4 top-1/2 -translate-y-1/2 opacity-85" />
<SelectValue />
@@ -630,7 +638,7 @@ function SelectAvgMax({ store }: { store: [boolean, React.Dispatch<React.SetStat
</SelectContent>
</Select>
)
}
})
function ChartCard({
title,

View File

@@ -9,7 +9,7 @@ import {
VisibilityState,
getCoreRowModel,
useReactTable,
Column,
HeaderContext,
} from "@tanstack/react-table"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
@@ -21,6 +21,9 @@ import {
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
@@ -34,7 +37,6 @@ import {
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog"
import { SystemRecord } from "@/types"
@@ -50,48 +52,68 @@ import {
HardDriveIcon,
ServerIcon,
CpuIcon,
ChevronDownIcon,
LayoutGridIcon,
LayoutListIcon,
ArrowDownIcon,
ArrowUpIcon,
Settings2Icon,
EyeIcon,
PenBoxIcon,
} from "lucide-react"
import { useEffect, useMemo, useState } from "react"
import { memo, useEffect, useMemo, useRef, useState } from "react"
import { $hubVersion, $systems, pb } from "@/lib/stores"
import { useStore } from "@nanostores/react"
import { cn, copyToClipboard, decimalString, isReadOnlyUser, useLocalStorage } from "@/lib/utils"
import AlertsButton from "../alerts/alert-button"
import { navigate } from "../router"
import { EthernetIcon } from "../ui/icons"
import { $router, Link, navigate } from "../router"
import { EthernetIcon, GpuIcon, ThermometerIcon } from "../ui/icons"
import { Trans, t } from "@lingui/macro"
import { useLingui } from "@lingui/react"
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "../ui/card"
import { Input } from "../ui/input"
import { ClassValue } from "clsx"
import { getPagePath } from "@nanostores/router"
import { SystemDialog } from "../add-system"
import { Dialog } from "../ui/dialog"
type ViewMode = "table" | "grid"
function CellFormatter(info: CellContext<SystemRecord, unknown>) {
const val = info.getValue() as number
const val = (info.getValue() as number) || 0
return (
<div className="flex gap-1 items-center tabular-nums tracking-tight">
<span className="min-w-[3.5em]">{decimalString(val, 1)}%</span>
<div className="flex gap-2 items-center tabular-nums tracking-tight">
<span className="min-w-[3.3em]">{decimalString(val, 1)}%</span>
<span className="grow min-w-10 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
<span
className={cn(
"absolute inset-0 w-full h-full origin-left",
(val < 65 && "bg-green-500") || (val < 90 && "bg-yellow-500") || "bg-red-600"
(info.row.original.status !== "up" && "bg-primary/30") ||
(val < 65 && "bg-green-500") ||
(val < 90 && "bg-yellow-500") ||
"bg-red-600"
)}
style={{ transform: `scalex(${val}%)` }}
style={{
transform: `scalex(${val / 100})`,
}}
></span>
</span>
</div>
)
}
function sortableHeader(column: Column<SystemRecord, unknown>, Icon: any, hideSortIcon = false) {
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
const { column } = context
return (
<Button
variant="ghost"
className="h-9 px-3 flex"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
<Icon className="me-2 h-4 w-4" />
{/* @ts-ignore */}
{column.columnDef.icon && <column.columnDef.icon className="me-2 size-4" />}
{column.id}
{!hideSortIcon && <ArrowUpDownIcon className="ms-2 h-4 w-4" />}
{/* @ts-ignore */}
{column.columnDef.hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
</Button>
)
}
@@ -100,9 +122,10 @@ export default function SystemsTable() {
const data = useStore($systems)
const hubVersion = useStore($hubVersion)
const [filter, setFilter] = useState<string>()
const [sorting, setSorting] = useState<SortingState>([])
const [sorting, setSorting] = useState<SortingState>([{ id: t`System`, desc: false }])
const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([])
const [columnVisibility, setColumnVisibility] = useLocalStorage<VisibilityState>("cols", {})
const [viewMode, setViewMode] = useLocalStorage<ViewMode>("viewMode", window.innerWidth > 1024 ? "table" : "grid")
const { i18n } = useLingui()
useEffect(() => {
@@ -120,64 +143,101 @@ export default function SystemsTable() {
accessorKey: "name",
id: t`System`,
enableHiding: false,
cell: (info) => {
const { status } = info.row.original
return (
<span className="flex gap-0.5 items-center text-base md:pe-5">
<span
className={cn("w-2 h-2 left-0 rounded-full", {
"bg-green-500": status === "up",
"bg-red-500": status === "down",
"bg-primary/40": status === "paused",
"bg-yellow-500": status === "pending",
})}
style={{ marginBottom: "-1px" }}
></span>
<Button
data-nolink
variant={"ghost"}
className="text-primary/90 h-7 px-1.5 gap-1.5"
onClick={() => copyToClipboard(info.getValue() as string)}
>
{info.getValue() as string}
<CopyIcon className="h-2.5 w-2.5" />
</Button>
</span>
)
},
header: ({ column }) => sortableHeader(column, ServerIcon),
icon: ServerIcon,
cell: (info) => (
<span className="flex gap-0.5 items-center text-base md:pe-5">
<IndicatorDot system={info.row.original} />
<Button
data-nolink
variant={"ghost"}
className="text-primary/90 h-7 px-1.5 gap-1.5"
onClick={() => copyToClipboard(info.getValue() as string)}
>
{info.getValue() as string}
<CopyIcon className="h-2.5 w-2.5" />
</Button>
</span>
),
header: sortableHeader,
},
{
accessorKey: "info.cpu",
id: t`CPU`,
invertSorting: true,
cell: CellFormatter,
header: ({ column }) => sortableHeader(column, CpuIcon),
icon: CpuIcon,
header: sortableHeader,
},
{
accessorKey: "info.mp",
id: t`Memory`,
invertSorting: true,
cell: CellFormatter,
header: ({ column }) => sortableHeader(column, MemoryStickIcon),
icon: MemoryStickIcon,
header: sortableHeader,
},
{
accessorKey: "info.dp",
id: t`Disk`,
invertSorting: true,
cell: CellFormatter,
header: ({ column }) => sortableHeader(column, HardDriveIcon),
icon: HardDriveIcon,
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.g,
id: "GPU",
invertSorting: true,
sortUndefined: -1,
cell: CellFormatter,
icon: GpuIcon,
header: sortableHeader,
},
{
accessorFn: (originalRow) => originalRow.info.b || 0,
id: t`Net`,
invertSorting: true,
size: 115,
header: ({ column }) => sortableHeader(column, EthernetIcon),
cell: (info) => {
size: 50,
icon: EthernetIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
return (
<span className="tabular-nums whitespace-nowrap ps-1">{decimalString(val, val >= 100 ? 1 : 2)} MB/s</span>
<span
className={cn("tabular-nums whitespace-nowrap", {
"ps-1": viewMode === "table",
})}
>
{decimalString(val, val >= 100 ? 1 : 2)} MB/s
</span>
)
},
},
{
accessorFn: (originalRow) => originalRow.info.dt,
id: t({
message: "Temp",
comment: "Temperature label in systems table",
}),
invertSorting: true,
sortUndefined: -1,
size: 50,
hideSort: true,
icon: ThermometerIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
if (!val) {
return null
}
return (
<span
className={cn("tabular-nums whitespace-nowrap", {
"ps-1.5": viewMode === "table",
})}
>
{decimalString(val)} °C
</span>
)
},
},
@@ -186,18 +246,29 @@ export default function SystemsTable() {
id: t`Agent`,
invertSorting: true,
size: 50,
header: ({ column }) => sortableHeader(column, WifiIcon, true),
cell: (info) => {
icon: WifiIcon,
hideSort: true,
header: sortableHeader,
cell(info) {
const version = info.getValue() as string
if (!version || !hubVersion) {
return null
}
const system = info.row.original
return (
<span className="flex gap-2 items-center md:pe-5 tabular-nums ps-1">
<span
className={cn("w-2 h-2 left-0 rounded-full", version === hubVersion ? "bg-green-500" : "bg-yellow-500")}
style={{ marginBottom: "-1px" }}
></span>
<span
className={cn("flex gap-2 items-center md:pe-5 tabular-nums", {
"ps-1": viewMode === "table",
})}
>
<IndicatorDot
system={system}
className={
(system.status !== "up" && "bg-primary/30") ||
(version === hubVersion && "bg-green-500") ||
"bg-yellow-500"
}
/>
<span>{info.getValue() as string}</span>
</span>
)
@@ -205,84 +276,13 @@ export default function SystemsTable() {
},
{
id: t({ message: "Actions", comment: "Table column" }),
size: 120,
cell: ({ row }) => {
const { id, name, status, host } = row.original
return (
<div className={"flex justify-end items-center gap-1"}>
<AlertsButton system={row.original} />
<AlertDialog>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
<span className="sr-only">
<Trans>Open menu</Trans>
</span>
<MoreHorizontalIcon className="w-5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem
className={cn(isReadOnlyUser() && "hidden")}
onClick={() => {
pb.collection("systems").update(id, {
status: status === "paused" ? "pending" : "paused",
})
}}
>
{status === "paused" ? (
<>
<PlayCircleIcon className="me-2.5 h-4 w-4" />
<Trans>Resume</Trans>
</>
) : (
<>
<PauseCircleIcon className="me-2.5 h-4 w-4" />
<Trans>Pause</Trans>
</>
)}
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
<CopyIcon className="me-2.5 h-4 w-4" />
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<AlertDialogTrigger asChild>
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")}>
<Trash2Icon className="me-2.5 h-4 w-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</AlertDialogTrigger>
</DropdownMenuContent>
</DropdownMenu>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure you want to delete {name}?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>
This action cannot be undone. This will permanently delete all current records for {name} from
the database.
</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={() => pb.collection("systems").delete(id)}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</div>
)
},
size: 50,
cell: ({ row }) => (
<div className="flex justify-end items-center gap-1">
<AlertsButton system={row.original} />
<ActionsButton system={row.original} />
</div>
),
},
] as ColumnDef<SystemRecord>[]
}, [hubVersion, i18n.locale])
@@ -308,6 +308,8 @@ export default function SystemsTable() {
},
})
const rows = table.getRowModel().rows
return (
<Card>
<CardHeader className="pb-5 px-2 sm:px-6 max-sm:pt-5 max-sm:pb-1">
@@ -325,86 +327,340 @@ export default function SystemsTable() {
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline">
<Trans comment="Context: table columns">Columns</Trans>{" "}
<ChevronDownIcon className="ms-1.5 h-4 w-4 opacity-90" />
<Settings2Icon className="me-1.5 size-4 opacity-80" />
<Trans>View</Trans>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{table
.getAllColumns()
.filter((column) => column.getCanHide())
.map((column) => {
return (
<DropdownMenuCheckboxItem
key={column.id}
checked={column.getIsVisible()}
onCheckedChange={(value) => column.toggleVisibility(!!value)}
>
{column.id}
</DropdownMenuCheckboxItem>
)
})}
<DropdownMenuContent align="end" className="h-72 md:h-auto min-w-48 md:min-w-auto overflow-y-auto">
<div className="grid grid-cols-1 md:grid-cols-3 divide-y md:divide-s md:divide-y-0">
<div>
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
<LayoutGridIcon className="size-4" />
<Trans>Layout</Trans>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuRadioGroup
className="px-1 pb-1"
value={viewMode}
onValueChange={(view) => setViewMode(view as ViewMode)}
>
<DropdownMenuRadioItem value="table" onSelect={(e) => e.preventDefault()} className="gap-2">
<LayoutListIcon className="size-4" />
<Trans>Table</Trans>
</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="grid" onSelect={(e) => e.preventDefault()} className="gap-2">
<LayoutGridIcon className="size-4" />
<Trans>Grid</Trans>
</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</div>
<div>
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
<ArrowUpDownIcon className="size-4" />
<Trans>Sort By</Trans>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<div className="px-1 pb-1">
{table.getAllColumns().map((column) => {
if (column.id === t`Actions` || !column.getCanSort()) return null
let Icon = <span className="w-6"></span>
// if current sort column, show sort direction
if (sorting[0]?.id === column.id) {
if (sorting[0]?.desc) {
Icon = <ArrowUpIcon className="me-2 size-4" />
} else {
Icon = <ArrowDownIcon className="me-2 size-4" />
}
}
return (
<DropdownMenuItem
onSelect={(e) => {
e.preventDefault()
setSorting([{ id: column.id, desc: sorting[0]?.id === column.id && !sorting[0]?.desc }])
}}
key={column.id}
>
{Icon}
{column.id}
</DropdownMenuItem>
)
})}
</div>
</div>
<div>
<DropdownMenuLabel className="pt-2 px-3.5 flex items-center gap-2">
<EyeIcon className="size-4" />
<Trans>Visible Fields</Trans>
</DropdownMenuLabel>
<DropdownMenuSeparator />
<div className="px-1.5 pb-1">
{table
.getAllColumns()
.filter((column) => column.getCanHide())
.map((column) => {
return (
<DropdownMenuCheckboxItem
key={column.id}
onSelect={(e) => e.preventDefault()}
checked={column.getIsVisible()}
onCheckedChange={(value) => column.toggleVisibility(!!value)}
>
{column.id}
</DropdownMenuCheckboxItem>
)
})}
</div>
</div>
</div>
</DropdownMenuContent>
</DropdownMenu>
</div>
</div>
</CardHeader>
<CardContent className="max-sm:p-2">
<div className="rounded-md border overflow-hidden">
<Table>
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<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.original.id}
data-state={row.getIsSelected() && "selected"}
className={cn("cursor-pointer transition-opacity", {
"opacity-50": row.original.status === "paused",
<div className="p-6 pt-0 max-sm:py-3 max-sm:px-2">
{viewMode === "table" ? (
// table layout
<div className="rounded-md border overflow-hidden">
<Table>
<TableHeader>
{table.getHeaderGroups().map((headerGroup) => (
<TableRow key={headerGroup.id}>
{headerGroup.headers.map((header) => {
return (
<TableHead className="px-2" key={header.id}>
{header.isPlaceholder
? null
: flexRender(header.column.columnDef.header, header.getContext())}
</TableHead>
)
})}
onClick={(e) => {
const target = e.target as HTMLElement
if (!target.closest("[data-nolink]") && e.currentTarget.contains(target)) {
navigate(`/system/${encodeURIComponent(row.original.name)}`)
}
}}
>
{row.getVisibleCells().map((cell) => (
<TableCell
key={cell.id}
style={{
width: cell.column.getSize() === Number.MAX_SAFE_INTEGER ? "auto" : cell.column.getSize(),
}}
className={cn("overflow-hidden relative", data.length > 10 ? "py-2" : "py-2.5")}
>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={columns.length} className="h-24 text-center">
<Trans>No systems found.</Trans>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
</CardContent>
))}
</TableHeader>
<TableBody>
{rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow
key={row.original.id}
data-state={row.getIsSelected() && "selected"}
className={cn("cursor-pointer transition-opacity", {
"opacity-50": row.original.status === "paused",
})}
onClick={(e) => {
const target = e.target as HTMLElement
if (!target.closest("[data-nolink]") && e.currentTarget.contains(target)) {
navigate(getPagePath($router, "system", { name: row.original.name }))
}
}}
>
{row.getVisibleCells().map((cell) => (
<TableCell
key={cell.id}
style={{
width: cell.column.getSize() === Number.MAX_SAFE_INTEGER ? "auto" : cell.column.getSize(),
}}
className={cn("overflow-hidden relative", data.length > 10 ? "py-2" : "py-2.5")}
>
{flexRender(cell.column.columnDef.cell, cell.getContext())}
</TableCell>
))}
</TableRow>
))
) : (
<TableRow>
<TableCell colSpan={columns.length} className="h-24 text-center">
<Trans>No systems found.</Trans>
</TableCell>
</TableRow>
)}
</TableBody>
</Table>
</div>
) : (
// grid layout
<div className="grid gap-4 grid-cols-1 sm:grid-cols-2 lg:grid-cols-3">
{table.getRowModel().rows?.length ? (
table.getRowModel().rows.map((row) => {
const system = row.original
const { status } = system
return (
<Card
key={system.id}
className={cn(
"cursor-pointer hover:shadow-md transition-all bg-transparent w-full dark:border-border duration-200 relative",
{
"opacity-50": status === "paused",
}
)}
>
<CardHeader className="py-1 ps-5 pe-3 bg-muted/30 border-b border-border/60">
<div className="flex items-center justify-between gap-2">
<CardTitle className="text-base tracking-normal shrink-1 text-primary/90 flex items-center min-h-10 gap-2.5 min-w-0">
<div className="flex items-center gap-2.5 min-w-0">
<IndicatorDot system={system} />
<CardTitle className="text-[.95em]/normal tracking-normal truncate text-primary/90">
{system.name}
</CardTitle>
</div>
</CardTitle>
{table.getColumn(t`Actions`)?.getIsVisible() && (
<div className="flex gap-1 flex-shrink-0 relative z-10">
<AlertsButton system={system} />
<ActionsButton system={system} />
</div>
)}
</div>
</CardHeader>
<CardContent className="space-y-2.5 text-sm px-5 pt-3.5 pb-4">
{table.getAllColumns().map((column) => {
if (!column.getIsVisible() || column.id === t`System` || column.id === t`Actions`) return null
const cell = row.getAllCells().find((cell) => cell.column.id === column.id)
if (!cell) return null
return (
<div key={column.id} className="flex items-center gap-3">
{/* @ts-ignore */}
{column.columnDef?.icon && (
// @ts-ignore
<column.columnDef.icon className="size-4 text-muted-foreground" />
)}
<div className="flex items-center gap-3 flex-1">
<span className="text-muted-foreground min-w-16">{column.id}:</span>
<div className="flex-1">{flexRender(cell.column.columnDef.cell, cell.getContext())}</div>
</div>
</div>
)
})}
</CardContent>
<Link
href={getPagePath($router, "system", { name: row.original.name })}
className="inset-0 absolute w-full h-full"
>
<span className="sr-only">{row.original.name}</span>
</Link>
</Card>
)
})
) : (
<div className="col-span-full text-center py-8">
<Trans>No systems found.</Trans>
</div>
)}
</div>
)}
</div>
</Card>
)
}
function IndicatorDot({ system, className }: { system: SystemRecord; className?: ClassValue }) {
className ||= {
"bg-green-500": system.status === "up",
"bg-red-500": system.status === "down",
"bg-primary/40": system.status === "paused",
"bg-yellow-500": system.status === "pending",
}
return (
<span
className={cn("flex-shrink-0 size-2 rounded-full", className)}
// style={{ marginBottom: "-1px" }}
/>
)
}
const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
const [deleteOpen, setDeleteOpen] = useState(false)
const [editOpen, setEditOpen] = useState(false)
let editOpened = useRef(false)
const { id, status, host, name } = system
return (
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
<span className="sr-only">
<Trans>Open menu</Trans>
</span>
<MoreHorizontalIcon className="w-5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{!isReadOnlyUser() && (
<DropdownMenuItem
onSelect={() => {
editOpened.current = true
setEditOpen(true)
}}
>
<PenBoxIcon className="me-2.5 size-4" />
<Trans>Edit</Trans>
</DropdownMenuItem>
)}
<DropdownMenuItem
className={cn(isReadOnlyUser() && "hidden")}
onClick={() => {
pb.collection("systems").update(id, {
status: status === "paused" ? "pending" : "paused",
})
}}
>
{status === "paused" ? (
<>
<PlayCircleIcon className="me-2.5 size-4" />
<Trans>Resume</Trans>
</>
) : (
<>
<PauseCircleIcon className="me-2.5 size-4" />
<Trans>Pause</Trans>
</>
)}
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
{/* edit dialog */}
<Dialog open={editOpen} onOpenChange={setEditOpen}>
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
</Dialog>
{/* deletion dialog */}
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure you want to delete {name}?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>
This action cannot be undone. This will permanently delete all current records for {name} from the
database.
</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={() => pb.collection("systems").delete(id)}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</>
)
})

View File

@@ -63,3 +63,13 @@ export function ThermometerIcon(props: SVGProps<SVGSVGElement>) {
</svg>
)
}
// Huge icons (MIT)
export function GpuIcon(props: SVGProps<SVGSVGElement>) {
return (
<svg viewBox="0 0 24 24" {...props} stroke="currentColor" fill="none" strokeWidth="2">
<path d="M4 21V4.1a1.5 1.5 0 0 0-1.1-1L2 3m2 2h13c2.4 0 3.5 0 4.3.7s.7 2 .7 4.3v4.5c0 2.4 0 3.5-.7 4.3-.8.7-2 .7-4.3.7h-4.9a1.8 1.8 0 0 1-1.6-1c-.3-.6-1-1-1.6-1H4" />
<path d="M19 11.5a3 3 0 1 1-6 0 3 3 0 0 1 6 0m-11.5-3h2m-2 3h2m-2 3h2" />
</svg>
)
}

View File

@@ -34,11 +34,11 @@
.dark {
color-scheme: dark;
--background: 220 5.5% 9.5%;
--background: 220 5.5% 9%;
--foreground: 220 2% 97%;
--card: 220 5.5% 11%;
--card: 220 5.5% 10.5%;
--card-foreground: 220 2% 97%;
--popover: 220 5.5% 9.5%;
--popover: 220 5.5% 9%;
--popover-foreground: 220 2% 97%;
--primary: 220 2% 96%;
--primary-foreground: 220 4% 10%;
@@ -78,9 +78,19 @@
body {
@apply bg-background text-foreground;
}
}
@layer utilities {
.link {
@apply text-primary font-medium underline-offset-4 hover:underline;
}
/* New system dialog width */
.ns-dialog {
min-width: 30.3rem;
}
:where(:lang(zh), :lang(zh-CN), :lang(ko)) .ns-dialog {
min-width: 27.9rem;
}
}
.recharts-tooltip-wrapper {

View File

@@ -2,8 +2,8 @@ import { $direction } from "./stores"
import { i18n } from "@lingui/core"
import type { Messages } from "@lingui/core"
import languages from "@/lib/languages"
import { detect, fromUrl, fromStorage, fromNavigator } from "@lingui/detect-locale"
import { messages as enMessages } from "../locales/en/en.ts"
import { detect, fromStorage, fromNavigator } from "@lingui/detect-locale"
import { messages as enMessages } from "@/locales/en/en.ts"
// let locale = detect(fromUrl("lang"), fromStorage("lang"), fromNavigator(), "en")
let locale = detect(fromStorage("lang"), fromNavigator(), "en")
@@ -19,7 +19,7 @@ function activateLocale(locale: string, messages: Messages = enMessages) {
i18n.activate(locale)
document.documentElement.lang = locale
localStorage.setItem("lang", locale)
$direction.set(locale.startsWith("ar") ? "rtl" : "ltr")
$direction.set(locale.startsWith("ar") || locale.startsWith("fa") ? "rtl" : "ltr")
}
// dynamically loads translations for the given locale
@@ -41,15 +41,10 @@ export async function dynamicActivate(locale: string) {
if (locale?.startsWith("zh-")) {
// map zh variants to zh-CN
const zhVariantMap: Record<string, string> = {
"zh-CN": "zh-CN",
"zh-SG": "zh-CN",
"zh-MY": "zh-CN",
zh: "zh-CN",
"zh-Hans": "zh-CN",
"zh-HK": "zh-HK",
"zh-TW": "zh-HK",
"zh-MO": "zh-HK",
"zh-Hant": "zh-HK",
"zh-TW": "zh",
"zh-MO": "zh",
"zh-Hant": "zh",
}
dynamicActivate(zhVariantMap[locale] || "zh-CN")
} else {

View File

@@ -4,6 +4,21 @@ export default [
label: "العربية",
e: "🇵🇸",
},
{
lang: "bg",
label: "Български",
e: "🇧🇬",
},
{
lang: "cs",
label: "Čeština",
e: "🇨🇿",
},
{
lang: "da",
label: "Dansk",
e: "🇩🇰",
},
{
lang: "de",
label: "Deutsch",
@@ -19,6 +34,11 @@ export default [
label: "Español",
e: "🇲🇽",
},
{
lang: "fa",
label: "فارسی",
e: "🇮🇷",
},
{
lang: "fr",
label: "Français",
@@ -29,6 +49,11 @@ export default [
label: "Hrvatski",
e: "🇭🇷",
},
{
lang: "hu",
label: "Magyar",
e: "🇭🇺",
},
{
lang: "it",
label: "Italiano",
@@ -49,6 +74,11 @@ export default [
label: "Nederlands",
e: "🇳🇱",
},
{
lang: "no",
label: "Norsk",
e: "🇳🇴",
},
{
lang: "pl",
label: "Polski",
@@ -69,6 +99,16 @@ export default [
label: "Русский",
e: "🇷🇺",
},
{
lang: "sl",
label: "Slovenščina",
e: "🇸🇮",
},
{
lang: "sv",
label: "Svenska",
e: "🇸🇪",
},
{
lang: "uk",
label: "Українська",
@@ -89,4 +129,9 @@ export default [
label: "繁體中文",
e: "🇭🇰",
},
{
lang: "zh",
label: "繁體中文",
e: "🇹🇼",
},
] as const

View File

@@ -1,9 +1,10 @@
import PocketBase from "pocketbase"
import { atom, map, WritableAtom } from "nanostores"
import { atom, map, PreinitializedWritableAtom } from "nanostores"
import { AlertRecord, ChartTimes, SystemRecord, UserSettings } from "@/types"
import { basePath } from "@/components/router"
/** PocketBase JS Client */
export const pb = new PocketBase("/")
export const pb = new PocketBase(basePath)
/** Store if user is authenticated */
export const $authenticated = atom(pb.authStore.isValid)
@@ -21,12 +22,15 @@ export const $publicKey = atom("")
export const $hubVersion = atom("")
/** Chart time period */
export const $chartTime = atom("1h") as WritableAtom<ChartTimes>
export const $chartTime = atom("1h") as PreinitializedWritableAtom<ChartTimes>
/** Whether to display average or max chart values */
export const $maxValues = atom(false)
/** User settings */
export const $userSettings = map<UserSettings>({
chartTime: "1h",
emails: [pb.authStore.model?.email || ""],
emails: [pb.authStore.record?.email || ""],
})
// update local storage on change
$userSettings.subscribe((value) => {

View File

@@ -10,6 +10,7 @@ import { useEffect, useState } from "react"
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
import { EthernetIcon, ThermometerIcon } from "@/components/ui/icons"
import { t } from "@lingui/macro"
import { prependBasePath } from "@/components/router"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
@@ -33,7 +34,7 @@ const verifyAuth = () => {
pb.collection("users")
.authRefresh()
.catch(() => {
pb.authStore.clear()
logOut()
toast({
title: t`Failed to authenticate`,
description: t`Please log in again`,
@@ -42,15 +43,33 @@ const verifyAuth = () => {
})
}
export const updateSystemList = async () => {
const records = await pb
.collection<SystemRecord>("systems")
.getFullList({ sort: "+name", fields: "id,name,host,info,status" })
if (records.length) {
$systems.set(records)
} else {
verifyAuth()
export const updateSystemList = (() => {
let isFetchingSystems = false
return async () => {
if (isFetchingSystems) {
return
}
isFetchingSystems = true
try {
const records = await pb
.collection<SystemRecord>("systems")
.getFullList({ sort: "+name", fields: "id,name,host,port,info,status" })
if (records.length) {
$systems.set(records)
} else {
verifyAuth()
}
} finally {
isFetchingSystems = false
}
}
})()
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
export async function logOut() {
pb.authStore.clear()
pb.realtime.unsubscribe()
}
export const updateAlerts = () => {
@@ -88,11 +107,11 @@ export const formatDay = (timestamp: string) => {
}
export const updateFavicon = (newIcon: string) => {
;(document.querySelector("link[rel='icon']") as HTMLLinkElement).href = `/static/${newIcon}`
;(document.querySelector("link[rel='icon']") as HTMLLinkElement).href = prependBasePath(`/static/${newIcon}`)
}
export const isAdmin = () => pb.authStore.model?.role === "admin"
export const isReadOnlyUser = () => pb.authStore.model?.role === "readonly"
export const isAdmin = () => pb.authStore.record?.role === "admin"
export const isReadOnlyUser = () => pb.authStore.record?.role === "readonly"
/** Update systems / alerts list when records change */
export function updateRecordList<T extends RecordModel>(e: RecordSubscription<T>, $store: WritableAtom<T[]>) {
@@ -251,7 +270,7 @@ export async function updateUserSettings() {
}
// create user settings if error fetching existing
try {
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.model!.id })
const createdSettings = await pb.collection("user_settings").create({ user: pb.authStore.record!.id })
$userSettings.set(createdSettings.settings)
} catch (e) {
console.log("create settings", e)
@@ -283,7 +302,8 @@ export const alertInfo: Record<string, AlertInfo> = {
unit: "",
icon: ServerIcon,
desc: () => t`Triggers when status switches between up and down`,
single: true,
/** "for x minutes" is appended to desc when only one value */
singleDesc: () => t`System` + " " + t`Down`,
},
CPU: {
name: () => t`CPU Usage`,
@@ -317,3 +337,11 @@ export const alertInfo: Record<string, AlertInfo> = {
desc: () => t`Triggers when any sensor exceeds a threshold`,
},
}
/**
* Retuns value of system host, truncating full path if socket.
* @example
* // Assuming system.host is "/var/run/beszel.sock"
* const hostname = getHostDisplayValue(system) // hostname will be "beszel.sock"
*/
export const getHostDisplayValue = (system: SystemRecord): string => system.host.slice(system.host.lastIndexOf("/") + 1)

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ar\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Arabic\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# يوم} other {# أيام}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعة} other {# ساعات}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 ساعة"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 أسبوع"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 ساعة"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 ساعة"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 يومًا"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "إجراءات"
@@ -55,20 +58,19 @@ msgstr "إجراءات"
msgid "Active Alerts"
msgstr "التنبيهات النشطة"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "إضافة <0>نظام</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "إضافة نظام جديد"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "إضافة نظام"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "إضافة عنوان URL"
@@ -81,11 +83,10 @@ msgstr "تعديل خيارات العرض للرسوم البيانية."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "مسؤول"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "وكيل"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "التنبيهات"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "جميع الأنظمة"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "هل أنت متأكد أنك تريد حذف {name}؟"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "مزودو المصادقة"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "النسخ التلقائي يتطلب سياقًا آمنًا."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "متوسط"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "متوسط استخدام وحدة المعالجة المركزية للحاويات"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "المتوسط يتجاوز <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "متوسط ​​استهلاك طاقة GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "متوسط استخدام وحدة المعالجة المركزية على مستوى النظام"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "متوسط ​​استخدام {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "النسخ الاحتياطية"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "عرض النطاق الترددي"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "يدعم Beszel OpenID Connect والعديد من مزودي المصادقة OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "يستخدم Beszel <0>Shoutrrr</0> للتكامل مع خدمات الإشعارات الشهيرة."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "ثنائي"
@@ -162,7 +158,7 @@ msgstr "ثنائي"
msgid "Cache / Buffers"
msgstr "ذاكرة التخزين المؤقت / المخازن المؤقتة"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "إلغاء"
@@ -186,50 +182,46 @@ msgstr "تحقق من {email} للحصول على رابط إعادة التعي
msgid "Check logs for more details."
msgstr "تحقق من السجلات لمزيد من التفاصيل."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "تحقق من خدمة الإشعارات الخاصة بك"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "انقر للنسخ"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "أعمدة"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "تعليمات سطر الأوامر"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "قم بتكوين كيفية تلقي إشعارات التنبيه."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "تأكيد كلمة المرور"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "متابعة"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "تم النسخ إلى الحافظة"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "نسخ"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "نسخ المضيف"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "نسخ أمر لينكس"
@@ -237,17 +229,17 @@ msgstr "نسخ أمر لينكس"
msgid "Copy text"
msgstr "نسخ النص"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "المعالج"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "استخدام وحدة المعالجة المركزية"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "إنشاء حساب"
@@ -265,37 +257,37 @@ msgstr "لوحة التحكم"
msgid "Default time period"
msgstr "الفترة الزمنية الافتراضية"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "حذف"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "القرص"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "إدخال/إخراج القرص"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "استخدام القرص"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "استخدام القرص لـ {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "استخدام CPU لـ Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "استخدام الذاكرة لـ Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "إدخال/إخراج الشبكة لـ Docker"
@@ -303,16 +295,17 @@ msgstr "إدخال/إخراج الشبكة لـ Docker"
msgid "Documentation"
msgstr "التوثيق"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "البريد الإلكتروني"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "البريد الإلكتروني"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "إشعارات البريد الإلكتروني"
@@ -320,13 +313,13 @@ msgstr "إشعارات البريد الإلكتروني"
msgid "Enter email address to reset password"
msgstr "أدخل عنوان البريد الإلكتروني لإعادة تعيين كلمة المرور"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "أدخل عنوان البريد الإلكتروني..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "خطأ"
@@ -346,33 +339,33 @@ msgstr "تصدير التكوين"
msgid "Export your current systems configuration."
msgstr "تصدير تكوين الأنظمة الحالية الخاصة بك."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "فشل في المصادقة"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "فشل في حفظ الإعدادات"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "فشل في إرسال إشعار الاختبار"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "فشل في تحديث التنبيه"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "تصفية..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "لمدة <0>{min}</0> {min, plural, one {دقيقة} other {دقائق}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "هل نسيت كلمة المرور؟"
@@ -382,11 +375,15 @@ msgstr "هل نسيت كلمة المرور؟"
msgid "General"
msgstr "عام"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "استهلاك طاقة GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "شبكة"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "مضيف / IP"
@@ -394,12 +391,12 @@ msgstr "مضيف / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "إذا فقدت كلمة المرور لحساب المسؤول الخاص بك، يمكنك إعادة تعيينها باستخدام الأمر التالي."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "عنوان البريد الإلكتروني غير صالح."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "كيرنل"
@@ -407,12 +404,16 @@ msgstr "كيرنل"
msgid "Language"
msgstr "اللغة"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "التخطيط"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "فاتح"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "تسجيل الخروج"
@@ -420,7 +421,7 @@ msgstr "تسجيل الخروج"
msgid "Login"
msgstr "تسجيل الدخول"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "فشل محاولة تسجيل الدخول"
@@ -430,7 +431,7 @@ msgstr "فشل محاولة تسجيل الدخول"
msgid "Logs"
msgstr "السجلات"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "هل تبحث عن مكان لإنشاء التنبيهات؟ انقر على أيقونات الجرس <0/> في جدول الأنظمة."
@@ -438,37 +439,41 @@ msgstr "هل تبحث عن مكان لإنشاء التنبيهات؟ انقر
msgid "Manage display and notification preferences."
msgstr "إدارة تفضيلات العرض والإشعارات."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "1 دقيقة كحد"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "الذاكرة"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "استخدام الذاكرة"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "استخدام الذاكرة لحاويات Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "الاسم"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "الشبكة"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "حركة مرور الشبكة لحاويات Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "حركة مرور الشبكة للواجهات العامة"
@@ -476,17 +481,18 @@ msgstr "حركة مرور الشبكة للواجهات العامة"
msgid "No results found."
msgstr "لم يتم العثور على نتائج."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "لم يتم العثور على أنظمة."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "الإشعارات"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "دعم OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "دعم OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "في كل إعادة تشغيل، سيتم تحديث الأنظمة في قاعدة البيانات لتتطابق مع الأنظمة المعرفة في الملف."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "فتح القائمة"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "أو المتابعة باستخدام"
@@ -514,32 +520,36 @@ msgstr "صفحة"
msgid "Pages / Settings"
msgstr "الصفحات / الإعدادات"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "كلمة المرور"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "يجب أن تكون كلمة المرور مكونة من 10 أحرف على الأقل."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "كلمة المرور يجب أن تتكون من 8 أحرف على الأقل."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "تم استلام طلب إعادة تعيين كلمة المرور"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "إيقاف مؤقت"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "يرجى <0>تكوين خادم SMTP</0> لضمان تسليم التنبيهات."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "يرجى التحقق من السجلات لمزيد من التفاصيل."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "يرجى التحقق من بيانات الاعتماد الخاصة بك والمحاولة مرة أخرى"
@@ -548,15 +558,15 @@ msgstr "يرجى التحقق من بيانات الاعتماد الخاصة ب
msgid "Please create an admin account"
msgstr "يرجى إنشاء حساب مسؤول"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "يرجى تمكين النوافذ المنبثقة لهذا الموقع"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "يرجى تسجيل الدخول مرة أخرى"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "يرجى الاطلاع على <0>التوثيق</0> للحصول على التعليمات."
@@ -564,12 +574,12 @@ msgstr "يرجى الاطلاع على <0>التوثيق</0> للحصول على
msgid "Please sign in to your account"
msgstr "يرجى تسجيل الدخول إلى حسابك"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "المنفذ"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "الاستخدام الدقيق في الوقت المسجل"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "اللغة المفضلة"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "المفتاح العام"
@@ -597,20 +607,24 @@ msgstr "تم الاستلام"
msgid "Reset Password"
msgstr "إعادة تعيين كلمة المرور"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "استئناف"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "احفظ العنوان باستخدام مفتاح الإدخال أو الفاصلة. اتركه فارغًا لتعطيل إشعارات البريد الإلكتروني."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "حفظ الإعدادات"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "بحث"
@@ -643,30 +657,36 @@ msgstr "الإعدادات"
msgid "Settings saved"
msgstr "تم حفظ الإعدادات"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "تسجيل الدخول"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "إعدادات SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "الترتيب حسب"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "الحالة"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "مساحة التبديل المستخدمة من قبل النظام"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "استخدام التبديل"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "النظام"
@@ -678,28 +698,37 @@ msgstr "الأنظمة"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "يمكن إدارة الأنظمة في ملف <0>config.yml</0> داخل دليل البيانات الخاص بك."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "درجة الحرارة"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "درجات حرارة مستشعرات النظام"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "اختبار <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "تم إرسال إشعار الاختبار"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "يجب أن يكون الوكيل قيد التشغيل على النظام للاتصال. انسخ أمر التثبيت للوكيل أدناه."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "يجب أن يكون الوكيل قيد التشغيل على النظام للاتصال. انسخ <0>docker-compose.yml</0> للوكيل أدناه."
@@ -707,24 +736,24 @@ msgstr "يجب أن يكون الوكيل قيد التشغيل على النظ
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "ثم قم بتسجيل الدخول إلى الواجهة الخلفية وأعد تعيين كلمة مرور حساب المستخدم الخاص بك في جدول المستخدمين."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "لا يمكن التراجع عن هذا الإجراء. سيؤدي ذلك إلى حذف جميع السجلات الحالية لـ {name} من قاعدة البيانات بشكل دائم."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "معدل نقل {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "معدل نقل نظام الملفات الجذر"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "إلى البريد الإلكتروني"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "تبديل الشبكة"
@@ -732,45 +761,45 @@ msgstr "تبديل الشبكة"
msgid "Toggle theme"
msgstr "تبديل السمة"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "يتم التفعيل عندما <20><>تجاوز أي مستشعر عتبة معينة"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز الجمع بين الصعود/الهبوط عتبة معينة"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز استخدام وحدة المعالجة المركزية عتبة معينة"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز استخدام الذاكرة عتبة معينة"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "يتم التفعيل عندما يتغير الحالة بين التشغيل والإيقاف"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "يتم التفعيل عندما يتجاوز استخدام أي قرص عتبة معينة"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "محدث في الوقت الحقيقي. انقر على نظام لعرض المعلومات."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "مدة التشغيل"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "الاستخدام"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "استخدام القسم الجذر"
@@ -780,20 +809,20 @@ msgstr "استخدام القسم الجذر"
msgid "Used"
msgstr "مستخدم"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "اسم المستخدم"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "اسم المستخدم"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "المستخدمون"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "عرض"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "الأعمدة الظاهرة"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "في انتظار وجود سجلات كافية للعرض"
@@ -801,7 +830,7 @@ msgstr "في انتظار وجود سجلات كافية للعرض"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "هل تريد مساعدتنا في تحسين ترجماتنا؟ تحقق من <0>Crowdin</0> لمزيد من التفاصيل."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "إشعارات Webhook / Push"

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: bg\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Bulgarian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ден} other {# дни}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часа}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 час"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 седмица"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 часа"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 часа"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 дни"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Действия"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Активни тревоги"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Добави <0>Система</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Добави нова система"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Добави система"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Добави URL"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "Настрой опциите за показване на диаграмите."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Агент"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Тревоги"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Всички системи"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Автоматичното копиране изисква защитен контескт."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Средно"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Средно използване на процесора на контейнерите"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Средната стойност надхвърля <0>{value}{0}</0>"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Средна консумация на ток от графични карти"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Средно използване на процесора на цялата система"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Средно използване на {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Архиви"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Bandwidth на мрежата"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel поддържа OpenID Connect и много други OAuth2 доставчици за удостоверяване."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel ползва <0>Shoutrrr</0> за да се интегрира с известни услуги за уведомяване."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Двоичен код"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Откажи"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Внимание - възможност за загуба на данни"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Смени общите опции на приложението."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Опции на диаграмата"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Провери {email} за линк за нулиране."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Провери log-овете за повече информация."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Провери услугата си за удостоверяване"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Настисни за да копираш"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Инструкции за командната линия"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Настрой как получаваш нотификации за тревоги."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Потвърди парола"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Продължи"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Записано в клипборда"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Копирай"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Копирай хоста"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Копирай linux командата"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Копирай текста"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "Процесор"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Употреба на процесор"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Създай акаунт"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Тъмно"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Табло"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Времеви диапазон по подразбиране"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Изтрий"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Диск I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Използване на диск"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Изполване на диск от {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Използване на процесор от docker"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Изполване на памет от docker"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Мрежов I/O използван от docker"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Документация"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Имейл"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Имейл нотификации"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "Въведи имейл адрес за да нулираш паролата"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Въведи имейл адрес..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Грешка"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Надвишава {0}{1} в последните {2, plural, one {# минута} other {# минути}}"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Експортирай конфигурация"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Експортирай конфигурацията на системите."
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Неуспешно удостоверяване"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Неуспешно запазване на настройки"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Неуспешно изпрати тестова нотификация"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Неуспешно обнови тревога"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Филтрирай..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "За <0>{min}</0> {min, plural, one {минута} other {минути}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Забравена парола?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Общо"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "Консумация на ток от графична карта"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Мрежово"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Хост / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ако си загубил паролата до администраторския акаунт, можеш да я нулираш със следващата команда."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Невалиден имейл адрес."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Linux Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Език"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Подреждане"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Светъл"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Изход"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Вход"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Неуспешен опит за вход"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Логове"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Търсиш къде да създадеш тревоги? Натисни емотиконата за звънец <0/> в таблицата за системи."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Управление на предпочитанията за показване и уведомяване."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Максимум 1 минута"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Памет"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Употреба на паметта"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Използването на памет от docker контейнерите"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Име"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Мрежа"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Мрежов трафик на docker контейнери"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Мрежов трафик на публични интерфейси"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Няма намерени резултати."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Няма намерени системи."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Нотификации"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Поддръжка на OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "На всеки рестарт, системите в датабазата ще бъдат обновени да съвпадат със системите зададени във файла."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Отвори менюто"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Или продължи с"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Презапиши съществуващи тревоги"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Страница"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Страници / Настройки"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Парола"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Паролата трябва да е поне 8 символа."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Получено е искането за нулиране на паролата"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Пауза"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Моля <0>конфигурурай SMTP сървър</0> за да се подсигуриш, че тревогите са доставени."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Моля провери log-овете за повече информация."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Моля провери дадената информация и опитай отново"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Моля създай администраторски акаунт"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Моля активирай изскачащите прозорци за този сайт"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Моля влез отново"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Моля виж <0>документацията</0> за инструкции."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Моля влез в акаунта ти"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Точно използване в записаното време"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Предпочитан език"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Публичен ключ"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Прочети"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Получени"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Нулиране на парола"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Възобнови"
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Запази адреса с enter или запетая. Остави празно за да изключиш нотификациите чрез имейл."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Запази настройките"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Търси"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Търси за системи или настройки..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "Изпратени"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Задава диапазона за време за диаграмите, когато се разглежда система."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Настройки"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Настройките са запазени"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Влез"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Настройки за SMTP"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Сортиране по"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Изполван swap от системата"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Използване на swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Система"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Системи"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Системите могат да бъдат управлявани в <0>config.yml</0> файл намиращ се в директорията с данни."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Температири на системни сензори"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Тествай <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Тестова нотификация изпратена"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Агента трябва да работи на системата за да се свърже. Копирай инсталационната команда за агента долу."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Агемта трябва да работи на системата за да се свърже. Копирай <0>docker-compose.yml</0> файла за агента долу."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "След това влез в backend-а и нулирай паролата за потребителския акаунт в таблицата за потребители."
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Пропускателна способност на {extraFsName}"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Пропускателна способност на root файловата система"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "До имейл(ите)"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Превключване на мрежа"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Включи тема"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Задейства се, когато комбинираното качване/сваляне надвиши зададен праг"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Задейства се, когато употребата на процесора надвиши зададен праг"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Задейства се, когато употребата на паметта надвиши зададен праг"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Задейства се, когато статуса превключва между долу и горе"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Актуализира се в реално време. Натисни на система за да видиш информация."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Време на работа"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Употреба"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Употреба на root partition-а"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Използвани"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Потребители"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Изглед"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Видими полета"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Изчаква се за достатъчно записи за показване"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Искаш да помогнеш да направиш преводите още по-добри? Провери нашия <0>Crowdin</0> за повече детайли."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Пуш нотификации"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Запиши"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML конфигурация"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML конфигурация"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Настройките за потребителя ти са обновени."

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: cs\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 hodina"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 týden"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 hodin"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 hodin"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dní"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Akce"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivní výstrahy"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Přidat <0>Systém</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Přidat nový systém"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Přidat systém"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Přidat URL"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "Upravit možnosti zobrazení pro grafy."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Výstrahy"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Všechny systémy"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Opravdu chcete odstranit {name}?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Průměr"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Průměrné využití CPU kontejnerů"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Průměr je vyšší než <0>{value}{0}</0>"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Průměrná spotřeba energie GPU"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Průměrné využití CPU v celém systému"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Průměrné využití {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Zálohy"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Přenos"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podporuje OpenID Connect a mnoho poskytovatelů OAuth2 ověřování."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel používá <0>Shoutrrr</0> k integraci s populárními notifikačními službami."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binary"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / vyrovnávací paměť"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Zrušit"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Upozornění - možná ztráta dat"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Změnit obecné nastavení aplikace."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Možnosti grafu"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Zkontrolujte {email} pro odkaz na obnovení."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Zkontrolujte službu upozornění"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Klikněte pro zkopírování"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrukce příkazového řádku"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurace způsobu přijímání upozornění."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Potvrdit heslo"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Pokračovat"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Zkopírováno do schránky"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopírovat"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopírovat hostitele"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopírovat příkaz Linux"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Kopírovat text"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "Procesor"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Využití procesoru"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Vytvořit účet"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Tmavý"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Přehled"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Výchozí doba"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Odstranit"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Využití disku"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Využití disku {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Využití CPU Dockeru"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Využití paměti Dockeru"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Síťové I/O Dockeru"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Dokumentace"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Emailová upozornění"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "Zadejte e-mailovou adresu pro obnovu hesla"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Zadejte e-mailovou adresu..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Chyba"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Překračuje {0}{1} za {2, plural, one {poslední # minutu} few {poslední # minuty} other {posledních # minut}}"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Exportovat konfiguraci"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportovat aktuální konfiguraci systémů."
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Ověření se nezdařilo"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Nepodařilo se uložit nastavení"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Nepodařilo se odeslat testovací oznámení"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nepodařilo se aktualizovat upozornění"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtr..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minutu} few {minuty} other {minut}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Zapomněli jste heslo?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Obecné"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "Spotřeba energie GPU"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Mřížka"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Hostitel / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Pokud jste ztratili heslo k vašemu účtu správce, můžete jej obnovit pomocí následujícího příkazu."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Neplatná e-mailová adresa."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Jazyk"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Rozvržení"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Světlý"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Odhlásit"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Přihlásit"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Pokus o přihlášení selhal"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Logy"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Hledáte místo kde vytvářet upozornění? Klikněte na ikonu zvonku <0/> v systémové tabulce."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Správa nastavení zobrazení a oznámení."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max. 1 min"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Paměť"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Využití paměti"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Využití paměti docker kontejnerů"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Název"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Síť"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Síťový provoz kontejnerů docker"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Síťový provoz veřejných rozhraní"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Nenalezeny žádné výskyty."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nenalezeny žádné systémy."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Upozornění"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Podpora OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Při každém restartu budou systémy v databázi aktualizovány tak, aby odpovídaly systémům definovaným v souboru."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Otevřít menu"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Nebo pokračujte s"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Přepsat existující upozornění"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Stránka"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Stránky / Nastavení"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Heslo"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Heslo musí obsahovat alespoň 8 znaků."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Žádost o obnovu hesla byla přijata"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pozastavit"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "<0>nakonfigurujte SMTP server</0> pro zajištění toho, aby byla upozornění doručena."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Zkontrolujte prosím Vaše přihlašovací údaje a zkuste to znovu"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Vytvořte si prosím účet administrátora"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Prosím povolte vyskakovací okna pro tento web"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Přihlaste se prosím znovu"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Instrukce naleznete v <0>dokumentaci</0>."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Přihlaste se prosím k vašemu účtu"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Přesné využití v zaznamenaném čase"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Upřednostňovaný jazyk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Veřejný klíč"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Číst"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Přijato"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Obnovit heslo"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Pokračovat"
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Uložit nastavení"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Hledat"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Hledat systémy nebo nastavení..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "Odeslat"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Nastaví výchozí časový rozsah grafů, když je systém zobrazen."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Nastavení"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Nastavení uloženo"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Přihlásit se"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Nastavení SMTP"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Seřadit podle"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Stav"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap prostor využívaný systémem"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap využití"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Systém"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systémy"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systémy lze spravovat v souboru <0>config.yml</0> uvnitř datového adresáře."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabulka"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Teplota"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Teploty systémových senzorů"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testovací oznámení odesláno"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent musí být v systému spuštěn, aby se mohl připojit. Zkopírujte níže uvedený instalační příkaz pro agenta."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent musí být v systému spuštěn, aby se mohl připojit. Zkopírujte níže uvedený soubor<0>docker-compose.yml</0> pro agenta."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Poté se přihlaste do backendu a obnovte heslo k uživatelskému účtu v tabulce uživatelů."
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Propustnost {extraFsName}"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Propustnost kořenového souborového systému"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Na email(y)"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Přepnout mřížku"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Přepnout motiv"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Spustí se, když kombinace up/down překročí prahovou hodnotu"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Spustí se, když využití procesoru překročí prahovou hodnotu"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Spustí se, když využití paměti překročí prahovou hodnotu"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Spouští se, když se změní dostupnost"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Aktualizováno v reálném čase. Klepnutím na systém zobrazíte informace."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Doba provozu"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Využití"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Využití kořenového oddílu"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Využito"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Uživatelé"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Zobrazení"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Viditelné sloupce"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Čeká se na dostatek záznamů k zobrazení"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Chcete nám pomoci s našimi překlady ještě lépe? Podívejte se na <0>Crowdin</0> pro více informací."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push oznámení"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Psát"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML konfigurace"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML konfigurace"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše uživatelská nastavení byla aktualizována."

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: da\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# day} other {# days}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 time"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 uge"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 timer"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 timer"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dage"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Handlinger"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktive Alarmer"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Tilføj <0>System</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Tilføj nyt system"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Tilføj system"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Tilføj URL"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "Juster visningsindstillinger for diagrammer."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alarmer"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Alle systemer"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på, at du vil slette {name}?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kræver en sikker kontekst."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Gennemsnitlig"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Gennemsnitlig CPU udnyttelse af containere"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gennemsnit overstiger <0>{value}{0}</0>"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Gennemsnitligt strømforbrug for GPU'er"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Gennemsnitlig systembaseret CPU-udnyttelse"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Gennemsnitlig udnyttelse af {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Sikkerhedskopier"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Båndbredde"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel understøtter OpenID Connect og mange OAuth2 godkendelsesudbydere."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel bruger <0>Shoutrrr</0> til at integrere med populære notifikationstjenester."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binær"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Fortryd"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Forsigtig - muligt tab af data"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Skift generelle applikationsindstillinger."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Diagrammuligheder"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Tjek {email} for et nulstillingslink."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Tjek din notifikationstjeneste"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Klik for at kopiere"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instruktioner for kommandolinje"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurer hvordan du modtager advarselsmeddelelser."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Forsæt"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Kopieret til udklipsholder"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopier"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopier host"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopier Linux kommando"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Kopier tekst"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU forbrug"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Opret konto"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Mørk"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Oversigtspanel"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Slet"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Diskforbrug"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Diskforbrug af {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU forbrug"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker Hukommelsesforbrug"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker Netværk I/O"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Dokumentation"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email-notifikationer"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "Indtast e-mailadresse for at nulstille adgangskoden"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Indtast e-mailadresse..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Fejl"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Overskrider {0}{1} i sidste {2, plural, one {# minut} other {# minutter}}"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Eksporter konfiguration"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Eksporter din nuværende systemkonfiguration."
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Kunne ikke godkende"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Kunne ikke gemme indstillinger"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Afsendelse af testnotifikation mislykkedes"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Kunne ikke opdatere alarm"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "For <0>{min}</0> {min, plural, one {minut} other {minutter}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Glemt adgangskode?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Generelt"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "Gpu Strøm Træk"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Gitter"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Vært / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Hvis du har mistet adgangskoden til din administratorkonto, kan du nulstille den ved hjælp af følgende kommando."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ugyldig email adresse."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Sprog"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Lys"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Log ud"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Log ind"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Loginforsøg mislykkedes"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Leder du i stedet for efter hvor du kan oprette alarmer? Klik på klokken <0/> ikoner i system tabellen."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Administrer display og notifikationsindstillinger."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Hukommelse"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Hukommelsesforbrug"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Hukommelsesforbrug af dockercontainere"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Netværkstrafik af dockercontainere"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Netværkstrafik af offentlige grænseflader"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Ingen resultater fundet."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Ingen systemer fundet."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notifikationer"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC understøttelse"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ved hver genstart vil systemer i databasen blive opdateret til at matche de systemer, der er defineret i filen."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Åbn menu"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Eller fortsæt med"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Overskriv eksisterende alarmer"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Side"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Sider / Indstillinger"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Adgangskode"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Adgangskoden skal være på mindst 8 tegn."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Anmodning om nulstilling af adgangskode modtaget"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Konfigurer <0>en SMTP server</0> for at sikre at alarmer bliver leveret."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Tjek dine legitimationsoplysninger og prøv igen"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Opret venligst en administratorkonto"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Aktiver pop-ups for dette websted"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Log venligst ind igen"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Se <0>dokumentationen</0> for instruktioner."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Log venligst ind på din konto"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Præcis udnyttelse på det registrerede tidspunkt"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Foretrukket sprog"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Offentlig nøgle"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Læs"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Modtaget"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Nulstil adgangskode"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Genoptag"
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Gem indstillinger"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Søg"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Søg efter systemer eller indstillinger..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "Sendt"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Sætter standardtidsintervallet for diagrammer når et system vises."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Indstillinger"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Indstillinger gemt"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Log ind"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP-indstillinger"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sorter efter"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap plads brugt af systemet"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap forbrug"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systemer"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemer kan være administreres i filen <0>config.yml</0> i din datamappe."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperaturer i systemsensorer"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Test notifikation sendt"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agenten skal køre på systemet for at forbinde. Kopier installationskommandoen for agenten nedenfor."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agenten skal køre på systemet for at forbinde. Kopier <0>docker-compose.yml</0> for agenten nedenfor."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Log derefter ind på backend og nulstil adgangskoden til din brugerkonto i tabellen brugere."
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Gennemløb af {extraFsName}"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Gennemløb af rodfilsystemet"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til email(s)"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Slå gitter til/fra"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Skift tema"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Udløser når en sensor overstiger en tærskel"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Udløses når de kombinerede op/ned overstiger en tærskel"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Udløser når CPU-forbrug overstiger en tærskel"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Udløser når hukommelsesforbruget overstiger en tærskel"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Udløser når status skifter mellem op og ned"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Udløser når brugen af en disk overstiger en tærskel"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Opdateret i realtid. Klik på et system for at se information."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Oppetid"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Forbrug"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Brug af rodpartition"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Brugt"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Brugere"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Vis"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Synlige felter"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Venter på nok posteringer til at vise"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vil du hjælpe os med at gøre vores oversættelser endnu bedre? Tjek <0>Crowdin</0> for flere detaljer."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifikationer"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skriv"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML Konfiguration"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML Konfiguration"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dine brugerindstillinger er opdateret."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: de\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-22 11:59\n"
"Last-Translator: \n"
"Language-Team: German\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# Tag} other {# Tage}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Stunde} other {# Stunden}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 Stunde"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 Woche"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 Stunden"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 Stunden"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 Tage"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Aktionen"
@@ -55,20 +58,19 @@ msgstr "Aktionen"
msgid "Active Alerts"
msgstr "Aktive Warnungen"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>System</0> hinzufügen"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Neues System hinzufügen"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "System hinzufügen"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL hinzufügen"
@@ -81,11 +83,10 @@ msgstr "Anzeigeoptionen für Diagramme anpassen."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Warnungen"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Alle Systeme"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Möchten Sie {name} wirklich löschen?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Authentifizierungsanbieter"
msgstr "Möchtest du {name} wirklich löschen?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatisches Kopieren erfordert einen sicheren Kontext."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Durchschnitt"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Durchschnittliche CPU-Auslastung der Container"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Durchschnitt überschreitet <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Durchschnittlicher Stromverbrauch der GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Durchschnittliche systemweite CPU-Auslastung"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Durchschnittliche Auslastung von {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Backups"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Bandbreite"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel unterstützt OpenID Connect und viele OAuth2-Authentifizierungsanbieter."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel verwendet <0>Shoutrrr</0>, um sich mit beliebten Benachrichtigungsdiensten zu integrieren."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binär"
@@ -162,7 +158,7 @@ msgstr "Binär"
msgid "Cache / Buffers"
msgstr "Cache / Puffer"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Abbrechen"
@@ -180,56 +176,52 @@ msgstr "Diagrammoptionen"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Überprüfen Sie {email} auf einen Rücksetzlink."
msgstr "Überprüfe {email} auf einen Link zum Zurücksetzen."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Überprüfen Sie die Protokolle für weitere Details."
msgstr "Überprüfe die Protokolle für weitere Details."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Überprüfen Sie Ihren Benachrichtigungsdienst"
msgstr "Überprüfe deinen Benachrichtigungsdienst"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Zum Kopieren klicken"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Spalten"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Befehlszeilenanweisungen"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurieren Sie, wie Sie Warnbenachrichtigungen erhalten."
msgstr "Konfiguriere, wie du Warnbenachrichtigungen erhältst."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Passwort bestätigen"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Fortfahren"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "In die Zwischenablage kopiert"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopieren"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Host kopieren"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Linux-Befehl kopieren"
@@ -237,17 +229,17 @@ msgstr "Linux-Befehl kopieren"
msgid "Copy text"
msgstr "Text kopieren"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU-Auslastung"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Konto erstellen"
@@ -265,37 +257,37 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardzeitraum"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Löschen"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Festplatte"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Festplatten-I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Festplattennutzung"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Festplattennutzung von {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker-CPU-Auslastung"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker-Speichernutzung"
msgstr "Docker-Arbeitsspeichernutzung"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker-Netzwerk-I/O"
@@ -303,16 +295,17 @@ msgstr "Docker-Netzwerk-I/O"
msgid "Documentation"
msgstr "Dokumentation"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "E-Mail"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "Bearbeiten"
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "E-Mail"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-Mail-Benachrichtigungen"
@@ -320,13 +313,13 @@ msgstr "E-Mail-Benachrichtigungen"
msgid "Enter email address to reset password"
msgstr "E-Mail-Adresse eingeben, um das Passwort zurückzusetzen"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "E-Mail-Adresse eingeben..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Fehler"
@@ -336,7 +329,7 @@ msgstr "Überschreitet {0}{1} in den letzten {2, plural, one {# Minute} other {#
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr "Bestehende Systeme, die nicht in <0>config.yml</0> definiert sind, werden gelöscht. Bitte machen Sie regelmäßige 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/config-yaml.tsx:93
msgid "Export configuration"
@@ -344,35 +337,35 @@ msgstr "Konfiguration exportieren"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportieren Sie Ihre aktuelle Systemkonfiguration."
msgstr "Exportiere die aktuelle Systemkonfiguration."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Authentifizierung fehlgeschlagen"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Einstellungen konnten nicht gespeichert werden"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Testbenachrichtigung konnte nicht gesendet werden"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Warnung konnte nicht aktualisiert werden"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Für <0>{min}</0> {min, plural, one {Minute} other {Minuten}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Passwort vergessen?"
@@ -382,24 +375,28 @@ msgstr "Passwort vergessen?"
msgid "General"
msgstr "Allgemein"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "GPU-Leistungsaufnahme"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Raster"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Wenn Sie das Passwort für Ihr Administratorkonto verloren haben, können Sie es mit dem folgenden Befehl zurücksetzen."
msgstr "Wenn du das Passwort für dein Administratorkonto verloren hast, kannst du es mit dem folgenden Befehl zurücksetzen."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ungültige E-Mail-Adresse."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Sprache"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Anordnung"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Hell"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Abmelden"
@@ -420,7 +421,7 @@ msgstr "Abmelden"
msgid "Login"
msgstr "Anmelden"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Anmeldeversuch fehlgeschlagen"
@@ -430,45 +431,49 @@ msgstr "Anmeldeversuch fehlgeschlagen"
msgid "Logs"
msgstr "Protokolle"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Suchen Sie stattdessen nach der Erstellung von Warnungen? Klicken Sie auf die Glocken-<0/>-Symbole in der Systemtabelle."
msgstr "Du möchtest neue Warnungen erstellen? Klicke dafür auf die Glocken-<0/>-Symbole in der Systemtabelle."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Anzeige- und Benachrichtigungseinstellungen verwalten."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max 1 Min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Speicher"
msgstr "Arbeitsspeicher"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Speichernutzung"
msgstr "Arbeitsspeichernutzung"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Speichernutzung der Docker-Container"
msgstr "Arbeitsspeichernutzung der Docker-Container"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Netz"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Netzwerkverkehr der Docker-Container"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
@@ -476,29 +481,30 @@ msgstr "Netzwerkverkehr der öffentlichen Schnittstellen"
msgid "No results found."
msgstr "Keine Ergebnisse gefunden."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Keine Systeme gefunden."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Benachrichtigungen"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC-Unterstützung"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Bei jedem Neustart werden die Systeme in der Datenbank aktualisiert, um den im Datei definierten Systemen zu entsprechen."
msgstr "Bei jedem Neustart werden die Systeme in der Datenbank aktualisiert, um den in der Datei definierten Systemen zu entsprechen."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Menü öffnen"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Oder fortfahren mit"
@@ -514,62 +520,66 @@ msgstr "Seite"
msgid "Pages / Settings"
msgstr "Seiten / Einstellungen"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Passwort"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Das Passwort muss mindestens 10 Zeichen lang sein."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Das Passwort muss mindestens 8 Zeichen haben."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Das Passwort muss weniger als 72 Bytes lang sein."
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Anfrage zum Zurücksetzen des Passworts erhalten"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Bitte <0>konfigurieren Sie einen SMTP-Server</0>, um sicherzustellen, dass Warnungen zugestellt werden."
msgstr "Bitte <0>konfiguriere einen SMTP-Server</0>, um sicherzustellen, dass Warnungen zugestellt werden."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Bitte überprüfen Sie die Protokolle für weitere Details."
msgstr "Bitte überprüfe die Protokolle für weitere Details."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Bitte überprüfen Sie Ihre Anmeldedaten und versuchen Sie es erneut"
msgstr "Bitte überprüfe deine Anmeldedaten und versuche es erneut"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Bitte erstellen Sie ein Administratorkonto"
msgstr "Bitte erstelle ein Administratorkonto"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Bitte aktivieren Sie Pop-ups für diese Seite"
msgstr "Bitte aktiviere Pop-ups für diese Seite"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Bitte melden Sie sich erneut an"
msgstr "Bitte melde dich erneut an"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Bitte sehen Sie sich <0>die Dokumentation</0> für Anweisungen an."
msgstr "In der <0>Dokumentation</0> findest du weitere Anweisungen."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Bitte melden Sie sich bei Ihrem Konto an"
msgstr "Bitte melde dich bei beinem Konto an"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Genaue Nutzung zum aufgezeichneten Zeitpunkt"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Bevorzugte Sprache"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Schlüssel"
@@ -597,20 +607,24 @@ msgstr "Empfangen"
msgid "Reset Password"
msgstr "Passwort zurücksetzen"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Fortsetzen"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Adresse mit der Eingabetaste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
msgstr "Adresse mit der Enter-Taste oder Komma speichern. Leer lassen, um E-Mail-Benachrichtigungen zu deaktivieren."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Einstellungen speichern"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Suche"
@@ -620,7 +634,7 @@ msgstr "Nach Systemen oder Einstellungen suchen..."
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie Sie Warnungen erhalten."
msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du Warnungen erhältst."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:64
@@ -643,30 +657,36 @@ msgstr "Einstellungen"
msgid "Settings saved"
msgstr "Einstellungen gespeichert"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Anmelden"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP-Einstellungen"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sortieren nach"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Vom System genutzter Swap-Speicher"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap-Nutzung"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "System"
@@ -676,101 +696,110 @@ msgstr "Systeme"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systeme können in einer <0>config.yml</0>-Datei in Ihrem Datenverzeichnis verwaltet werden."
msgstr "Systeme können in einer <0>config.yml</0>-Datei im Datenverzeichnis verwaltet werden."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabelle"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperaturen der Systemsensoren"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testbenachrichtigung gesendet"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopieren Sie den Installationsbefehl für den Agenten unten."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopiere den Installationsbefehl für den Agent unten."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopieren Sie die <0>docker-compose.yml</0> für den Agenten unten."
msgstr "Der Agent muss auf dem System laufen, um eine Verbindung herzustellen. Kopiere die <0>docker-compose.yml</0> für den Agent unten."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Melden Sie sich dann im Backend an und setzen Sie Ihr Benutzerkontopasswort in der Benutzertabelle zurück."
msgstr "Melde dich dann im Backend an und setze dein Benutzerkontopasswort in der Benutzertabelle zurück."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Durchsatz von {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Durchsatz des Root-Dateisystems"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "An E-Mail(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Raster umschalten"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Thema umschalten"
msgstr "Darstellung umschalten"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Löst aus, wenn ein Sensor einen Schwellenwert überschreitet"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Löst aus, wenn die kombinierte Auf-/Abwärtsbewegung einen Schwellenwert überschreitet"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Löst aus, wenn die CPU-Auslastung einen Schwellenwert überschreitet"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Löst aus, wenn die Speichernutzung einen Schwellenwert überschreitet"
#: src/lib/utils.ts:285
msgid "Triggers when status switches between up and down"
msgstr "Löst aus, wenn der Status zwischen oben und unten wechselt"
msgstr "Löst aus, wenn die Arbeitsspeichernutzung einen Schwellenwert überschreitet"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Löst aus, wenn der Status zwischen online und offline wechselt"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Löst aus, wenn die Nutzung einer Festplatte einen Schwellenwert überschreitet"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "In Echtzeit aktualisiert. Klicken Sie auf ein System, um Informationen anzuzeigen."
msgstr "In Echtzeit aktualisiert. Klicke auf ein System, um Informationen anzuzeigen."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Betriebszeit"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Nutzung"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Nutzung der Root-Partition"
@@ -780,28 +809,28 @@ msgstr "Nutzung der Root-Partition"
msgid "Used"
msgstr "Verwendet"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "Benutzername"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Benutzername"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Benutzer"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Ansicht"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Sichtbare Spalten"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Warten auf genügend Datensätze zur Anzeige"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Möchten Sie uns helfen, unsere Übersetzungen noch besser zu machen? Schauen Sie sich <0>Crowdin</0> für weitere Details an."
msgstr "Möchtest du uns helfen, unsere Übersetzungen noch besser zu machen? Schau dir <0>Crowdin</0> für weitere Details an."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-Benachrichtigungen"
@@ -821,4 +850,4 @@ msgstr "YAML-Konfiguration"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Ihre Benutzereinstellungen wurden aktualisiert."
msgstr "Deine Benutzereinstellungen wurden aktualisiert."

View File

@@ -13,36 +13,39 @@ msgstr ""
"Language-Team: \n"
"Plural-Forms: \n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# day} other {# days}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 hour"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 week"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 hours"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 hours"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 days"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Actions"
@@ -50,20 +53,19 @@ msgstr "Actions"
msgid "Active Alerts"
msgstr "Active Alerts"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Add <0>System</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Add New System"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Add system"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Add URL"
@@ -76,11 +78,10 @@ msgstr "Adjust display options for charts."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -90,44 +91,39 @@ msgid "Alerts"
msgstr "Alerts"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "All Systems"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Are you sure you want to delete {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Auth Providers"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatic copy requires a secure context."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Average"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Average CPU utilization of containers"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Average exceeds <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Average power consumption of GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Average system-wide CPU utilization"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Average utilization of {0}"
@@ -136,20 +132,20 @@ msgstr "Average utilization of {0}"
msgid "Backups"
msgstr "Backups"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Bandwidth"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel supports OpenID Connect and many OAuth2 authentication providers."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binary"
@@ -157,7 +153,7 @@ msgstr "Binary"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Cancel"
@@ -181,50 +177,46 @@ msgstr "Check {email} for a reset link."
msgid "Check logs for more details."
msgstr "Check logs for more details."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Check your notification service"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Click to copy"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Columns"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Command line instructions"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configure how you receive alert notifications."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Confirm password"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Continue"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Copied to clipboard"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copy"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copy host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copy Linux command"
@@ -232,17 +224,17 @@ msgstr "Copy Linux command"
msgid "Copy text"
msgstr "Copy text"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU Usage"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Create account"
@@ -260,37 +252,37 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Default time period"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Delete"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Disk Usage"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Disk usage of {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU Usage"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker Memory Usage"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker Network I/O"
@@ -298,16 +290,17 @@ msgstr "Docker Network I/O"
msgid "Documentation"
msgstr "Documentation"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "email"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "Edit"
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email notifications"
@@ -315,13 +308,13 @@ msgstr "Email notifications"
msgid "Enter email address to reset password"
msgstr "Enter email address to reset password"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Enter email address..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Error"
@@ -341,33 +334,33 @@ msgstr "Export configuration"
msgid "Export your current systems configuration."
msgstr "Export your current systems configuration."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Failed to authenticate"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Failed to save settings"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Failed to send test notification"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Failed to update alert"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Forgot password?"
@@ -377,11 +370,15 @@ msgstr "Forgot password?"
msgid "General"
msgstr "General"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "GPU Power Draw"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Grid"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -389,12 +386,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "If you've lost the password to your admin account, you may reset it using the following command."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Invalid email address."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -402,12 +399,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Language"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Light"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Log Out"
@@ -415,7 +416,7 @@ msgstr "Log Out"
msgid "Login"
msgstr "Login"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Login attempt failed"
@@ -425,7 +426,7 @@ msgstr "Login attempt failed"
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
@@ -433,37 +434,41 @@ msgstr "Looking instead for where to create alerts? Click the bell <0/> icons in
msgid "Manage display and notification preferences."
msgstr "Manage display and notification preferences."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr "Manual setup instructions"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Memory"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Memory Usage"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Memory usage of docker containers"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Network traffic of docker containers"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Network traffic of public interfaces"
@@ -471,17 +476,18 @@ msgstr "Network traffic of public interfaces"
msgid "No results found."
msgstr "No results found."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "No systems found."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notifications"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC support"
@@ -489,11 +495,11 @@ msgstr "OAuth 2 / OIDC support"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "On each restart, systems in the database will be updated to match the systems defined in the file."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Open menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Or continue with"
@@ -509,32 +515,36 @@ msgstr "Page"
msgid "Pages / Settings"
msgstr "Pages / Settings"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Password"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Password must be at least 10 characters."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Password must be at least 8 characters."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Password must be less than 72 bytes."
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Password reset request received"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Please check logs for more details."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Please check your credentials and try again"
@@ -543,15 +553,15 @@ msgstr "Please check your credentials and try again"
msgid "Please create an admin account"
msgstr "Please create an admin account"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Please enable pop-ups for this site"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Please log in again"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Please see <0>the documentation</0> for instructions."
@@ -559,12 +569,12 @@ msgstr "Please see <0>the documentation</0> for instructions."
msgid "Please sign in to your account"
msgstr "Please sign in to your account"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Precise utilization at the recorded time"
@@ -573,7 +583,7 @@ msgid "Preferred Language"
msgstr "Preferred Language"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Public Key"
@@ -592,20 +602,24 @@ msgstr "Received"
msgid "Reset Password"
msgstr "Reset Password"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Resume"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Save Settings"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr "Save system"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Search"
@@ -638,30 +652,36 @@ msgstr "Settings"
msgid "Settings saved"
msgstr "Settings saved"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Sign in"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP settings"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sort By"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap space used by the system"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap Usage"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "System"
@@ -673,28 +693,37 @@ msgstr "Systems"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systems may be managed in a <0>config.yml</0> file inside your data directory."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Table"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr "Temp"
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperature"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperatures of system sensors"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Test notification sent"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "The agent must be running on the system to connect. Copy the installation command for the agent below."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
@@ -702,24 +731,24 @@ msgstr "The agent must be running on the system to connect. Copy the<0>docker-co
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Then log into the backend and reset your user account password in the users table."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Throughput of {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Throughput of root filesystem"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "To email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Toggle grid"
@@ -727,45 +756,45 @@ msgstr "Toggle grid"
msgid "Toggle theme"
msgstr "Toggle theme"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Triggers when any sensor exceeds a threshold"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Triggers when combined up/down exceeds a threshold"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Triggers when CPU usage exceeds a threshold"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Triggers when memory usage exceeds a threshold"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Triggers when status switches between up and down"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Triggers when usage of any disk exceeds a threshold"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Updated in real time. Click on a system to view information."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Uptime"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Usage"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Usage of root partition"
@@ -775,20 +804,20 @@ msgstr "Usage of root partition"
msgid "Used"
msgstr "Used"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "username"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Username"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Users"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "View"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Visible Fields"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Waiting for enough records to display"
@@ -796,7 +825,7 @@ msgstr "Waiting for enough records to display"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifications"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: es\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# día} other {# días}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 hora"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 semana"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 horas"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 horas"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 días"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Acciones"
@@ -55,20 +58,19 @@ msgstr "Acciones"
msgid "Active Alerts"
msgstr "Alertas Activas"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Agregar <0>Sistema</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Agregar Nuevo Sistema"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Agregar sistema"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Agregar URL"
@@ -81,11 +83,10 @@ msgstr "Ajustar las opciones de visualización para los gráficos."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Administrador"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agente"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Alertas"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Todos los Sistemas"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "¿Está seguro de que desea eliminar {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Proveedores de Autenticación"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "La copia automática requiere un contexto seguro."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Promedio"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Utilización promedio de CPU de los contenedores"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "El promedio excede <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Consumo de energía promedio de GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Utilización promedio de CPU del sistema"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Uso promedio de {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Copias de Seguridad"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Ancho de banda"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel admite OpenID Connect y muchos proveedores de autenticación OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel utiliza <0>Shoutrrr</0> para integrarse con servicios populares de notificación."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binario"
@@ -162,7 +158,7 @@ msgstr "Binario"
msgid "Cache / Buffers"
msgstr "Caché / Buffers"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Cancelar"
@@ -186,50 +182,46 @@ msgstr "Revise {email} para un enlace de restablecimiento."
msgid "Check logs for more details."
msgstr "Revise los registros para más detalles."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Verifique su servicio de notificaciones"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Haga clic para copiar"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Columnas"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrucciones de línea de comandos"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configure cómo recibe las notificaciones de alertas."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Continuar"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copiar comando de Linux"
@@ -237,17 +229,17 @@ msgstr "Copiar comando de Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Crear cuenta"
@@ -265,37 +257,37 @@ msgstr "Tablero"
msgid "Default time period"
msgstr "Período de tiempo predeterminado"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Eliminar"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Uso de CPU de Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Uso de Memoria de Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "E/S de Red de Docker"
@@ -303,16 +295,17 @@ msgstr "E/S de Red de Docker"
msgid "Documentation"
msgstr "Documentación"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "correo electrónico"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Correo electrónico"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notificaciones por correo"
@@ -320,13 +313,13 @@ msgstr "Notificaciones por correo"
msgid "Enter email address to reset password"
msgstr "Ingrese la dirección de correo electrónico para restablecer la contraseña"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Ingrese dirección de correo..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Error"
@@ -346,33 +339,33 @@ msgstr "Exportar configuración"
msgid "Export your current systems configuration."
msgstr "Exporte la configuración actual de sus sistemas."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Error al autenticar"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Error al guardar la configuración"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Error al enviar la notificación de prueba"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Error al actualizar la alerta"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "¿Olvidó su contraseña?"
@@ -382,11 +375,15 @@ msgstr "¿Olvidó su contraseña?"
msgid "General"
msgstr "General"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Cuadrícula"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -394,12 +391,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Si ha perdido la contraseña de su cuenta de administrador, puede restablecerla usando el siguiente comando."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Dirección de correo electrónico no válida."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Diseño"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Claro"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Cerrar Sesión"
@@ -420,7 +421,7 @@ msgstr "Cerrar Sesión"
msgid "Login"
msgstr "Iniciar sesión"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Intento de inicio de sesión fallido"
@@ -430,7 +431,7 @@ msgstr "Intento de inicio de sesión fallido"
msgid "Logs"
msgstr "Registros"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "¿Busca dónde crear alertas? Haga clic en los iconos de campana <0/> en la tabla de sistemas."
@@ -438,37 +439,41 @@ msgstr "¿Busca dónde crear alertas? Haga clic en los iconos de campana <0/> en
msgid "Manage display and notification preferences."
msgstr "Administrar preferencias de visualización y notificaciones."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Memoria"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Uso de Memoria"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Uso de memoria de los contenedores de Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nombre"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Red"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Tráfico de red de los contenedores de Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Tráfico de red de interfaces públicas"
@@ -476,17 +481,18 @@ msgstr "Tráfico de red de interfaces públicas"
msgid "No results found."
msgstr "No se encontraron resultados."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "No se encontraron sistemas."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notificaciones"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Soporte para OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Soporte para OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "En cada reinicio, los sistemas en la base de datos se actualizarán para coincidir con los sistemas definidos en el archivo."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Abrir menú"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "O continuar con"
@@ -514,32 +520,36 @@ msgstr "Página"
msgid "Pages / Settings"
msgstr "Páginas / Configuraciones"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Contraseña"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "La contraseña debe tener al menos 10 caracteres."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "La contraseña debe tener al menos 8 caracteres."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Solicitud de restablecimiento de contraseña recibida"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pausar"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Por favor, <0>configure un servidor SMTP</0> para asegurar que las alertas sean entregadas."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Por favor, revise los registros para más detalles."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique sus credenciales e intente de nuevo"
@@ -548,15 +558,15 @@ msgstr "Por favor, verifique sus credenciales e intente de nuevo"
msgid "Please create an admin account"
msgstr "Por favor, cree una cuenta de administrador"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Por favor, habilite las ventanas emergentes para este sitio"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Por favor, inicie sesión de nuevo"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, consulte <0>la documentación</0> para obtener instrucciones."
@@ -564,12 +574,12 @@ msgstr "Por favor, consulte <0>la documentación</0> para obtener instrucciones.
msgid "Please sign in to your account"
msgstr "Por favor, inicie sesión en su cuenta"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Puerto"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Utilización precisa en el momento registrado"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Clave Pública"
@@ -597,20 +607,24 @@ msgstr "Recibido"
msgid "Reset Password"
msgstr "Restablecer Contraseña"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Reanudar"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Guardar Configuración"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Buscar"
@@ -643,30 +657,36 @@ msgstr "Configuración"
msgid "Settings saved"
msgstr "Configuración guardada"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Iniciar sesión"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Configuración SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Ordenar por"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Estado"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Espacio de swap utilizado por el sistema"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Sistema"
@@ -678,28 +698,37 @@ msgstr "Sistemas"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Los sistemas pueden ser gestionados en un archivo <0>config.yml</0> dentro de su directorio de datos."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperaturas de los sensores del sistema"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Probar <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notificación de prueba enviada"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "El agente debe estar ejecutándose en el sistema para conectarse. Copie el comando de instalación para el agente a continuación."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "El agente debe estar ejecutándose en el sistema para conectarse. Copie el <0>docker-compose.yml</0> para el agente a continuación."
@@ -707,24 +736,24 @@ msgstr "El agente debe estar ejecutándose en el sistema para conectarse. Copie
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Luego inicie sesión en el backend y restablezca la contraseña de su cuenta de usuario en la tabla de usuarios."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Rendimiento de {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Rendimiento del sistema de archivos raíz"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "A correo(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Alternar cuadrícula"
@@ -732,45 +761,45 @@ msgstr "Alternar cuadrícula"
msgid "Toggle theme"
msgstr "Alternar tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Se activa cuando cualquier sensor supera un umbral"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Se activa cuando la suma de subida/bajada supera un umbral"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Se activa cuando el uso de CPU supera un umbral"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Se activa cuando el uso de memoria supera un umbral"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Se activa cuando el estado cambia entre activo e inactivo"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Se activa cuando el uso de cualquier disco supera un umbral"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Actualizado en tiempo real. Haga clic en un sistema para ver la información."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Tiempo de actividad"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Uso de la partición raíz"
@@ -780,20 +809,20 @@ msgstr "Uso de la partición raíz"
msgid "Used"
msgstr "Usado"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "nombre de usuario"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Nombre de usuario"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Usuarios"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Vista"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Columnas visibles"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Esperando suficientes registros para mostrar"
@@ -801,7 +830,7 @@ msgstr "Esperando suficientes registros para mostrar"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "¿Quieres ayudarnos a mejorar nuestras traducciones? Consulta <0>Crowdin</0> para más detalles."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notificaciones Webhook / Push"

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: fa\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# روز} other {# روز}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "۱ ساعت"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "۱ هفته"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "۱۲ ساعت"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "۲۴ ساعت"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "۳۰ روز"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "عملیات"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr " هشدارهای فعال"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "افزودن <0>سیستم</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "افزودن سیستم جدید"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "افزودن سیستم"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "افزودن آدرس اینترنتی"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "تنظیم گزینه‌های نمایش برای نمودارها."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "مدیر"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "عامل"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "هشدارها"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "همه سیستم‌ها"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف کنید؟"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "میانگین"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "میانگین استفاده از CPU کانتینرها"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr ""
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "میانگین مصرف برق پردازنده‌های گرافیکی"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "میانگین استفاده از CPU در کل سیستم"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "میانگین استفاده از {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "پشتیبان‌گیری‌ها"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "پهنای باند"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "بِزل از OpenID Connect و بسیاری از ارائه‌دهندگان احراز هویت OAuth2 پشتیبانی می‌کند."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "بِزل از <0>Shoutrrr</0> برای ادغام با سرویس‌های اطلاع‌رسانی محبوب استفاده می‌کند."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "دودویی"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "حافظه پنهان / بافرها"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "لغو"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "احتیاط - احتمال از دست رفتن داده‌ها"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "تغییر گزینه‌های کلی برنامه."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "گزینه‌های نمودار"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "ایمیل {email} خود را برای لینک بازنشانی بررسی کنید."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "برای جزئیات بیشتر، لاگ‌ها را بررسی کنید."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "سرویس اطلاع‌رسانی خود را بررسی کنید"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "برای کپی کردن کلیک کنید"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "دستورالعمل‌های خط فرمان"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "نحوه دریافت هشدارهای اطلاع‌رسانی را پیکربندی کنید."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "تأیید رمز عبور"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "ادامه"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "در کلیپ‌بورد کپی شد"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "کپی"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "کپی میزبان"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "کپی دستور لینوکس"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "کپی متن"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "پردازنده"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "میزان استفاده از پردازنده"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "ایجاد حساب کاربری"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "تیره"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "داشبورد"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "بازه زمانی پیش‌فرض"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "حذف"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "دیسک"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "ورودی/خروجی دیسک"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "میزان استفاده از دیسک"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "میزان استفاده از دیسک {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "میزان استفاده از CPU داکر"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "میزان استفاده از حافظه داکر"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "ورودی/خروجی شبکه داکر"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "مستندات"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "ایمیل"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "اعلان‌های ایمیلی"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "آدرس ایمیل را برای بازنشانی رمز عبور وارد کنید"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "آدرس ایمیل را وارد کنید..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "خطا"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "در {2, plural, one {# دقیقه} other {# دقیقه}} گذشته از {0}{1} بیشتر است"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "خارج کردن پیکربندی"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "پیکربندی سیستم‌های فعلی خود را خارج کنید."
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "احراز هویت ناموفق بود"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "ذخیره تنظیمات ناموفق بود"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "ارسال اعلان آزمایشی ناموفق بود"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "به‌روزرسانی هشدار ناموفق بود"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "فیلتر..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "برای <0>{min}</0> {min, plural, one {دقیقه} other {دقیقه}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "رمز عبور را فراموش کرده‌اید؟"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "عمومی"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "مصرف برق پردازنده گرافیکی"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "جدول"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "میزبان / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "اگر رمز عبور حساب مدیر خود را گم کرده‌اید، می‌توانید آن را با استفاده از دستور زیر بازنشانی کنید."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "آدرس ایمیل نامعتبر است."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "هسته"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "زبان"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "طرح‌بندی"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "روشن"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "خروج"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "ورود"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "تلاش برای ورود ناموفق بود"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "لاگ‌ها"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "به دنبال جایی برای ایجاد هشدار هستید؟ روی آیکون‌های زنگ <0/> در جدول سیستم‌ها کلیک کنید."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "مدیریت تنظیمات نمایش و اعلان‌ها."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "حداکثر ۱ دقیقه"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "حافظه"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "میزان استفاده از حافظه"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "نام"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "شبکه"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "ترافیک شبکه کانتینرهای داکر"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "ترافیک شبکه رابط‌های عمومی"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "هیچ نتیجه‌ای یافت نشد."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "هیچ سیستمی یافت نشد."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "اعلان‌ها"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "پشتیبانی از OAuth 2 / OIDC"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "در هر بار راه‌اندازی مجدد، سیستم‌های موجود در پایگاه داده با سیستم‌های تعریف شده در فایل مطابقت داده می‌شوند."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "باز کردن منو"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "یا ادامه با"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "بازنویسی هشدارهای موجود"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "صفحه"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "صفحات / تنظیمات"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "رمز عبور"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "رمز عبور باید حداقل ۸ کاراکتر باشد."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "درخواست بازنشانی رمز عبور دریافت شد"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "توقف"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "لطفاً برای اطمینان از تحویل هشدارها، یک <0>سرور SMTP پیکربندی کنید</0>."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "لطفاً برای جزئیات بیشتر، لاگ‌ها را بررسی کنید."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "لطفاً اعتبارنامه‌های خود را بررسی کرده و دوباره تلاش کنید."
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "لطفاً یک حساب مدیر ایجاد کنید"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "لطفاً پنجره‌های بازشو را برای این سایت فعال کنید"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "لطفاً دوباره وارد شوید"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "لطفاً برای دستورالعمل‌ها به <0>مستندات</0> مراجعه کنید."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "لطفاً به حساب کاربری خود وارد شوید"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "پورت"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "میزان دقیق استفاده در زمان ثبت شده"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "زبان ترجیحی"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "کلید عمومی"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "خواندن"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "دریافت شد"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "بازنشانی رمز عبور"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "ادامه"
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "آدرس را با استفاده از کلید Enter یا کاما ذخیره کنید. برای غیرفعال کردن اعلان‌های ایمیلی، خالی بگذارید."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "ذخیره تنظیمات"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "جستجو"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "جستجو برای سیستم‌ها یا تنظیمات..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "ارسال شد"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "بازه زمانی پیش‌فرض برای نمودارها هنگام مشاهده یک سیستم را تعیین می‌کند."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "تنظیمات"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "تنظیمات ذخیره شد"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "ورود"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "تنظیمات SMTP"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "مرتب‌سازی بر اساس"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "وضعیت"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "فضای Swap استفاده شده توسط سیستم"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "میزان استفاده از Swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "سیستم"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "سیستم‌ها"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "سیستم‌ها ممکن است در یک فایل <0>config.yml</0> درون دایرکتوری داده شما مدیریت شوند."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "دما"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "دمای حسگرهای سیستم"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "تست <0>آدرس اینترنتی</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "اعلان آزمایشی ارسال شد"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "برای اتصال، عامل باید روی سیستم در حال اجرا باشد. دستور نصب عامل را از زیر کپی کنید."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "برای اتصال، عامل باید روی سیستم در حال اجرا باشد. <0>docker-compose.yml</0> مربوط به عامل را از زیر کپی کنید."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "سپس وارد بخش پشتیبان شوید و رمز عبور حساب کاربری خود را در جدول کاربران بازنشانی کنید."
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "توان عملیاتی {extraFsName}"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "توان عملیاتی سیستم فایل ریشه"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "به ایمیل(ها)"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "تغییر نمایش جدول"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "تغییر تم"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "هنگامی که مجموع بالا/پایین از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "هنگامی که میزان استفاده از CPU از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "هنگامی که میزان استفاده از حافظه از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "هنگامی که وضعیت بین بالا و پایین تغییر می‌کند، فعال می‌شود"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال می‌شود"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "به صورت لحظه‌ای به‌روزرسانی می‌شود. برای مشاهده اطلاعات، روی یک سیستم کلیک کنید."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "آپتایم"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "میزان استفاده"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "میزان استفاده از پارتیشن ریشه"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "استفاده شده"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "کاربران"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "مشاهده"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "فیلدهای قابل مشاهده"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "در انتظار رکوردهای کافی برای نمایش"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "می‌خواهید به ما کمک کنید تا ترجمه‌های خود را بهتر کنیم؟ برای جزئیات بیشتر به <0>Crowdin</0> مراجعه کنید."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "اعلان‌های Webhook / Push"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "نوشتن"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "پیکربندی YAML"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "پیکربندی YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "تنظیمات کاربری شما به‌روزرسانی شد."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: fr\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-06 20:36\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: French\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# jour} other {# jours}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# heure} other {# heures}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 heure"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 semaine"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 heures"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 heures"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 jours"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Actions"
@@ -55,20 +58,19 @@ msgstr "Actions"
msgid "Active Alerts"
msgstr "Alertes actives"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Ajouter <0>Système</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Ajouter un nouveau système"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Ajouter un système"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Ajouter URL"
@@ -81,11 +83,10 @@ msgstr "Ajuster les options d'affichage pour les graphiques."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Alertes"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Tous les systèmes"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Êtes-vous sûr de vouloir supprimer {name} ?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Fournisseurs d'authentification"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "La copie automatique nécessite un contexte sécurisé."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Moyenne"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Utilisation moyenne du CPU des conteneurs"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "La moyenne dépasse <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Consommation d'énergie moyenne des GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Utilisation moyenne du CPU à l'échelle du système"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Utilisation moyenne de {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Sauvegardes"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Bande passante"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel prend en charge OpenID Connect et de nombreux fournisseurs d'authentification OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel utilise <0>Shoutrrr</0> pour s'intégrer aux services de notification populaires."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binaire"
@@ -162,7 +158,7 @@ msgstr "Binaire"
msgid "Cache / Buffers"
msgstr "Cache / Tampons"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Annuler"
@@ -186,50 +182,46 @@ msgstr "Vérifiez {email} pour un lien de réinitialisation."
msgid "Check logs for more details."
msgstr "Vérifiez les journaux pour plus de détails."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Vérifiez votre service de notification"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Cliquez pour copier"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Colonnes"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instructions en ligne de commande"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configurez comment vous recevez les notifications d'alerte."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Confirmer le mot de passe"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Continuer"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Copié dans le presse-papiers"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copier"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copier l'hôte"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copier la commande Linux"
@@ -237,17 +229,17 @@ msgstr "Copier la commande Linux"
msgid "Copy text"
msgstr "Copier le texte"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Utilisation du CPU"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Créer un compte"
@@ -265,37 +257,37 @@ msgstr "Tableau de bord"
msgid "Default time period"
msgstr "Période par défaut"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Supprimer"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disque"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Entrée/Sortie disque"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Utilisation du disque"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Utilisation du disque de {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Utilisation du CPU Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Utilisation de la mémoire Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Entrée/Sortie réseau Docker"
@@ -303,16 +295,17 @@ msgstr "Entrée/Sortie réseau Docker"
msgid "Documentation"
msgstr "Documentation"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "email"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notifications par email"
@@ -320,13 +313,13 @@ msgstr "Notifications par email"
msgid "Enter email address to reset password"
msgstr "Entrez l'adresse email pour réinitialiser le mot de passe"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Entrez l'adresse email..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Erreur"
@@ -346,33 +339,33 @@ msgstr "Exporter la configuration"
msgid "Export your current systems configuration."
msgstr "Exportez la configuration actuelle de vos systèmes."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Échec de l'authentification"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Échec de l'enregistrement des paramètres"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Échec de l'envoi de la notification de test"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Échec de la mise à jour de l'alerte"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtrer..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Pour <0>{min}</0> {min, plural, one {minute} other {minutes}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Mot de passe oublié ?"
@@ -382,11 +375,15 @@ msgstr "Mot de passe oublié ?"
msgid "General"
msgstr "Général"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "Consommation du GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Grille"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Hôte / IP"
@@ -394,12 +391,12 @@ msgstr "Hôte / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Si vous avez perdu le mot de passe de votre compte administrateur, vous pouvez le réinitialiser en utilisant la commande suivante."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Adresse email invalide."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Noyau"
@@ -407,12 +404,16 @@ msgstr "Noyau"
msgid "Language"
msgstr "Langue"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Disposition"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Clair"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Déconnexion"
@@ -420,7 +421,7 @@ msgstr "Déconnexion"
msgid "Login"
msgstr "Connexion"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Échec de la tentative de connexion"
@@ -430,7 +431,7 @@ msgstr "Échec de la tentative de connexion"
msgid "Logs"
msgstr "Journaux"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Vous cherchez plutôt où créer des alertes ? Cliquez sur les icônes de cloche <0/> dans le tableau des systèmes."
@@ -438,37 +439,41 @@ msgstr "Vous cherchez plutôt où créer des alertes ? Cliquez sur les icônes d
msgid "Manage display and notification preferences."
msgstr "Gérer les préférences d'affichage et de notification."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Mémoire"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Utilisation de la mémoire"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Utilisation de la mémoire des conteneurs Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nom"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Trafic réseau des conteneurs Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Trafic réseau des interfaces publiques"
@@ -476,17 +481,18 @@ msgstr "Trafic réseau des interfaces publiques"
msgid "No results found."
msgstr "Aucun résultat trouvé."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Aucun système trouvé."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notifications"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Support OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Support OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "À chaque redémarrage, les systèmes dans la base de données seront mis à jour pour correspondre aux systèmes définis dans le fichier."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Ouvrir le menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Ou continuer avec"
@@ -514,32 +520,36 @@ msgstr "Page"
msgid "Pages / Settings"
msgstr "Pages / Paramètres"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Mot de passe"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Le mot de passe doit contenir au moins 10 caractères."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Le mot de passe doit contenir au moins 8 caractères."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Demande de réinitialisation du mot de passe reçue"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Veuillez <0>configurer un serveur SMTP</0> pour garantir la livraison des alertes."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Veuillez vérifier les journaux pour plus de détails."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Veuillez vérifier vos identifiants et réessayer"
@@ -548,15 +558,15 @@ msgstr "Veuillez vérifier vos identifiants et réessayer"
msgid "Please create an admin account"
msgstr "Veuillez créer un compte administrateur"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Veuillez activer les pop-ups pour ce site"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Veuillez vous reconnecter"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Veuillez consulter <0>la documentation</0> pour les instructions."
@@ -564,12 +574,12 @@ msgstr "Veuillez consulter <0>la documentation</0> pour les instructions."
msgid "Please sign in to your account"
msgstr "Veuillez vous connecter à votre compte"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Utilisation précise au moment enregistré"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Langue préférée"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Clé publique"
@@ -597,20 +607,24 @@ msgstr "Reçu"
msgid "Reset Password"
msgstr "Réinitialiser le mot de passe"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Reprendre"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Enregistrer les paramètres"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Recherche"
@@ -643,30 +657,36 @@ msgstr "Paramètres"
msgid "Settings saved"
msgstr "Paramètres enregistrés"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Se connecter"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Paramètres SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Trier par"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Statut"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Espace Swap utilisé par le système"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Utilisation du swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Système"
@@ -678,28 +698,37 @@ msgstr "Systèmes"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Les systèmes peuvent être gérés dans un fichier <0>config.yml</0> à l'intérieur de votre répertoire de données."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tableau"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Température"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Températures des capteurs du système"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Tester <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notification de test envoyée"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "L'agent doit être en cours d'exécution sur le système pour se connecter. Copiez la commande d'installation pour l'agent ci-dessous."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "L'agent doit être en cours d'exécution sur le système pour se connecter. Copiez le <0>docker-compose.yml</0> pour l'agent ci-dessous."
@@ -707,24 +736,24 @@ msgstr "L'agent doit être en cours d'exécution sur le système pour se connect
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Ensuite, connectez-vous au backend et réinitialisez le mot de passe de votre compte utilisateur dans la table des utilisateurs."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Débit de {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Débit du système de fichiers racine"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Aux email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Basculer la grille"
@@ -732,45 +761,45 @@ msgstr "Basculer la grille"
msgid "Toggle theme"
msgstr "Changer le thème"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Déclenchement lorsque tout capteur dépasse un seuil"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Déclenchement lorsque le montant/descendant combinée dépasse un seuil"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Déclenchement lorsque l'utilisation du CPU dépasse un seuil"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Déclenchement lorsque l'utilisation de la mémoire dépasse un seuil"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Déclenchement lorsque le statut passe d'opérationnel à indisponible"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Déclenchement lorsque l'utilisation de tout disque dépasse un seuil"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Mis à jour en temps réel. Cliquez sur un système pour voir les informations."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Temps de fonctionnement"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Utilisation"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Utilisation de la partition racine"
@@ -780,20 +809,20 @@ msgstr "Utilisation de la partition racine"
msgid "Used"
msgstr "Utilisé"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "nom d'utilisateur"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Nom d'utilisateur"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Utilisateurs"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Vue"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Colonnes visibles"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "En attente de suffisamment d'enregistrements à afficher"
@@ -801,7 +830,7 @@ msgstr "En attente de suffisamment d'enregistrements à afficher"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vous voulez nous aider à améliorer nos traductions ? Consultez <0>Crowdin</0> pour plus de détails."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notifications Webhook / Push"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: hr\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-05 19:48\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Croatian\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} other {# dani}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# sat} other {# sati}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 sat"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 tjedan"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 sati"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 sati"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dana"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Akcije"
@@ -55,20 +58,19 @@ msgstr "Akcije"
msgid "Active Alerts"
msgstr "Aktivna upozorenja"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>Sistem</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Dodaj Novi Sistem"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Dodaj sistem"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Dodaj URL"
@@ -81,11 +83,10 @@ msgstr "Podesite opcije prikaza za grafikone."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -95,44 +96,39 @@ msgid "Alerts"
msgstr "Upozorenja"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Svi Sistemi"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Jeste li sigurni da želite izbrisati {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Davatelji Autentifikacije"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Prosjek"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Prosječna iskorištenost procesora u spremnicima"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Prosjek premašuje <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Prosječna iskorištenost procesora na cijelom sustavu"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
@@ -141,20 +137,20 @@ msgstr ""
msgid "Backups"
msgstr "Sigurnosne kopije"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Propusnost"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podržava OpenID Connect i mnoge druge OAuth2 davatalje autentifikacije."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel koristi <0>Shoutrrr</0> za integraciju sa popularnim servisima za notifikacije."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binarni"
@@ -162,7 +158,7 @@ msgstr "Binarni"
msgid "Cache / Buffers"
msgstr "Predmemorija / Međuspremnici"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Otkaži"
@@ -186,50 +182,46 @@ msgstr "Provjerite {email} za vezu za resetiranje."
msgid "Check logs for more details."
msgstr "Provjerite logove za više detalja."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Provjerite Vaš servis notifikacija"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Pritisnite za kopiranje"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Stupci"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Upute za naredbeni redak"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurirajte način primanja obavijesti upozorenja."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Potvrdite lozinku"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Nastavite"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Kopirano u međuspremnik"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopiraj"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopiraj hosta"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopiraj Linux komandu"
@@ -237,17 +229,17 @@ msgstr "Kopiraj Linux komandu"
msgid "Copy text"
msgstr "Kopiraj tekst"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "Procesor"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Iskorištenost procesora"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Napravite račun"
@@ -265,37 +257,37 @@ msgstr "Nadzorna ploča"
msgid "Default time period"
msgstr "Zadano vremensko razdoblje"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Izbriši"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Iskorištenost Diska"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Iskorištenost diska od {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Iskorištenost Docker Procesora"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Iskorištenost Docker Memorije"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker Mrežni I/O"
@@ -303,16 +295,17 @@ msgstr "Docker Mrežni I/O"
msgid "Documentation"
msgstr "Dokumentacija"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "email"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email notifikacije"
@@ -320,13 +313,13 @@ msgstr "Email notifikacije"
msgid "Enter email address to reset password"
msgstr "Unesite email adresu za resetiranje lozinke"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Unesite email adresu..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Greška"
@@ -346,33 +339,33 @@ msgstr "Izvoz konfiguracije"
msgid "Export your current systems configuration."
msgstr "Izvoz trenutne sistemske konfiguracije."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Provjera autentičnosti nije uspjela"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Neuspješno snimanje postavki"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Neuspješno slanje testne notifikacije"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Ažuriranje upozorenja nije uspjelo"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minutu} other {minute}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Zaboravljena lozinka?"
@@ -382,11 +375,15 @@ msgstr "Zaboravljena lozinka?"
msgid "General"
msgstr "Općenito"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Mreža"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -394,12 +391,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ako ste izgubili lozinku za svoj administratorski račun, možete ju resetirati pomoću sljedeće naredbe."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Nevažeća adresa e-pošte."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Jezik"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Izgled"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Svijetlo"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Odjava"
@@ -420,7 +421,7 @@ msgstr "Odjava"
msgid "Login"
msgstr "Prijava"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Pokušaj prijave nije uspio"
@@ -430,7 +431,7 @@ msgstr "Pokušaj prijave nije uspio"
msgid "Logs"
msgstr "Logovi"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Tražite gdje stvoriti upozorenja? Kliknite ikonu zvona <0/> u tablici sustava."
@@ -438,37 +439,41 @@ msgstr "Tražite gdje stvoriti upozorenja? Kliknite ikonu zvona <0/> u tablici s
msgid "Manage display and notification preferences."
msgstr "Upravljajte postavkama prikaza i obavijesti."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Maksimalno 1 minuta"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Memorija"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Upotreba memorije"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Upotreba memorije Docker spremnika"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Ime"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Mreža"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Mrežni promet Docker spremnika"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Mrežni promet javnih sučelja"
@@ -476,17 +481,18 @@ msgstr "Mrežni promet javnih sučelja"
msgid "No results found."
msgstr "Nema rezultata."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nije pronađen nijedan sustav."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Obavijesti"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Podrška za OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Podrška za OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Prilikom svakog ponovnog pokretanja, sustavi u bazi podataka biti će ažurirani kako bi odgovarali sustavima definiranim u datoteci."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Otvori menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Ili nastavi sa"
@@ -514,32 +520,36 @@ msgstr "Stranica"
msgid "Pages / Settings"
msgstr "Stranice / Postavke"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Lozinka"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Lozinka mora imati 10 znakova."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lozinka mora imati najmanje 8 znakova."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Zahtjev za ponovno postavljanje lozinke primljen"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pauza"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Molimo <0>konfigurirajte SMTP server</0> kako biste osigurali isporuku upozorenja."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Za više detalja provjerite logove."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Provjerite svoje podatke i pokušajte ponovno"
@@ -548,15 +558,15 @@ msgstr "Provjerite svoje podatke i pokušajte ponovno"
msgid "Please create an admin account"
msgstr "Molimo kreirajte administratorski račun"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Omogućite skočne prozore za ovu stranicu"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Molimo prijavite se ponovno"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Molimo pogledajte <0>dokumentaciju</0> za instrukcije."
@@ -564,12 +574,12 @@ msgstr "Molimo pogledajte <0>dokumentaciju</0> za instrukcije."
msgid "Please sign in to your account"
msgstr "Molimo prijavite se u svoj račun"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Precizno iskorištenje u zabilježenom vremenu"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Preferirani jezik"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Javni Ključ"
@@ -597,20 +607,24 @@ msgstr "Primljeno"
msgid "Reset Password"
msgstr "Resetiraj Lozinku"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Nastavi"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Spremi Postavke"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Pretraži"
@@ -643,30 +657,36 @@ msgstr "Postavke"
msgid "Settings saved"
msgstr "Postavke spremljene"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Prijava"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP postavke"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sortiraj po"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap prostor uzet od strane sistema"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap Iskorištenost"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Sistem"
@@ -678,28 +698,37 @@ msgstr "Sistemi"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sistemima se može upravljati u <0>config.yml</0> datoteci unutar data direktorija."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tablica"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzora"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testni <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testna obavijest poslana"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent mora biti pokrenut na sistemu da bi se spojio. Kopirajte instalacijske komande za agenta ispod."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent mora biti pokrenut na sistemu da bi se spojio. Kopirajte <0>docker-compose.yml</0> za agenta ispod."
@@ -707,24 +736,24 @@ msgstr "Agent mora biti pokrenut na sistemu da bi se spojio. Kopirajte <0>docker
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Zatim se prijavite u backend i resetirajte lozinku korisničkog računa u tablici korisnika."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Protok {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Protok root datotečnog sustava"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Primaoci e-pošte"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Uključi/isključi rešetku"
@@ -732,45 +761,45 @@ msgstr "Uključi/isključi rešetku"
msgid "Toggle theme"
msgstr "Uključi/isključi temu"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Pokreće se kada bilo koji senzor prijeđe prag"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Pokreće se kada kombinacija gore/dolje premaši prag"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Pokreće se kada iskorištenost procesora premaši prag"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Pokreće se kada iskorištenost memorije premaši prag"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Pokreće se kada se status sistema promijeni"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Pokreće se kada iskorištenost bilo kojeg diska premaši prag"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Ažurirano odmah. Kliknite na sistem za više informacija."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Vrijeme rada"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Iskorištenost"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Iskorištenost root datotečnog sustava"
@@ -780,20 +809,20 @@ msgstr "Iskorištenost root datotečnog sustava"
msgid "Used"
msgstr "Iskorišteno"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "račun"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Račun"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Korisnici"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Prikaz"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Vidljiva polja"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Čeka se na više podataka prije prikaza"
@@ -801,7 +830,7 @@ msgstr "Čeka se na više podataka prije prikaza"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Želite li nam pomoći da naše prijevode učinimo još boljim? Posjetite <0>Crowdin</0> za više detalja."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push obavijest"

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: hu\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Hungarian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# nap} other {# nap}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# óra} other {# óra}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 óra"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 hét"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 óra"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 óra"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 nap"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Műveletek"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktív riasztások"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Hozzáadás <0>System</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Új rendszer hozzáadása"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Rendszer hozzáadása"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL hozzáadása"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "Állítsa be a diagram megjelenítését."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Ügynök"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Riasztások"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Minden rendszer"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Biztosan törölni szeretnéd {name}-t?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Az automatikus másolás biztonságos környezetet igényel."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Átlag"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Konténerek átlagos CPU kihasználtsága"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Az átlag meghaladja a <0>{value}{0}</0> értéket"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "GPU-k átlagos energiafogyasztása"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Rendszerszintű CPU átlagos kihasználtság"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "{0} átlagos kihasználtsága"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Biztonsági mentések"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Sávszélesség"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "A Beszel támogatja az OpenID Connect-et és számos OAuth2 hitelesítési szolgáltatót."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "A Beszel a <0>Shoutrrr</0>-t használja a népszerű értesítési szolgáltatások integrálására."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Bináris"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Gyorsítótár / Pufferelések"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Mégsem"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Figyelem - potenciális adatvesztés"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Általános alkalmazásbeállítások módosítása."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Diagram beállítások"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Ellenőrizd a {email} címet a visszaállító linkért."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Ellenőrizd a naplót a további részletekért."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Ellenőrizd az értesítési szolgáltatásodat"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Kattints a másoláshoz"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Parancssori utasítások"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfiguráld, hogyan kapod az értesítéseket."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Jelszó megerősítése"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Tovább"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Vágólapra másolva"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Másolás"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Hoszt másolása"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Linux parancs másolása"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Szöveg másolása"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU használat"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Fiók létrehozása"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Sötét"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Áttekintés"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Alapértelmezett időszak"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Törlés"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Lemez"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Lemez I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Lemezhasználat"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Lemezhasználat a {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU használat"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker memória használat"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker hálózat I/O"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Dokumentáció"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-mail értesítések"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "E-mail cím megadása a jelszó visszaállításához"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Adja meg az e-mail címet..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Hiba"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Túllépi a {0}{1} értéket az elmúlt {2, plural, one {# percben} other {# percben}}"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Konfiguráció exportálása"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Exportálja a jelenlegi rendszerkonfigurációt."
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Hitelesítés sikertelen"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Nem sikerült menteni a beállításokat"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Teszt értesítés elküldése sikertelen"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nem sikerült frissíteni a riasztást"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Szűrő..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "A <0>{min}</0> {min, plural, one {perc} other {percek}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Elfelejtette a jelszavát?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Általános"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "GPU áramfelvétele"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Rács"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Állomás / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Ha elvesztette az admin fiók jelszavát, a következő paranccsal állíthatja vissza."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Érvénytelen e-mail cím."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Nyelv"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Elrendezés"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Világos"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Kijelentkezés"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Bejelentkezés"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Bejelentkezés sikertelen"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Naplók"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Inkább azt keresi, hogy hol hozhat létre riasztásokat? Kattintson a csengő <0/> ikonokra a rendszerek táblázatában."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "A megjelenítési és értesítési beállítások kezelése."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Maximum 1 perc"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "RAM"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Memóriahasználat"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Docker konténerek memória használata"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Név"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Hálózat"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Docker konténerek hálózati forgalma"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Nyilvános interfészek hálózati forgalma"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Nincs találat."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nem található rendszer."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Értesítések"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC támogatás"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Minden újraindításkor az adatbázisban lévő rendszerek frissítésre kerülnek, hogy megfeleljenek a fájlban meghatározott rendszereknek."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Menü megnyitása"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Vagy folytasd ezzel"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Felülírja a meglévő riasztásokat"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Oldal"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Oldalak / Beállítások"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Jelszó"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "A jelszónak legalább 8 karakternek kell lennie."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Jelszó-visszaállítási kérelmet kaptunk"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Szüneteltetés"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Kérjük, <0>konfigurálj egy SMTP szervert</0> az értesítések kézbesítésének biztosítása érdekében."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Kérjük, ellenőrizd a naplókat a további részletekért."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Kérjük, ellenőrizze a hitelesítő adatait, és próbálja újra"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Kérjük, hozzon létre egy admin fiókot"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Kérjük, engedélyezze a felugró ablakokat ezen az oldalon"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Kérjük jelentkezz be újra"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Kérjük, nézze meg <0>a dokumentációt</0> az utasításokért."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Kérjük, jelentkezzen be a fiókjába"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Pontos kihasználás a rögzített időpontban"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Preferált nyelv"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Nyilvános kulcs"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Olvasás"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Fogadott"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Jelszó visszaállítása"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Folytatás"
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Beállítások mentése"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Keresés"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Keresés rendszerek vagy beállítások után..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "Elküldve"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Beállítja az alapértelmezett időtartamot a diagramokhoz, amikor egy rendszert néznek."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Beállítások"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Beállítások elmentve"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Bejelentkezés"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP beállítások"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Rendezés"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Állapot"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Rendszer által használt swap terület"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap használat"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Rendszer"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Rendszer"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "A rendszereket egy <0>config.yml</0> fájlban lehet kezelni az adatkönyvtárban."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tábla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Hőmérséklet"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "A rendszer érzékelőinek hőmérséklete"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Teszt <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Teszt értesítés elküldve"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "A csatlakozáshoz az ügynöknek futnia kell a rendszerben. Másolja ki az alábbi telepítési parancsot az ügynök telepítéséhez."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "A csatlakozáshoz az ügynöknek futnia kell a rendszerben. Másolja az<0>docker-compose.yml</0> fájlt az ügynök futtatásához."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Ezután jelentkezzen be a backendbe, és állítsa vissza a felhasználói fiók jelszavát a felhasználók táblázatban."
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "A {extraFsName} átviteli teljesítménye"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "A gyökér fájlrendszer átviteli teljesítménye"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-mailben"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Rács ki- és bekapcsolása"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Téma váltása"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Bekapcsol, ha bármelyik érzékelő túllép egy küszöbértéket"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Bekapcsol, ha a CPU érzékelő túllép egy küszöbértéket"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Bekapcsol, ha a Ram érzékelő túllép egy küszöbértéket"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Bekapcsol, amikor az állapot fel és le között változik"
#: src/lib/utils.ts:323
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"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Valós időben frissítve. Kattintson egy rendszerre az információk megtekintéséhez."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Üzemidő"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Használat"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Root partíció kihasználtsága"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Felhasznált"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Felhasználók"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Nézet"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Látható mezők"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Elegendő rekordra várva a megjelenítéshez"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Szeretne segíteni nekünk abban, hogy fordításaink még jobbak legyenek? További részletekért nézze meg a <0>Crowdin</0> honlapot."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push értesítések"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Írás"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML konfiguráció"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML konfiguráció"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "A felhasználói beállítások frissítésre kerültek."

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2024-11-01 11:30-0400\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: is\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Icelandic\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: is\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dagur} other {# dagar}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 klukkustund"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 vika"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 klukkustundir"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 klukkustundir"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dagar"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Aðgerðir"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Virkar tilkynningar"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Bæta við <0>Kerfi</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Bæta við nýju kerfi"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Bæta við kerfi"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Bæta við léni"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr ""
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr ""
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Tilkynningar"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Öll kerfi"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Ertu viss um að þú viljir eyða {name}?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Sjálfvisk afritun krefst öruggs samhengis."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Meðal"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Meðal örgjörva notkun container-a."
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Meðaltal er yfir <0>{value}{0}</0>"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Meðal orkunotkun skjákorta"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Meðal nýting örgjörva yfir allt kerfið"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Meðal notkun af {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Öryggisafrit"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Gangnaflutningsgeta"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel styður OpenID Connect og margar OAuth2 auðkenningarveitendur."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel notar <0>Shoutrrr</0> til að tengjast vinsælum tilkynningaþjónustum."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binary"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Skyndiminni / Biðminni"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Hætta við"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Aðvörun - möguleiki á gagnatapi"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Breyta almennum stillingum."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Valkostir fyrir línurit"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Skoðaðu {email} fyrir endurstillingar lén."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Skoðaðu logga til að sjá meiri upplýsingar."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Athugaðu tilkynningaþjónustuna þína"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Smelltu til að afrita"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Skipanalínu leiðbeiningar"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Stilltu hvernig þú vilt fá tilkynningar."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Staðfestu lykilorð"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Halda áfram"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Afritað í klippiborð"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Afrita"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Afrita host"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Afrita Linux aðgerð"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Afrita texta"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "Örgjörvi"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Örgjörva notkun"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Búa til aðgang"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Dökkt"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Yfirlitssíða"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Sjálfgefið tímabil"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Eyða"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Diskur"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr ""
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Diskanotkun"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Diska notkun af {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU notkun"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Minnisnotkun Docker"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr ""
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Skjal"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Netfang"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Tilkynningar í tölvupósti"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "Settu netfang til að endursetja lykilorð"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Settu inn Netfang..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Villa"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Fór yfir {0}{1} á síðustu {2, plural, one {# mínútu} other {# mínútum}}"
#: src/components/routes/settings/config-yaml.tsx:72
msgid "Existing systems not defined in <0>config.yml</0> will be deleted. Please make regular backups."
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:93
msgid "Export configuration"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr ""
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Villa í auðkenningu"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Villa við að vista stillingar"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Villa í sendingu prufu skilaboða"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Mistókst að uppfæra tilkynningu"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Sía..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr ""
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Gleymt lykilorð?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Almennt"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "Skjákorts rafmagnsnotkun"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr ""
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr ""
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ógilt netfang."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr ""
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Tungumál"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr ""
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Ljóst"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Útskrá"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Innskrá"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Innskránings tilraun misheppnaðist"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Loggar"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr ""
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr ""
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Mest 1 mínúta"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Minni"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Minnisnotkun"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Minnisnotkun docker kerfa"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nafn"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Net traffík docker kerfa"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr ""
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Engar niðurstöður fundust."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Engin kerfi fundust."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Tilkynningar"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC stuðningur"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr ""
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Opna valmynd"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Eða halda áfram með"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Yfirskrifa núverandi tilkynningu"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Síða"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Síða / Stillingar"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Lykilorð"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lykilorðið verður að vera minnst 8 stafir."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Beiðni um að endurstilla lykilorð móttekin"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pása"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr ""
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Skoðaðu logga til að sjá meiri upplýsingar."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Vinsamlegast farðu yfir upplýsingarnar þínar og reyndu aftur"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Vinsamlegast búðu til admin aðgang"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr ""
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Vinsamlegast skráðu þið inn aftur"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vinsamlegast skoðaðu <0>skjölin</0> fyrir leiðbeiningar."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Vinsamlegast skráðu þig inn á aðganginn þinn"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr ""
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Valið tungumál"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Dreifilykill"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Lesa"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Móttekið"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Endurstilla lykilorð"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Halda áfram"
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr ""
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Vista stillingar"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Leita"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Leita að kerfum eða stillingum..."
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr ""
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:64
msgid "Sent"
msgstr "Sent"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr ""
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Stillingar"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Stillingar vistaðar"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Innskrá"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP stillingar"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Raða eftir"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Staða"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr ""
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Skipti minni"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Kerfi"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Kerfi"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr ""
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tafla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Hitastig"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Hitastig kerfa skynjara"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Prufa <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Prufu tilkynning send"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr ""
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Skráðu þig þá inní bakendann og endurstilltu lykilorðið þitt inni í notenda töflunni."
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr ""
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr ""
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til tölvupósta"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr ""
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Velja þema"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Virkjast þegar samanlagt sent/móttekið fer yfir þröskuld"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Virkjast þegar örgjörva notkun fer yfir þröskuld"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Virkjast þegar minnisnotkun fer yfir þröskuld"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Virkjast þegar staða breytist milli virkur og óvirkur"
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Uppfærist í rauntíma. Veldu kerfi til að skoða upplýsingar."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr ""
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr ""
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr ""
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Notað"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Notendur"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Skoða"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Sjáanlegir reitir"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Bíður eftir nægum upplýsingum til að sýna"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr ""
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Tilkynningar"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skrifa"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr ""
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr ""
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Notenda stillingar vistaðar."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: it\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:47\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Italian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# giorno} other {# giorni}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ora} other {# ore}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 ora"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 settimana"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 ore"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 ore"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 giorni"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Azioni"
@@ -55,20 +58,19 @@ msgstr "Azioni"
msgid "Active Alerts"
msgstr "Avvisi Attivi"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Aggiungi <0>Sistema</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Aggiungi Nuovo Sistema"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Aggiungi sistema"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Aggiungi URL"
@@ -81,11 +83,10 @@ msgstr "Regola le opzioni di visualizzazione per i grafici."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Amministratore"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agente"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Avvisi"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Tutti i Sistemi"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Sei sicuro di voler eliminare {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Provider di Autenticazione"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "La copia automatica richiede un contesto sicuro."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Media"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Utilizzo medio della CPU dei container"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "La media supera <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Consumo energetico medio delle GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Utilizzo medio della CPU a livello di sistema"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Utilizzo medio di {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Backup"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Larghezza di banda"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel supporta OpenID Connect e molti provider di autenticazione OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel utilizza <0>Shoutrrr</0> per integrarsi con i servizi di notifica popolari."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binario"
@@ -162,7 +158,7 @@ msgstr "Binario"
msgid "Cache / Buffers"
msgstr "Cache / Buffer"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Annulla"
@@ -186,50 +182,46 @@ msgstr "Controlla {email} per un link di reset."
msgid "Check logs for more details."
msgstr "Controlla i log per maggiori dettagli."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Controlla il tuo servizio di notifica"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Clicca per copiare"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Colonne"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Istruzioni da riga di comando"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configura come ricevere le notifiche di avviso."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Conferma password"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Continua"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Copiato negli appunti"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copia"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copia host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copia comando Linux"
@@ -237,17 +229,17 @@ msgstr "Copia comando Linux"
msgid "Copy text"
msgstr "Copia testo"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Utilizzo CPU"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Crea account"
@@ -265,37 +257,37 @@ msgstr "Cruscotto"
msgid "Default time period"
msgstr "Periodo di tempo predefinito"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Elimina"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "I/O Disco"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Utilizzo Disco"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Utilizzo del disco di {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Utilizzo CPU Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Utilizzo Memoria Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "I/O di Rete Docker"
@@ -303,16 +295,17 @@ msgstr "I/O di Rete Docker"
msgid "Documentation"
msgstr "Documentazione"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "email"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notifiche email"
@@ -320,13 +313,13 @@ msgstr "Notifiche email"
msgid "Enter email address to reset password"
msgstr "Inserisci l'indirizzo email per reimpostare la password"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Inserisci l'indirizzo email..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Errore"
@@ -346,33 +339,33 @@ msgstr "Esporta configurazione"
msgid "Export your current systems configuration."
msgstr "Esporta la configurazione attuale dei tuoi sistemi."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Autenticazione fallita"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Salvataggio delle impostazioni fallito"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Invio della notifica di test fallito"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Aggiornamento dell'avviso fallito"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtra..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Per <0>{min}</0> {min, plural, one {minuto} other {minuti}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Password dimenticata?"
@@ -382,11 +375,15 @@ msgstr "Password dimenticata?"
msgid "General"
msgstr "Generale"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "Consumo della GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Griglia"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -394,12 +391,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Se hai perso la password del tuo account amministratore, puoi reimpostarla utilizzando il seguente comando."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Indirizzo email non valido."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Lingua"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Aspetto"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Chiaro"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Disconnetti"
@@ -420,7 +421,7 @@ msgstr "Disconnetti"
msgid "Login"
msgstr "Accedi"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Tentativo di accesso fallito"
@@ -430,7 +431,7 @@ msgstr "Tentativo di accesso fallito"
msgid "Logs"
msgstr "Log"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Cerchi invece dove creare avvisi? Clicca sulle icone della campana <0/> nella tabella dei sistemi."
@@ -438,37 +439,41 @@ msgstr "Cerchi invece dove creare avvisi? Clicca sulle icone della campana <0/>
msgid "Manage display and notification preferences."
msgstr "Gestisci le preferenze di visualizzazione e notifica."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Memoria"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Utilizzo Memoria"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Utilizzo della memoria dei container Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Rete"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Traffico di rete dei container Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Traffico di rete delle interfacce pubbliche"
@@ -476,17 +481,18 @@ msgstr "Traffico di rete delle interfacce pubbliche"
msgid "No results found."
msgstr "Nessun risultato trovato."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nessun sistema trovato."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notifiche"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Supporto OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Supporto OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ad ogni riavvio, i sistemi nel database verranno aggiornati per corrispondere ai sistemi definiti nel file."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Apri menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Oppure continua con"
@@ -514,32 +520,36 @@ msgstr "Pagina"
msgid "Pages / Settings"
msgstr "Pagine / Impostazioni"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Password"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "La password deve essere di almeno 10 caratteri."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "La password deve contenere almeno 8 caratteri."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Richiesta di reimpostazione password ricevuta"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pausa"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Si prega di <0>configurare un server SMTP</0> per garantire la consegna degli avvisi."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Si prega di controllare i log per maggiori dettagli."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Si prega di controllare le credenziali e riprovare"
@@ -548,15 +558,15 @@ msgstr "Si prega di controllare le credenziali e riprovare"
msgid "Please create an admin account"
msgstr "Si prega di creare un account amministratore"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Si prega di abilitare i pop-up per questo sito"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Si prega di accedere nuovamente"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Si prega di consultare <0>la documentazione</0> per le istruzioni."
@@ -564,12 +574,12 @@ msgstr "Si prega di consultare <0>la documentazione</0> per le istruzioni."
msgid "Please sign in to your account"
msgstr "Si prega di accedere al proprio account"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Porta"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Utilizzo preciso al momento registrato"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Lingua Preferita"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Chiave Pub"
@@ -597,20 +607,24 @@ msgstr "Ricevuto"
msgid "Reset Password"
msgstr "Reimposta Password"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Riprendi"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Salva Impostazioni"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Cerca"
@@ -643,30 +657,36 @@ msgstr "Impostazioni"
msgid "Settings saved"
msgstr "Impostazioni salvate"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Accedi"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Impostazioni SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Ordina per"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Stato"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Spazio di swap utilizzato dal sistema"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Utilizzo Swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Sistema"
@@ -678,28 +698,37 @@ msgstr "Sistemi"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "I sistemi possono essere gestiti in un file <0>config.yml</0> all'interno della tua directory dati."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabella"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperature dei sensori di sistema"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notifica di test inviata"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "L'agente deve essere in esecuzione sul sistema per connettersi. Copia il comando di installazione per l'agente qui sotto."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "L'agente deve essere in esecuzione sul sistema per connettersi. Copia il<0>docker-compose.yml</0> per l'agente qui sotto."
@@ -707,24 +736,24 @@ msgstr "L'agente deve essere in esecuzione sul sistema per connettersi. Copia il
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Quindi accedi al backend e reimposta la password del tuo account utente nella tabella degli utenti."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Throughput di {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Throughput del filesystem root"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "A email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Attiva/disattiva griglia"
@@ -732,45 +761,45 @@ msgstr "Attiva/disattiva griglia"
msgid "Toggle theme"
msgstr "Attiva/disattiva tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Attiva quando un sensore supera una soglia"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Attiva quando il combinato up/down supera una soglia"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Attiva quando l'utilizzo della CPU supera una soglia"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Attiva quando l'utilizzo della memoria supera una soglia"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Attiva quando lo stato passa tra up e down"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Attiva quando l'utilizzo di un disco supera una soglia"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Aggiornato in tempo reale. Clicca su un sistema per visualizzare le informazioni."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Tempo di attività"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Utilizzo"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Utilizzo della partizione root"
@@ -780,20 +809,20 @@ msgstr "Utilizzo della partizione root"
msgid "Used"
msgstr "Utilizzato"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "nome utente"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Nome utente"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Utenti"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Vista"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Colonne visibili"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "In attesa di abbastanza record da visualizzare"
@@ -801,7 +830,7 @@ msgstr "In attesa di abbastanza record da visualizzare"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vuoi aiutarci a migliorare ulteriormente le nostre traduzioni? Dai un'occhiata a <0>Crowdin</0> per maggiori dettagli."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notifiche Webhook / Push"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ja\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 日} other {# 日}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1時間"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1週間"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12時間"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24時間"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30日間"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "アクション"
@@ -55,20 +58,19 @@ msgstr "アクション"
msgid "Active Alerts"
msgstr "アクティブなアラート"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>システム</0>を追加"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "新しいシステムを追加"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "システムを追加"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URLを追加"
@@ -81,13 +83,12 @@ msgstr "チャートの表示オプションを調整します。"
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "管理者"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "代理"
msgstr "エージェント"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "アラート"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "すべてのシステム"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "{name}を削除してもよろしいですか?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "認証プロバイダー"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "自動コピーには安全なコンテキストが必要です。"
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "コンテナの平均CPU使用率"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均が<0>{value}{0}</0>を超えています"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "GPUの平均消費電力"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "システム全体の平均CPU使用率"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "{0}の平均使用率"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "バックアップ"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "帯域幅"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "BeszelはOpenID Connectと多くのOAuth2認証プロバイダーをサポートしています。"
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszelは<0>Shoutrrr</0>を使用して、人気のある通知サービスと統合します。"
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "バイナリ"
@@ -162,7 +158,7 @@ msgstr "バイナリ"
msgid "Cache / Buffers"
msgstr "キャッシュ / バッファ"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "キャンセル"
@@ -186,50 +182,46 @@ msgstr "{email}を確認してリセットリンクを探してください。"
msgid "Check logs for more details."
msgstr "詳細についてはログを確認してください。"
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "通知サービスを確認してください"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "クリックしてコピー"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "列"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "コマンドラインの指示"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "アラート通知の受信方法を設定します。"
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "パスワードを確認"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "続行"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "クリップボードにコピーされました"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "コピー"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "ホストをコピー"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Linuxコマンドをコピー"
@@ -237,17 +229,17 @@ msgstr "Linuxコマンドをコピー"
msgid "Copy text"
msgstr "テキストをコピー"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU使用率"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "アカウントを作成"
@@ -265,37 +257,37 @@ msgstr "ダッシュボード"
msgid "Default time period"
msgstr "デフォルトの期間"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "削除"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "ディスク"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "ディスクI/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "ディスク使用率"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}のディスク使用率"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU使用率"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Dockerメモリ使用率"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "DockerネットワークI/O"
@@ -303,16 +295,17 @@ msgstr "DockerネットワークI/O"
msgid "Documentation"
msgstr "ドキュメント"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "メール"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "編集"
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "メール"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "メール通知"
@@ -320,13 +313,13 @@ msgstr "メール通知"
msgid "Enter email address to reset password"
msgstr "パスワードをリセットするためにメールアドレスを入力してください"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "メールアドレスを入力..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "エラー"
@@ -346,33 +339,33 @@ msgstr "設定をエクスポート"
msgid "Export your current systems configuration."
msgstr "現在のシステム設定をエクスポートします。"
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "認証に失敗しました"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "設定の保存に失敗しました"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "テスト通知の送信に失敗しました"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "アラートの更新に失敗しました"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "フィルター..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {分} other {分}}の間"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "パスワードをお忘れですか?"
@@ -382,11 +375,15 @@ msgstr "パスワードをお忘れですか?"
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "GPUの消費電力"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "グリッド"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "ホスト / IP"
@@ -394,12 +391,12 @@ msgstr "ホスト / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "管理者アカウントのパスワードを忘れた場合は、次のコマンドを使用してリセットできます。"
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "無効なメールアドレスです。"
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "カーネル"
@@ -407,12 +404,16 @@ msgstr "カーネル"
msgid "Language"
msgstr "言語"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "レイアウト"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "ライト"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "ログアウト"
@@ -420,7 +421,7 @@ msgstr "ログアウト"
msgid "Login"
msgstr "ログイン"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "ログイン試行に失敗しました"
@@ -430,7 +431,7 @@ msgstr "ログイン試行に失敗しました"
msgid "Logs"
msgstr "ログ"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "アラートを作成する場所を探していますか?システムテーブルのベル<0/>アイコンをクリックしてください。"
@@ -438,37 +439,41 @@ msgstr "アラートを作成する場所を探していますか?システム
msgid "Manage display and notification preferences."
msgstr "表示と通知の設定を管理します。"
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "最大1分"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "メモリ"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "メモリ使用率"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Dockerコンテナのメモリ使用率"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "名前"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "帯域"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Dockerコンテナのネットワークトラフィック"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "パブリックインターフェースのネットワークトラフィック"
@@ -476,17 +481,18 @@ msgstr "パブリックインターフェースのネットワークトラフィ
msgid "No results found."
msgstr "結果が見つかりませんでした。"
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "システムが見つかりませんでした。"
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDCサポート"
@@ -494,13 +500,13 @@ msgstr "OAuth 2 / OIDCサポート"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "再起動のたびに、データベース内のシステムはファイルに定義されたシステムに一致するように更新されます。"
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "メニューを開く"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "または続行"
msgstr "または、以下の方法でログイン"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
@@ -514,32 +520,36 @@ msgstr "ページ"
msgid "Pages / Settings"
msgstr "ページ / 設定"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "パスワード"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "パスワードは10文字以上でなければなりません。"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "パスワードは8文字以上である必要があります。"
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "パスワードは72バイト未満でなければなりません。"
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "パスワードリセットのリクエストを受け取りました"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "一時停止"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "アラートが配信されるように<0>SMTPサーバーを設定</0>してください。"
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "詳細についてはログを確認してください。"
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "資格情報を確認して再試行してください"
@@ -548,15 +558,15 @@ msgstr "資格情報を確認して再試行してください"
msgid "Please create an admin account"
msgstr "管理者アカウントを作成してください"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "このサイトのポップアップを有効にしてください"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "再度ログインしてください"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "手順については<0>ドキュメント</0>を参照してください。"
@@ -564,12 +574,12 @@ msgstr "手順については<0>ドキュメント</0>を参照してくださ
msgid "Please sign in to your account"
msgstr "アカウントにサインインしてください"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "ポート"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "記録された時点での正確な利用"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "優先言語"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "公開鍵"
@@ -597,20 +607,24 @@ msgstr "受信"
msgid "Reset Password"
msgstr "パスワードをリセット"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "再開"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enterキーまたはカンマを使用してアドレスを保存します。空白のままにするとメール通知が無効になります。"
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "設定を保存"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr "システムを保存"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "検索"
@@ -643,30 +657,36 @@ msgstr "設定"
msgid "Settings saved"
msgstr "設定が保存されました"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "サインイン"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP設定"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "並び替え基準"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "ステータス"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "システムが使用するスワップ領域"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "スワップ使用量"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "システム"
@@ -678,28 +698,37 @@ msgstr "システム"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "システムはデータディレクトリ内の<0>config.yml</0>ファイルで管理できます。"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "テーブル"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr "温度"
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "温度"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "システムセンサーの温度"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "テスト<0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "テスト通知が送信されました"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "接続するにはエージェントがシステム上で実行されている必要があります。以下のエージェントのインストールコマンドをコピーしてください。"
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "接続するにはエージェントがシステム上で実行されている必要があります。以下のエージェント用<0>docker-compose.yml</0>をコピーしてください。"
@@ -707,24 +736,24 @@ msgstr "接続するにはエージェントがシステム上で実行されて
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "その後、バックエンドにログインして、ユーザーテーブルでユーザーアカウントのパスワードをリセットしてください。"
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}のスループット"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "ルートファイルシステムのスループット"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "メール"
msgstr "宛先メールアドレス"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "グリッドを切り替え"
@@ -732,45 +761,45 @@ msgstr "グリッドを切り替え"
msgid "Toggle theme"
msgstr "テーマを切り替え"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "センサーがしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "上り/下りの合計がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "CPU使用率がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "メモリ使用率がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "ステータスが上から下に切り替わるときにトリガーされます"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "リアルタイムで更新されます。システムをクリックして情報を表示します。"
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "稼働時間"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "使用量"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "ルートパーティションの使用量"
@@ -778,22 +807,22 @@ msgstr "ルートパーティションの使用量"
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "使用済み"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "ユーザー名"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "ユーザー名"
msgstr "使用"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "ユーザー"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "表示"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "表示列"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "表示するのに十分なレコードを待っています"
@@ -801,7 +830,7 @@ msgstr "表示するのに十分なレコードを待っています"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "翻訳をさらに良くするためにご協力いただけますか?詳細については<0>Crowdin</0>をご覧ください。"
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / プッシュ通知"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ko\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Korean\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -18,151 +18,147 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 일} other {# 일}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 시간} other {# 시간}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1시간"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1주"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12시간"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24시간"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30일"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "작업"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "활성 경고"
msgstr "활성화된 알림들"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>시스템</0> 추가"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "새 시스템 추가"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "시스템 추가"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL 추가"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "차트 표시 옵션 조정."
msgstr "차트 표시 옵션 변경."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "관리자"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "에이"
msgstr "에이전트"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "경고"
msgstr "알림"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "모든 시스템"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "{name}을(를) 삭제하시겠습니까?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "인증 제공자"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "자동 복사는 안전한 컨텍스트가 필요합니다."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "평균"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "컨테이너의 평균 CPU 사용량"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "평균이 <0>{value}{0}</0>을 초과합니다"
msgstr "평균이 <0>{value}{0}</0>을(를) 초과합니다"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "GPU들의 평균 전원 사용량"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "시스템 전체의 평균 CPU 사용량"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "평균 {0} 사용량"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "백업"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "대역폭"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel은 OpenID Connect 및 많은 OAuth2 인증 제공자를 지원합니다."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel은 <0>Shoutrrr</0>을 사용하여 인기 있는 알림 서비스와 통합합니다."
msgstr "Beszel은 여러 인기 있는 알림 서비스와 연동하기 위해 <0>Shoutrrr</0>을 이용합니다."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "이진"
msgstr "실행 파일"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "캐시 / 버퍼"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "취소"
@@ -186,75 +182,71 @@ msgstr "{email}에서 재설정 링크를 확인하세요."
msgid "Check logs for more details."
msgstr "자세한 내용은 로그를 확인하세요."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "알림 서비스를 확인하세요."
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "클릭하여 복사"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "열"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "명령 지침"
msgstr "명령어 사용 지침"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "경고 알림을 받는 방법을 구성하세요."
msgstr "알림을 수신할 방법을 설정하세요."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "비밀번호 확인"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "계속"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "클립보드에 복사됨"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "복사"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "호스트 복사"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "리눅스 명령 복사"
msgstr "리눅스 명령 복사"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "텍스트 복사"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU 사용량"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "계정 생성"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "어두운"
msgstr "어둡게"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
@@ -263,56 +255,57 @@ msgstr "대시보드"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "기본 시간 기간"
msgstr "기본 기간"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "삭제"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "디스크"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "디스크 I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "디스크 사용량"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}의 디스크 사용량"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "도커 CPU 사용량"
msgstr "Docker CPU 사용량"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "도커 메모리 사용량"
msgstr "Docker 메모리 사용량"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "도커 네트워크 I/O"
msgstr "Docker 네트워크 I/O"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "문서"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "이메일"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "이메일"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "이메일 알림"
@@ -320,13 +313,13 @@ msgstr "이메일 알림"
msgid "Enter email address to reset password"
msgstr "비밀번호를 재설정하려면 이메일 주소를 입력하세요"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "이메일 주소 입력..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "오류"
@@ -344,35 +337,35 @@ msgstr "구성 내보내기"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "현재 시스템 구성 내보내기."
msgstr "현재 시스템 구성 내보내기"
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "인증 실패"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "설정 저장 실패"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "테스트 알림 전송 실패"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "경고 업데이트 실패"
msgstr "알림 수정 실패"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "필터..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {분} other {분}} 동안"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "비밀번호를 잊으셨나요?"
@@ -382,24 +375,28 @@ msgstr "비밀번호를 잊으셨나요?"
msgid "General"
msgstr "일반"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "GPU 전원 사용량"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "그리드"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "호스트 / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "관리자 계정의 비밀번호를 잃어버린 경우, 다음 명령 사용하여 재설정할 수 있습니다."
msgstr "관리자 계정의 비밀번호를 잃어버린 경우, 다음 명령어를 사용하여 재설정할 수 있습니다."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "잘못된 이메일 주소입니다."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "커널"
@@ -407,12 +404,16 @@ msgstr "커널"
msgid "Language"
msgstr "언어"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "레이아웃"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "밝"
msgstr "밝"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "로그아웃"
@@ -420,55 +421,59 @@ msgstr "로그아웃"
msgid "Login"
msgstr "로그인"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "로그인 시도 실패"
msgstr "로그인 실패"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "로그"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "경고를 생성할 위치를 찾고 계신가요? 시스템 테이블의 종 <0/> 아이콘을 클릭하세요."
msgstr "알림을 생성하려 하시나요? 시스템 테이블의 종 <0/> 아이콘을 클릭하세요."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "디스플레이 및 알림 환경설정을 관리하세요."
msgstr "디스플레이 및 알림 설정"
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "최대 1분"
msgstr "1분간 최댓값"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "메모리"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "메모리 사용량"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "도커 컨테이너의 메모리 사용량"
msgstr "Docker 컨테이너의 메모리 사용량"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "이름"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "네트"
msgstr "네트워크"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "도커 컨테이너의 네트워크 트래픽"
msgstr "Docker 컨테이너의 네트워크 트래픽"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "공용 인터페이스의 네트워크 트래픽"
@@ -476,35 +481,36 @@ msgstr "공용 인터페이스의 네트워크 트래픽"
msgid "No results found."
msgstr "결과가 없습니다."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "시스템을 찾을 수 없습니다."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "알림"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC 지원"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "각 재시작 시, 데이터베이스의 시스템이 파일에 정의된 시스템과 일치하도록 업데이트됩니다."
msgstr "시작 시, 데이터베이스 파일에 정의된 시스템과 일치하도록 업데이트됩니다."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "메뉴 열기"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "또는 계속하기"
msgstr "또는 아래 항목으로 진행하기"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "기존 경고 덮어쓰기"
msgstr "기존 알림 덮어쓰기"
#: src/components/command-palette.tsx:85
msgid "Page"
@@ -514,32 +520,36 @@ msgstr "페이지"
msgid "Pages / Settings"
msgstr "페이지 / 설정"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "비밀번호"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "비밀번호는 최소 10자 이상이어야 합니다."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "비밀번호는 최소 8자 이상이어야 합니다."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "비밀번호 재설정 요청이 접수되었습니다"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "일시 중지"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "경고가 전달되도록 <0>SMTP 서버를 구성</0>하세요."
msgstr "알림이 전달되도록 <0>SMTP 서버를 구성</0>하세요."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "자세한 내용은 로그를 확인하세요."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "자격 증명을 확인하고 다시 시도하세요."
@@ -548,28 +558,28 @@ msgstr "자격 증명을 확인하고 다시 시도하세요."
msgid "Please create an admin account"
msgstr "관리자 계정을 생성하세요."
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "이 사이트에 대 팝업을 활성화하세요."
msgstr "이 사이트에 대 팝업을 활성화하세요."
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "다시 로그인하세요."
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "지침은 <0>문서</0>를 참조하세요."
msgstr "사용법은 <0>문서</0>를 참조하세요."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "계정에 로그인하세요."
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "포트"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "기록된 시간의 정확한 사용량"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "선호 언어"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "공개 키"
@@ -597,20 +607,24 @@ msgstr "수신됨"
msgid "Reset Password"
msgstr "비밀번호 재설정"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "재개"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Enter 키 또는 쉼표를 사용하여 주소를 저장하세요. 이메일 알림을 비활성화하려면 비워 두세요."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "설정 저장"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "검색"
@@ -620,7 +634,7 @@ msgstr "시스템 또는 설정 검색..."
#: src/components/alerts/alert-button.tsx:71
msgid "See <0>notification settings</0> to configure how you receive alerts."
msgstr "경고를 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참조하세요."
#. Network bytes sent (upload)
#: src/components/charts/area-chart.tsx:64
@@ -643,30 +657,36 @@ msgstr "설정"
msgid "Settings saved"
msgstr "설정이 저장되었습니다."
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "로그인"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP 설정"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "정렬 기준"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "상태"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "시스템에서 사용된 스왑 공간"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "스왑 사용량"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "시스템"
@@ -678,28 +698,37 @@ msgstr "시스템"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "시스템은 데이터 디렉토리 내의 <0>config.yml</0> 파일에서 관리할 수 있습니다."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "표"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "온도"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "시스템 센서의 온도"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "테스트 <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "테스트 알림이 전송되었습니다."
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "에이전트가 시스템에서 실행 중이어야 연결할 수 있습니다. 아래의 에이전트 설치 명령을 복사하세요."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "에이전트가 시스템에서 실행 중이어야 연결할 수 있습니다. 아래의 <0>docker-compose.yml</0>을 복사하세요."
@@ -707,24 +736,24 @@ msgstr "에이전트가 시스템에서 실행 중이어야 연결할 수 있습
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "그런 다음 백엔드에 로그인하여 사용자 테이블에서 사용자 계정 비밀번호를 재설정하세요."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}의 처리량"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "루트 파일 시스템의 처리량"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "이메일로"
msgstr "받는사람(들)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "그리드 전환"
@@ -732,45 +761,45 @@ msgstr "그리드 전환"
msgid "Toggle theme"
msgstr "테마 전환"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "센서가 임계값을 초과할 때 트리거됩니다."
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "상승/하강이 결합되어 임계값을 초과할 때 트리거됩니다."
msgstr "업로드와 다운로드 대역폭의 합이 임계값을 초과할 때 트리거됩니다."
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "CPU 사용량이 임계값을 초과할 때 트리거됩니다."
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "메모리 사용량이 임계값을 초과할 때 트리거됩니다."
#: src/lib/utils.ts:285
msgid "Triggers when status switches between up and down"
msgstr "상태가 상승과 하강 사이에서 전환될 때 트리거됩니다."
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "시스템의 전원이 켜지거나 꺼질때 트리거됩니다."
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "디스크 사용량이 임계값을 초과할 때 트리거됩니다."
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "실시간으로 업데이트됩니다. 시스템을 클릭하여 정보를 확인하세요."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "가동 시간"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "사용량"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "루트 파티션의 사용량"
@@ -780,20 +809,20 @@ msgstr "루트 파티션의 사용량"
msgid "Used"
msgstr "사용됨"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "사용자 이름"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "사용자 이름"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "사용자"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "보기"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "표시할 열"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "표시할 충분한 기록을 기다리는 중"
@@ -801,7 +830,7 @@ msgstr "표시할 충분한 기록을 기다리는 중"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "번역을 더 좋게 만드는 데 도움을 주시겠습니까? 자세한 내용은 <0>Crowdin</0>을 확인하세요."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / 푸시 알림"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: nl\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-08 17:29\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Dutch\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dagen}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# uur} other {# uren}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 uur"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 week"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 uren"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 uren"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dagen"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Acties"
@@ -55,20 +58,19 @@ msgstr "Acties"
msgid "Active Alerts"
msgstr "Actieve waarschuwingen"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Voeg <0>Systeem</0> toe"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Nieuw systeem toevoegen"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Voeg systeem toe"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Voeg URL toe"
@@ -81,11 +83,10 @@ msgstr "Weergaveopties voor grafieken aanpassen."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Waarschuwingen"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Alle systemen"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Weet je zeker dat je {name} wilt verwijderen?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Authenticatie aanbieders"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatisch kopiëren vereist een veilige context."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Gemiddelde"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Gemiddeld CPU-gebruik van containers"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gemiddelde overschrijdt <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Gemiddeld stroomverbruik van GPU's"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Gemiddeld systeembrede CPU-gebruik"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Gemiddeld gebruik van {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Back-ups"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Bandbreedte"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel ondersteunt OpenID Connect en vele OAuth2 authenticatieaanbieders."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel gebruikt <0>Shoutrr</0> om te integreren met populaire meldingsdiensten."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binair"
@@ -162,7 +158,7 @@ msgstr "Binair"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Annuleren"
@@ -186,50 +182,46 @@ msgstr "Controleer {email} op een reset link."
msgid "Check logs for more details."
msgstr "Controleer de logs voor meer details."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Controleer je meldingsservice"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Klik om te kopiëren"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Kolommen"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instructies voor de opdrachtregel"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configureer hoe je waarschuwingsmeldingen ontvangt."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Bevestig wachtwoord"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Volgende"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Gekopieerd naar het klembord"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopieer"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopieer host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopieer Linux-opdracht"
@@ -237,17 +229,17 @@ msgstr "Kopieer Linux-opdracht"
msgid "Copy text"
msgstr "Kopieer tekst"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Processorgebruik"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Account aanmaken"
@@ -265,37 +257,37 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standaard tijdsduur"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Verwijderen"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Schijf"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Schijf I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Schijfgebruik"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Schijfgebruik van {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU-gebruik"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker geheugengebruik"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker netwerk I/O"
@@ -303,16 +295,17 @@ msgstr "Docker netwerk I/O"
msgid "Documentation"
msgstr "Documentatie"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "e-mail"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-mailnotificaties"
@@ -320,13 +313,13 @@ msgstr "E-mailnotificaties"
msgid "Enter email address to reset password"
msgstr "Voer een e-mailadres in om het wachtwoord opnieuw in te stellen"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Voer een e-mailadres in..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Fout"
@@ -346,33 +339,33 @@ msgstr "Configuratie exporteren"
msgid "Export your current systems configuration."
msgstr "Exporteer je huidige systeemconfiguratie."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Authenticatie mislukt"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Instellingen opslaan mislukt"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Versturen test notificatie mislukt"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Bijwerken waarschuwing mislukt"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Voor <0>{min}</0> {min, plural, one {minuut} other {minuten}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Wachtwoord vergeten?"
@@ -382,11 +375,15 @@ msgstr "Wachtwoord vergeten?"
msgid "General"
msgstr "Algemeen"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "GPU stroomverbruik"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Raster"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP-adres"
@@ -394,12 +391,12 @@ msgstr "Host / IP-adres"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Als je het wachtwoord voor je beheerdersaccount bent kwijtgeraakt, kan je het opnieuw instellen met behulp van de volgende opdracht."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ongeldig e-mailadres."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Taal"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Indeling"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Licht"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Afmelden"
@@ -420,7 +421,7 @@ msgstr "Afmelden"
msgid "Login"
msgstr "Aanmelden"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Aanmelding mislukt"
@@ -430,7 +431,7 @@ msgstr "Aanmelding mislukt"
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Zoek je waar je meldingen kunt aanmaken? Klik op de bel <0/> in de systeemtabel."
@@ -438,37 +439,41 @@ msgstr "Zoek je waar je meldingen kunt aanmaken? Klik op de bel <0/> in de syste
msgid "Manage display and notification preferences."
msgstr "Weergave- en notificatievoorkeuren beheren."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Geheugen"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Geheugengebruik"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Geheugengebruik van docker containers"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Naam"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Netwerkverkeer van docker containers"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Netwerkverkeer van publieke interfaces"
@@ -476,17 +481,18 @@ msgstr "Netwerkverkeer van publieke interfaces"
msgid "No results found."
msgstr "Geen resultaten gevonden."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Geen systemen gevonden."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Meldingen"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC ondersteuning"
@@ -494,11 +500,11 @@ msgstr "OAuth 2 / OIDC ondersteuning"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Bij elke herstart zullen systemen in de database worden bijgewerkt om overeen te komen met de systemen die in het bestand zijn gedefinieerd."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Open menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Of ga verder met"
@@ -514,32 +520,36 @@ msgstr "Pagina"
msgid "Pages / Settings"
msgstr "Pagina's / Instellingen"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Wachtwoord"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Het wachtwoord moet tenminste 10 tekens lang zijn."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Het wachtwoord moet minimaal 8 tekens bevatten."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Wachtwoord reset aanvraag ontvangen"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pauze"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "<0>Configureer een SMTP-server </0> om ervoor te zorgen dat waarschuwingen worden afgeleverd."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Controleer de logs voor meer details."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Controleer je aanmeldgegevens en probeer het opnieuw"
@@ -548,15 +558,15 @@ msgstr "Controleer je aanmeldgegevens en probeer het opnieuw"
msgid "Please create an admin account"
msgstr "Maak een beheerdersaccount aan"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Activeer pop-ups voor deze website"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Meld je opnieuw aan"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Bekijk <0>de documentatie</0> voor instructies."
@@ -564,12 +574,12 @@ msgstr "Bekijk <0>de documentatie</0> voor instructies."
msgid "Please sign in to your account"
msgstr "Meld je aan bij je account"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Poort"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Nauwkeurig gebruik op de opgenomen tijd"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Voorkeurstaal"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Publieke sleutel"
@@ -597,20 +607,24 @@ msgstr "Ontvangen"
msgid "Reset Password"
msgstr "Wachtwoord resetten"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Hervatten"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Instellingen opslaan"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Zoeken"
@@ -643,30 +657,36 @@ msgstr "Instellingen"
msgid "Settings saved"
msgstr "Instellingen opgeslagen"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Aanmelden"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP-instellingen"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sorteren op"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap ruimte gebruikt door het systeem"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap gebruik"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Systeem"
@@ -678,28 +698,37 @@ msgstr "Systemen"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemen kunnen worden beheerd in een <0>config.yml</0> bestand in je data map."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatuur"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperatuur van systeem sensoren"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testmelding verzonden"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "De agent moet op het systeem draaien om te verbinden. Kopieer het installatiecommando voor de agent hieronder."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "De agent moet op het systeem draaien om te verbinden. Kopieer de<0>docker-compose.yml</0> voor de agent hieronder."
@@ -707,24 +736,24 @@ msgstr "De agent moet op het systeem draaien om te verbinden. Kopieer de<0>docke
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Log vervolgens in op de backend en reset het wachtwoord van je gebruikersaccount in het gebruikersoverzicht."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Doorvoer van {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Doorvoer van het root bestandssysteem"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Naar e-mail(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Schakel raster"
@@ -732,45 +761,45 @@ msgstr "Schakel raster"
msgid "Toggle theme"
msgstr "Schakel thema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Triggert wanneer een sensor een drempelwaarde overschrijdt"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Triggert wanneer de gecombineerde up/down een drempelwaarde overschrijdt"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Triggert wanneer het CPU-gebruik een drempelwaarde overschrijdt"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Triggert wanneer het geheugengebruik een drempelwaarde overschrijdt"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Triggert wanneer de status schakelt tussen up en down"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Triggert wanneer het gebruik van een schijf een drempelwaarde overschrijdt"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "In realtime bijgewerkt. Klik op een systeem om informatie te bekijken."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Actief"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Gebruik"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Gebruik van root-partitie"
@@ -780,20 +809,20 @@ msgstr "Gebruik van root-partitie"
msgid "Used"
msgstr "Gebruikt"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "gebruikersnaam"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Gebruikersnaam"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Gebruikers"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Weergave"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Zichtbare kolommen"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Wachtend op genoeg records om weer te geven"
@@ -801,7 +830,7 @@ msgstr "Wachtend op genoeg records om weer te geven"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Wil je ons helpen onze vertalingen nog beter te maken? Bekijk <0>Crowdin</0> voor meer informatie."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Pushmeldingen"

View File

@@ -0,0 +1,853 @@
msgid ""
msgstr ""
"POT-Creation-Date: 2025-02-20 01:42-0100\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: @lingui/cli\n"
"Language: no\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Norwegian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: no\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dager}}"
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# time} other {# timer}}"
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 time"
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 uke"
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 timer"
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 timer"
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dager"
#. Table column
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Handlinger"
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktive Alarmer"
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Legg til <0>System</0>"
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Legg Til Nytt System"
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Legg til system"
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Legg Til URL"
#: src/components/routes/settings/general.tsx:81
msgid "Adjust display options for charts."
msgstr "Juster visningsalternativer for diagrammer."
#: src/components/command-palette.tsx:133
#: src/components/command-palette.tsx:146
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Alarmer"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Alle Systemer"
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på at du vil slette {name}?"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering krever en sikker kontekst."
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Gjennomsnitt"
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Gjennomsnittlig CPU-utnyttelse av konteinere"
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gjennomsnittet overstiger <0>{value}{0}</0>"
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr "Gjennomsnittlig strømforbruk for GPU-er"
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Gjennomsnittlig CPU-utnyttelse for hele systemet"
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr "Gjennomsnittlig utnyttelse av {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Sikkerhetskopier"
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Båndbredde"
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel støtter OpenID Connect og mange OAuth2 autentiserings-tilbydere."
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel bruker <0>Shoutrrr</0> for integrering mot populære meldingstjenester."
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binær"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Avbryt"
#: src/components/routes/settings/config-yaml.tsx:68
msgid "Caution - potential data loss"
msgstr "Advarsel - potensielt tap av data"
#: src/components/routes/settings/general.tsx:36
msgid "Change general application options."
msgstr "Endre generelle program-innstillinger."
#: src/components/routes/settings/general.tsx:78
msgid "Chart options"
msgstr "Diagraminnstillinger"
#: src/components/login/forgot-pass-form.tsx:34
msgid "Check {email} for a reset link."
msgstr "Sjekk {email} for en nullstillings-link."
#: src/components/routes/settings/layout.tsx:40
msgid "Check logs for more details."
msgstr "Sjekk loggene for flere detaljer."
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Sjekk din meldingstjeneste"
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Klikk for å kopiere"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Kommandolinje-instrukser"
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurer hvordan du vil motta alarmvarsler."
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Bekreft passord"
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Fortsett"
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Kopiert til utklippstavlen"
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopier"
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopier vert"
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopier Linux-kommando"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Kopier tekst"
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "CPU-bruk"
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Opprett konto"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Mørkt"
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Dashbord"
#: src/components/routes/settings/general.tsx:85
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Slett"
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Diskbruk"
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Diskbruk av {extraFsName}"
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Docker CPU-bruk"
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Docker Minnebruk"
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Docker Nettverks-I/O"
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Dokumentasjon"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "Rediger"
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "E-post"
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-postvarslinger"
#: src/components/login/login.tsx:38
msgid "Enter email address to reset password"
msgstr "Skriv inn e-postadresse for å nullstille passordet"
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Skriv inn e-postadresse..."
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Feil"
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Overstiger {0}{1} {2, plural, one {det siste minuttet} other {de siste # minuttene}}"
#: src/components/routes/settings/config-yaml.tsx:72
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/config-yaml.tsx:93
msgid "Export configuration"
msgstr "Eksporter konfigurasjon"
#: src/components/routes/settings/config-yaml.tsx:48
msgid "Export your current systems configuration."
msgstr "Eksporter din nåværende systemkonfigurasjon"
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Autentisering mislyktes"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Kunne ikke lagre innstillingene"
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Kunne ikke sende test-varsling"
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Kunne ikke oppdatere alarm"
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "I <0>{min}</0> {min, plural, one {minutt} other {minutter}}"
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Glemt passord?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
msgid "General"
msgstr "Generelt"
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr "GPU Effektforbruk"
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Rutenett"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Vert / IP"
#: src/components/login/forgot-pass-form.tsx:93
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Dersom du har mistet passordet til admin-kontoen kan du nullstille det med følgende kommando."
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ugyldig e-postadresse."
#. Linux kernel
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kjerne"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Språk"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Lyst"
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Logg Ut"
#: src/components/login/login.tsx:19
msgid "Login"
msgstr "Logg Inn"
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Innlogging mislyktes"
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
msgid "Logs"
msgstr "Logger"
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Ser du etter hvor du kan opprette alarmer? Klikk på bjelle-ikonene <0/> i systemtabellen."
#: src/components/routes/settings/layout.tsx:85
msgid "Manage display and notification preferences."
msgstr "Endre visnings- og varslingsinnstillinger."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Maks 1 min"
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Minne"
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Minnebruk"
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Minnebruk av docker-konteinere"
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Nett"
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Nettverkstrafikk av docker-konteinere"
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "Ingen resultater funnet."
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Ingen systemer funnet."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Varslinger"
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC-støtte"
#: src/components/routes/settings/config-yaml.tsx:61
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ved hver omstart vil systemer i databasen bli oppdatert til å matche systemene definert i fila."
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Åpne meny"
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Eller fortsett med"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Overskriv eksisterende alarmer"
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Side"
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Sider / Innstillinger"
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Passord"
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Passord må bestå av minst 8 tegn."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "Passord må være mindre enn 72 byte."
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Mottatt forespørsel om å nullstille passord"
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Vennligst <0>konfigurer en SMTP-server</0> for å forsikre deg om at varsler blir levert."
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Vennligst sjekk loggene for mer informasjon."
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Vennligst kontroller dine innloggingsopplysninger og prøv igjen"
#: src/components/login/login.tsx:36
msgid "Please create an admin account"
msgstr "Vennligst opprett en admin-konto"
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Vennligst aktiver pop-ups for nettsiden"
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Vennligst logg inn på nytt"
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vennligst se <0>dokumentasjonen</0> for instrukser."
#: src/components/login/login.tsx:40
msgid "Please sign in to your account"
msgstr "Vennligst logg inn på kontoen din"
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Nøyaktig utnyttelse på registrert tidspunkt"
#: src/components/routes/settings/general.tsx:58
msgid "Preferred Language"
msgstr "Foretrukket Språk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Offentlig Nøkkel"
#. Disk read
#: src/components/charts/area-chart.tsx:60
#: src/components/charts/area-chart.tsx:70
msgid "Read"
msgstr "Lesing"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:65
msgid "Received"
msgstr "Mottatt"
#: src/components/login/forgot-pass-form.tsx:76
msgid "Reset Password"
msgstr "Nullstill Passord"
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Gjenoppta"
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Lagre Innstillinger"
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr "Lagre system"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Søk"
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Søk etter systemer eller innstillinger..."
#: src/components/alerts/alert-button.tsx:71
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:64
msgid "Sent"
msgstr "Sendt"
#: src/components/routes/settings/general.tsx:100
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Angir standard tidsperiode for diagrammer når et system vises."
#: src/components/command-palette.tsx:96
#: src/components/command-palette.tsx:99
#: src/components/command-palette.tsx:114
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
msgstr "Innstillinger"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Innstillinger lagret"
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Logg inn"
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP-innstillinger"
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sorter Etter"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Swap-plass i bruk av systemet"
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Swap-bruk"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systemer"
#: src/components/routes/settings/config-yaml.tsx:55
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemer kan håndteres i en <0>config.yml</0>-fil i din data-katalog."
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabell"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr "Temp"
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperaturer på system-sensorer"
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Test-varsling sendt"
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agenten må kjøre på systemet du vil koble til. Kopier installasjons-kommandoen for agenten under."
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agenten må kjøre på systemet du vil koble til. Kopier <0>docker-compose.yml</0> for agenten under."
#: src/components/login/forgot-pass-form.tsx:98
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Logg deretter inn i backend og nullstill passordet på din konto i users-tabellen."
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Gjennomstrømning av {extraFsName}"
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Gjennomstrømning av rot-filsystemet"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til e-postadresse(r)"
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Rutenett av/på"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Tema av/på"
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Slår inn når kombinert opp/ned overskrider en grenseverdi"
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Slår inn når CPU-bruken overstiger en grenseverdi"
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Slår inn når minnebruken overstiger en grenseverdi"
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Slår inn når statusen veksler mellom oppe og nede"
#: src/lib/utils.ts:323
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"
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Oppdatert i sanntid. Klikk på et system for å se mer informasjon."
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Oppetid"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Forbruk"
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Forbruk av rot-partisjon"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
msgid "Used"
msgstr "Brukt"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Brukere"
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Visning"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Synlige Felter"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Venter på nok registreringer til å vise"
#: src/components/routes/settings/general.tsx:48
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vil du hjelpe oss med å gjøre oversettelsene enda bedre? Ta en titt på <0>Crowdin</0> for mer informasjon."
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-varslinger"
#. Disk write
#: src/components/charts/area-chart.tsx:59
#: src/components/charts/area-chart.tsx:69
msgid "Write"
msgstr "Skriving"
#: src/components/routes/settings/layout.tsx:61
msgid "YAML Config"
msgstr "YAML Oppsett"
#: src/components/routes/settings/config-yaml.tsx:45
msgid "YAML Configuration"
msgstr "YAML Konfigurasjon"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dine brukerinnstillinger har blitt oppdatert."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: pl\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-05 14:26\n"
"PO-Revision-Date: 2025-02-20 02:40\n"
"Last-Translator: \n"
"Language-Team: Polish\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dzień} few {# dni} many {# dni} other {# dni}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {godzinę} few {# godziny} many {# godzin} other {# godziny}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 godzina"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 tydzień"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 godzin"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 godziny"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dni"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Akcje"
@@ -55,20 +58,19 @@ msgstr "Akcje"
msgid "Active Alerts"
msgstr "Aktywne alerty"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>system</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Dodaj nowy system"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Dodaj system"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Dodaj URL"
@@ -81,11 +83,10 @@ msgstr "Dostosuj opcje wyświetlania wykresów."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Alerty"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Wszystkie systemy"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Czy na pewno chcesz usunąć {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Dostawcy Autoryzacji"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Średnia"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Średnie wykorzystanie procesora przez kontenery"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Średnia przekracza <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Średnie zużycie energii przez GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Średnie wykorzystanie procesora w całym systemie"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Średnie użycie {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Kopie"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Przepustowość"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel obsługuje OpenID Connect i wielu dostawców uwierzytelniania OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel używa <0>Shoutrrr</0> do integracji z popularnych serwisami powiadomień."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Plik binarny"
@@ -162,7 +158,7 @@ msgstr "Plik binarny"
msgid "Cache / Buffers"
msgstr "Pamięć podręczna / Bufory"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Anuluj"
@@ -186,50 +182,46 @@ msgstr "Sprawdź {email}, aby uzyskać link do resetowania."
msgid "Check logs for more details."
msgstr "Sprawdź logi, aby uzyskać więcej informacji."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Sprawdź swój serwis powiadomień"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Kliknij, aby skopiować"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Kolumny"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instrukcje wiersza poleceń"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Skonfiguruj sposób otrzymywania powiadomień."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Kontynuuj"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Skopiowano do schowka"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Kopiuj"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Kopiuj host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Kopiuj polecenie Linux"
@@ -237,17 +229,17 @@ msgstr "Kopiuj polecenie Linux"
msgid "Copy text"
msgstr "Kopiuj tekst"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "Procesor"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Użycie procesora"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Utwórz konto"
@@ -265,37 +257,37 @@ msgstr "Panel kontrolny"
msgid "Default time period"
msgstr "Domyślny przedział czasu"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Usuń"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Dysk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Dysk I/O"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Użycie dysku"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Wykorzystanie dysku {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Wykorzystanie procesora przez Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Wykorzystanie pamięci przez Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Sieć Docker I/O"
@@ -303,16 +295,17 @@ msgstr "Sieć Docker I/O"
msgid "Documentation"
msgstr "Dokumentacja"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "e-mail"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Powiadomienia e-mail"
@@ -320,13 +313,13 @@ msgstr "Powiadomienia e-mail"
msgid "Enter email address to reset password"
msgstr "Wprowadź adres e-mail, aby zresetować hasło"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Wprowadź adres e-mail..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Błąd"
@@ -346,33 +339,33 @@ msgstr "Eksportuj konfigurację"
msgid "Export your current systems configuration."
msgstr "Eksportuj aktualną konfigurację systemów."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Błąd autoryzacji"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Nie udało się zapisać ustawień"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Nie udało się wysłać testowego powiadomienia"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Nie udało się zaktualizować powiadomienia"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtruj..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Na <0>{min}</0> {min, plural, one {minutę} other {minut}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Zapomniałeś hasła?"
@@ -382,11 +375,15 @@ msgstr "Zapomniałeś hasła?"
msgid "General"
msgstr "Ogólne"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "Moc GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Siatka"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / adres IP"
@@ -394,12 +391,12 @@ msgstr "Host / adres IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Jeśli utraciłeś hasło do swojego konta administratora, możesz je zresetować, używając następującego polecenia."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Nieprawidłowy adres e-mail."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Jądro"
@@ -407,12 +404,16 @@ msgstr "Jądro"
msgid "Language"
msgstr "Język"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Układ"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Jasny"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Wyloguj"
@@ -420,7 +421,7 @@ msgstr "Wyloguj"
msgid "Login"
msgstr "Logowanie"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Próba logowania nie powiodła się"
@@ -430,7 +431,7 @@ msgstr "Próba logowania nie powiodła się"
msgid "Logs"
msgstr "Logi"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Szukasz, gdzie utworzyć powiadomienia? Kliknij ikonę dzwonka <0/> w tabeli systemów."
@@ -438,37 +439,41 @@ msgstr "Szukasz, gdzie utworzyć powiadomienia? Kliknij ikonę dzwonka <0/> w ta
msgid "Manage display and notification preferences."
msgstr "Zarządzaj preferencjami wyświetlania i powiadomień."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Pamięć"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Wykorzystanie pamięci"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Użycie pamięci przez kontenery Docker."
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nazwa"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Sieć"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Ruch sieciowy kontenerów Docker."
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Ruch sieciowy interfejsów publicznych"
@@ -476,17 +481,18 @@ msgstr "Ruch sieciowy interfejsów publicznych"
msgid "No results found."
msgstr "Brak wyników."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nie znaleziono systemów."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Powiadomienia"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Wsparcie OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Wsparcie OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Przy każdym ponownym uruchomieniu systemy w bazie danych będą aktualizowane, aby odpowiadały systemom zdefiniowanym w pliku."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Otwórz menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Lub kontynuuj z"
@@ -514,32 +520,36 @@ msgstr "Strona"
msgid "Pages / Settings"
msgstr "Strony / Ustawienia"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Hasło"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Hasło musi mieć co najmniej 10 znaków."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Hasło musi mieć co najmniej 8 znaków."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Otrzymane żądanie resetowania hasła"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pauza"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Proszę <0>skonfigurować serwer SMTP</0>, aby zapewnić dostarczanie powiadomień."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Sprawdź logi, aby uzyskać więcej informacji."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Sprawdź swoje poświadczenia i spróbuj ponownie"
@@ -548,15 +558,15 @@ msgstr "Sprawdź swoje poświadczenia i spróbuj ponownie"
msgid "Please create an admin account"
msgstr "Utwórz konto administratora"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Włącz wyskakujące okna dla tej strony"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Zaloguj się ponownie"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Proszę zapoznać się z <0>dokumentacją</0>."
@@ -564,12 +574,12 @@ msgstr "Proszę zapoznać się z <0>dokumentacją</0>."
msgid "Please sign in to your account"
msgstr "Zaloguj się na swoje konto"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Dokładne wykorzystanie w zarejestrowanym czasie"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Preferowany język"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Klucz publiczny"
@@ -597,20 +607,24 @@ msgstr "Otrzymane"
msgid "Reset Password"
msgstr "Resetuj hasło"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Wznów"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Zapisz ustawienia"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Szukaj"
@@ -643,30 +657,36 @@ msgstr "Ustawienia"
msgid "Settings saved"
msgstr "Ustawienia zapisane"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Zaloguj się"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Ustawienia SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sortuj według"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Pamięć wymiany używana przez system"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Użycie pamięci wymiany"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "System"
@@ -678,28 +698,37 @@ msgstr "Systemy"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Systemy mogą być zarządzane w pliku <0>config.yml</0> znajdującym się w Twoim katalogu danych."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperatury czujników systemowych."
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testowe powiadomienie wysłane."
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agent musi być uruchomiony na systemie, aby nawiązać połączenie. Skopiuj poniżej polecenie instalacji agenta."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Agent musi być uruchomiony na systemie, aby nawiązać połączenie. Skopiuj poniżej plik <0>docker-compose.yml</0> dla agenta."
@@ -707,24 +736,24 @@ msgstr "Agent musi być uruchomiony na systemie, aby nawiązać połączenie. Sk
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Następnie zaloguj się do panelu administracyjnego i zresetuj hasło do konta użytkownika w tabeli użytkowników."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Przepustowość {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Przepustowość głównego systemu plików"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Do e-mail(ów)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Przełącz siatkę"
@@ -732,45 +761,45 @@ msgstr "Przełącz siatkę"
msgid "Toggle theme"
msgstr "Zmień motyw"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Wyzwalane, gdy jakikolwiek czujnik przekroczy ustalony próg."
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Wyzwalane, gdy łączna wartość w górę/w dół przekroczy próg"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Wyzwalane, gdy użycie procesora przekracza próg"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Wyzwalane, wykorzystanie pamięci przekroczy ustalony próg."
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Wyzwalane, gdy status przełącza się między stanem aktywnym a nieaktywnym"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Wyzwalane, gdy wykorzystanie któregokolwiek dysku przekroczy ustalony próg"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Aktualizowane w czasie rzeczywistym. Kliknij system, aby zobaczyć informacje."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Czas pracy"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Wykorzystanie"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Użycie partycji głównej"
@@ -780,20 +809,20 @@ msgstr "Użycie partycji głównej"
msgid "Used"
msgstr "Używane"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "nazwa użytkownika"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Nazwa użytkownika"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Użytkownicy"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Widok"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Widoczne kolumny"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
@@ -801,7 +830,7 @@ msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Chcesz pomóc nam uczynić nasze tłumaczenia jeszcze lepszymi? Sprawdź <0>Crowdin</0> po więcej szczegółów."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Powiadomienia push"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dia} other {# dias}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 hora"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 semana"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 horas"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 horas"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 dias"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Ações"
@@ -55,20 +58,19 @@ msgstr "Ações"
msgid "Active Alerts"
msgstr "Alertas Ativos"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Adicionar <0>Sistema</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Adicionar Novo Sistema"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Adicionar sistema"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Adicionar URL"
@@ -81,11 +83,10 @@ msgstr "Ajustar opções de exibição para gráficos."
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agente"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Alertas"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Todos os Sistemas"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Tem certeza de que deseja excluir {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Provedores de Autenticação"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "A cópia automática requer um contexto seguro."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Média"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Utilização média de CPU dos contêineres"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "A média excede <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Consumo médio de energia pelas GPU's"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Utilização média de CPU em todo o sistema"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Utilização média de {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Backups"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Largura de Banda"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel suporta OpenID Connect e muitos provedores de autenticação OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel usa <0>Shoutrrr</0> para integrar com serviços de notificação populares."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binário"
@@ -162,7 +158,7 @@ msgstr "Binário"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Cancelar"
@@ -186,50 +182,46 @@ msgstr "Verifique {email} para um link de redefinição."
msgid "Check logs for more details."
msgstr "Verifique os logs para mais detalhes."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Verifique seu serviço de notificação"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Clique para copiar"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Colunas"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Instruções de linha de comando"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Configure como você recebe notificações de alerta."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Continuar"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Copiado para a área de transferência"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copiar comando Linux"
@@ -237,17 +229,17 @@ msgstr "Copiar comando Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Criar conta"
@@ -265,37 +257,37 @@ msgstr "Painel"
msgid "Default time period"
msgstr "Período de tempo padrão"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Excluir"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Uso de CPU do Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Uso de Memória do Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "E/S de Rede do Docker"
@@ -303,16 +295,17 @@ msgstr "E/S de Rede do Docker"
msgid "Documentation"
msgstr "Documentação"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "email"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "Editar"
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Notificações por email"
@@ -320,13 +313,13 @@ msgstr "Notificações por email"
msgid "Enter email address to reset password"
msgstr "Digite o endereço de email para redefinir a senha"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Digite o endereço de email..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Erro"
@@ -346,33 +339,33 @@ msgstr "Exportar configuração"
msgid "Export your current systems configuration."
msgstr "Exporte a configuração atual dos seus sistemas."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Falha na autenticação"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Falha ao salvar configurações"
msgstr "Falha ao guardar as definições"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Falha ao enviar notificação de teste"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Falha ao atualizar alerta"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Por <0>{min}</0> {min, plural, one {minuto} other {minutos}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Esqueceu a senha?"
@@ -382,11 +375,15 @@ msgstr "Esqueceu a senha?"
msgid "General"
msgstr "Geral"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "Consumo de Energia da GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Grade"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -394,12 +391,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Se você perdeu a senha da sua conta de administrador, pode redefini-la usando o seguinte comando."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Endereço de email inválido."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Kernel"
@@ -407,12 +404,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Aspeto"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Claro"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Sair"
@@ -420,7 +421,7 @@ msgstr "Sair"
msgid "Login"
msgstr "Entrar"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Tentativa de login falhou"
@@ -430,7 +431,7 @@ msgstr "Tentativa de login falhou"
msgid "Logs"
msgstr "Logs"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Procurando onde criar alertas? Clique nos ícones de sino <0/> na tabela de sistemas."
@@ -438,37 +439,41 @@ msgstr "Procurando onde criar alertas? Clique nos ícones de sino <0/> na tabela
msgid "Manage display and notification preferences."
msgstr "Gerenciar preferências de exibição e notificação."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Memória"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Uso de Memória"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Uso de memória dos contêineres Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Rede"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Tráfego de rede dos contêineres Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Tráfego de rede das interfaces públicas"
@@ -476,17 +481,18 @@ msgstr "Tráfego de rede das interfaces públicas"
msgid "No results found."
msgstr "Nenhum resultado encontrado."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Nenhum sistema encontrado."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Notificações"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Suporte a OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Suporte a OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "A cada reinício, os sistemas no banco de dados serão atualizados para corresponder aos sistemas definidos no arquivo."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Abrir menu"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Ou continue com"
@@ -514,32 +520,36 @@ msgstr "Página"
msgid "Pages / Settings"
msgstr "Páginas / Configurações"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Senha"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "A senha deve ter pelo menos 10 caracteres."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "A senha deve ter pelo menos 8 caracteres."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr "A password tem que ter menos de 72 bytes."
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Solicitação de redefinição de senha recebida"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Pausar"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Por favor, <0>configure um servidor SMTP</0> para garantir que os alertas sejam entregues."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Por favor, verifique os logs para mais detalhes."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique suas credenciais e tente novamente"
@@ -548,15 +558,15 @@ msgstr "Por favor, verifique suas credenciais e tente novamente"
msgid "Please create an admin account"
msgstr "Por favor, crie uma conta de administrador"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Por favor, habilite pop-ups para este site"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Por favor, faça login novamente"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, veja <0>a documentação</0> para instruções."
@@ -564,12 +574,12 @@ msgstr "Por favor, veja <0>a documentação</0> para instruções."
msgid "Please sign in to your account"
msgstr "Por favor, entre na sua conta"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Porta"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Utilização precisa no momento registrado"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Chave Pública"
@@ -597,20 +607,24 @@ msgstr "Recebido"
msgid "Reset Password"
msgstr "Redefinir Senha"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Retomar"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
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."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Salvar Configurações"
msgstr "Guardar Definições"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr "Guardar Sistema"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Pesquisar"
@@ -641,32 +655,38 @@ msgstr "Configurações"
#: src/components/routes/settings/layout.tsx:33
msgid "Settings saved"
msgstr "Configurações salvas"
msgstr "Definições guardadas"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Entrar"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Configurações SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Ordenar Por"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Espaço de swap usado pelo sistema"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Sistema"
@@ -678,28 +698,37 @@ msgstr "Sistemas"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Os sistemas podem ser gerenciados em um arquivo <0>config.yml</0> dentro do seu diretório de dados."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr "Temp"
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Temperaturas dos sensores do sistema"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testar <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Notificação de teste enviada"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "O agente deve estar em execução no sistema para conectar. Copie o comando de instalação para o agente abaixo."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "O agente deve estar em execução no sistema para conectar. Copie o <0>docker-compose.yml</0> para o agente abaixo."
@@ -707,24 +736,24 @@ msgstr "O agente deve estar em execução no sistema para conectar. Copie o <0>d
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Em seguida, faça login no backend e redefina a senha da sua conta de usuário na tabela de usuários."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
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/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Taxa de transferência de {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Taxa de transferência do sistema de arquivos raiz"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Para email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Alternar grade"
@@ -732,45 +761,45 @@ msgstr "Alternar grade"
msgid "Toggle theme"
msgstr "Alternar tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Dispara quando qualquer sensor excede um limite"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Dispara quando a soma de subida/descida excede um limite"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Dispara quando o uso de CPU excede um limite"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Dispara quando o uso de memória excede um limite"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Dispara quando o status alterna entre ativo e inativo"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Dispara quando o uso de qualquer disco excede um limite"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Atualizado em tempo real. Clique em um sistema para ver informações."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Tempo de Atividade"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Uso da partição raiz"
@@ -780,20 +809,20 @@ msgstr "Uso da partição raiz"
msgid "Used"
msgstr "Usado"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "nome de usuário"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Nome de usuário"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Usuários"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Visual"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Campos Visíveis"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Aguardando registros suficientes para exibir"
@@ -801,7 +830,7 @@ msgstr "Aguardando registros suficientes para exibir"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Quer nos ajudar a melhorar ainda mais nossas traduções? Confira <0>Crowdin</0> para mais detalhes."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Notificações Webhook / Push"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ru\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-11-04 20:46\n"
"PO-Revision-Date: 2025-02-23 04:50\n"
"Last-Translator: \n"
"Language-Team: Russian\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
@@ -18,36 +18,39 @@ msgstr ""
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#: src/components/routes/system.tsx:250
#: src/components/routes/system.tsx:252
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# день} other {# дней}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:250
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часов}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:158
msgid "1 hour"
msgstr "1 час"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:181
msgid "1 week"
msgstr "1 неделя"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:166
msgid "12 hours"
msgstr "12 часов"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:174
msgid "24 hours"
msgstr "24 часа"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:189
msgid "30 days"
msgstr "30 дней"
#. Table column
#: src/components/systems-table/systems-table.tsx:207
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:366
#: src/components/systems-table/systems-table.tsx:508
#: src/components/systems-table/systems-table.tsx:518
msgid "Actions"
msgstr "Действия"
@@ -55,20 +58,19 @@ msgstr "Действия"
msgid "Active Alerts"
msgstr "Активные оповещения"
#: src/components/add-system.tsx:74
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Добавить <0>Систему</0>"
#: src/components/add-system.tsx:83
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Добавить новую систему"
#: src/components/add-system.tsx:161
#: src/components/add-system.tsx:172
#: src/components/add-system.tsx:230
msgid "Add system"
msgstr "Добавить систему"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Добавить URL"
@@ -81,11 +83,10 @@ msgstr "Настроить параметры отображения для гр
#: src/components/command-palette.tsx:160
#: src/components/command-palette.tsx:174
#: src/components/command-palette.tsx:189
#: src/components/command-palette.tsx:204
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx:186
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Агент"
@@ -95,66 +96,61 @@ msgid "Alerts"
msgstr "Оповещения"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:317
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "Все системы"
#: src/components/systems-table/systems-table.tsx:261
#: src/components/systems-table/systems-table.tsx:642
msgid "Are you sure you want to delete {name}?"
msgstr "Вы уверены, что хотите удалить {name}?"
#: src/components/command-palette.tsx:186
#: src/components/navbar.tsx:102
msgid "Auth Providers"
msgstr "Поставщики аутентификации"
#: src/components/copy-to-clipboard.tsx:16
msgid "Automatic copy requires a secure context."
msgstr "Автоматическое копирование требует безопасного контекста."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:626
msgid "Average"
msgstr "Среднее"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:403
msgid "Average CPU utilization of containers"
msgstr "Среднее использование CPU контейнерами"
#: src/components/alerts/alerts-system.tsx:204
#: src/components/alerts/alerts-system.tsx:206
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Среднее превышает <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:504
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "Среднее потребление мощности всеми GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:392
msgid "Average system-wide CPU utilization"
msgstr "Среднее использование CPU по всей системе"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:522
msgid "Average utilization of {0}"
msgstr ""
msgstr "Среднее использование {0}"
#: src/components/command-palette.tsx:171
#: src/components/navbar.tsx:94
msgid "Backups"
msgstr "Резервные копии"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/components/routes/system.tsx:448
#: src/lib/utils.ts:326
msgid "Bandwidth"
msgstr "Пропускная способность"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:304
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel поддерживает OpenID Connect и многих поставщиков аутентификации OAuth2."
msgstr "Beszel поддерживает OpenID Connect и множество поставщиков аутентификации OAuth2."
#: src/components/routes/settings/notifications.tsx:127
#: src/components/routes/settings/notifications.tsx:128
msgid "Beszel uses <0>Shoutrrr</0> to integrate with popular notification services."
msgstr "Beszel использует <0>Shoutrrr</0> для интеграции с популярными сервисами уведомлений."
#: src/components/add-system.tsx:88
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Двоичный"
@@ -162,7 +158,7 @@ msgstr "Двоичный"
msgid "Cache / Buffers"
msgstr "Кэш / Буферы"
#: src/components/systems-table/systems-table.tsx:272
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Отмена"
@@ -186,50 +182,46 @@ msgstr "Проверьте {email} для получения ссылки на
msgid "Check logs for more details."
msgstr "Проверьте журналы для получения более подробной информации."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Проверьте ваш сервис уведомлений"
#: src/components/add-system.tsx:147
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Нажмите, чтобы скопировать"
#. Context: table columns
#: src/components/systems-table/systems-table.tsx:328
msgid "Columns"
msgstr "Столбцы"
#: src/components/login/forgot-pass-form.tsx:83
#: src/components/login/forgot-pass-form.tsx:89
msgid "Command line instructions"
msgstr "Инструкции командной строки"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Настройте, как вы получаете уведомления об оповещениях."
#: src/components/login/auth-form.tsx:189
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:210
#: src/components/login/auth-form.tsx:215
msgid "Confirm password"
msgstr "Подтвердите пароль"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:659
msgid "Continue"
msgstr "Продолжить"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:26
msgid "Copied to clipboard"
msgstr "Скопировано в буфер обмена"
#: src/components/add-system.tsx:158
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Копировать"
#: src/components/systems-table/systems-table.tsx:247
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Копировать хост"
#: src/components/add-system.tsx:169
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Копировать команду Linux"
@@ -237,17 +229,17 @@ msgstr "Копировать команду Linux"
msgid "Copy text"
msgstr "Копировать текст"
#: src/components/systems-table/systems-table.tsx:152
#: src/components/systems-table/systems-table.tsx:165
msgid "CPU"
msgstr "CPU"
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
#: src/components/routes/system.tsx:391
#: src/lib/utils.ts:308
msgid "CPU Usage"
msgstr "Использование CPU"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Создать аккаунт"
@@ -265,37 +257,37 @@ msgstr "Панель управления"
msgid "Default time period"
msgstr "Период по умолчанию"
#: src/components/systems-table/systems-table.tsx:253
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Удалить"
#: src/components/systems-table/systems-table.tsx:166
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:438
msgid "Disk I/O"
msgstr "Дисковый ввод/вывод"
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
#: src/components/routes/system.tsx:431
#: src/lib/utils.ts:320
msgid "Disk Usage"
msgstr "Использование диска"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:559
msgid "Disk usage of {extraFsName}"
msgstr "Использование диска {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:402
msgid "Docker CPU Usage"
msgstr "Использование CPU Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:423
msgid "Docker Memory Usage"
msgstr "Использование памяти Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:464
msgid "Docker Network I/O"
msgstr "Сетевой ввод/вывод Docker"
@@ -303,16 +295,17 @@ msgstr "Сетевой ввод/вывод Docker"
msgid "Documentation"
msgstr "Документация"
#: src/components/login/auth-form.tsx:158
msgid "email"
msgstr "электронная почта"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr ""
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:173
#: src/components/login/forgot-pass-form.tsx:53
msgid "Email"
msgstr "Электронная почта"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Уведомления по электронной почте"
@@ -320,13 +313,13 @@ msgstr "Уведомления по электронной почте"
msgid "Enter email address to reset password"
msgstr "Введите адрес электронной почты для сброса пароля"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Введите адрес электронной почты..."
#: src/components/login/auth-form.tsx:256
#: src/components/login/auth-form.tsx:136
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/routes/settings/notifications.tsx:188
msgid "Error"
msgstr "Ошибка"
@@ -346,33 +339,33 @@ msgstr "Экспорт конфигурации"
msgid "Export your current systems configuration."
msgstr "Экспортируйте текущую конфигурацию систем."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:39
msgid "Failed to authenticate"
msgstr "Не удалось аутентифицировать"
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
#: src/components/routes/settings/notifications.tsx:63
msgid "Failed to save settings"
msgstr "Не удалось сохранить настройки"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Не удалось отправить тестовое уведомление"
#: src/components/alerts/alerts-system.tsx:27
#: src/components/alerts/alerts-system.tsx:24
msgid "Failed to update alert"
msgstr "Не удалось обновить оповещение"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:324
#: src/components/routes/system.tsx:599
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Фильтр..."
#: src/components/alerts/alerts-system.tsx:225
#: src/components/alerts/alerts-system.tsx:227
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "На <0>{min}</0> {min, plural, one {минуту} other {минут}}"
#: src/components/login/auth-form.tsx:337
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Забыли пароль?"
@@ -382,11 +375,15 @@ msgstr "Забыли пароль?"
msgid "General"
msgstr "Общие"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:503
msgid "GPU Power Draw"
msgstr ""
msgstr "Потребляемая мощность GPU"
#: src/components/add-system.tsx:116
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Сетка"
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Хост / IP"
@@ -394,12 +391,12 @@ msgstr "Хост / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Если вы потеряли пароль от своей учетной записи администратора, вы можете сбросить его, используя следующую команду."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Неверный адрес электронной почты."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:264
msgid "Kernel"
msgstr "Ядро"
@@ -407,12 +404,16 @@ msgstr "Ядро"
msgid "Language"
msgstr "Язык"
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Макет"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Светлая"
#: src/components/navbar.tsx:113
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Выйти"
@@ -420,7 +421,7 @@ msgstr "Выйти"
msgid "Login"
msgstr "Вход"
#: src/components/login/auth-form.tsx:42
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Попытка входа не удалась"
@@ -430,7 +431,7 @@ msgstr "Попытка входа не удалась"
msgid "Logs"
msgstr "Журналы"
#: src/components/routes/settings/notifications.tsx:80
#: src/components/routes/settings/notifications.tsx:81
msgid "Looking instead for where to create alerts? Click the bell <0/> icons in the systems table."
msgstr "Ищете, где создать оповещения? Нажмите на значки колокольчика <0/> в таблице систем."
@@ -438,37 +439,41 @@ msgstr "Ищете, где создать оповещения? Нажмите
msgid "Manage display and notification preferences."
msgstr "Управляйте предпочтениями отображения и уведомлений."
#: src/components/add-system.tsx:225
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:629
msgid "Max 1 min"
msgstr "Макс 1 мин"
#: src/components/systems-table/systems-table.tsx:159
#: src/components/systems-table/systems-table.tsx:173
msgid "Memory"
msgstr "Память"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/components/routes/system.tsx:413
#: src/lib/utils.ts:314
msgid "Memory Usage"
msgstr "Использование памяти"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:424
msgid "Memory usage of docker containers"
msgstr "Использование памяти контейнерами Docker"
#: src/components/add-system.tsx:112
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Имя"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Сеть"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:465
msgid "Network traffic of docker containers"
msgstr "Сетевой трафик контейнеров Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:450
msgid "Network traffic of public interfaces"
msgstr "Сетевой трафик публичных интерфейсов"
@@ -476,17 +481,18 @@ msgstr "Сетевой трафик публичных интерфейсов"
msgid "No results found."
msgstr "Результаты не найдены."
#: src/components/systems-table/systems-table.tsx:400
#: src/components/systems-table/systems-table.tsx:474
#: src/components/systems-table/systems-table.tsx:547
msgid "No systems found."
msgstr "Системы не найдены."
#: src/components/command-palette.tsx:111
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
#: src/components/routes/settings/notifications.tsx:75
msgid "Notifications"
msgstr "Уведомления"
#: src/components/login/auth-form.tsx:308
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "Поддержка OAuth 2 / OIDC"
@@ -494,11 +500,11 @@ msgstr "Поддержка OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "При каждом перезапуске системы в базе данных будут обновлены в соответствии с системами, определенными в файле."
#: src/components/systems-table/systems-table.tsx:219
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Открыть меню"
#: src/components/login/auth-form.tsx:227
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Или продолжить с"
@@ -514,32 +520,36 @@ msgstr "Страница"
msgid "Pages / Settings"
msgstr "Страницы / Настройки"
#: src/components/login/auth-form.tsx:171
#: src/components/login/auth-form.tsx:176
#: src/components/login/auth-form.tsx:192
#: src/components/login/auth-form.tsx:197
msgid "Password"
msgstr "Пароль"
#: src/components/login/auth-form.tsx:17
msgid "Password must be at least 10 characters."
msgstr "Пароль должен содержать не менее 10 символов."
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Пароль должен содержать не менее 8 символов."
#: src/components/login/auth-form.tsx:21
msgid "Password must be less than 72 bytes."
msgstr ""
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "Запрос на сброс пароля получен"
#: src/components/systems-table/systems-table.tsx:241
#: src/components/systems-table/systems-table.tsx:618
msgid "Pause"
msgstr "Пауза"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Пожалуйста, <0>настройте SMTP-сервер</0>, чтобы гарантировать доставку оповещений."
#: src/components/alerts/alerts-system.tsx:28
#: src/components/alerts/alerts-system.tsx:25
msgid "Please check logs for more details."
msgstr "Пожалуйста, проверьте журналы для получения более подробной информации."
#: src/components/login/auth-form.tsx:43
#: src/components/login/auth-form.tsx:40
#: src/components/login/forgot-pass-form.tsx:16
msgid "Please check your credentials and try again"
msgstr "Пожалуйста, проверьте свои учетные данные и попробуйте снова"
@@ -548,15 +558,15 @@ msgstr "Пожалуйста, проверьте свои учетные дан
msgid "Please create an admin account"
msgstr "Пожалуйста, создайте учетную запись администратора"
#: src/components/login/auth-form.tsx:257
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Пожалуйста, включите всплывающие окна для этого сайта"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:40
msgid "Please log in again"
msgstr "Пожалуйста, войдите снова"
#: src/components/login/auth-form.tsx:316
#: src/components/login/auth-form.tsx:307
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Пожалуйста, смотрите <0>документацию</0> для получения инструкций."
@@ -564,12 +574,12 @@ msgstr "Пожалуйста, смотрите <0>документацию</0>
msgid "Please sign in to your account"
msgstr "Пожалуйста, войдите в свою учетную запись"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:169
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:414
#: src/components/routes/system.tsx:530
msgid "Precise utilization at the recorded time"
msgstr "Точное использование в записанное время"
@@ -578,7 +588,7 @@ msgid "Preferred Language"
msgstr "Предпочтительный язык"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Ключ"
@@ -597,20 +607,24 @@ msgstr "Получено"
msgid "Reset Password"
msgstr "Сбросить пароль"
#: src/components/systems-table/systems-table.tsx:236
#: src/components/systems-table/systems-table.tsx:613
msgid "Resume"
msgstr "Возобновить"
#: src/components/routes/settings/notifications.tsx:117
#: src/components/routes/settings/notifications.tsx:118
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
msgstr "Сохраните адрес, используя клавишу ввода или запятую. Оставьте пустым, чтобы отключить уведомления по электронной почте."
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
#: src/components/routes/settings/notifications.tsx:168
msgid "Save Settings"
msgstr "Сохранить настройки"
#: src/components/navbar.tsx:142
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Поиск"
@@ -643,30 +657,36 @@ msgstr "Настройки"
msgid "Settings saved"
msgstr "Настройки сохранены"
#: src/components/login/auth-form.tsx:215
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Войти"
#: src/components/command-palette.tsx:201
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "Настройки SMTP"
#: src/lib/utils.ts:282
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Сортировать по"
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:480
msgid "Swap space used by the system"
msgstr "Используемое системой пространство подкачки"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:479
msgid "Swap Usage"
msgstr "Использование подкачки"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:110
#: src/components/systems-table/systems-table.tsx:121
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
msgid "System"
msgstr "Система"
@@ -678,28 +698,37 @@ msgstr "Системы"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Системы могут управляться в файле <0>config.yml</0> внутри вашего каталога данных."
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr ""
#: src/components/routes/system.tsx:491
#: src/lib/utils.ts:333
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:492
msgid "Temperatures of system sensors"
msgstr "Температуры датчиков системы"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Тест <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Тестовое уведомление отправлено"
#: src/components/add-system.tsx:104
#: src/components/add-system.tsx:145
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Агент должен работать на системе для подключения. Скопируйте команду установки агента ниже."
#: src/components/add-system.tsx:95
#: src/components/add-system.tsx:136
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Агент должен работать на системе для подключения. Скопируйте <0>docker-compose.yml</0> для агента ниже."
@@ -707,24 +736,24 @@ msgstr "Агент должен работать на системе для по
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Затем войдите в бэкенд и сбросьте пароль вашей учетной записи в таблице пользователей."
#: src/components/systems-table/systems-table.tsx:264
#: src/components/systems-table/systems-table.tsx:645
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Это действие не может быть отменено. Это навсегда удалит все текущие записи для {name} из базы данных."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:571
msgid "Throughput of {extraFsName}"
msgstr "Пропускная способность {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:439
msgid "Throughput of root filesystem"
msgstr "Пропускная способность корневой файловой системы"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "На электронную почту"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:366
#: src/components/routes/system.tsx:379
msgid "Toggle grid"
msgstr "Переключить сетку"
@@ -732,45 +761,45 @@ msgstr "Переключить сетку"
msgid "Toggle theme"
msgstr "Переключить тему"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:336
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Срабатывает, когда любой датчик превышает порог"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:329
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Срабатывает, когда комбинированный вход/выход превышает порог"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:311
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Срабатывает, когда использование CPU превышает порог"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:317
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Срабатывает, когда использование памяти превышает порог"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:304
msgid "Triggers when status switches between up and down"
msgstr "Срабатывает, когда статус переключается между включено и выключено"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:323
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Срабатывает, когда использование любого диска превышает порог"
#: src/components/systems-table/systems-table.tsx:320
#: src/components/systems-table/systems-table.tsx:322
msgid "Updated in real time. Click on a system to view information."
msgstr "Обновляется в реальном времени. Нажмите на систему, чтобы просмотреть информацию."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:263
msgid "Uptime"
msgstr "Время работы"
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
#: src/components/routes/system.tsx:521
#: src/components/routes/system.tsx:558
msgid "Usage"
msgstr "Использование"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:431
msgid "Usage of root partition"
msgstr "Использование корневого раздела"
@@ -780,20 +809,20 @@ msgstr "Использование корневого раздела"
msgid "Used"
msgstr "Использовано"
#: src/components/login/auth-form.tsx:138
msgid "username"
msgstr "имя пользователя"
#: src/components/login/auth-form.tsx:131
msgid "Username"
msgstr "Имя пользователя"
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Пользователи"
#: src/components/routes/system.tsx:662
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "Вид"
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Видимые столбцы"
#: src/components/routes/system.tsx:663
msgid "Waiting for enough records to display"
msgstr "Ожидание достаточного количества записей для отображения"
@@ -801,7 +830,7 @@ msgstr "Ожидание достаточного количества запи
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Хотите помочь нам улучшить наши переводы? Посетите <0>Crowdin</0> для получения более подробной информации."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push уведомления"

Some files were not shown because too many files have changed in this diff Show More