Compare commits

...

178 Commits

Author SHA1 Message Date
hank
c01bfd9332 New translations en.po (Arabic) 2025-04-23 13:19:56 -04:00
hank
209e82aed2 New translations en.po (Dutch) 2025-04-14 09:04:03 -04:00
hank
c66e740d52 New translations en.po (Arabic) 2025-04-05 21:52:03 -04:00
hank
551ae49c2e New translations en.po (French) 2025-03-28 17:04:47 -04:00
hank
906daa6f2a New translations en.po (French) 2025-03-26 06:03:01 -04:00
hank
49e55943c1 New translations en.po (Russian) 2025-03-25 04:32:17 -04:00
hank
9e75cbc1ef New translations en.po (Italian) 2025-03-22 11:29:03 -04:00
hank
79190a2c51 New translations en.po (Norwegian) 2025-03-17 09:40:03 -04:00
hank
32960c7c35 New translations en.po (Chinese Simplified) 2025-03-15 04:13:35 -04:00
hank
cdff974a8a New translations en.po (Ukrainian) 2025-03-15 00:14:37 -04:00
hank
20a6ef129c New translations en.po (Czech) 2025-03-13 20:50:03 -04:00
hank
d1e5310f83 New translations en.po (Japanese) 2025-03-13 06:13:10 -04:00
hank
152173eab5 New translations en.po (Korean) 2025-03-07 05:06:11 -05:00
hank
c2aec69638 New translations en.po (Ukrainian) 2025-03-06 07:37:37 -05:00
hank
16c97fe77b New translations en.po (Chinese Traditional, Hong Kong) 2025-03-06 02:27:48 -05:00
hank
bed5bc2791 New translations en.po (Croatian) 2025-03-06 02:27:47 -05:00
hank
424c7aceff New translations en.po (Persian) 2025-03-06 02:27:46 -05:00
hank
8eb101e714 New translations en.po (Vietnamese) 2025-03-06 02:27:45 -05:00
hank
f2e69e2a80 New translations en.po (Chinese Traditional) 2025-03-06 02:27:44 -05:00
hank
41b4dbce98 New translations en.po (Chinese Simplified) 2025-03-06 02:27:43 -05:00
hank
c3432fc7b5 New translations en.po (Ukrainian) 2025-03-06 02:27:42 -05:00
hank
b167244e28 New translations en.po (Turkish) 2025-03-06 02:27:40 -05:00
hank
bcca6a5a9d New translations en.po (Swedish) 2025-03-06 02:27:39 -05:00
hank
6b661b4878 New translations en.po (Slovenian) 2025-03-06 02:27:37 -05:00
hank
bc537edb73 New translations en.po (Russian) 2025-03-06 02:27:36 -05:00
hank
561a3e8aaf New translations en.po (Polish) 2025-03-06 02:27:34 -05:00
hank
f173ea37da New translations en.po (Norwegian) 2025-03-06 02:27:33 -05:00
hank
0d9f2ba06a New translations en.po (Dutch) 2025-03-06 02:27:32 -05:00
hank
4e772e6008 New translations en.po (Korean) 2025-03-06 02:27:31 -05:00
hank
b959d97502 New translations en.po (Italian) 2025-03-06 02:27:30 -05:00
hank
735cbe2cf0 New translations en.po (German) 2025-03-06 02:27:29 -05:00
hank
0f5a470495 New translations en.po (Danish) 2025-03-06 02:27:28 -05:00
hank
a42e99370e New translations en.po (Czech) 2025-03-06 02:27:27 -05:00
hank
abfae78af1 New translations en.po (Bulgarian) 2025-03-06 02:27:26 -05:00
hank
e36c40c4a9 New translations en.po (Arabic) 2025-03-06 02:27:25 -05:00
hank
bf7b2ae598 New translations en.po (Spanish) 2025-03-06 02:27:24 -05:00
hank
f71ee4b058 New translations en.po (French) 2025-03-06 02:27:23 -05:00
hank
f2466eb37d New translations en.po (Hungarian) 2025-03-06 02:27:22 -05:00
hank
7244c7130b New translations en.po (Japanese) 2025-03-06 02:27:21 -05:00
hank
f2e84a9d3e New translations en.po (Portuguese) 2025-03-06 02:27:20 -05:00
hank
04a1ee5e4e New translations en.po (Icelandic) 2025-03-06 02:27:19 -05:00
hank
9b83088897 New translations en.po (Norwegian) 2025-03-05 15:49:42 -05:00
hank
13b30aa255 New translations en.po (Russian) 2025-03-01 13:24:35 -05:00
hank
2bd25e9e8d New translations en.po (Ukrainian) 2025-03-01 08:20:09 -05:00
hank
4fe192bf28 New translations en.po (Ukrainian) 2025-03-01 07:11:52 -05:00
hank
2056ae285f New translations en.po (Spanish) 2025-02-28 12:20:35 -05:00
hank
a02e7a0a69 New translations en.po (Spanish) 2025-02-28 11:07:32 -05:00
hank
b1a9e90034 New translations en.po (Chinese Traditional, Hong Kong) 2025-02-27 17:31:32 -05:00
hank
20916fab3e New translations en.po (Croatian) 2025-02-27 17:31:31 -05:00
hank
0c777cca72 New translations en.po (Persian) 2025-02-27 17:31:31 -05:00
hank
44e30ad429 New translations en.po (Vietnamese) 2025-02-27 17:31:30 -05:00
hank
9e30786dda New translations en.po (Chinese Traditional) 2025-02-27 17:31:29 -05:00
hank
1f677773e7 New translations en.po (Chinese Simplified) 2025-02-27 17:31:28 -05:00
hank
882289da91 New translations en.po (Ukrainian) 2025-02-27 17:31:26 -05:00
hank
fbbc4eff27 New translations en.po (Turkish) 2025-02-27 17:31:25 -05:00
hank
b78231f677 New translations en.po (Swedish) 2025-02-27 17:31:24 -05:00
hank
332e2d14a9 New translations en.po (Slovenian) 2025-02-27 17:31:23 -05:00
hank
e088b88c84 New translations en.po (Russian) 2025-02-27 17:31:22 -05:00
hank
09840f95d9 New translations en.po (Polish) 2025-02-27 17:31:21 -05:00
hank
de03bb658a New translations en.po (Norwegian) 2025-02-27 17:31:19 -05:00
hank
bcadfeb729 New translations en.po (Dutch) 2025-02-27 17:31:18 -05:00
hank
ec582a9171 New translations en.po (Korean) 2025-02-27 17:31:17 -05:00
hank
0c3eaefc90 New translations en.po (Italian) 2025-02-27 17:31:16 -05:00
hank
d6b5866f90 New translations en.po (German) 2025-02-27 17:31:15 -05:00
hank
2ba629e4b4 New translations en.po (Danish) 2025-02-27 17:31:14 -05:00
hank
6e9341b7ff New translations en.po (Czech) 2025-02-27 17:31:13 -05:00
hank
89499a341b New translations en.po (Bulgarian) 2025-02-27 17:31:12 -05:00
hank
9c88845798 New translations en.po (Arabic) 2025-02-27 17:31:10 -05:00
hank
c9f65f63e6 New translations en.po (Spanish) 2025-02-27 17:31:09 -05:00
hank
996620c8e0 New translations en.po (French) 2025-02-27 17:31:08 -05:00
hank
626c1358d9 New translations en.po (Hungarian) 2025-02-27 17:31:07 -05:00
hank
19dd39b7db New translations en.po (Japanese) 2025-02-27 17:31:06 -05:00
hank
d482b50e31 New translations en.po (Portuguese) 2025-02-27 17:31:05 -05:00
hank
f61ec49c76 New translations en.po (Icelandic) 2025-02-27 17:31:03 -05:00
henrygd
2b43ba3cbe i18n: update language files 2025-02-27 17:20:12 -05:00
ArsFy
b2b1a0b6ea i18n: new Chinese translations 2025-02-27 17:19:04 -05:00
stanol
b11d0aae61 i18n: new Ukrainian translations 2025-02-27 17:18:35 -05:00
henrygd
2b73d8845a feat: allow x min downtime before alerting (#595, #625)
- splits alerts package into three files. status alerts were not
modified aside from updating to slices.Delete method
2025-02-27 17:12:25 -05:00
henrygd
41e3e3d760 chore: update .gitignore 2025-02-27 00:37:29 -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
111 changed files with 14298 additions and 5992 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

3
.gitignore vendored
View File

@@ -14,4 +14,5 @@ node_modules
beszel/build
*timestamp*
.swc
beszel/site/src/locales/**/*.ts
beszel/site/src/locales/**/*.ts
*.bak

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

@@ -48,6 +48,7 @@ dev-server: generate-locales
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 \

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,29 +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,77 +1,72 @@
module beszel
go 1.23
toolchain go1.23.2
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.8
github.com/goccy/go-json v0.10.4
github.com/goccy/go-json v0.10.5
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.24.1
github.com/pocketbase/pocketbase v0.25.0
github.com/rhysd/go-github-selfupdate v1.2.3
github.com/shirou/gopsutil/v4 v4.24.12
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.31.0
golang.org/x/exp v0.0.0-20250103183323-7d7fa50e5329
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.7 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect
github.com/aws/aws-sdk-go-v2/config v1.28.7 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.45 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // 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.26 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.0 // indirect
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect
github.com/aws/smithy-go v1.22.1 // 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.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.1 // 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.14.1 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // 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/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
@@ -79,23 +74,20 @@ require (
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.opencensus.io v0.24.0 // indirect
gocloud.dev v0.40.0 // indirect
golang.org/x/image v0.23.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/oauth2 v0.25.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.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.214.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect
google.golang.org/grpc v1.69.2 // indirect
google.golang.org/protobuf v1.36.1 // indirect
modernc.org/gc/v3 v3.0.0-20250105121824-520be1a3aee6 // 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.1 // indirect
modernc.org/sqlite v1.34.4 // indirect
modernc.org/strutil v1.2.1 // indirect
modernc.org/token v1.1.0 // indirect
modernc.org/memory v1.8.2 // indirect
modernc.org/sqlite v1.34.5 // indirect
)

View File

@@ -1,10 +1,10 @@
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
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.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
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.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
@@ -14,11 +14,7 @@ cloud.google.com/go/storage v1.43.0 h1:CcxnSohZwizt4LCzQHWvBf1/kvtHUn7gk9QERXPyX
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.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw=
github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc=
github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE=
github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M=
github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ=
github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.45 h1:ZxB8WFVYwolhDZxuZXoesHkl+L9cXLWy0K/G0QkNATc=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.45/go.mod h1:1krrbyoFFDqaNldmltPTP+mK3sAXLHPoaFtISOw2Hkk=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8=
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.26 h1:GeNJsIFHB+WW5ap2Tec4K6dzcVTsRbsT1Lra46Hv9ME=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26/go.mod h1:zfgMpwHDXX2WGoG84xG2H+ZlPTkJUU4YUvx2svLQYWo=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 h1:tB4tNw83KcajNAzaIMhkhVI2Nt8fAZd5A5ro113FEMY=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7/go.mod h1:lvpyBGkZ3tZ9iSsUIcC2EWp+0ywa7aK3BLT+FwZi+mQ=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 h1:Hi0KGbrnr57bEHWM0bJ1QcBzxLrL/k2DHvGYhb8+W1w=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7/go.mod h1:wKNgWgExdjjrm4qvfbTorkvocEstaoDl4WCvGfeCy9c=
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.0 h1:SAfh4pNx5LuTafKKWR02Y+hL3A+3TX8cTKG1OIAJaBk=
github.com/aws/aws-sdk-go-v2/service/s3 v1.72.0/go.mod h1:r+xl5yzMk9083rMR+sJ5TYj9Tihvf/l1oxzZXDgGj2Q=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g=
github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY=
github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc=
github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
github.com/aws/smithy-go v1.22.1/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=
@@ -117,10 +111,10 @@ 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.4 h1:JSwxQzIqKfmFX1swYPpUThQZp/Ka4wzJdK0LWVytLPM=
github.com/goccy/go-json v0.10.4/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/golang-jwt/jwt/v4 v4.5.1 h1:JdqV9zKUdtaa9gdPlywC3aeoEsR681PlKC+4F5gQgeo=
github.com/golang-jwt/jwt/v4 v4.5.1/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-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
@@ -154,8 +148,8 @@ github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD
github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
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.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
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=
@@ -165,10 +159,6 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gT
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
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/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/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=
@@ -189,16 +177,10 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
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/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=
@@ -213,8 +195,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.24.1 h1:Hhx3L4eap7g3kyBQ8OuWneZo7mYu1lrMvqQpxjK+zcs=
github.com/pocketbase/pocketbase v0.24.1/go.mod h1:VVaUmgKgjCBW3s/ob2SSHuDNtTboTbwK/VyTUguTt3o=
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=
@@ -225,19 +207,19 @@ 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.12 h1:qvePBOk20e0IKA1QXrIIU+jmk+zEiYVVx06WjBRlZo4=
github.com/shirou/gopsutil/v4 v4.24.12/go.mod h1:DCtMPAad2XceTeIAbGyVfycbYQNBGk2P8cvDi7/VN9o=
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=
@@ -252,43 +234,42 @@ 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/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.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
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.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
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-20250103183323-7d7fa50e5329 h1:9kj3STMvgqy3YA4VQXBrN7925ICMxD5wzMRcgA30588=
golang.org/x/exp v0.0.0-20250103183323-7d7fa50e5329/go.mod h1:qj5a5QZpwLU2NLQudwIN5koi3beDhSAlJwa67PuM98c=
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.23.0 h1:HseQ7c2OpPKTPVzNjG5fwJsOTCiiwS4QdsYi5XU6H68=
golang.org/x/image v0.23.0/go.mod h1:wJJBTdLfCCf3tiHa1fNxpZmUI4mmoZvwMCPP0ddoNKY=
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.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=
@@ -298,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.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
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.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
golang.org/x/oauth2 v0.25.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.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.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.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
golang.org/x/sys v0.29.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.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
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.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
golang.org/x/time v0.8.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.28.0 h1:WuB6qZ4RPCQo5aP3WdKZS7i595EdWqWR8vqJTlwTVK8=
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
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.214.0 h1:h2Gkq07OYi6kusGOaT/9rnNljuXmqPnaig7WGPmKbwA=
google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE=
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,15 +337,15 @@ google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phr
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-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
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.69.2 h1:U3S9QEtbXC0bYNvRtcoklF3xGtLViumSYxWykJS+7AU=
google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
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=
@@ -391,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.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
google.golang.org/protobuf v1.36.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=
@@ -413,21 +377,19 @@ 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.4.1 h1:9cNzOqPyMJBvrUipmynX0ZohMhcxPtMccYgGOJdOiBw=
modernc.org/gc/v2 v2.4.1/go.mod h1:wzN5dK1AzVGoH6XOzc3YZ+ey/jPgYHLuVckd62P0GYU=
modernc.org/gc/v3 v3.0.0-20250105121824-520be1a3aee6 h1:JoKwHjIFumiKrjMbp1cNbC5E9UyCgA/ZcID0xOWQ2N8=
modernc.org/gc/v3 v3.0.0-20250105121824-520be1a3aee6/go.mod h1:LG5UO1Ran4OO0JRKz2oNiXhR5nNrgz0PzH7UKhz0aMU=
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.1 h1:HS1HRg1jEohnuONobEq2WrLEhLyw8+J42yLFTnllm2A=
modernc.org/memory v1.8.1/go.mod h1:ZbjSvMO5NQ1A2i3bWeDiVMxIorXwdClKE/0SZ+BMotU=
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.34.4 h1:sjdARozcL5KJBvYQvLlZEmctRgW9xqIZc2ncN7PU0P8=
modernc.org/sqlite v1.34.4/go.mod h1:3QQFCG2SEMtc2nv+Wq4cQCH7Hjcg+p/RMlS1XK+zwbk=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
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=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=

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"
@@ -16,28 +17,31 @@ import (
// 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:"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 (%)"`
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)"`
}
// gpuCollector defines a collector for a specific GPU management utility (nvidia-smi or rocm-smi)
type gpuCollector struct {
name string
cmd *exec.Cmd
parse func([]byte) bool // returns true if valid data was found
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
@@ -60,71 +64,118 @@ func (c *gpuCollector) start() {
// collect executes the command, parses output with the assigned parser function
func (c *gpuCollector) collect() error {
stdout, err := c.cmd.StdoutPipe()
cmd := exec.Command(c.name, c.cmdArgs...)
stdout, err := cmd.StdoutPipe()
if err != nil {
return err
}
if err := c.cmd.Start(); err != nil {
if err := cmd.Start(); err != nil {
return err
}
scanner := bufio.NewScanner(stdout)
buf := make([]byte, 0, 8*1024)
scanner.Buffer(buf, bufio.MaxScanTokenSize)
hasValidData := false
for scanner.Scan() {
if c.parse(scanner.Bytes()) {
hasValidData = true
}
if c.buf == nil {
c.buf = make([]byte, 0, 4*1024)
}
scanner.Buffer(c.buf, bufio.MaxScanTokenSize)
if !hasValidData {
return errNoValidData
for scanner.Scan() {
hasValidData := c.parse(scanner.Bytes())
if !hasValidData {
return errNoValidData
}
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("scanner error: %w", err)
}
return c.cmd.Wait()
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) bool {
fields := strings.Split(string(output), ", ")
if len(fields) < 7 {
return false
}
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++
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++
}
return true
return valid
}
// parseAmdData parses the output of rocm-smi and updates the GPUData map
@@ -133,24 +184,26 @@ func (gm *GPUManager) parseAmdData(output []byte) bool {
if err := json.Unmarshal(output, &rocmSmiInfo); err != nil || len(rocmSmiInfo) == 0 {
return false
}
gm.mutex.Lock()
defer gm.mutex.Unlock()
gm.Lock()
defer gm.Unlock()
for _, v := range rocmSmiInfo {
temp, _ := strconv.ParseFloat(v.Temperature, 64)
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++
@@ -160,8 +213,8 @@ func (gm *GPUManager) parseAmdData(output []byte) bool {
// 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)
@@ -191,41 +244,58 @@ func (gm *GPUManager) GetCurrentData() map[string]system.GPUData {
return gpuData
}
// detectGPUs 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
// 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.Command("nvidia-smi").Run(); err == nil {
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")
}
// 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":
nvidia := gpuCollector{
name: "nvidia-smi",
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"),
parse: gm.parseNvidiaData,
}
go nvidia.start()
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":
amdCollector := gpuCollector{
name: "rocm-smi",
cmd: exec.Command("/bin/sh", "-c",
"while true; do rocm-smi --showid --showtemp --showuse --showpower --showproductname --showmeminfo vram --json; sleep 4.3; done"),
parse: gm.parseAmdData,
}
go amdCollector.start()
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)
}
}()
}
}
@@ -235,7 +305,7 @@ func NewGPUManager() (*GPUManager, error) {
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 {
gm.startCollector("nvidia-smi")
@@ -243,6 +313,9 @@ func NewGPUManager() (*GPUManager, error) {
if gm.rocmSmi {
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, "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

@@ -138,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()
@@ -178,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))
@@ -224,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)
}
}
}
@@ -239,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,26 +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/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/apis"
"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 {
@@ -61,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 *core.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.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
// 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.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 := 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.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,
})
}
}
// todo: allow x minutes downtime before sending alert
func (am *AlertManager) HandleStatusAlerts(newStatus string, oldSystemRecord *core.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.FindAllRecords("alerts",
dbx.HashExp{
"system": oldSystemRecord.Id,
"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.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.Id,
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.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{
@@ -423,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 {
@@ -439,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 {
@@ -460,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
@@ -501,16 +188,6 @@ 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(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {

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

@@ -28,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
@@ -49,7 +49,7 @@ func (h *Hub) syncSystemsWithConfig() error {
// Create a map of email to user ID
userEmailToID := make(map[string]string)
users, err := h.app.FindAllRecords("users", dbx.NewExp("id != ''"))
users, err := h.FindAllRecords("users", dbx.NewExp("id != ''"))
if err != nil {
return err
}
@@ -84,7 +84,7 @@ func (h *Hub) syncSystemsWithConfig() error {
}
// Get existing systems
existingSystems, err := h.app.FindAllRecords("systems", dbx.NewExp("id != ''"))
existingSystems, err := h.FindAllRecords("systems", dbx.NewExp("id != ''"))
if err != nil {
return err
}
@@ -104,13 +104,13 @@ func (h *Hub) syncSystemsWithConfig() error {
existingSystem.Set("name", sysConfig.Name)
existingSystem.Set("users", sysConfig.Users)
existingSystem.Set("port", sysConfig.Port)
if err := h.app.Save(existingSystem); err != nil {
if err := h.Save(existingSystem); err != nil {
return err
}
delete(existingSystemsMap, key)
} else {
// Create new system
systemsCollection, err := h.app.FindCollectionByNameOrId("systems")
systemsCollection, err := h.FindCollectionByNameOrId("systems")
if err != nil {
return fmt.Errorf("failed to find systems collection: %v", err)
}
@@ -121,7 +121,7 @@ func (h *Hub) syncSystemsWithConfig() error {
newSystem.Set("users", sysConfig.Users)
newSystem.Set("info", system.Info{})
newSystem.Set("status", "pending")
if err := h.app.Save(newSystem); err != nil {
if err := h.Save(newSystem); err != nil {
return fmt.Errorf("failed to create new system: %v", err)
}
}
@@ -129,7 +129,7 @@ func (h *Hub) syncSystemsWithConfig() error {
// Delete systems not in config
for _, system := range existingSystemsMap {
if err := h.app.Delete(system); err != nil {
if err := h.Delete(system); err != nil {
return err
}
}
@@ -141,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.FindRecordsByFilter("systems", "id != ''", "name", -1, 0)
systems, err := h.FindRecordsByFilter("systems", "id != ''", "name", -1, 0)
if err != nil {
return "", err
}
@@ -194,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.FindRecordsByIds("users", userIDs)
users, err := h.FindRecordsByIds("users", userIDs)
if err != nil {
return nil, err
}

View File

@@ -8,11 +8,11 @@ import (
"beszel/internal/records"
"beszel/internal/users"
"beszel/site"
"context"
"crypto/ed25519"
"encoding/pem"
"fmt"
"io/fs"
"log"
"net"
"net/http"
@@ -20,7 +20,6 @@ import (
"net/url"
"os"
"strings"
"sync"
"time"
"github.com/goccy/go-json"
@@ -28,72 +27,101 @@ import (
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
"github.com/spf13/cobra"
"golang.org/x/crypto/ssh"
)
type Hub struct {
app *pocketbase.PocketBase
systemConnections sync.Map
sshClientConfig *ssh.ClientConfig
pubKey string
am *alerts.AlertManager
um *users.UserManager
rm *records.RecordManager
systemStats *core.Collection
containerStats *core.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,
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.OnServe().BindFunc(func(se *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.app.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.FindCollectionByNameOrId("users")
usersCollection, err := h.FindCollectionByNameOrId("users")
if err != nil {
return err
}
// disable email auth if DISABLE_PASSWORD_AUTH env var is set
usersCollection.PasswordAuth.Enabled = os.Getenv("DISABLE_PASSWORD_AUTH") != "true"
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
}
// allow oauth user creation if USER_CREATION is set
if os.Getenv("USER_CREATION") == "true" {
if userCreation, _ := GetEnv("USER_CREATION"); userCreation == "true" {
cr := "@request.context = 'oauth2'"
usersCollection.CreateRule = &cr
} else {
usersCollection.CreateRule = nil
}
if err := h.app.Save(usersCollection); err != nil {
if err := h.Save(usersCollection); err != nil {
return err
}
// sync systems with config
@@ -102,40 +130,60 @@ func (h *Hub) Run() {
})
// serve web ui
h.app.OnServe().BindFunc(func(se *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",
})
se.Router.Any("/", func(e *core.RequestEvent) error {
se.Router.GET("/{path...}", func(e *core.RequestEvent) error {
proxy.ServeHTTP(e.Response, e.Request)
return nil
})
default:
csp, cspExists := os.LookupEnv("CSP")
se.Router.Any("/{path...}", func(e *core.RequestEvent) error {
// parse app url
parsedURL, err := url.Parse(h.appURL)
if err != nil {
return err
}
// 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)
}
indexFallback := !strings.HasPrefix(e.Request.URL.Path, "/static/")
return apis.Static(site.DistDirFS, indexFallback)(e)
return e.HTML(http.StatusOK, indexContent)
})
}
return se.Next()
})
// set up scheduled jobs / ticker for system updates
h.app.OnServe().BindFunc(func(se *core.ServeEvent) error {
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.app.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
h.Cron().MustAdd("delete old records", "8 * * * *", h.rm.DeleteOldRecords)
// create longer records every 10 minutes
h.app.Cron().MustAdd("create longer records", "*/10 * * * *", func() {
h.Cron().MustAdd("create longer records", "*/10 * * * *", func() {
if systemStats, containerStats, err := h.getCollections(); err == nil {
h.rm.CreateLongerRecords([]*core.Collection{systemStats, containerStats})
}
@@ -144,7 +192,7 @@ func (h *Hub) Run() {
})
// custom api routes
h.app.OnServe().BindFunc(func(se *core.ServeEvent) error {
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()
@@ -155,7 +203,7 @@ func (h *Hub) Run() {
})
// check if first time setup on login page
se.Router.GET("/api/beszel/first-run", func(e *core.RequestEvent) error {
total, err := h.app.CountRecords("users")
total, err := h.CountRecords("users")
return e.JSON(http.StatusOK, map[string]bool{"firstRun": err == nil && total == 0})
})
// send test notification
@@ -163,31 +211,31 @@ func (h *Hub) Run() {
// API endpoint to get config.yml content
se.Router.GET("/api/beszel/config-yaml", h.getYamlConfig)
// create first user endpoint only needed if no users exist
if totalUsers, _ := h.app.CountRecords("users"); totalUsers == 0 {
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.OnRecordCreate("systems").BindFunc(func(e *core.RecordEvent) error {
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.OnRecordAfterCreateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
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.OnRecordCreate("users").BindFunc(h.um.InitializeUserRole)
h.app.OnRecordCreate("user_settings").BindFunc(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.OnRecordUpdate("systems").BindFunc(func(e *core.RecordEvent) error {
h.OnRecordUpdate("systems").BindFunc(func(e *core.RecordEvent) error {
if e.Record.GetString("status") == "paused" {
e.Record.Set("info", system.Info{})
}
@@ -195,13 +243,13 @@ func (h *Hub) Run() {
})
// do things after a systems record is updated
h.app.OnRecordAfterUpdateSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
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)
}
@@ -210,18 +258,17 @@ func (h *Hub) Run() {
go h.updateSystem(newRecord)
} else {
h.am.HandleStatusAlerts(newStatus, oldRecord)
}
return e.Next()
})
// if system is deleted, close connection
h.app.OnRecordAfterDeleteSuccess("systems").BindFunc(func(e *core.RecordEvent) error {
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)
}
}
@@ -234,7 +281,7 @@ func (h *Hub) startSystemUpdateTicker() {
}
func (h *Hub) updateSystems() {
records, err := h.app.FindRecordsByFilter(
records, err := h.FindRecordsByFilter(
"2hz5ncl8tizk5nx", // systems collection
"status != 'paused'", // filter
"updated", // sort
@@ -243,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)
@@ -268,52 +315,52 @@ func (h *Hub) updateSystem(record *core.Record) {
var err error
// check if system connection exists
if existingClient, ok := h.systemConnections.Load(record.Id); ok {
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.systemConnections.Store(record.Id, client)
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
record.Set("status", "up")
record.Set("info", systemData.Info)
if err := h.app.SaveNoValidate(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 := core.NewRecord(systemStats)
systemStatsRecord.Set("system", record.Id)
systemStatsRecord.Set("stats", systemData.Stats)
systemStatsRecord.Set("type", "1m")
if err := h.app.SaveNoValidate(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 {
@@ -321,29 +368,29 @@ func (h *Hub) updateSystem(record *core.Record) {
containerStatsRecord.Set("system", record.Id)
containerStatsRecord.Set("stats", systemData.Containers)
containerStatsRecord.Set("type", "1m")
if err := h.app.SaveNoValidate(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
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() (*core.Collection, *core.Collection, error) {
if h.systemStats == nil {
systemStats, err := h.app.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.FindCollectionByNameOrId("container_stats")
containerStats, err := h.FindCollectionByNameOrId("container_stats")
if err != nil {
return nil, nil, err
}
@@ -356,24 +403,31 @@ func (h *Hub) getCollections() (*core.Collection, *core.Collection, error) {
func (h *Hub) updateSystemStatus(record *core.Record, status string) {
if record.Fresh().GetString("status") != status {
record.Set("status", status)
if err := h.app.SaveNoValidate(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())
}
}
}
// delete system connection from map and close connection
func (h *Hub) deleteSystemConnection(record *core.Record) {
if client, ok := h.systemConnections.Load(record.Id); ok {
if client, ok := h.Store().GetOk(record.Id); ok {
if sshClient := client.(*ssh.Client); sshClient != nil {
sshClient.Close()
}
h.systemConnections.Delete(record.Id)
h.Store().Remove(record.Id)
}
}
func (h *Hub) createSystemConnection(record *core.Record) (*ssh.Client, error) {
client, err := ssh.Dial("tcp", net.JoinHostPort(record.GetString("host"), record.GetString("port")), h.sshClientConfig)
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
}
@@ -383,7 +437,7 @@ func (h *Hub) createSystemConnection(record *core.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
}
@@ -460,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
@@ -474,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
}
@@ -518,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,13 +10,12 @@ import (
"github.com/goccy/go-json"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/types"
)
type RecordManager struct {
app *pocketbase.PocketBase
app core.App
}
type LongerRecordData struct {
@@ -35,7 +34,7 @@ type RecordStats []struct {
Stats []byte `db:"stats"`
}
func NewRecordManager(app *pocketbase.PocketBase) *RecordManager {
func NewRecordManager(app core.App) *RecordManager {
return &RecordManager{app}
}

View File

@@ -5,14 +5,12 @@ import (
"beszel/migrations"
"log"
"net/http"
"strings"
"github.com/pocketbase/pocketbase"
"github.com/pocketbase/pocketbase/core"
)
type UserManager struct {
app *pocketbase.PocketBase
app core.App
}
type UserSettings struct {
@@ -22,7 +20,7 @@ type UserSettings struct {
// Language string `json:"lang"`
}
func NewUserManager(app *pocketbase.PocketBase) *UserManager {
func NewUserManager(app core.App) *UserManager {
return &UserManager{
app: app,
}
@@ -98,9 +96,6 @@ func (um *UserManager) CreateFirstUser(e *core.RequestEvent) error {
user.SetPassword(data.Password)
user.Set("role", "admin")
user.Set("verified", true)
if username := strings.Split(data.Email, "@")[0]; len(username) > 2 {
user.Set("username", username)
}
if err := um.app.Save(user); err != nil {
return e.JSON(http.StatusInternalServerError, map[string]string{"err": err.Error()})
}

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)
})
}

Binary file not shown.

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,6 +4,7 @@ const config: LinguiConfig = {
locales: [
"en",
"ar",
"bg",
"cs",
"da",
"de",
@@ -11,10 +12,13 @@ const config: LinguiConfig = {
"fa",
"fr",
"hr",
"hu",
"it",
"is",
"ja",
"ko",
"nl",
"no",
"pl",
"pt",
"tr",
@@ -23,6 +27,7 @@ const config: LinguiConfig = {
"sv",
"uk",
"vi",
"zh",
"zh-CN",
"zh-HK",
],

View File

@@ -14,20 +14,20 @@
"@lingui/react": "^4.14.1",
"@nanostores/react": "^0.7.3",
"@nanostores/router": "^0.11.0",
"@radix-ui/react-alert-dialog": "^1.1.4",
"@radix-ui/react-checkbox": "^1.1.3",
"@radix-ui/react-dialog": "^1.1.4",
"@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.4",
"@radix-ui/react-label": "^2.1.1",
"@radix-ui/react-select": "^2.1.4",
"@radix-ui/react-separator": "^1.1.1",
"@radix-ui/react-slider": "^1.2.2",
"@radix-ui/react-slot": "^1.1.1",
"@radix-ui/react-switch": "^1.1.2",
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-toast": "^1.2.4",
"@radix-ui/react-tooltip": "^1.1.6",
"@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",
@@ -35,11 +35,11 @@
"d3-time": "^3.1.0",
"lucide-react": "^0.452.0",
"nanostores": "^0.11.3",
"pocketbase": "^0.22.1",
"pocketbase": "^0.25.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"recharts": "^2.15.0",
"tailwind-merge": "^2.5.5",
"recharts": "^2.15.1",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"valibot": "^0.36.0"
},
@@ -47,16 +47,16 @@
"@lingui/cli": "^4.14.1",
"@lingui/swc-plugin": "^4.1.0",
"@lingui/vite-plugin": "^4.14.1",
"@types/bun": "^1.1.14",
"@types/react": "^18.3.17",
"@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.49",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"tailwindcss-rtl": "^0.9.0",
"typescript": "^5.7.2",
"vite": "^5.4.11"
"typescript": "^5.7.3",
"vite": "^5.4.14"
},
"optionalDependencies": {
"@esbuild/linux-arm64": "^0.21.5"
@@ -1079,22 +1079,22 @@
}
},
"node_modules/@floating-ui/core": {
"version": "1.6.8",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
"integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
"version": "1.6.9",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.9.tgz",
"integrity": "sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==",
"license": "MIT",
"dependencies": {
"@floating-ui/utils": "^0.2.8"
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/dom": {
"version": "1.6.12",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
"integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
"version": "1.6.13",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.13.tgz",
"integrity": "sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==",
"license": "MIT",
"dependencies": {
"@floating-ui/core": "^1.6.0",
"@floating-ui/utils": "^0.2.8"
"@floating-ui/utils": "^0.2.9"
}
},
"node_modules/@floating-ui/react-dom": {
@@ -1111,9 +1111,9 @@
}
},
"node_modules/@floating-ui/utils": {
"version": "0.2.8",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
"integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==",
"version": "0.2.9",
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz",
"integrity": "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==",
"license": "MIT"
},
"node_modules/@henrygd/queue": {
@@ -2246,17 +2246,17 @@
"license": "MIT"
},
"node_modules/@radix-ui/react-alert-dialog": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.4.tgz",
"integrity": "sha512-A6Kh23qZDLy3PSU4bh2UJZznOrUdHImIXqF8YtUa6CN73f8EOO9XlXSCd9IHyPvIquTaa/kwaSWzZTtUvgXVGw==",
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.6.tgz",
"integrity": "sha512-p4XnPqgej8sZAAReCAKgz1REYZEBLR8hU9Pg27wFnCWIMc8g1ccCs0FjBcy05V15VTu8pAePw/VDYeOm/uZ6yQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-dialog": "1.1.4",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-slot": "1.1.1"
"@radix-ui/react-dialog": "1.1.6",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-slot": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2274,12 +2274,12 @@
}
},
"node_modules/@radix-ui/react-arrow": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz",
"integrity": "sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.1.2.tgz",
"integrity": "sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.1"
"@radix-ui/react-primitive": "2.0.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2297,16 +2297,16 @@
}
},
"node_modules/@radix-ui/react-checkbox": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.3.tgz",
"integrity": "sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-checkbox/-/react-checkbox-1.1.4.tgz",
"integrity": "sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-use-previous": "1.1.0",
"@radix-ui/react-use-size": "1.1.0"
@@ -2327,15 +2327,15 @@
}
},
"node_modules/@radix-ui/react-collection": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.1.tgz",
"integrity": "sha512-LwT3pSho9Dljg+wY2KN2mrrh6y3qELfftINERIzBUO9e0N+t0oMTyn3k9iv+ZqgrwGkRnLpNJrsMv9BZlt2yuA==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.1.2.tgz",
"integrity": "sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-slot": "1.1.1"
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-slot": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2383,25 +2383,25 @@
}
},
"node_modules/@radix-ui/react-dialog": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz",
"integrity": "sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA==",
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.6.tgz",
"integrity": "sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-dismissable-layer": "1.1.3",
"@radix-ui/react-dismissable-layer": "1.1.5",
"@radix-ui/react-focus-guards": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.2",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-portal": "1.1.3",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-slot": "1.1.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-slot": "1.1.2",
"@radix-ui/react-use-controllable-state": "1.1.0",
"aria-hidden": "^1.1.1",
"react-remove-scroll": "^2.6.1"
"aria-hidden": "^1.2.4",
"react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
"@types/react": "*",
@@ -2434,14 +2434,14 @@
}
},
"node_modules/@radix-ui/react-dismissable-layer": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz",
"integrity": "sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.5.tgz",
"integrity": "sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"@radix-ui/react-use-escape-keydown": "1.1.0"
},
@@ -2461,17 +2461,17 @@
}
},
"node_modules/@radix-ui/react-dropdown-menu": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.4.tgz",
"integrity": "sha512-iXU1Ab5ecM+yEepGAWK8ZhMyKX4ubFdCNtol4sT9D0OVErG9PNElfx3TQhjw7n7BC5nFVz68/5//clWy+8TXzA==",
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.6.tgz",
"integrity": "sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-menu": "2.1.4",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-menu": "2.1.6",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-controllable-state": "1.1.0"
},
"peerDependencies": {
@@ -2505,13 +2505,13 @@
}
},
"node_modules/@radix-ui/react-focus-scope": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz",
"integrity": "sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.2.tgz",
"integrity": "sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0"
},
"peerDependencies": {
@@ -2548,12 +2548,12 @@
}
},
"node_modules/@radix-ui/react-label": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.1.tgz",
"integrity": "sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-label/-/react-label-2.1.2.tgz",
"integrity": "sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.1"
"@radix-ui/react-primitive": "2.0.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2571,29 +2571,29 @@
}
},
"node_modules/@radix-ui/react-menu": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.4.tgz",
"integrity": "sha512-BnOgVoL6YYdHAG6DtXONaR29Eq4nvbi8rutrV/xlr3RQCMMb3yqP85Qiw/3NReozrSW+4dfLkK+rc1hb4wPU/A==",
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.6.tgz",
"integrity": "sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-collection": "1.1.1",
"@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-dismissable-layer": "1.1.3",
"@radix-ui/react-dismissable-layer": "1.1.5",
"@radix-ui/react-focus-guards": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.2",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-popper": "1.2.1",
"@radix-ui/react-portal": "1.1.3",
"@radix-ui/react-popper": "1.2.2",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-roving-focus": "1.1.1",
"@radix-ui/react-slot": "1.1.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-roving-focus": "1.1.2",
"@radix-ui/react-slot": "1.1.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"aria-hidden": "^1.1.1",
"react-remove-scroll": "^2.6.1"
"aria-hidden": "^1.2.4",
"react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
"@types/react": "*",
@@ -2611,16 +2611,16 @@
}
},
"node_modules/@radix-ui/react-popper": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.1.tgz",
"integrity": "sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.2.2.tgz",
"integrity": "sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==",
"license": "MIT",
"dependencies": {
"@floating-ui/react-dom": "^2.0.0",
"@radix-ui/react-arrow": "1.1.1",
"@radix-ui/react-arrow": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"@radix-ui/react-use-layout-effect": "1.1.0",
"@radix-ui/react-use-rect": "1.1.0",
@@ -2643,12 +2643,12 @@
}
},
"node_modules/@radix-ui/react-portal": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.3.tgz",
"integrity": "sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==",
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.4.tgz",
"integrity": "sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-layout-effect": "1.1.0"
},
"peerDependencies": {
@@ -2691,12 +2691,12 @@
}
},
"node_modules/@radix-ui/react-primitive": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz",
"integrity": "sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.2.tgz",
"integrity": "sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-slot": "1.1.1"
"@radix-ui/react-slot": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2714,18 +2714,18 @@
}
},
"node_modules/@radix-ui/react-roving-focus": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.1.tgz",
"integrity": "sha512-QE1RoxPGJ/Nm8Qmk0PxP8ojmoaS67i0s7hVssS7KuI2FQoc/uzVlZsqKfQvxPE6D8hICCPHJ4D88zNhT3OOmkw==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.2.tgz",
"integrity": "sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-collection": "1.1.1",
"@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"@radix-ui/react-use-controllable-state": "1.1.0"
},
@@ -2745,32 +2745,32 @@
}
},
"node_modules/@radix-ui/react-select": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.4.tgz",
"integrity": "sha512-pOkb2u8KgO47j/h7AylCj7dJsm69BXcjkrvTqMptFqsE2i0p8lHkfgneXKjAgPzBMivnoMyt8o4KiV4wYzDdyQ==",
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.1.6.tgz",
"integrity": "sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==",
"license": "MIT",
"dependencies": {
"@radix-ui/number": "1.1.0",
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-collection": "1.1.1",
"@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-dismissable-layer": "1.1.3",
"@radix-ui/react-dismissable-layer": "1.1.5",
"@radix-ui/react-focus-guards": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.1",
"@radix-ui/react-focus-scope": "1.1.2",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-popper": "1.2.1",
"@radix-ui/react-portal": "1.1.3",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-slot": "1.1.1",
"@radix-ui/react-popper": "1.2.2",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-slot": "1.1.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-use-layout-effect": "1.1.0",
"@radix-ui/react-use-previous": "1.1.0",
"@radix-ui/react-visually-hidden": "1.1.1",
"aria-hidden": "^1.1.1",
"react-remove-scroll": "^2.6.1"
"@radix-ui/react-visually-hidden": "1.1.2",
"aria-hidden": "^1.2.4",
"react-remove-scroll": "^2.6.3"
},
"peerDependencies": {
"@types/react": "*",
@@ -2788,12 +2788,12 @@
}
},
"node_modules/@radix-ui/react-separator": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.1.tgz",
"integrity": "sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-separator/-/react-separator-1.1.2.tgz",
"integrity": "sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.1"
"@radix-ui/react-primitive": "2.0.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2811,18 +2811,18 @@
}
},
"node_modules/@radix-ui/react-slider": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.2.tgz",
"integrity": "sha512-sNlU06ii1/ZcbHf8I9En54ZPW0Vil/yPVg4vQMcFNjrIx51jsHbFl1HYHQvCIWJSr1q0ZmA+iIs/ZTv8h7HHSA==",
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slider/-/react-slider-1.2.3.tgz",
"integrity": "sha512-nNrLAWLjGESnhqBqcCNW4w2nn7LxudyMzeB6VgdyAnFLC6kfQgnAjSL2v6UkQTnDctJBlxrmxfplWS4iYjdUTw==",
"license": "MIT",
"dependencies": {
"@radix-ui/number": "1.1.0",
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-collection": "1.1.1",
"@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-use-layout-effect": "1.1.0",
"@radix-ui/react-use-previous": "1.1.0",
@@ -2844,9 +2844,9 @@
}
},
"node_modules/@radix-ui/react-slot": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.1.tgz",
"integrity": "sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
"integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.1"
@@ -2862,15 +2862,15 @@
}
},
"node_modules/@radix-ui/react-switch": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.2.tgz",
"integrity": "sha512-zGukiWHjEdBCRyXvKR6iXAQG6qXm2esuAD6kDOi9Cn+1X6ev3ASo4+CsYaD6Fov9r/AQFekqnD/7+V0Cs6/98g==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-switch/-/react-switch-1.1.3.tgz",
"integrity": "sha512-1nc+vjEOQkJVsJtWPSiISGT6OKm4SiOdjMo+/icLxo2G4vxz1GntC5MzfL4v8ey9OEfw787QCD1y3mUv0NiFEQ==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-use-previous": "1.1.0",
"@radix-ui/react-use-size": "1.1.0"
@@ -2891,9 +2891,9 @@
}
},
"node_modules/@radix-ui/react-tabs": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.2.tgz",
"integrity": "sha512-9u/tQJMcC2aGq7KXpGivMm1mgq7oRJKXphDwdypPd/j21j/2znamPU8WkXgnhUaTrSFNIt8XhOyCAupg8/GbwQ==",
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.3.tgz",
"integrity": "sha512-9mFyI30cuRDImbmFF6O2KUJdgEOsGh9Vmx9x/Dh9tOhL7BngmQPQfwW4aejKm5OHpfWIdmeV6ySyuxoOGjtNng==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
@@ -2901,8 +2901,8 @@
"@radix-ui/react-direction": "1.1.0",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-roving-focus": "1.1.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-roving-focus": "1.1.2",
"@radix-ui/react-use-controllable-state": "1.1.0"
},
"peerDependencies": {
@@ -2921,23 +2921,23 @@
}
},
"node_modules/@radix-ui/react-toast": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.4.tgz",
"integrity": "sha512-Sch9idFJHJTMH9YNpxxESqABcAFweJG4tKv+0zo0m5XBvUSL8FM5xKcJLFLXononpePs8IclyX1KieL5SDUNgA==",
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-toast/-/react-toast-1.2.6.tgz",
"integrity": "sha512-gN4dpuIVKEgpLn1z5FhzT9mYRUitbfZq9XqN/7kkBMUgFTzTG8x/KszWJugJXHcwxckY8xcKDZPz7kG3o6DsUA==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-collection": "1.1.1",
"@radix-ui/react-collection": "1.1.2",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-dismissable-layer": "1.1.3",
"@radix-ui/react-portal": "1.1.3",
"@radix-ui/react-dismissable-layer": "1.1.5",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-use-callback-ref": "1.1.0",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-use-layout-effect": "1.1.0",
"@radix-ui/react-visually-hidden": "1.1.1"
"@radix-ui/react-visually-hidden": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -2955,23 +2955,23 @@
}
},
"node_modules/@radix-ui/react-tooltip": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz",
"integrity": "sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==",
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.1.8.tgz",
"integrity": "sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==",
"license": "MIT",
"dependencies": {
"@radix-ui/primitive": "1.1.1",
"@radix-ui/react-compose-refs": "1.1.1",
"@radix-ui/react-context": "1.1.1",
"@radix-ui/react-dismissable-layer": "1.1.3",
"@radix-ui/react-dismissable-layer": "1.1.5",
"@radix-ui/react-id": "1.1.0",
"@radix-ui/react-popper": "1.2.1",
"@radix-ui/react-portal": "1.1.3",
"@radix-ui/react-popper": "1.2.2",
"@radix-ui/react-portal": "1.1.4",
"@radix-ui/react-presence": "1.1.2",
"@radix-ui/react-primitive": "2.0.1",
"@radix-ui/react-slot": "1.1.1",
"@radix-ui/react-primitive": "2.0.2",
"@radix-ui/react-slot": "1.1.2",
"@radix-ui/react-use-controllable-state": "1.1.0",
"@radix-ui/react-visually-hidden": "1.1.1"
"@radix-ui/react-visually-hidden": "1.1.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -3106,12 +3106,12 @@
}
},
"node_modules/@radix-ui/react-visually-hidden": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz",
"integrity": "sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg==",
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.2.tgz",
"integrity": "sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==",
"license": "MIT",
"dependencies": {
"@radix-ui/react-primitive": "2.0.1"
"@radix-ui/react-primitive": "2.0.2"
},
"peerDependencies": {
"@types/react": "*",
@@ -3624,13 +3624,13 @@
}
},
"node_modules/@types/bun": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.14.tgz",
"integrity": "sha512-opVYiFGtO2af0dnWBdZWlioLBoxSdDO5qokaazLhq8XQtGZbY4pY3/JxY8Zdf/hEwGubbp7ErZXoN1+h2yesxA==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.2.2.tgz",
"integrity": "sha512-tr74gdku+AEDN5ergNiBnplr7hpDp3V1h7fqI2GcR/rsUaM39jpSeKH0TFibRvU0KwniRx5POgaYnaXbk0hU+w==",
"dev": true,
"license": "MIT",
"dependencies": {
"bun-types": "1.1.37"
"bun-types": "1.2.2"
}
},
"node_modules/@types/d3-array": {
@@ -3750,9 +3750,9 @@
"license": "MIT"
},
"node_modules/@types/react": {
"version": "18.3.17",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.17.tgz",
"integrity": "sha512-opAQ5no6LqJNo9TqnxBKsgnkIYHozW9KSTlFVoSUJYh1Fl/sswkEoqIugRSm7tbh6pABtYjGAjW+GOS23j8qbw==",
"version": "18.3.18",
"resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz",
"integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -3771,9 +3771,9 @@
}
},
"node_modules/@types/ws": {
"version": "8.5.13",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
"integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
"version": "8.5.14",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.14.tgz",
"integrity": "sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -4100,13 +4100,13 @@
}
},
"node_modules/bun-types": {
"version": "1.1.37",
"resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.37.tgz",
"integrity": "sha512-C65lv6eBr3LPJWFZ2gswyrGZ82ljnH8flVE03xeXxKhi2ZGtFiO4isRKTKnitbSqtRAcaqYSR6djt1whI66AbA==",
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.2.2.tgz",
"integrity": "sha512-RCbMH5elr9gjgDGDhkTTugA21XtJAy/9jkKe/G3WR2q17VPGhcquf9Sir6uay9iW+7P/BV0CAHA1XlHXMAVKHg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "~20.12.8",
"@types/node": "*",
"@types/ws": "~8.5.10"
}
},
@@ -4724,9 +4724,9 @@
}
},
"node_modules/fast-equals": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz",
"integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==",
"version": "5.2.2",
"resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz",
"integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==",
"license": "MIT",
"engines": {
"node": ">=6.0.0"
@@ -6167,9 +6167,9 @@
}
},
"node_modules/pocketbase": {
"version": "0.22.1",
"resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.22.1.tgz",
"integrity": "sha512-hnzpDcIx5kbkUJXz6IkiTox6R4nb706u4rPSMy2FYCaI2OqBnFxbY0qwWBSqx1ERz/Xi61Uguf17Gb9bWZ8+kw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/pocketbase/-/pocketbase-0.25.1.tgz",
"integrity": "sha512-2IH0KLI/qMNR/E17C7BGWX2FxW7Tead+igLHOWZ45P56v/NyVT18Jnmddeft+3qWWGL1Hog2F8bc4orWV/+Fcg==",
"license": "MIT"
},
"node_modules/pofile": {
@@ -6180,9 +6180,9 @@
"license": "MIT"
},
"node_modules/postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
"integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
"version": "8.5.1",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
"integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
"funding": [
{
"type": "opencollective",
@@ -6199,7 +6199,7 @@
],
"license": "MIT",
"dependencies": {
"nanoid": "^3.3.7",
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@@ -6460,16 +6460,16 @@
"license": "MIT"
},
"node_modules/react-remove-scroll": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz",
"integrity": "sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw==",
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.3.tgz",
"integrity": "sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==",
"license": "MIT",
"dependencies": {
"react-remove-scroll-bar": "^2.3.7",
"react-style-singleton": "^2.2.1",
"react-style-singleton": "^2.2.3",
"tslib": "^2.1.0",
"use-callback-ref": "^1.3.3",
"use-sidecar": "^1.1.2"
"use-sidecar": "^1.1.3"
},
"engines": {
"node": ">=10"
@@ -6507,9 +6507,9 @@
}
},
"node_modules/react-smooth": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.1.tgz",
"integrity": "sha512-OE4hm7XqR0jNOq3Qmk9mFLyd6p2+j6bvbPJ7qlB7+oo0eNcL2l7WQzG6MBnT3EXY6xzkLMUBec3AfewJdA0J8w==",
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz",
"integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==",
"license": "MIT",
"dependencies": {
"fast-equals": "^5.0.1",
@@ -6517,8 +6517,8 @@
"react-transition-group": "^4.4.5"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/react-style-singleton": {
@@ -6596,16 +6596,16 @@
}
},
"node_modules/recharts": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.0.tgz",
"integrity": "sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw==",
"version": "2.15.1",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz",
"integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==",
"license": "MIT",
"dependencies": {
"clsx": "^2.0.0",
"eventemitter3": "^4.0.1",
"lodash": "^4.17.21",
"react-is": "^18.3.1",
"react-smooth": "^4.0.0",
"react-smooth": "^4.0.4",
"recharts-scale": "^0.4.4",
"tiny-invariant": "^1.3.1",
"victory-vendor": "^36.6.8"
@@ -7034,9 +7034,9 @@
}
},
"node_modules/tailwind-merge": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.5.5.tgz",
"integrity": "sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==",
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.6.0.tgz",
"integrity": "sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==",
"license": "MIT",
"funding": {
"type": "github",
@@ -7200,9 +7200,9 @@
}
},
"node_modules/typescript": {
"version": "5.7.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz",
"integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==",
"version": "5.7.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz",
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"devOptional": true,
"license": "Apache-2.0",
"bin": {
@@ -7343,9 +7343,9 @@
}
},
"node_modules/vite": {
"version": "5.4.11",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz",
"integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==",
"version": "5.4.14",
"resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz",
"integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==",
"dev": true,
"license": "MIT",
"dependencies": {

View File

@@ -17,20 +17,20 @@
"@lingui/react": "^4.14.1",
"@nanostores/react": "^0.7.3",
"@nanostores/router": "^0.11.0",
"@radix-ui/react-alert-dialog": "^1.1.4",
"@radix-ui/react-checkbox": "^1.1.3",
"@radix-ui/react-dialog": "^1.1.4",
"@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.4",
"@radix-ui/react-label": "^2.1.1",
"@radix-ui/react-select": "^2.1.4",
"@radix-ui/react-separator": "^1.1.1",
"@radix-ui/react-slider": "^1.2.2",
"@radix-ui/react-slot": "^1.1.1",
"@radix-ui/react-switch": "^1.1.2",
"@radix-ui/react-tabs": "^1.1.2",
"@radix-ui/react-toast": "^1.2.4",
"@radix-ui/react-tooltip": "^1.1.6",
"@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",
@@ -38,11 +38,11 @@
"d3-time": "^3.1.0",
"lucide-react": "^0.452.0",
"nanostores": "^0.11.3",
"pocketbase": "^0.22.1",
"pocketbase": "^0.25.1",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"recharts": "^2.15.0",
"tailwind-merge": "^2.5.5",
"recharts": "^2.15.1",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7",
"valibot": "^0.36.0"
},
@@ -50,16 +50,16 @@
"@lingui/cli": "^4.14.1",
"@lingui/swc-plugin": "^4.1.0",
"@lingui/vite-plugin": "^4.14.1",
"@types/bun": "^1.1.14",
"@types/react": "^18.3.17",
"@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.49",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"tailwindcss-rtl": "^0.9.0",
"typescript": "^5.7.2",
"vite": "^5.4.11"
"typescript": "^5.7.3",
"vite": "^5.4.14"
},
"overrides": {
"@nanostores/router": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

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

@@ -8,63 +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) {
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)
}
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)
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 (
@@ -80,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

@@ -160,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)
@@ -180,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}`}
@@ -198,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>
@@ -222,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

@@ -22,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)
@@ -55,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>
@@ -72,7 +73,7 @@ export default function CommandPalette({ open, setOpen }: { open: boolean; setOp
<CommandItem
keywords={["home"]}
onSelect={() => {
navigate("/")
navigate(basePath)
setOpen(false)
}}
>
@@ -86,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)
}}
>
@@ -101,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)
}}
>

View File

@@ -7,14 +7,19 @@ 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(8, t`Password must be at least 8 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,
@@ -113,9 +118,49 @@ export function UserAuthForm({
return null
}
const oauthEnabled = authMethods.oauth2.enabled && authMethods.oauth2.providers.length > 0
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}>
{passwordEnabled && (
@@ -132,12 +177,12 @@ export function UserAuthForm({
name="email"
required
placeholder="name@example.com"
type="email"
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>
@@ -154,7 +199,7 @@ export function UserAuthForm({
type="password"
autoComplete="current-password"
disabled={isLoading || isOauthLoading}
className="ps-9 placeholder: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>
@@ -172,7 +217,7 @@ export function UserAuthForm({
type="password"
autoComplete="current-password"
disabled={isLoading || isOauthLoading}
className="ps-9 placeholder: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>
@@ -218,37 +263,7 @@ export function UserAuthForm({
"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 ? (
@@ -256,11 +271,11 @@ export function UserAuthForm({
) : (
<img
className="me-2 h-4 w-4 dark:brightness-0 dark:invert"
src={`/_/images/oauth2/${provider.name}.svg`}
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>
@@ -274,7 +289,7 @@ export function UserAuthForm({
<Dialog>
<DialogTrigger asChild>
<button type="button" className={cn(buttonVariants({ variant: "outline" }))}>
<img className="me-2 h-4 w-4 dark:invert" src="/_/images/oauth2/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>
@@ -307,7 +322,7 @@ export function UserAuthForm({
{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

@@ -10,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,
@@ -27,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"))
@@ -35,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 />
@@ -44,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" }))}
>
@@ -63,7 +64,7 @@ export default function Navbar() {
{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>
@@ -71,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>
@@ -79,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>
@@ -87,7 +88,7 @@ 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>
@@ -98,7 +99,7 @@ export default function Navbar() {
</>
)}
</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"))
@@ -83,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.

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"
@@ -37,7 +37,6 @@ import {
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogTrigger,
} from "@/components/ui/alert-dialog"
import { SystemRecord } from "@/types"
@@ -59,32 +58,39 @@ import {
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 { Link, 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-2 items-center tabular-nums tracking-tight">
<span className="min-w-[3.5em]">{decimalString(val, 1)}%</span>
<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 / 100})`,
@@ -95,7 +101,8 @@ function CellFormatter(info: CellContext<SystemRecord, unknown>) {
)
}
function sortableHeader(column: Column<SystemRecord, unknown>, hideSortIcon = false) {
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
const { column } = context
return (
<Button
variant="ghost"
@@ -103,9 +110,10 @@ function sortableHeader(column: Column<SystemRecord, unknown>, hideSortIcon = fa
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
{/* @ts-ignore */}
{column.columnDef?.icon && <column.columnDef.icon className="me-2 size-4" />}
{column.columnDef.icon && <column.columnDef.icon className="me-2 size-4" />}
{column.id}
{!hideSortIcon && <ArrowUpDownIcon className="ms-2 size-4" />}
{/* @ts-ignore */}
{column.columnDef.hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
</Button>
)
}
@@ -150,7 +158,7 @@ export default function SystemsTable() {
</Button>
</span>
),
header: ({ column }) => sortableHeader(column),
header: sortableHeader,
},
{
accessorKey: "info.cpu",
@@ -158,7 +166,7 @@ export default function SystemsTable() {
invertSorting: true,
cell: CellFormatter,
icon: CpuIcon,
header: ({ column }) => sortableHeader(column),
header: sortableHeader,
},
{
accessorKey: "info.mp",
@@ -166,7 +174,7 @@ export default function SystemsTable() {
invertSorting: true,
cell: CellFormatter,
icon: MemoryStickIcon,
header: ({ column }) => sortableHeader(column),
header: sortableHeader,
},
{
accessorKey: "info.dp",
@@ -174,15 +182,24 @@ export default function SystemsTable() {
invertSorting: true,
cell: CellFormatter,
icon: HardDriveIcon,
header: ({ column }) => sortableHeader(column),
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,
size: 50,
icon: EthernetIcon,
header: ({ column }) => sortableHeader(column),
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
return (
@@ -196,18 +213,48 @@ export default function SystemsTable() {
)
},
},
{
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>
)
},
},
{
accessorKey: "info.v",
id: t`Agent`,
invertSorting: true,
size: 50,
icon: WifiIcon,
header: ({ column }) => sortableHeader(column, true),
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={cn("flex gap-2 items-center md:pe-5 tabular-nums", {
@@ -215,8 +262,12 @@ export default function SystemsTable() {
})}
>
<IndicatorDot
system={info.row.original}
className={version === hubVersion ? "bg-green-500" : "bg-yellow-500"}
system={system}
className={
(system.status !== "up" && "bg-primary/30") ||
(version === hubVersion && "bg-green-500") ||
"bg-yellow-500"
}
/>
<span>{info.getValue() as string}</span>
</span>
@@ -225,7 +276,7 @@ export default function SystemsTable() {
},
{
id: t({ message: "Actions", comment: "Table column" }),
size: 120,
size: 50,
cell: ({ row }) => (
<div className="flex justify-end items-center gap-1">
<AlertsButton system={row.original} />
@@ -257,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">
@@ -387,7 +440,7 @@ export default function SystemsTable() {
))}
</TableHeader>
<TableBody>
{table.getRowModel().rows?.length ? (
{rows.length ? (
table.getRowModel().rows.map((row) => (
<TableRow
key={row.original.id}
@@ -398,7 +451,7 @@ export default function SystemsTable() {
onClick={(e) => {
const target = e.target as HTMLElement
if (!target.closest("[data-nolink]") && e.currentTarget.contains(target)) {
navigate(`/system/${encodeURIComponent(row.original.name)}`)
navigate(getPagePath($router, "system", { name: row.original.name }))
}
}}
>
@@ -481,7 +534,7 @@ export default function SystemsTable() {
})}
</CardContent>
<Link
href={`/system/${encodeURIComponent(row.original.name)}`}
href={getPagePath($router, "system", { name: row.original.name })}
className="inset-0 absolute w-full h-full"
>
<span className="sr-only">{row.original.name}</span>
@@ -516,11 +569,15 @@ function IndicatorDot({ system, className }: { system: SystemRecord; className?:
)
}
function ActionsButton({ system }: { system: SystemRecord }) {
// const [opened, setOpened] = useState(false)
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 (
<AlertDialog>
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
@@ -531,6 +588,17 @@ function ActionsButton({ system }: { system: SystemRecord }) {
</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={() => {
@@ -556,38 +624,43 @@ function ActionsButton({ system }: { system: SystemRecord }) {
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<AlertDialogTrigger asChild>
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</AlertDialogTrigger>
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</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>
{/* 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

@@ -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,7 +2,7 @@ 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 { 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")
@@ -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,11 @@ export default [
label: "العربية",
e: "🇵🇸",
},
{
lang: "bg",
label: "Български",
e: "🇧🇬",
},
{
lang: "cs",
label: "Čeština",
@@ -44,6 +49,11 @@ export default [
label: "Hrvatski",
e: "🇭🇷",
},
{
lang: "hu",
label: "Magyar",
e: "🇭🇺",
},
{
lang: "it",
label: "Italiano",
@@ -64,6 +74,11 @@ export default [
label: "Nederlands",
e: "🇳🇱",
},
{
lang: "no",
label: "Norsk",
e: "🇳🇴",
},
{
lang: "pl",
label: "Polski",
@@ -114,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,7 +22,10 @@ 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>({

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,7 +107,7 @@ 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.record?.role === "admin"
@@ -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)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,878 @@
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-03-06 07:27\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"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ден} other {# дни}}"
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# час} other {# часа}}"
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 час"
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 седмица"
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 часа"
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 часа"
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 дни"
#. Table column
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
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:125
msgid "Add New System"
msgstr "Добави нова система"
#: src/components/add-system.tsx:231
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:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Агент"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Тревоги"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Всички системи"
#: src/components/systems-table/systems-table.tsx:657
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:660
msgid "Average"
msgstr "Средно"
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Средно използване на процесора на контейнерите"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Средната стойност надхвърля <0>{value}{0}</0>"
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Средна консумация на ток от графични карти"
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Средно използване на процесора на цялата система"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Средно използване на {0}"
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Архиви"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bandwidth на мрежата"
#: src/components/login/auth-form.tsx:306
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:130
msgid "Binary"
msgstr "Двоичен код"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx:668
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:204
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:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Потвърди парола"
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Продължи"
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Записано в клипборда"
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Копирай"
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Копирай хоста"
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Копирай linux командата"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "Копирай текста"
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Процесор"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Употреба на процесор"
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Създай акаунт"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "Тъмно"
#: src/components/command-palette.tsx:80
#: 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:644
msgid "Delete"
msgstr "Изтрий"
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Диск I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Използване на диск"
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Изполване на диск от {extraFsName}"
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Използване на процесор от docker"
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Изполване на памет от docker"
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Мрежов I/O използван от docker"
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Грешка"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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:48
msgid "Failed to authenticate"
msgstr "Неуспешно удостоверяване"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
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/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Филтрирай..."
#: src/components/alerts/alerts-system.tsx:230
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:330
msgid "Forgot password?"
msgstr "Забравена парола?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Общо"
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Консумация на ток от графична карта"
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Мрежово"
#: src/components/add-system.tsx:158
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:267
msgid "Kernel"
msgstr "Linux Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Език"
#: src/components/systems-table/systems-table.tsx:354
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/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Неуспешен опит за вход"
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Максимум 1 минута"
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Памет"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Употреба на паметта"
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Използването на памет от docker контейнерите"
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Име"
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Мрежа"
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Мрежов трафик на docker контейнери"
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Мрежов трафик на публични интерфейси"
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Няма намерени резултати."
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Няма намерени системи."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Нотификации"
#: src/components/login/auth-form.tsx:301
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:600
msgid "Open menu"
msgstr "Отвори менюто"
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Или продължи с"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "Презапиши съществуващи тревоги"
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Страница"
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Страници / Настройки"
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
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:633
msgid "Pause"
msgstr "Пауза"
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
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/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
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:49
msgid "Please log in again"
msgstr "Моля влез отново"
#: src/components/login/auth-form.tsx:309
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:170
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
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:181
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:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Запази настройките"
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Търси"
#: src/components/command-palette.tsx:45
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:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: 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:238
msgid "Sign in"
msgstr "Влез"
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Настройки за SMTP"
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Сортиране по"
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Изполван swap от системата"
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Използване на swap"
#. System theme
#: src/lib/utils.ts:316
#: 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:150
#: src/components/systems-table/systems-table.tsx:533
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:364
msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:526
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:146
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:137
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:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "Пропускателна способност на {extraFsName}"
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Пропускателна способност на root файловата система"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "До имейл(ите)"
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Превключване на мрежа"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Включи тема"
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Задейства се, когато някой даден сензор надвиши зададен праг"
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Задейства се, когато комбинираното качване/сваляне надвиши зададен праг"
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Задейства се, когато употребата на процесора надвиши зададен праг"
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Задейства се, когато употребата на паметта надвиши зададен праг"
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Задейства се, когато статуса превключва между долу и горе"
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Задейства се, когато употребата на някой диск надивши зададен праг"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Актуализира се в реално време. Натисни на система за да видиш информация."
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Време на работа"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Употреба"
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Употреба на root partition-а"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Използвани"
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Потребители"
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Изглед"
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Видими полета"
#: src/components/routes/system.tsx:697
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

@@ -8,7 +8,7 @@ msgstr ""
"Language: cs\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-14 00:50\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# Hodina} few {# Hodiny} many {# Hodin} other {# Hodin}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 hodina"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 týden"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 hodin"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 hodin"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dní"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akce"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivní výstrahy"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Přidat <0>Systém</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Přidat nový systém"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Přidat systém"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Přidat URL"
@@ -79,15 +79,15 @@ msgstr "Přidat URL"
msgid "Adjust display options for charts."
msgstr "Upravit možnosti zobrazení pro grafy."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Výstrahy"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Všechny systémy"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Opravdu chcete odstranit {name}?"
@@ -109,49 +109,51 @@ msgstr "Opravdu chcete odstranit {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatická kopie vyžaduje zabezpečený kontext."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "Průměr"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "Průměrné využití CPU kontejnerů"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Průměr je vyšší než <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "Průměrná spotřeba energie GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "Průměrné využití CPU v celém systému"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "Průměrné využití {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Zálohy"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "Přenos"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:127
#: 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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binary"
@@ -159,7 +161,7 @@ msgstr "Binary"
msgid "Cache / Buffers"
msgstr "Cache / vyrovnávací paměť"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Zrušit"
@@ -183,11 +185,11 @@ msgstr "Zkontrolujte {email} pro odkaz na obnovení."
msgid "Check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Zkontrolujte službu upozornění"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klikněte pro zkopírování"
@@ -196,32 +198,33 @@ msgstr "Klikněte pro zkopírování"
msgid "Command line instructions"
msgstr "Instrukce příkazového řádku"
#: src/components/routes/settings/notifications.tsx:77
#: 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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potvrdit heslo"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Pokračovat"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Zkopírováno do schránky"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopírovat"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopírovat hostitele"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopírovat příkaz Linux"
@@ -229,17 +232,17 @@ msgstr "Kopírovat příkaz Linux"
msgid "Copy text"
msgstr "Kopírovat text"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Využití procesoru"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Vytvořit účet"
@@ -248,8 +251,8 @@ msgstr "Vytvořit účet"
msgid "Dark"
msgstr "Tmavý"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Přehled"
@@ -257,50 +260,62 @@ msgstr "Přehled"
msgid "Default time period"
msgstr "Výchozí doba"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Odstranit"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Využití disku"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "Využití disku {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Využití CPU Dockeru"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Využití paměti Dockeru"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "Síťové I/O Dockeru"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentace"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "Nefunkční"
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Upravit"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Emailová upozornění"
@@ -308,17 +323,20 @@ msgstr "Emailová upozornění"
msgid "Enter email address to reset password"
msgstr "Zadejte e-mailovou adresu pro obnovu hesla"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Zadejte e-mailovou adresu..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Chyba"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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}}"
@@ -334,16 +352,16 @@ msgstr "Exportovat konfiguraci"
msgid "Export your current systems configuration."
msgstr "Exportovat aktuální konfiguraci systémů."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Ověření se nezdařilo"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Nepodařilo se uložit nastavení"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Nepodařilo se odeslat testovací oznámení"
@@ -351,34 +369,34 @@ msgstr "Nepodařilo se odeslat testovací oznámení"
msgid "Failed to update alert"
msgstr "Nepodařilo se aktualizovat upozornění"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "Filtr..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
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
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Obecné"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "Spotřeba energie GPU"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mřížka"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Hostitel / IP"
@@ -386,12 +404,12 @@ msgstr "Hostitel / IP"
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:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Neplatná e-mailová adresa."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:270
msgid "Kernel"
msgstr "Kernel"
@@ -399,7 +417,7 @@ msgstr "Kernel"
msgid "Language"
msgstr "Jazyk"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Rozvržení"
@@ -408,7 +426,7 @@ msgstr "Rozvržení"
msgid "Light"
msgstr "Světlý"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Odhlásit"
@@ -416,17 +434,17 @@ msgstr "Odhlásit"
msgid "Login"
msgstr "Přihlásit"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Pokus o přihlášení selhal"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Logy"
#: 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 "Hledáte místo kde vytvářet upozornění? Klikněte na ikonu zvonku <0/> v systémové tabulce."
@@ -434,56 +452,60 @@ msgstr "Hledáte místo kde vytvářet upozornění? Klikněte na ikonu zvonku <
msgid "Manage display and notification preferences."
msgstr "Správa nastavení zobrazení a oznámení."
#: src/components/add-system.tsx:226
msgid "Manual setup instructions"
msgstr "Pokyny k manuálnímu nastavení"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:671
msgid "Max 1 min"
msgstr "Max. 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Paměť"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "Využití paměti"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Využití paměti docker kontejnerů"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Název"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Síť"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Síťový provoz kontejnerů docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "Síťový provoz veřejných rozhraní"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Nenalezeny žádné výskyty."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nenalezeny žádné systémy."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Upozornění"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podpora OAuth 2 / OIDC"
@@ -491,11 +513,11 @@ msgstr "Podpora OAuth 2 / OIDC"
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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otevřít menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Nebo pokračujte s"
@@ -503,32 +525,40 @@ msgstr "Nebo pokračujte s"
msgid "Overwrite existing alerts"
msgstr "Přepsat existující upozornění"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Stránka"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Stránky / Nastavení"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Heslo"
#: src/components/login/auth-form.tsx:17
#: 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 "Heslo musí být menší než 72 bytů."
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pozastavit"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr "Pozastaveno"
#: 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."
@@ -536,8 +566,8 @@ msgstr "<0>nakonfigurujte SMTP server</0> pro zajištění toho, aby byla upozor
msgid "Please check logs for more details."
msgstr "Pro více informací zkontrolujte logy."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Zkontrolujte prosím Vaše přihlašovací údaje a zkuste to znovu"
@@ -545,15 +575,15 @@ msgstr "Zkontrolujte prosím Vaše přihlašovací údaje a zkuste to znovu"
msgid "Please create an admin account"
msgstr "Vytvořte si prosím účet administrátora"
#: src/components/login/auth-form.tsx:233
#: 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:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Přihlaste se prosím znovu"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Instrukce naleznete v <0>dokumentaci</0>."
@@ -561,12 +591,12 @@ msgstr "Instrukce naleznete v <0>dokumentaci</0>."
msgid "Please sign in to your account"
msgstr "Přihlaste se prosím k vašemu účtu"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "Přesné využití v zaznamenaném čase"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Upřednostňovaný jazyk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Veřejný klíč"
@@ -594,24 +624,28 @@ msgstr "Přijato"
msgid "Reset Password"
msgstr "Obnovit heslo"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Pokračovat"
#: 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 "Adresu uložte pomocí klávesy enter nebo čárky. Pro deaktivaci e-mailových oznámení ponechte prázdné pole."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Uložit nastavení"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Uložit systém"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Hledat"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Hledat systémy nebo nastavení..."
@@ -628,9 +662,9 @@ msgstr "Odeslat"
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:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Nastavení"
msgid "Settings saved"
msgstr "Nastavení uloženo"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Přihlásit se"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Nastavení SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Seřadit podle"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Stav"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "Swap prostor využívaný systémem"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "Swap využití"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Systém"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systémy"
@@ -681,32 +716,37 @@ msgstr "Systémy"
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:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabulka"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Teplota"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "Teplota"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:534
msgid "Temperatures of system sensors"
msgstr "Teploty systémových senzorů"
#: 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 "Testovací oznámení odesláno"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,24 @@ msgstr "Agent musí být v systému spuštěn, aby se mohl připojit. Zkopírujt
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:573
#: src/components/systems-table/systems-table.tsx:660
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:564
#: src/components/routes/system.tsx:613
msgid "Throughput of {extraFsName}"
msgstr "Propustnost {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:481
msgid "Throughput of root filesystem"
msgstr "Propustnost kořenového souborového systému"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Na email(y)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "Přepnout mřížku"
@@ -739,68 +779,74 @@ msgstr "Přepnout mřížku"
msgid "Toggle theme"
msgstr "Přepnout motiv"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Spustí se, když některý senzor překročí prahovou hodnotu"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Spustí se, když kombinace up/down překročí prahovou hodnotu"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Spustí se, když využití procesoru překročí prahovou hodnotu"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Spustí se, když využití paměti překročí prahovou hodnotu"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Spouští se, když se změní dostupnost"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "Funkční"
#: src/components/systems-table/systems-table.tsx:337
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:261
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "Doba provozu"
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Využití"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:473
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
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Využito"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Uživatelé"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Zobrazení"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Viditelné sloupce"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "Čeká se na dostatek záznamů k zobrazení"
@@ -808,7 +854,7 @@ msgstr "Čeká se na dostatek záznamů k zobrazení"
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:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push oznámení"
@@ -829,3 +875,4 @@ 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

@@ -8,7 +8,7 @@ msgstr ""
"Language: da\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-01-05 19:49\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Danish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
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:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hour} other {# hours}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 time"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 uge"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 timer"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 timer"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dage"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Handlinger"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktive Alarmer"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Tilføj <0>System</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Tilføj nyt system"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Tilføj system"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Tilføj URL"
@@ -79,15 +79,15 @@ msgstr "Tilføj URL"
msgid "Adjust display options for charts."
msgstr "Juster visningsindstillinger for diagrammer."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Alarmer"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Alle systemer"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på, at du vil slette {name}?"
@@ -109,49 +109,51 @@ msgstr "Er du sikker på, at du vil slette {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kræver en sikker kontekst."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Gennemsnitlig"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Gennemsnitlig CPU udnyttelse af containere"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gennemsnit overstiger <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Gennemsnitligt strømforbrug for GPU'er"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Gennemsnitlig systembaseret CPU-udnyttelse"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Gennemsnitlig udnyttelse af {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Sikkerhedskopier"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Båndbredde"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:127
#: 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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binær"
@@ -159,7 +161,7 @@ msgstr "Binær"
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Fortryd"
@@ -183,11 +185,11 @@ msgstr "Tjek {email} for et nulstillingslink."
msgid "Check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Tjek din notifikationstjeneste"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klik for at kopiere"
@@ -196,32 +198,33 @@ msgstr "Klik for at kopiere"
msgid "Command line instructions"
msgstr "Instruktioner for kommandolinje"
#: src/components/routes/settings/notifications.tsx:77
#: 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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Bekræft adgangskode"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Forsæt"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Kopieret til udklipsholder"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopier"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopier host"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopier Linux kommando"
@@ -229,17 +232,17 @@ msgstr "Kopier Linux kommando"
msgid "Copy text"
msgstr "Kopier tekst"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "CPU forbrug"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Opret konto"
@@ -248,8 +251,8 @@ msgstr "Opret konto"
msgid "Dark"
msgstr "Mørk"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Oversigtspanel"
@@ -257,50 +260,62 @@ msgstr "Oversigtspanel"
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Slet"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Diskforbrug"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diskforbrug af {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU forbrug"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Hukommelsesforbrug"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Netværk I/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentation"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-mail"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email-notifikationer"
@@ -308,17 +323,20 @@ msgstr "Email-notifikationer"
msgid "Enter email address to reset password"
msgstr "Indtast e-mailadresse for at nulstille adgangskoden"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Indtast e-mailadresse..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Fejl"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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}}"
@@ -334,16 +352,16 @@ msgstr "Eksporter konfiguration"
msgid "Export your current systems configuration."
msgstr "Eksporter din nuværende systemkonfiguration."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Kunne ikke godkende"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Kunne ikke gemme indstillinger"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Afsendelse af testnotifikation mislykkedes"
@@ -351,34 +369,34 @@ msgstr "Afsendelse af testnotifikation mislykkedes"
msgid "Failed to update alert"
msgstr "Kunne ikke opdatere alarm"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Glemt adgangskode?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Generelt"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Gpu Strøm Træk"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Gitter"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Vært / IP"
@@ -386,12 +404,12 @@ msgstr "Vært / IP"
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:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ugyldig email adresse."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
@@ -399,7 +417,7 @@ msgstr "Kernel"
msgid "Language"
msgstr "Sprog"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Layout"
@@ -408,7 +426,7 @@ msgstr "Layout"
msgid "Light"
msgstr "Lys"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Log ud"
@@ -416,17 +434,17 @@ msgstr "Log ud"
msgid "Login"
msgstr "Log ind"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Loginforsøg mislykkedes"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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 "Leder du i stedet for efter hvor du kan oprette alarmer? Klik på klokken <0/> ikoner i system tabellen."
@@ -434,56 +452,60 @@ msgstr "Leder du i stedet for efter hvor du kan oprette alarmer? Klik på klokke
msgid "Manage display and notification preferences."
msgstr "Administrer display og notifikationsindstillinger."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Hukommelse"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Hukommelsesforbrug"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Hukommelsesforbrug af dockercontainere"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Netværkstrafik af dockercontainere"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Netværkstrafik af offentlige grænseflader"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Ingen resultater fundet."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Ingen systemer fundet."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Notifikationer"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC understøttelse"
@@ -491,11 +513,11 @@ msgstr "OAuth 2 / OIDC understøttelse"
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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Åbn menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Eller fortsæt med"
@@ -503,32 +525,40 @@ msgstr "Eller fortsæt med"
msgid "Overwrite existing alerts"
msgstr "Overskriv eksisterende alarmer"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Side"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Sider / Indstillinger"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Adgangskode"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pause"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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."
@@ -536,8 +566,8 @@ msgstr "Konfigurer <0>en SMTP server</0> for at sikre at alarmer bliver leveret.
msgid "Please check logs for more details."
msgstr "Tjek logfiler for flere detaljer."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Tjek dine legitimationsoplysninger og prøv igen"
@@ -545,15 +575,15 @@ msgstr "Tjek dine legitimationsoplysninger og prøv igen"
msgid "Please create an admin account"
msgstr "Opret venligst en administratorkonto"
#: src/components/login/auth-form.tsx:233
#: 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:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Log venligst ind igen"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Se <0>dokumentationen</0> for instruktioner."
@@ -561,12 +591,12 @@ msgstr "Se <0>dokumentationen</0> for instruktioner."
msgid "Please sign in to your account"
msgstr "Log venligst ind på din konto"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Præcis udnyttelse på det registrerede tidspunkt"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Foretrukket sprog"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Offentlig nøgle"
@@ -594,24 +624,28 @@ msgstr "Modtaget"
msgid "Reset Password"
msgstr "Nulstil adgangskode"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Genoptag"
#: 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 "Gem adresse ved hjælp af enter eller komma. Lad feltet stå tomt for at deaktivere e-mail-meddelelser."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Gem indstillinger"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Søg"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Søg efter systemer eller indstillinger..."
@@ -628,9 +662,9 @@ msgstr "Sendt"
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:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Indstillinger"
msgid "Settings saved"
msgstr "Indstillinger gemt"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Log ind"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP-indstillinger"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sorter efter"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap plads brugt af systemet"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap forbrug"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systemer"
@@ -681,32 +716,37 @@ msgstr "Systemer"
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:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabel"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturer i systemsensorer"
#: 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 notifikation sendt"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,24 @@ msgstr "Agenten skal køre på systemet for at forbinde. Kopier <0>docker-compos
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:573
#: src/components/systems-table/systems-table.tsx:660
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:564
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Gennemløb af {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Gennemløb af rodfilsystemet"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Til email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Slå gitter til/fra"
@@ -739,68 +779,74 @@ msgstr "Slå gitter til/fra"
msgid "Toggle theme"
msgstr "Skift tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Udløser når en sensor overstiger en tærskel"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
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:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Udløser når CPU-forbrug overstiger en tærskel"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Udløser når hukommelsesforbruget overstiger en tærskel"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Udløser når status skifter mellem op og ned"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Oppetid"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Forbrug"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
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
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Brugt"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Brugere"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Vis"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Synlige felter"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Venter på nok posteringer til at vise"
@@ -808,7 +854,7 @@ msgstr "Venter på nok posteringer til at vise"
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:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifikationer"
@@ -829,3 +875,4 @@ msgstr "YAML Konfiguration"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dine brugerindstillinger er opdateret."

File diff suppressed because it is too large Load Diff

View File

@@ -13,60 +13,59 @@ 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:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: 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"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Active Alerts"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Add <0>System</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:124
msgid "Add New System"
msgstr "Add New System"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: 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"
@@ -74,15 +73,15 @@ msgstr "Add URL"
msgid "Adjust display options for charts."
msgstr "Adjust display options for charts."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: 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:201
#: src/components/systems-table/systems-table.tsx:246
msgid "Agent"
msgstr "Agent"
@@ -92,11 +91,11 @@ msgid "Alerts"
msgstr "Alerts"
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
#: src/components/systems-table/systems-table.tsx:319
msgid "All Systems"
msgstr "All Systems"
#: src/components/systems-table/systems-table.tsx:570
#: 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}?"
@@ -104,49 +103,49 @@ msgstr "Are you sure you want to delete {name}?"
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:633
msgid "Average"
msgstr "Average"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:410
msgid "Average CPU utilization of containers"
msgstr "Average CPU utilization of containers"
#: src/components/alerts/alerts-system.tsx:206
#: src/components/alerts/alerts-system.tsx:205
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:511
msgid "Average power consumption of GPUs"
msgstr "Average power consumption of GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:399
msgid "Average system-wide CPU utilization"
msgstr "Average system-wide CPU utilization"
#: src/components/routes/system.tsx:515
#: src/components/routes/system.tsx:529
msgid "Average utilization of {0}"
msgstr "Average utilization of {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: 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:455
#: src/lib/utils.ts:327
msgid "Bandwidth"
msgstr "Bandwidth"
#: src/components/login/auth-form.tsx:289
#: 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:92
#: src/components/add-system.tsx:129
msgid "Binary"
msgstr "Binary"
@@ -154,7 +153,7 @@ msgstr "Binary"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:653
msgid "Cancel"
msgstr "Cancel"
@@ -178,11 +177,11 @@ 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:151
#: src/components/add-system.tsx:203
msgid "Click to copy"
msgstr "Click to copy"
@@ -191,32 +190,33 @@ msgstr "Click to copy"
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:165
#: src/components/login/auth-form.tsx:170
#: 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:587
#: 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:162
#: src/components/add-system.tsx:214
#: src/components/add-system.tsx:216
msgid "Copy"
msgstr "Copy"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:624
msgid "Copy host"
msgstr "Copy host"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:223
msgid "Copy Linux command"
msgstr "Copy Linux command"
@@ -224,17 +224,17 @@ msgstr "Copy Linux command"
msgid "Copy text"
msgstr "Copy text"
#: src/components/systems-table/systems-table.tsx:157
#: 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:398
#: src/lib/utils.ts:309
msgid "CPU Usage"
msgstr "CPU Usage"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:236
msgid "Create account"
msgstr "Create account"
@@ -243,8 +243,8 @@ msgstr "Create account"
msgid "Dark"
msgstr "Dark"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:82
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Dashboard"
@@ -252,50 +252,61 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Default time period"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:629
msgid "Delete"
msgstr "Delete"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:181
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:445
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:438
#: src/lib/utils.ts:321
msgid "Disk Usage"
msgstr "Disk Usage"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:566
msgid "Disk usage of {extraFsName}"
msgstr "Disk usage of {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:409
msgid "Docker CPU Usage"
msgstr "Docker CPU Usage"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:430
msgid "Docker Memory Usage"
msgstr "Docker Memory Usage"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:471
msgid "Docker Network I/O"
msgstr "Docker Network I/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:125
msgid "Documentation"
msgstr "Documentation"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/components/routes/system.tsx:309
#: src/lib/utils.ts:306
msgid "Down"
msgstr "Down"
#: src/components/add-system.tsx:124
#: src/components/systems-table/systems-table.tsx:599
msgid "Edit"
msgstr "Edit"
#: 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"
@@ -303,17 +314,17 @@ 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:232
#: 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"
#: src/components/routes/home.tsx:80
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
@@ -329,16 +340,16 @@ 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"
@@ -346,16 +357,16 @@ msgstr "Failed to send test notification"
msgid "Failed to update alert"
msgstr "Failed to update alert"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/routes/system.tsx:606
#: src/components/systems-table/systems-table.tsx:326
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:328
msgid "Forgot password?"
msgstr "Forgot password?"
@@ -365,15 +376,15 @@ msgstr "Forgot password?"
msgid "General"
msgstr "General"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:510
msgid "GPU Power Draw"
msgstr "GPU Power Draw"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:353
msgid "Grid"
msgstr "Grid"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:157
msgid "Host / IP"
msgstr "Host / IP"
@@ -381,12 +392,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"
@@ -394,7 +405,7 @@ msgstr "Kernel"
msgid "Language"
msgstr "Language"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:339
msgid "Layout"
msgstr "Layout"
@@ -403,7 +414,7 @@ msgstr "Layout"
msgid "Light"
msgstr "Light"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Log Out"
@@ -411,17 +422,17 @@ msgstr "Log Out"
msgid "Login"
msgstr "Login"
#: src/components/login/auth-form.tsx:34
#: src/components/login/auth-form.tsx:39
#: src/components/login/forgot-pass-form.tsx:15
msgid "Login attempt failed"
msgstr "Login attempt failed"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/command-palette.tsx:157
#: src/components/navbar.tsx:86
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."
@@ -429,56 +440,60 @@ 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:636
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: 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:420
#: src/lib/utils.ts:315
msgid "Memory Usage"
msgstr "Memory Usage"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:431
msgid "Memory usage of docker containers"
msgstr "Memory usage of docker containers"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:153
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:198
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:472
msgid "Network traffic of docker containers"
msgstr "Network traffic of docker containers"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:457
msgid "Network traffic of public interfaces"
msgstr "Network traffic of public interfaces"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:50
msgid "No results found."
msgstr "No results found."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: 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:110
#: 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:284
#: src/components/login/auth-form.tsx:299
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC support"
@@ -486,11 +501,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:528
#: src/components/systems-table/systems-table.tsx:585
msgid "Open menu"
msgstr "Open menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:248
msgid "Or continue with"
msgstr "Or continue with"
@@ -498,32 +513,36 @@ msgstr "Or continue with"
msgid "Overwrite existing alerts"
msgstr "Overwrite existing alerts"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:85
msgid "Page"
msgstr "Page"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:72
msgid "Pages / Settings"
msgstr "Pages / Settings"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: 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
#: 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:550
#: 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."
@@ -531,7 +550,7 @@ msgstr "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgid "Please check logs for more details."
msgstr "Please check logs for more details."
#: src/components/login/auth-form.tsx:35
#: 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"
@@ -540,15 +559,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:233
#: 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:292
#: 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."
@@ -556,12 +575,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:124
#: 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:421
#: src/components/routes/system.tsx:537
msgid "Precise utilization at the recorded time"
msgstr "Precise utilization at the recorded time"
@@ -570,7 +589,7 @@ msgid "Preferred Language"
msgstr "Preferred Language"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:180
msgid "Public Key"
msgstr "Public Key"
@@ -589,24 +608,28 @@ msgstr "Received"
msgid "Reset Password"
msgstr "Reset Password"
#: src/components/systems-table/systems-table.tsx:545
#: 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:133
#: src/components/add-system.tsx:230
msgid "Save system"
msgstr "Save system"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Search"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:47
msgid "Search for systems or settings..."
msgstr "Search for systems or settings..."
@@ -623,9 +646,9 @@ msgstr "Sent"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Sets the default time range for charts when a system is viewed."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: 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"
@@ -635,40 +658,41 @@ msgstr "Settings"
msgid "Settings saved"
msgstr "Settings saved"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:236
msgid "Sign in"
msgstr "Sign in"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:186
msgid "SMTP settings"
msgstr "SMTP settings"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:361
msgid "Sort By"
msgstr "Sort By"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:301
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:487
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:486
msgid "Swap Usage"
msgstr "Swap Usage"
#. System theme
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:144
#: src/components/systems-table/systems-table.tsx:518
#: src/lib/utils.ts:306
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systems"
@@ -676,32 +700,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:349
msgid "Table"
msgstr "Table"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:218
msgid "Temp"
msgstr "Temp"
#: src/components/routes/system.tsx:498
#: src/lib/utils.ts:334
msgid "Temperature"
msgstr "Temperature"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:499
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:108
#: 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:99
#: 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."
@@ -709,24 +738,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:573
#: 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:578
msgid "Throughput of {extraFsName}"
msgstr "Throughput of {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:446
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:373
#: src/components/routes/system.tsx:386
msgid "Toggle grid"
msgstr "Toggle grid"
@@ -734,45 +763,50 @@ msgstr "Toggle grid"
msgid "Toggle theme"
msgstr "Toggle theme"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:337
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:330
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:312
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:318
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:324
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:269
#. Context: System is up
#: src/components/routes/system.tsx:307
msgid "Up"
msgstr "Up"
#: 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:528
#: src/components/routes/system.tsx:565
msgid "Usage"
msgstr "Usage"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:438
msgid "Usage of root partition"
msgstr "Usage of root partition"
@@ -782,20 +816,20 @@ msgstr "Usage of root partition"
msgid "Used"
msgstr "Used"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/command-palette.tsx:143
#: src/components/navbar.tsx:70
msgid "Users"
msgstr "Users"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:331
msgid "View"
msgstr "View"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:395
msgid "Visible Fields"
msgstr "Visible Fields"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:670
msgid "Waiting for enough records to display"
msgstr "Waiting for enough records to display"
@@ -803,7 +837,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: 2025-01-02 04:46\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
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:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 hora"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 semana"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 horas"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 horas"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 días"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Acciones"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Alertas Activas"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Agregar <0>Sistema</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Agregar Nuevo Sistema"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
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"
@@ -79,15 +79,15 @@ msgstr "Agregar URL"
msgid "Adjust display options for charts."
msgstr "Ajustar las opciones de visualización para los gráficos."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Administrador"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agente"
@@ -96,12 +96,12 @@ msgstr "Agente"
msgid "Alerts"
msgstr "Alertas"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Todos los Sistemas"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "¿Está seguro de que desea eliminar {name}?"
@@ -109,49 +109,51 @@ msgstr "¿Está seguro de que desea eliminar {name}?"
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:660
msgid "Average"
msgstr "Promedio"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Utilización promedio de CPU de los contenedores"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
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:538
msgid "Average power consumption of GPUs"
msgstr "Consumo de energía promedio de GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Utilización promedio de CPU del sistema"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Uso promedio de {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Copias de Seguridad"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Ancho de banda"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binario"
@@ -159,7 +161,7 @@ msgstr "Binario"
msgid "Cache / Buffers"
msgstr "Caché / Buffers"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Cancelar"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Haga clic para copiar"
@@ -196,32 +198,33 @@ msgstr "Haga clic para copiar"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Confirmar contraseña"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Continuar"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Copiado al portapapeles"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Copiar comando de Linux"
@@ -229,17 +232,17 @@ msgstr "Copiar comando de Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Crear cuenta"
@@ -248,8 +251,8 @@ msgstr "Crear cuenta"
msgid "Dark"
msgstr "Oscuro"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Tablero"
@@ -257,50 +260,62 @@ msgstr "Tablero"
msgid "Default time period"
msgstr "Período de tiempo predeterminado"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Eliminar"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Uso de CPU de Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Uso de Memoria de Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "E/S de Red de Docker"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Documentación"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr "Abajo"
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Editar"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Error"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Excede {0}{1} en el último {2, plural, one {# minuto} other {# minutos}}"
@@ -334,16 +352,16 @@ 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:48
msgid "Failed to authenticate"
msgstr "Error al autenticar"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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"
@@ -351,34 +369,34 @@ msgstr "Error al enviar la notificación de prueba"
msgid "Failed to update alert"
msgstr "Error al actualizar la alerta"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "¿Olvidó su contraseña?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "General"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
msgstr "Consumo de energía de la GPU"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Cuadrícula"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
@@ -386,12 +404,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:267
msgid "Kernel"
msgstr "Kernel"
@@ -399,7 +417,7 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Diseño"
@@ -408,7 +426,7 @@ msgstr "Diseño"
msgid "Light"
msgstr "Claro"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Cerrar Sesión"
@@ -416,17 +434,17 @@ msgstr "Cerrar Sesión"
msgid "Login"
msgstr "Iniciar sesión"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Intento de inicio de sesión fallido"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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."
@@ -434,56 +452,60 @@ 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:226
msgid "Manual setup instructions"
msgstr "Instrucciones manuales de configuración"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:628
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memoria"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Uso de Memoria"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Uso de memoria de los contenedores de Docker"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nombre"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Red"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
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:484
msgid "Network traffic of public interfaces"
msgstr "Tráfico de red de interfaces públicas"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "No se encontraron resultados."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "No se encontraron sistemas."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Notificaciones"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Soporte para OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Abrir menú"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "O continuar con"
@@ -503,32 +525,40 @@ msgstr "O continuar con"
msgid "Overwrite existing alerts"
msgstr "Sobrescribir alertas existentes"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Página"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Páginas / Configuraciones"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Contraseña"
#: src/components/login/auth-form.tsx:17
#: 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 "La contraseña debe ser menor de 72 bytes."
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pausar"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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."
@@ -536,8 +566,8 @@ msgstr "Por favor, <0>configure un servidor SMTP</0> para asegurar que las alert
msgid "Please check logs for more details."
msgstr "Por favor, revise los registros para más detalles."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique sus credenciales e intente de nuevo"
@@ -545,15 +575,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:233
#: 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:49
msgid "Please log in again"
msgstr "Por favor, inicie sesión de nuevo"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, consulte <0>la documentación</0> para obtener instrucciones."
@@ -561,12 +591,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:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Puerto"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Utilización precisa en el momento registrado"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Clave Pública"
@@ -594,24 +624,28 @@ msgstr "Recibido"
msgid "Reset Password"
msgstr "Restablecer Contraseña"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Guardar Configuración"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Guardar Sistema"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Buscar"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Buscar sistemas o configuraciones..."
@@ -628,9 +662,9 @@ msgstr "Enviado"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Establece el rango de tiempo predeterminado para los gráficos cuando se visualiza un sistema."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Configuración"
msgid "Settings saved"
msgstr "Configuración guardada"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Iniciar sesión"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Configuración SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Ordenar por"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Estado"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
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:513
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistema"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Sistemas"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabla"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Temperatura"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "Rendimiento de {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Alternar cuadrícula"
@@ -739,68 +779,74 @@ msgstr "Alternar cuadrícula"
msgid "Toggle theme"
msgstr "Alternar tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
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:340
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:322
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:328
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:314
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:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr "Activo"
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr "Tiempo de actividad"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uso de la partición raíz"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Usado"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Usuarios"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Vista"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Columnas visibles"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Esperando suficientes registros para mostrar"
@@ -808,7 +854,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"
@@ -829,3 +875,4 @@ msgstr "Configuración YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Su configuración de usuario ha sido actualizada."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: fa\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Persian\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# روز} other {# روز}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ساعت} other {# ساعت}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "۱ ساعت"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "۱ هفته"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "۱۲ ساعت"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "۲۴ ساعت"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "۳۰ روز"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "عملیات"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr " هشدارهای فعال"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "افزودن <0>سیستم</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "افزودن سیستم جدید"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "افزودن سیستم"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "افزودن آدرس اینترنتی"
@@ -79,15 +79,15 @@ msgstr "افزودن آدرس اینترنتی"
msgid "Adjust display options for charts."
msgstr "تنظیم گزینه‌های نمایش برای نمودارها."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "مدیر"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "عامل"
@@ -96,12 +96,12 @@ msgstr "عامل"
msgid "Alerts"
msgstr "هشدارها"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "همه سیستم‌ها"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف کنید؟"
@@ -109,49 +109,51 @@ msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف
msgid "Automatic copy requires a secure context."
msgstr "کپی خودکار نیاز به یک زمینه امن دارد."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "میانگین"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "میانگین استفاده از CPU کانتینرها"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr ""
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "میانگین مصرف برق پردازنده‌های گرافیکی"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "میانگین استفاده از CPU در کل سیستم"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "میانگین استفاده از {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "پشتیبان‌گیری‌ها"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "پهنای باند"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "بِزل از 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 "بِزل از <0>Shoutrrr</0> برای ادغام با سرویس‌های اطلاع‌رسانی محبوب استفاده می‌کند."
#: src/components/add-system.tsx:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "دودویی"
@@ -159,7 +161,7 @@ msgstr "دودویی"
msgid "Cache / Buffers"
msgstr "حافظه پنهان / بافرها"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "لغو"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "برای کپی کردن کلیک کنید"
@@ -196,32 +198,33 @@ msgstr "برای کپی کردن کلیک کنید"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "تأیید رمز عبور"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "ادامه"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "در کلیپ‌بورد کپی شد"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "کپی"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "کپی میزبان"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "کپی دستور لینوکس"
@@ -229,17 +232,17 @@ msgstr "کپی دستور لینوکس"
msgid "Copy text"
msgstr "کپی متن"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "پردازنده"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "میزان استفاده از پردازنده"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "ایجاد حساب کاربری"
@@ -248,8 +251,8 @@ msgstr "ایجاد حساب کاربری"
msgid "Dark"
msgstr "تیره"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "داشبورد"
@@ -257,50 +260,62 @@ msgstr "داشبورد"
msgid "Default time period"
msgstr "بازه زمانی پیش‌فرض"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "حذف"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "دیسک"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "ورودی/خروجی دیسک"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "میزان استفاده از دیسک"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "میزان استفاده از دیسک {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "میزان استفاده از CPU داکر"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "میزان استفاده از حافظه داکر"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "ورودی/خروجی شبکه داکر"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "مستندات"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "ایمیل"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "اعلان‌های ایمیلی"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "خطا"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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} بیشتر است"
@@ -334,16 +352,16 @@ msgstr "خارج کردن پیکربندی"
msgid "Export your current systems configuration."
msgstr "پیکربندی سیستم‌های فعلی خود را خارج کنید."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "احراز هویت ناموفق بود"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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 "ارسال اعلان آزمایشی ناموفق بود"
@@ -351,34 +369,34 @@ msgstr "ارسال اعلان آزمایشی ناموفق بود"
msgid "Failed to update alert"
msgstr "به‌روزرسانی هشدار ناموفق بود"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "فیلتر..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "رمز عبور را فراموش کرده‌اید؟"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "عمومی"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "مصرف برق پردازنده گرافیکی"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "جدول"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "میزبان / IP"
@@ -386,12 +404,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:267
msgid "Kernel"
msgstr "هسته"
@@ -399,7 +417,7 @@ msgstr "هسته"
msgid "Language"
msgstr "زبان"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "طرح‌بندی"
@@ -408,7 +426,7 @@ msgstr "طرح‌بندی"
msgid "Light"
msgstr "روشن"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "خروج"
@@ -416,17 +434,17 @@ msgstr "خروج"
msgid "Login"
msgstr "ورود"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "تلاش برای ورود ناموفق بود"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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/> در جدول سیستم‌ها کلیک کنید."
@@ -434,56 +452,60 @@ msgstr "به دنبال جایی برای ایجاد هشدار هستید؟ ر
msgid "Manage display and notification preferences."
msgstr "مدیریت تنظیمات نمایش و اعلان‌ها."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "حداکثر ۱ دقیقه"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "حافظه"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "میزان استفاده از حافظه"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "میزان استفاده از حافظه کانتینرهای داکر"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "نام"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "شبکه"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "ترافیک شبکه کانتینرهای داکر"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "ترافیک شبکه رابط‌های عمومی"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "هیچ نتیجه‌ای یافت نشد."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "هیچ سیستمی یافت نشد."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "اعلان‌ها"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "پشتیبانی از OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "باز کردن منو"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "یا ادامه با"
@@ -503,32 +525,40 @@ msgstr "یا ادامه با"
msgid "Overwrite existing alerts"
msgstr "بازنویسی هشدارهای موجود"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "صفحه"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "صفحات / تنظیمات"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "رمز عبور"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "توقف"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
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>."
@@ -536,8 +566,8 @@ msgstr "لطفاً برای اطمینان از تحویل هشدارها، یک
msgid "Please check logs for more details."
msgstr "لطفاً برای جزئیات بیشتر، لاگ‌ها را بررسی کنید."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "لطفاً اعتبارنامه‌های خود را بررسی کرده و دوباره تلاش کنید."
@@ -545,15 +575,15 @@ msgstr "لطفاً اعتبارنامه‌های خود را بررسی کرده
msgid "Please create an admin account"
msgstr "لطفاً یک حساب مدیر ایجاد کنید"
#: src/components/login/auth-form.tsx:233
#: 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:49
msgid "Please log in again"
msgstr "لطفاً دوباره وارد شوید"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "لطفاً برای دستورالعمل‌ها به <0>مستندات</0> مراجعه کنید."
@@ -561,12 +591,12 @@ msgstr "لطفاً برای دستورالعمل‌ها به <0>مستندات</
msgid "Please sign in to your account"
msgstr "لطفاً به حساب کاربری خود وارد شوید"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "پورت"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "میزان دقیق استفاده در زمان ثبت شده"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "زبان ترجیحی"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "کلید عمومی"
@@ -594,24 +624,28 @@ msgstr "دریافت شد"
msgid "Reset Password"
msgstr "بازنشانی رمز عبور"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "ذخیره تنظیمات"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "جستجو"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "جستجو برای سیستم‌ها یا تنظیمات..."
@@ -628,9 +662,9 @@ msgstr "ارسال شد"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "بازه زمانی پیش‌فرض برای نمودارها هنگام مشاهده یک سیستم را تعیین می‌کند."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "تنظیمات"
msgid "Settings saved"
msgstr "تنظیمات ذخیره شد"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "ورود"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "تنظیمات SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "مرتب‌سازی بر اساس"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "وضعیت"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "فضای Swap استفاده شده توسط سیستم"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "میزان استفاده از Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "سیستم"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "سیستم‌ها"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "جدول"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "دما"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
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>آدرس اینترنتی</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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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> مربوط به عامل را از زیر کپی کنید."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "توان عملیاتی {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "تغییر نمایش جدول"
@@ -739,68 +779,74 @@ msgstr "تغییر نمایش جدول"
msgid "Toggle theme"
msgstr "تغییر تم"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "هنگامی که هر حسگری از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "هنگامی که مجموع بالا/پایین از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "هنگامی که میزان استفاده از CPU از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "هنگامی که میزان استفاده از حافظه از یک آستانه فراتر رود، فعال می‌شود"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "هنگامی که وضعیت بین بالا و پایین تغییر می‌کند، فعال می‌شود"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "هنگامی که استفاده از هر دیسکی از یک آستانه فراتر رود، فعال می‌شود"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "به صورت لحظه‌ای به‌روزرسانی می‌شود. برای مشاهده اطلاعات، روی یک سیستم کلیک کنید."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "آپتایم"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "میزان استفاده"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
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
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "استفاده شده"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "کاربران"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "مشاهده"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "فیلدهای قابل مشاهده"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "در انتظار رکوردهای کافی برای نمایش"
@@ -808,7 +854,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"
@@ -829,3 +875,4 @@ msgstr "پیکربندی YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "تنظیمات کاربری شما به‌روزرسانی شد."

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: hr\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-06 07:27\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,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
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:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# sat} other {# sati}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 sat"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 tjedan"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 sati"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 sati"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dana"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akcije"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivna upozorenja"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>Sistem</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj Novi Sistem"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
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"
@@ -79,15 +79,15 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Podesite opcije prikaza za grafikone."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Upozorenja"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Svi Sistemi"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Jeste li sigurni da želite izbrisati {name}?"
@@ -109,49 +109,51 @@ msgstr "Jeste li sigurni da želite izbrisati {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatsko kopiranje zahtijeva siguran kontekst."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Prosjek"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Prosječna iskorištenost procesora u spremnicima"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
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:538
msgid "Average power consumption of GPUs"
msgstr ""
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Prosječna iskorištenost procesora na cijelom sustavu"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr ""
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Sigurnosne kopije"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Propusnost"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binarni"
@@ -159,7 +161,7 @@ msgstr "Binarni"
msgid "Cache / Buffers"
msgstr "Predmemorija / Međuspremnici"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Otkaži"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Pritisnite za kopiranje"
@@ -196,32 +198,33 @@ msgstr "Pritisnite za kopiranje"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potvrdite lozinku"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Nastavite"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Kopirano u međuspremnik"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiraj"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiraj hosta"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiraj Linux komandu"
@@ -229,17 +232,17 @@ msgstr "Kopiraj Linux komandu"
msgid "Copy text"
msgstr "Kopiraj tekst"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Iskorištenost procesora"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Napravite račun"
@@ -248,8 +251,8 @@ msgstr "Napravite račun"
msgid "Dark"
msgstr "Tamno"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Nadzorna ploča"
@@ -257,50 +260,62 @@ msgstr "Nadzorna ploča"
msgid "Default time period"
msgstr "Zadano vremensko razdoblje"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Izbriši"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Iskorištenost Diska"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Iskorištenost diska od {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Iskorištenost Docker Procesora"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Iskorištenost Docker Memorije"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Mrežni I/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentacija"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Email notifikacije"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Greška"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Premašuje {0}{1} u posljednjih {2, plural, one {# minuta} other {# minute}}"
@@ -334,16 +352,16 @@ msgstr "Izvoz konfiguracije"
msgid "Export your current systems configuration."
msgstr "Izvoz trenutne sistemske konfiguracije."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Provjera autentičnosti nije uspjela"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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"
@@ -351,34 +369,34 @@ msgstr "Neuspješno slanje testne notifikacije"
msgid "Failed to update alert"
msgstr "Ažuriranje upozorenja nije uspjelo"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Zaboravljena lozinka?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Općenito"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mreža"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
@@ -386,12 +404,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:267
msgid "Kernel"
msgstr "Kernel"
@@ -399,7 +417,7 @@ msgstr "Kernel"
msgid "Language"
msgstr "Jezik"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Izgled"
@@ -408,7 +426,7 @@ msgstr "Izgled"
msgid "Light"
msgstr "Svijetlo"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Odjava"
@@ -416,17 +434,17 @@ msgstr "Odjava"
msgid "Login"
msgstr "Prijava"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Pokušaj prijave nije uspio"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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."
@@ -434,56 +452,60 @@ 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:226
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:663
msgid "Max 1 min"
msgstr "Maksimalno 1 minuta"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memorija"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Upotreba memorije"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Upotreba memorije Docker spremnika"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ime"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mreža"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Mrežni promet Docker spremnika"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Mrežni promet javnih sučelja"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Nema rezultata."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nije pronađen nijedan sustav."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Obavijesti"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podrška za OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otvori menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ili nastavi sa"
@@ -503,32 +525,40 @@ msgstr "Ili nastavi sa"
msgid "Overwrite existing alerts"
msgstr "Prebrišite postojeća upozorenja"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Stranica"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Stranice / Postavke"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Lozinka"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pauza"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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."
@@ -536,8 +566,8 @@ msgstr "Molimo <0>konfigurirajte SMTP server</0> kako biste osigurali isporuku u
msgid "Please check logs for more details."
msgstr "Za više detalja provjerite logove."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Provjerite svoje podatke i pokušajte ponovno"
@@ -545,15 +575,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:233
#: 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:49
msgid "Please log in again"
msgstr "Molimo prijavite se ponovno"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Molimo pogledajte <0>dokumentaciju</0> za instrukcije."
@@ -561,12 +591,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:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Precizno iskorištenje u zabilježenom vremenu"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Preferirani jezik"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Javni Ključ"
@@ -594,24 +624,28 @@ msgstr "Primljeno"
msgid "Reset Password"
msgstr "Resetiraj Lozinku"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Spremi Postavke"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Pretraži"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Pretraži za sisteme ili postavke..."
@@ -628,9 +662,9 @@ msgstr "Poslano"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Postavlja zadani vremenski raspon za grafikone kada se sustav gleda."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Postavke"
msgid "Settings saved"
msgstr "Postavke spremljene"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Prijava"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP postavke"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortiraj po"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
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:513
msgid "Swap Usage"
msgstr "Swap Iskorištenost"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistem"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Sistemi"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tablica"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "Protok {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Uključi/isključi rešetku"
@@ -739,68 +779,74 @@ 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:347
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:340
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:322
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:328
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:314
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:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr "Vrijeme rada"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Iskorištenost"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Iskorištenost root datotečnog sustava"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Iskorišteno"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Korisnici"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Prikaz"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Vidljiva polja"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Čeka se na više podataka prije prikaza"
@@ -808,7 +854,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"
@@ -829,3 +875,4 @@ msgstr "YAML Konfiguracija"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše korisničke postavke su ažurirane."

View File

@@ -0,0 +1,878 @@
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-03-06 07:27\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"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# nap} other {# nap}}"
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# óra} other {# óra}}"
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 óra"
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 hét"
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 óra"
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 óra"
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 nap"
#. Table column
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
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:125
msgid "Add New System"
msgstr "Új rendszer hozzáadása"
#: src/components/add-system.tsx:231
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:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:261
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/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Minden rendszer"
#: src/components/systems-table/systems-table.tsx:657
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:660
msgid "Average"
msgstr "Átlag"
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Konténerek átlagos CPU kihasználtsága"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Az átlag meghaladja a <0>{value}{0}</0> értéket"
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU-k átlagos energiafogyasztása"
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Rendszerszintű CPU átlagos kihasználtság"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} átlagos kihasználtsága"
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Biztonsági mentések"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Sávszélesség"
#: src/components/login/auth-form.tsx:306
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:130
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:668
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:204
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:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Jelszó megerősítése"
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Tovább"
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Vágólapra másolva"
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Másolás"
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Hoszt másolása"
#: src/components/add-system.tsx:224
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:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU használat"
#: src/components/login/auth-form.tsx:238
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:80
#: 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:644
msgid "Delete"
msgstr "Törlés"
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Lemez"
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Lemez I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Lemezhasználat"
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Lemezhasználat a {extraFsName}"
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU használat"
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker memória használat"
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker hálózat I/O"
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentáció"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Hiba"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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:48
msgid "Failed to authenticate"
msgstr "Hitelesítés sikertelen"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
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/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Szűrő..."
#: src/components/alerts/alerts-system.tsx:230
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:330
msgid "Forgot password?"
msgstr "Elfelejtette a jelszavát?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Általános"
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU áramfelvétele"
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Rács"
#: src/components/add-system.tsx:158
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:267
msgid "Kernel"
msgstr "Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Nyelv"
#: src/components/systems-table/systems-table.tsx:354
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/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Bejelentkezés sikertelen"
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Maximum 1 perc"
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "RAM"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Memóriahasználat"
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker konténerek memória használata"
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Név"
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Hálózat"
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker konténerek hálózati forgalma"
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Nyilvános interfészek hálózati forgalma"
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Nincs találat."
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nem található rendszer."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Értesítések"
#: src/components/login/auth-form.tsx:301
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:600
msgid "Open menu"
msgstr "Menü megnyitása"
#: src/components/login/auth-form.tsx:250
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:83
msgid "Page"
msgstr "Oldal"
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Oldalak / Beállítások"
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
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:633
msgid "Pause"
msgstr "Szüneteltetés"
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
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:49
msgid "Please log in again"
msgstr "Kérjük jelentkezz be újra"
#: src/components/login/auth-form.tsx:309
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:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
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:181
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:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Beállítások mentése"
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Keresés"
#: src/components/command-palette.tsx:45
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:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: 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:238
msgid "Sign in"
msgstr "Bejelentkezés"
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP beállítások"
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Rendezés"
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Állapot"
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Rendszer által használt swap terület"
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap használat"
#. System theme
#: src/lib/utils.ts:316
#: 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:150
#: src/components/systems-table/systems-table.tsx:533
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:364
msgid "Table"
msgstr "Tábla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Hőmérséklet"
#: src/components/routes/system.tsx:526
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:146
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:137
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:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "A {extraFsName} átviteli teljesítménye"
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
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:347
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:340
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:322
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:328
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:314
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:334
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"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr "Üzemidő"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "Használat"
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Root partíció kihasználtsága"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Felhasznált"
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Felhasználók"
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Nézet"
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Látható mezők"
#: src/components/routes/system.tsx:697
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,878 @@
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-03-06 07:27\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"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dagur} other {# dagar}}"
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# klukkustund} other {# klukkustundir}}"
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 klukkustund"
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 vika"
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 klukkustundir"
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 klukkustundir"
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dagar"
#. Table column
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
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:125
msgid "Add New System"
msgstr "Bæta við nýju kerfi"
#: src/components/add-system.tsx:231
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:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr ""
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "Tilkynningar"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "Öll kerfi"
#: src/components/systems-table/systems-table.tsx:657
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:660
msgid "Average"
msgstr "Meðal"
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Meðal örgjörva notkun container-a."
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Meðaltal er yfir <0>{value}{0}</0>"
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Meðal orkunotkun skjákorta"
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Meðal nýting örgjörva yfir allt kerfið"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Meðal notkun af {0}"
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Öryggisafrit"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Gangnaflutningsgeta"
#: src/components/login/auth-form.tsx:306
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:130
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:668
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:204
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:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Staðfestu lykilorð"
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Halda áfram"
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Afritað í klippiborð"
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Afrita"
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Afrita host"
#: src/components/add-system.tsx:224
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:180
msgid "CPU"
msgstr "Örgjörvi"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "Örgjörva notkun"
#: src/components/login/auth-form.tsx:238
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:80
#: 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:644
msgid "Delete"
msgstr "Eyða"
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Diskur"
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr ""
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "Diskanotkun"
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diska notkun af {extraFsName}"
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU notkun"
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Minnisnotkun Docker"
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr ""
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Skjal"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Villa"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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:48
msgid "Failed to authenticate"
msgstr "Villa í auðkenningu"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
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/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Sía..."
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr ""
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Gleymt lykilorð?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Almennt"
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Skjákorts rafmagnsnotkun"
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr ""
#: src/components/add-system.tsx:158
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:267
msgid "Kernel"
msgstr ""
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Tungumál"
#: src/components/systems-table/systems-table.tsx:354
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/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Innskránings tilraun misheppnaðist"
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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:226
msgid "Manual setup instructions"
msgstr ""
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "Mest 1 mínúta"
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Minni"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Minnisnotkun"
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Minnisnotkun docker kerfa"
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nafn"
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Net"
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Net traffík docker kerfa"
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr ""
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Engar niðurstöður fundust."
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Engin kerfi fundust."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "Tilkynningar"
#: src/components/login/auth-form.tsx:301
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:600
msgid "Open menu"
msgstr "Opna valmynd"
#: src/components/login/auth-form.tsx:250
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:83
msgid "Page"
msgstr "Síða"
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Síða / Stillingar"
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
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:633
msgid "Pause"
msgstr "Pása"
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
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:49
msgid "Please log in again"
msgstr "Vinsamlegast skráðu þið inn aftur"
#: src/components/login/auth-form.tsx:309
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:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
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:181
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:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Vista stillingar"
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Leita"
#: src/components/command-palette.tsx:45
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:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: 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:238
msgid "Sign in"
msgstr "Innskrá"
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP stillingar"
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Raða eftir"
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Staða"
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr ""
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Skipti minni"
#. System theme
#: src/lib/utils.ts:316
#: 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:150
#: src/components/systems-table/systems-table.tsx:533
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:364
msgid "Table"
msgstr "Tafla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Hitastig"
#: src/components/routes/system.tsx:526
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:146
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:137
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:660
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:605
msgid "Throughput of {extraFsName}"
msgstr ""
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr ""
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "Velja þema"
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Virkjast þegar einhver skynjari fer yfir þröskuld"
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Virkjast þegar samanlagt sent/móttekið fer yfir þröskuld"
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Virkjast þegar örgjörva notkun fer yfir þröskuld"
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Virkjast þegar minnisnotkun fer yfir þröskuld"
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Virkjast þegar staða breytist milli virkur og óvirkur"
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Virkjast þegar diska notkun fer yfir þröskuld"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr ""
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr ""
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr ""
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Notað"
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Notendur"
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Skoða"
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Sjáanlegir reitir"
#: src/components/routes/system.tsx:697
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."

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: ja\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-13 10:13\n"
"Last-Translator: \n"
"Language-Team: Japanese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 日} other {# 日}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 時間} other {# 時間}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1時間"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1週間"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12時間"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24時間"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30日間"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "アクション"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "アクティブなアラート"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>システム</0>を追加"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "新しいシステムを追加"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "システムを追加"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URLを追加"
@@ -79,29 +79,29 @@ msgstr "URLを追加"
msgid "Adjust display options for charts."
msgstr "チャートの表示オプションを調整します。"
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "管理者"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "代理"
msgstr "エージェント"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "アラート"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "すべてのシステム"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "{name}を削除してもよろしいですか?"
@@ -109,49 +109,51 @@ msgstr "{name}を削除してもよろしいですか?"
msgid "Automatic copy requires a secure context."
msgstr "自動コピーには安全なコンテキストが必要です。"
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "コンテナの平均CPU使用率"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均が<0>{value}{0}</0>を超えています"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr ""
msgstr "GPUの平均消費電力"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "システム全体の平均CPU使用率"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr ""
msgstr "{0}の平均使用率"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "バックアップ"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "帯域幅"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "バイナリ"
@@ -159,7 +161,7 @@ msgstr "バイナリ"
msgid "Cache / Buffers"
msgstr "キャッシュ / バッファ"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "キャンセル"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "クリックしてコピー"
@@ -196,32 +198,33 @@ msgstr "クリックしてコピー"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "パスワードを確認"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "続行"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "クリップボードにコピーされました"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "コピー"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "ホストをコピー"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linuxコマンドをコピー"
@@ -229,17 +232,17 @@ msgstr "Linuxコマンドをコピー"
msgid "Copy text"
msgstr "テキストをコピー"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "CPU使用率"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "アカウントを作成"
@@ -248,8 +251,8 @@ msgstr "アカウントを作成"
msgid "Dark"
msgstr "ダーク"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "ダッシュボード"
@@ -257,50 +260,62 @@ msgstr "ダッシュボード"
msgid "Default time period"
msgstr "デフォルトの期間"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "削除"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "ディスク"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "ディスクI/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "ディスク使用率"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}のディスク使用率"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Docker CPU使用率"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Dockerメモリ使用率"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "DockerネットワークI/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "ドキュメント"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "停止"
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "編集"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "メール"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "メール通知"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "エラー"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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}を超えています"
@@ -334,16 +352,16 @@ msgstr "設定をエクスポート"
msgid "Export your current systems configuration."
msgstr "現在のシステム設定をエクスポートします。"
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "認証に失敗しました"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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 "テスト通知の送信に失敗しました"
@@ -351,34 +369,34 @@ msgstr "テスト通知の送信に失敗しました"
msgid "Failed to update alert"
msgstr "アラートの更新に失敗しました"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "フィルター..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "パスワードをお忘れですか?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr ""
msgstr "GPUの消費電力"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "グリッド"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "ホスト / IP"
@@ -386,12 +404,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:270
msgid "Kernel"
msgstr "カーネル"
@@ -399,7 +417,7 @@ msgstr "カーネル"
msgid "Language"
msgstr "言語"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "レイアウト"
@@ -408,7 +426,7 @@ msgstr "レイアウト"
msgid "Light"
msgstr "ライト"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "ログアウト"
@@ -416,17 +434,17 @@ msgstr "ログアウト"
msgid "Login"
msgstr "ログイン"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "ログイン試行に失敗しました"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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/>アイコンをクリックしてください。"
@@ -434,56 +452,60 @@ msgstr "アラートを作成する場所を探していますか?システム
msgid "Manage display and notification preferences."
msgstr "表示と通知の設定を管理します。"
#: src/components/add-system.tsx:226
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:671
msgid "Max 1 min"
msgstr "最大1分"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "メモリ"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "メモリ使用率"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Dockerコンテナのメモリ使用率"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "名前"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "帯域"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Dockerコンテナのネットワークトラフィック"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "パブリックインターフェースのネットワークトラフィック"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "結果が見つかりませんでした。"
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "システムが見つかりませんでした。"
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDCサポート"
@@ -491,44 +513,52 @@ 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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "メニューを開く"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "または続行"
msgstr "または、以下の方法でログイン"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "既存のアラートを上書き"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "ページ"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "ページ / 設定"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "パスワード"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "一時停止"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
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>してください。"
@@ -536,8 +566,8 @@ msgstr "アラートが配信されるように<0>SMTPサーバーを設定</0>
msgid "Please check logs for more details."
msgstr "詳細についてはログを確認してください。"
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "資格情報を確認して再試行してください"
@@ -545,15 +575,15 @@ msgstr "資格情報を確認して再試行してください"
msgid "Please create an admin account"
msgstr "管理者アカウントを作成してください"
#: src/components/login/auth-form.tsx:233
#: 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:49
msgid "Please log in again"
msgstr "再度ログインしてください"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "手順については<0>ドキュメント</0>を参照してください。"
@@ -561,12 +591,12 @@ msgstr "手順については<0>ドキュメント</0>を参照してくださ
msgid "Please sign in to your account"
msgstr "アカウントにサインインしてください"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "ポート"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "記録された時点での正確な利用"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "優先言語"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "公開鍵"
@@ -594,24 +624,28 @@ msgstr "受信"
msgid "Reset Password"
msgstr "パスワードをリセット"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "設定を保存"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "システムを保存"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "検索"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "システムまたは設定を検索..."
@@ -628,9 +662,9 @@ msgstr "送信"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "システムを表示する際のチャートのデフォルトの時間範囲を設定します。"
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "設定"
msgid "Settings saved"
msgstr "設定が保存されました"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "サインイン"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP設定"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "並び替え基準"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "ステータス"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "システムが使用するスワップ領域"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "スワップ使用量"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "システム"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "システム"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "テーブル"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "温度"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "温度"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:534
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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>をコピーしてください。"
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:613
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}のスループット"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:481
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:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "グリッドを切り替え"
@@ -739,68 +779,74 @@ msgstr "グリッドを切り替え"
msgid "Toggle theme"
msgstr "テーマを切り替え"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "センサーがしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "上り/下りの合計がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "CPU使用率がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "メモリ使用率がしきい値を超えたときにトリガーされます"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "ステータスが上から下に切り替わるときにトリガーされます"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "ディスクの使用量がしきい値を超えたときにトリガーされます"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "正常"
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "リアルタイムで更新されます。システムをクリックして情報を表示します。"
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "稼働時間"
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "使用量"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:473
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
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "使用済み"
msgstr "使用"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "ユーザー"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "表示"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "表示列"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "表示するのに十分なレコードを待っています"
@@ -808,7 +854,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 / プッシュ通知"
@@ -829,3 +875,4 @@ msgstr "YAML設定"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "ユーザー設定が更新されました。"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,872 @@
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: no\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-17 13:40\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"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:259
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dager}}"
#: src/components/routes/system.tsx:257
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# time} other {# timer}}"
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 time"
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 uke"
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 timer"
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 timer"
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dager"
#. Table column
#: src/components/systems-table/systems-table.tsx:304
msgid "Actions"
msgstr "Handlinger"
#: src/components/routes/home.tsx:94
msgid "Active Alerts"
msgstr "Aktive Alarmer"
#: src/components/add-system.tsx:43
msgid "Add <0>System</0>"
msgstr "Legg til <0>System</0>"
#: src/components/add-system.tsx:126
msgid "Add New System"
msgstr "Legg Til Nytt System"
#: src/components/add-system.tsx:232
msgid "Add system"
msgstr "Legg til system"
#: src/components/routes/settings/notifications.tsx:158
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:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:270
msgid "Agent"
msgstr "Agent"
#: src/components/alerts/alert-button.tsx:33
#: src/components/alerts/alert-button.tsx:79
msgid "Alerts"
msgstr "Alarmer"
#: src/components/systems-table/systems-table.tsx:347
#: src/components/alerts/alert-button.tsx:99
msgid "All Systems"
msgstr "Alle Systemer"
#: src/components/systems-table/systems-table.tsx:696
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:670
msgid "Average"
msgstr "Gjennomsnitt"
#: src/components/routes/system.tsx:446
msgid "Average CPU utilization of containers"
msgstr "Gjennomsnittlig CPU-utnyttelse av konteinere"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:253
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Gjennomsnittet overstiger <0>{value}{0}</0>"
#: src/components/routes/system.tsx:547
msgid "Average power consumption of GPUs"
msgstr "Gjennomsnittlig strømforbruk for GPU-er"
#: src/components/routes/system.tsx:435
msgid "Average system-wide CPU utilization"
msgstr "Gjennomsnittlig CPU-utnyttelse for hele systemet"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:569
msgid "Average utilization of {0}"
msgstr "Gjennomsnittlig utnyttelse av {0}"
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Sikkerhetskopier"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:491
msgid "Bandwidth"
msgstr "Båndbredde"
#: src/components/login/auth-form.tsx:305
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:129
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:131
msgid "Binary"
msgstr "Binær"
#: src/components/charts/mem-chart.tsx:87
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx:707
msgid "Cancel"
msgstr "Avbryt"
#: src/components/routes/settings/config-yaml.tsx:69
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:35
msgid "Check {email} for a reset link."
msgstr "Sjekk {email} for en nullstillings-link."
#: src/components/routes/settings/layout.tsx:41
msgid "Check logs for more details."
msgstr "Sjekk loggene for flere detaljer."
#: src/components/routes/settings/notifications.tsx:185
msgid "Check your notification service"
msgstr "Sjekk din meldingstjeneste"
#: src/components/add-system.tsx:205
msgid "Click to copy"
msgstr "Klikk for å kopiere"
#: src/components/login/forgot-pass-form.tsx:84
#: src/components/login/forgot-pass-form.tsx:90
msgid "Command line instructions"
msgstr "Kommandolinje-instrukser"
#: src/components/routes/settings/notifications.tsx:79
msgid "Configure how you receive alert notifications."
msgstr "Konfigurer hvordan du vil motta alarmvarsler."
#: src/components/login/auth-form.tsx:213
#: src/components/login/auth-form.tsx:218
msgid "Confirm password"
msgstr "Bekreft passord"
#: src/components/systems-table/systems-table.tsx:713
msgid "Continue"
msgstr "Fortsett"
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Kopiert til utklippstavlen"
#: src/components/add-system.tsx:216
#: src/components/add-system.tsx:218
msgid "Copy"
msgstr "Kopier"
#: src/components/systems-table/systems-table.tsx:678
msgid "Copy host"
msgstr "Kopier vert"
#: src/components/add-system.tsx:225
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:186
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:434
#: src/components/charts/area-chart.tsx:58
msgid "CPU Usage"
msgstr "CPU-bruk"
#: src/components/login/auth-form.tsx:239
msgid "Create account"
msgstr "Opprett konto"
#. Dark theme
#: src/components/mode-toggle.tsx:22
msgid "Dark"
msgstr "Mørkt"
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:36
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:683
msgid "Delete"
msgstr "Slett"
#: src/components/systems-table/systems-table.tsx:204
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:481
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:474
#: src/components/charts/disk-chart.tsx:77
msgid "Disk Usage"
msgstr "Diskbruk"
#: src/components/routes/system.tsx:603
msgid "Disk usage of {extraFsName}"
msgstr "Diskbruk av {extraFsName}"
#: src/components/routes/system.tsx:445
msgid "Docker CPU Usage"
msgstr "Docker CPU-bruk"
#: src/components/routes/system.tsx:466
msgid "Docker Memory Usage"
msgstr "Docker Minnebruk"
#: src/components/routes/system.tsx:507
msgid "Docker Network I/O"
msgstr "Docker Nettverks-I/O"
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentasjon"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:142
#: src/components/routes/system.tsx:345
msgid "Down"
msgstr "Nede"
#: src/components/add-system.tsx:126
#: src/components/systems-table/systems-table.tsx:653
msgid "Edit"
msgstr "Rediger"
#: src/components/login/forgot-pass-form.tsx:54
#: src/components/login/auth-form.tsx:176
msgid "Email"
msgstr "E-post"
#: src/components/routes/settings/notifications.tsx:93
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:113
msgid "Enter email address..."
msgstr "Skriv inn e-postadresse..."
#: src/components/routes/settings/notifications.tsx:189
#: src/components/routes/settings/config-yaml.tsx:29
#: src/components/login/auth-form.tsx:137
msgid "Error"
msgstr "Feil"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:113
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:73
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:94
msgid "Export configuration"
msgstr "Eksporter konfigurasjon"
#: src/components/routes/settings/config-yaml.tsx:49
msgid "Export your current systems configuration."
msgstr "Eksporter din nåværende systemkonfigurasjon"
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Autentisering mislyktes"
#: src/components/routes/settings/notifications.tsx:64
#: src/components/routes/settings/layout.tsx:40
msgid "Failed to save settings"
msgstr "Kunne ikke lagre innstillingene"
#: src/components/routes/settings/notifications.tsx:190
msgid "Failed to send test notification"
msgstr "Kunne ikke sende test-varsling"
#: src/components/alerts/alerts-system.tsx:26
msgid "Failed to update alert"
msgstr "Kunne ikke oppdatere alarm"
#: src/components/systems-table/systems-table.tsx:354
#: src/components/routes/system.tsx:643
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:285
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/layout.tsx:52
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Generelt"
#: src/components/routes/system.tsx:546
msgid "GPU Power Draw"
msgstr "GPU Effektforbruk"
#: src/components/systems-table/systems-table.tsx:381
msgid "Grid"
msgstr "Rutenett"
#: src/components/add-system.tsx:159
msgid "Host / IP"
msgstr "Vert / IP"
#: src/components/login/forgot-pass-form.tsx:94
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:18
msgid "Invalid email address."
msgstr "Ugyldig e-postadresse."
#. Linux kernel
#: src/components/routes/system.tsx:271
msgid "Kernel"
msgstr "Kjerne"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "Språk"
#: src/components/systems-table/systems-table.tsx:367
msgid "Layout"
msgstr "Layout"
#. Light theme
#: src/components/mode-toggle.tsx:17
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/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Login attempt failed"
msgstr "Innlogging mislyktes"
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Logger"
#: src/components/routes/settings/notifications.tsx:82
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:86
msgid "Manage display and notification preferences."
msgstr "Endre visnings- og varslingsinnstillinger."
#: src/components/add-system.tsx:227
msgid "Manual setup instructions"
msgstr "Instruks for Manuell Installasjon"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:673
msgid "Max 1 min"
msgstr "Maks 1 min"
#: src/components/systems-table/systems-table.tsx:195
msgid "Memory"
msgstr "Minne"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:456
msgid "Memory Usage"
msgstr "Minnebruk"
#: src/components/routes/system.tsx:467
msgid "Memory usage of docker containers"
msgstr "Minnebruk av docker-konteinere"
#: src/components/add-system.tsx:155
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx:223
msgid "Net"
msgstr "Nett"
#: src/components/routes/system.tsx:508
msgid "Network traffic of docker containers"
msgstr "Nettverkstrafikk av docker-konteinere"
#: src/components/routes/system.tsx:493
msgid "Network traffic of public interfaces"
msgstr "Nettverkstrafikk av eksterne nettverksgrensesnitt"
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Ingen resultater funnet."
#: src/components/systems-table/systems-table.tsx:472
#: src/components/systems-table/systems-table.tsx:495
msgid "No systems found."
msgstr "Ingen systemer funnet."
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:76
#: src/components/routes/settings/layout.tsx:57
msgid "Notifications"
msgstr "Varslinger"
#: src/components/login/auth-form.tsx:300
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC-støtte"
#: src/components/routes/settings/config-yaml.tsx:62
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:639
msgid "Open menu"
msgstr "Åpne meny"
#: src/components/login/auth-form.tsx:251
msgid "Or continue with"
msgstr "Eller fortsett med"
#: src/components/alerts/alert-button.tsx:120
msgid "Overwrite existing alerts"
msgstr "Overskriv eksisterende alarmer"
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Side"
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Sider / Innstillinger"
#: src/components/login/auth-form.tsx:195
#: src/components/login/auth-form.tsx:200
msgid "Password"
msgstr "Passord"
#: src/components/login/auth-form.tsx:21
msgid "Password must be at least 8 characters."
msgstr "Passord må bestå av minst 8 tegn."
#: src/components/login/auth-form.tsx:22
msgid "Password must be less than 72 bytes."
msgstr "Passord må være mindre enn 72 byte."
#: src/components/login/forgot-pass-form.tsx:34
msgid "Password reset request received"
msgstr "Mottatt forespørsel om å nullstille passord"
#: src/components/systems-table/systems-table.tsx:672
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx:143
msgid "Paused"
msgstr "Satt på Pause"
#: src/components/routes/settings/notifications.tsx:97
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:27
msgid "Please check logs for more details."
msgstr "Vennligst sjekk loggene for mer informasjon."
#: src/components/login/forgot-pass-form.tsx:17
#: src/components/login/auth-form.tsx:41
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:138
msgid "Please enable pop-ups for this site"
msgstr "Vennligst aktiver pop-ups for nettsiden"
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Vennligst logg inn på nytt"
#: src/components/login/auth-form.tsx:308
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:171
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:577
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:182
msgid "Public Key"
msgstr "Offentlig Nøkkel"
#. Disk read
#: src/components/charts/area-chart.tsx:62
#: src/components/charts/area-chart.tsx:72
msgid "Read"
msgstr "Lesing"
#. Network bytes received (download)
#: src/components/charts/area-chart.tsx:67
msgid "Received"
msgstr "Mottatt"
#: src/components/login/forgot-pass-form.tsx:77
msgid "Reset Password"
msgstr "Nullstill Passord"
#: src/components/systems-table/systems-table.tsx:667
msgid "Resume"
msgstr "Gjenoppta"
#: src/components/routes/settings/notifications.tsx:119
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/notifications.tsx:169
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "Lagre Innstillinger"
#: src/components/add-system.tsx:232
msgid "Save system"
msgstr "Lagre system"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Søk"
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Søk etter systemer eller innstillinger..."
#: src/components/alerts/alert-button.tsx:82
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:66
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:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:72
#: src/components/routes/settings/layout.tsx:83
msgid "Settings"
msgstr "Innstillinger"
#: src/components/routes/settings/layout.tsx:34
msgid "Settings saved"
msgstr "Innstillinger lagret"
#: src/components/login/auth-form.tsx:239
msgid "Sign in"
msgstr "Logg inn"
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP-innstillinger"
#: src/components/systems-table/systems-table.tsx:389
msgid "Sort By"
msgstr "Sorter Etter"
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:523
msgid "Swap space used by the system"
msgstr "Swap-plass i bruk av systemet"
#: src/components/routes/system.tsx:522
msgid "Swap Usage"
msgstr "Swap-bruk"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:27
#: src/components/systems-table/systems-table.tsx:152
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systemer"
#: src/components/routes/settings/config-yaml.tsx:56
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:377
msgid "Table"
msgstr "Tabell"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:244
msgid "Temp"
msgstr "Temp"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:534
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:535
msgid "Temperatures of system sensors"
msgstr "Temperaturer på system-sensorer"
#: src/components/routes/settings/notifications.tsx:213
msgid "Test <0>URL</0>"
msgstr "Test <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:184
msgid "Test notification sent"
msgstr "Test-varsling sendt"
#: src/components/add-system.tsx:147
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:138
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:99
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:699
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:615
msgid "Throughput of {extraFsName}"
msgstr "Gjennomstrømning av {extraFsName}"
#: src/components/routes/system.tsx:482
msgid "Throughput of root filesystem"
msgstr "Gjennomstrømning av rot-filsystemet"
#: src/components/routes/settings/notifications.tsx:108
msgid "To email(s)"
msgstr "Til e-postadresse(r)"
#: src/components/routes/system.tsx:409
#: src/components/routes/system.tsx:422
msgid "Toggle grid"
msgstr "Rutenett av/på"
#: src/components/mode-toggle.tsx:34
msgid "Toggle theme"
msgstr "Tema av/på"
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Slår inn når enhver sensor overstiger en grenseverdi"
#: src/lib/utils.ts:340
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:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Slår inn når CPU-bruken overstiger en grenseverdi"
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Slår inn når minnebruken overstiger en grenseverdi"
#: src/lib/utils.ts:314
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:334
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"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:343
msgid "Up"
msgstr "Oppe"
#: src/components/systems-table/systems-table.tsx:350
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:270
msgid "Uptime"
msgstr "Oppetid"
#: src/components/routes/system.tsx:568
#: src/components/routes/system.tsx:602
#: src/components/charts/area-chart.tsx:75
msgid "Usage"
msgstr "Forbruk"
#: src/components/routes/system.tsx:474
msgid "Usage of root partition"
msgstr "Forbruk av rot-partisjon"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:63
#: src/components/charts/area-chart.tsx:75
msgid "Used"
msgstr "Brukt"
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Brukere"
#: src/components/systems-table/systems-table.tsx:359
msgid "View"
msgstr "Visning"
#: src/components/systems-table/systems-table.tsx:424
msgid "Visible Fields"
msgstr "Synlige Felter"
#: src/components/routes/system.tsx:707
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:126
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-varslinger"
#. Disk write
#: src/components/charts/area-chart.tsx:61
#: src/components/charts/area-chart.tsx:71
msgid "Write"
msgstr "Skriving"
#: src/components/routes/settings/layout.tsx:62
msgid "YAML Config"
msgstr "YAML Oppsett"
#: src/components/routes/settings/config-yaml.tsx:46
msgid "YAML Configuration"
msgstr "YAML Konfigurasjon"
#: src/components/routes/settings/layout.tsx:35
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: 2025-01-01 13:11\n"
"PO-Revision-Date: 2025-03-06 07:27\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,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
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:253
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:168
msgid "1 hour"
msgstr "1 godzina"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 tydzień"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 godzin"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 godziny"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dni"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Akcje"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktywne alerty"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>system</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj nowy system"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
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"
@@ -79,15 +79,15 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Dostosuj opcje wyświetlania wykresów."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Alerty"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Wszystkie systemy"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Czy na pewno chcesz usunąć {name}?"
@@ -109,49 +109,51 @@ msgstr "Czy na pewno chcesz usunąć {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatyczne kopiowanie wymaga bezpiecznego kontekstu."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Średnia"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Średnie wykorzystanie procesora przez kontenery"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
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:538
msgid "Average power consumption of GPUs"
msgstr "Średnie zużycie energii przez GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Średnie wykorzystanie procesora w całym systemie"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Średnie użycie {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Kopie"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Przepustowość"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Plik binarny"
@@ -159,7 +161,7 @@ msgstr "Plik binarny"
msgid "Cache / Buffers"
msgstr "Pamięć podręczna / Bufory"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Anuluj"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Kliknij, aby skopiować"
@@ -196,32 +198,33 @@ msgstr "Kliknij, aby skopiować"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potwierdź hasło"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Kontynuuj"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Skopiowano do schowka"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiuj"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiuj host"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiuj polecenie Linux"
@@ -229,17 +232,17 @@ msgstr "Kopiuj polecenie Linux"
msgid "Copy text"
msgstr "Kopiuj tekst"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "Procesor"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Użycie procesora"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Utwórz konto"
@@ -248,8 +251,8 @@ msgstr "Utwórz konto"
msgid "Dark"
msgstr "Ciemny"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Panel kontrolny"
@@ -257,50 +260,62 @@ msgstr "Panel kontrolny"
msgid "Default time period"
msgstr "Domyślny przedział czasu"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Usuń"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Dysk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Dysk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Użycie dysku"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Wykorzystanie dysku {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Wykorzystanie procesora przez Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Wykorzystanie pamięci przez Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Sieć Docker I/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentacja"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Błąd"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Przekracza {0}{1} w ciągu ostatnich {2, plural, one {# minuty} other {# minut}}"
@@ -334,16 +352,16 @@ msgstr "Eksportuj konfigurację"
msgid "Export your current systems configuration."
msgstr "Eksportuj aktualną konfigurację systemów."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Błąd autoryzacji"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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"
@@ -351,34 +369,34 @@ msgstr "Nie udało się wysłać testowego powiadomienia"
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:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtruj..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Zapomniałeś hasła?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Ogólne"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "Moc GPU"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Siatka"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / adres IP"
@@ -386,12 +404,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:267
msgid "Kernel"
msgstr "Jądro"
@@ -399,7 +417,7 @@ msgstr "Jądro"
msgid "Language"
msgstr "Język"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Układ"
@@ -408,7 +426,7 @@ msgstr "Układ"
msgid "Light"
msgstr "Jasny"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Wyloguj"
@@ -416,17 +434,17 @@ msgstr "Wyloguj"
msgid "Login"
msgstr "Logowanie"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Próba logowania nie powiodła się"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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."
@@ -434,56 +452,60 @@ 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:226
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:663
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Pamięć"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Wykorzystanie pamięci"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Użycie pamięci przez kontenery Docker."
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nazwa"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Sieć"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Ruch sieciowy kontenerów Docker."
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Ruch sieciowy interfejsów publicznych"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Brak wyników."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nie znaleziono systemów."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Powiadomienia"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Wsparcie OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Otwórz menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Lub kontynuuj z"
@@ -503,32 +525,40 @@ msgstr "Lub kontynuuj z"
msgid "Overwrite existing alerts"
msgstr "Nadpisz istniejące alerty"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Strona"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Strony / Ustawienia"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Hasło"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pauza"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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ń."
@@ -536,8 +566,8 @@ msgstr "Proszę <0>skonfigurować serwer SMTP</0>, aby zapewnić dostarczanie po
msgid "Please check logs for more details."
msgstr "Sprawdź logi, aby uzyskać więcej informacji."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Sprawdź swoje poświadczenia i spróbuj ponownie"
@@ -545,15 +575,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:233
#: 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:49
msgid "Please log in again"
msgstr "Zaloguj się ponownie"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Proszę zapoznać się z <0>dokumentacją</0>."
@@ -561,12 +591,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:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Dokładne wykorzystanie w zarejestrowanym czasie"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Preferowany język"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Klucz publiczny"
@@ -594,24 +624,28 @@ msgstr "Otrzymane"
msgid "Reset Password"
msgstr "Resetuj hasło"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Zapisz ustawienia"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Szukaj"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Szukaj systemów lub ustawień..."
@@ -628,9 +662,9 @@ msgstr "Wysłane"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Ustawia domyślny zakres czasowy dla wykresów, gdy system jest wyświetlony."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Ustawienia"
msgid "Settings saved"
msgstr "Ustawienia zapisane"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Zaloguj się"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Ustawienia SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortuj według"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
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:513
msgid "Swap Usage"
msgstr "Użycie pamięci wymiany"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Systemy"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "Przepustowość {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Przełącz siatkę"
@@ -739,68 +779,74 @@ msgstr "Przełącz siatkę"
msgid "Toggle theme"
msgstr "Zmień motyw"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
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:340
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:322
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:328
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:314
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:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr "Czas pracy"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Wykorzystanie"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Użycie partycji głównej"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Używane"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Użytkownicy"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Widok"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Widoczne kolumny"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
@@ -808,7 +854,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"
@@ -829,3 +875,4 @@ msgstr "Konfiguracja YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Twoje ustawienia użytkownika zostały zaktualizowane."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: pt\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Portuguese\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
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:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# hora} other {# horas}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 hora"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 semana"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 horas"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 horas"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dias"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Ações"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Alertas Ativos"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Adicionar <0>Sistema</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Adicionar Novo Sistema"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
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"
@@ -79,15 +79,15 @@ msgstr "Adicionar URL"
msgid "Adjust display options for charts."
msgstr "Ajustar opções de exibição para gráficos."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agente"
@@ -96,12 +96,12 @@ msgstr "Agente"
msgid "Alerts"
msgstr "Alertas"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Todos os Sistemas"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Tem certeza de que deseja excluir {name}?"
@@ -109,49 +109,51 @@ msgstr "Tem certeza de que deseja excluir {name}?"
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:660
msgid "Average"
msgstr "Média"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Utilização média de CPU dos contêineres"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
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:538
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:426
msgid "Average system-wide CPU utilization"
msgstr "Utilização média de CPU em todo o sistema"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr ""
msgstr "Utilização média de {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Backups"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Largura de Banda"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binário"
@@ -159,7 +161,7 @@ msgstr "Binário"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Cancelar"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Clique para copiar"
@@ -196,32 +198,33 @@ msgstr "Clique para copiar"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Confirmar senha"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Continuar"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Copiado para a área de transferência"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Copiar"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Copiar host"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Copiar comando Linux"
@@ -229,17 +232,17 @@ msgstr "Copiar comando Linux"
msgid "Copy text"
msgstr "Copiar texto"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Uso de CPU"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Criar conta"
@@ -248,8 +251,8 @@ msgstr "Criar conta"
msgid "Dark"
msgstr "Escuro"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Painel"
@@ -257,50 +260,62 @@ msgstr "Painel"
msgid "Default time period"
msgstr "Período de tempo padrão"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Excluir"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disco"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "E/S de Disco"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Uso de Disco"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Uso de disco de {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Uso de CPU do Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Uso de Memória do Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "E/S de Rede do Docker"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Documentação"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Editar"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Erro"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Excede {0}{1} no último {2, plural, one {# minuto} other {# minutos}}"
@@ -334,16 +352,16 @@ 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:48
msgid "Failed to authenticate"
msgstr "Falha na autenticação"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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"
@@ -351,34 +369,34 @@ msgstr "Falha ao enviar notificação de teste"
msgid "Failed to update alert"
msgstr "Falha ao atualizar alerta"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrar..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Esqueceu a senha?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Geral"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
msgstr "Consumo de Energia da GPU"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Grade"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
@@ -386,12 +404,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:267
msgid "Kernel"
msgstr "Kernel"
@@ -399,16 +417,16 @@ msgstr "Kernel"
msgid "Language"
msgstr "Idioma"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr ""
msgstr "Aspeto"
#. Light theme
#: src/components/mode-toggle.tsx:16
msgid "Light"
msgstr "Claro"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Sair"
@@ -416,17 +434,17 @@ msgstr "Sair"
msgid "Login"
msgstr "Entrar"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Tentativa de login falhou"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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."
@@ -434,56 +452,60 @@ 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:226
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:663
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Memória"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Uso de Memória"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Uso de memória dos contêineres Docker"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Rede"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
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:484
msgid "Network traffic of public interfaces"
msgstr "Tráfego de rede das interfaces públicas"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Nenhum resultado encontrado."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Nenhum sistema encontrado."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Notificações"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Suporte a OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Abrir menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ou continue com"
@@ -503,32 +525,40 @@ msgstr "Ou continue com"
msgid "Overwrite existing alerts"
msgstr "Sobrescrever alertas existentes"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Página"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Páginas / Configurações"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Senha"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Pausar"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: 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."
@@ -536,8 +566,8 @@ msgstr "Por favor, <0>configure um servidor SMTP</0> para garantir que os alerta
msgid "Please check logs for more details."
msgstr "Por favor, verifique os logs para mais detalhes."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Por favor, verifique suas credenciais e tente novamente"
@@ -545,15 +575,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:233
#: 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:49
msgid "Please log in again"
msgstr "Por favor, faça login novamente"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Por favor, veja <0>a documentação</0> para instruções."
@@ -561,12 +591,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:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Porta"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Utilização precisa no momento registrado"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Idioma Preferido"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Chave Pública"
@@ -594,24 +624,28 @@ msgstr "Recebido"
msgid "Reset Password"
msgstr "Redefinir Senha"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Salvar Configurações"
msgstr "Guardar Definições"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Guardar Sistema"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Pesquisar"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Pesquisar por sistemas ou configurações..."
@@ -628,9 +662,9 @@ msgstr "Enviado"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Define o intervalo de tempo padrão para gráficos quando um sistema é visualizado."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -638,42 +672,43 @@ 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:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Entrar"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Configurações SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Ordenar Por"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
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:513
msgid "Swap Usage"
msgstr "Uso de Swap"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistema"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Sistemas"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Temp"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "Taxa de transferência de {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
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:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Alternar grade"
@@ -739,68 +779,74 @@ msgstr "Alternar grade"
msgid "Toggle theme"
msgstr "Alternar tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
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:340
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:322
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:328
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:314
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:334
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:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
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:266
msgid "Uptime"
msgstr "Tempo de Atividade"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Uso"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uso da partição raiz"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Usado"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Usuários"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Visual"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Campos Visíveis"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Aguardando registros suficientes para exibir"
@@ -808,7 +854,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"
@@ -829,3 +875,4 @@ msgstr "Configuração YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "As configurações do seu usuário foram atualizadas."

File diff suppressed because it is too large Load Diff

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: sl\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-26 18:38\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Slovenian\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dan} two {# dneva} few {# dni} other {# dni}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# ura} two {# uri} few {# ur} other {# ur}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 ura"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 teden"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 ur"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 ur"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dni"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Dejanja"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktivna opozorila"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Dodaj <0>sistem</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Dodaj nov sistem"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
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"
@@ -79,15 +79,15 @@ msgstr "Dodaj URL"
msgid "Adjust display options for charts."
msgstr "Prilagodi možnosti prikaza za grafikone."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Administrator"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Opozorila"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Vsi sistemi"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
@@ -109,49 +109,51 @@ msgstr "Ali ste prepričani, da želite izbrisati {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Za samodejno kopiranje je potreben varen kontekst."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Povprečno"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Povprečna izkoriščenost procesorja kontejnerjev"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Povprečje presega <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Povprečna poraba energije GPU"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Povprečna CPU izkoriščenost v celotnem sistemu"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Povprečna poraba {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Varnostne kopije"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Pasovna širina"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel podpira OpenID Connect in številne ponudnike preverjanja pristnosti 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 uporablja <0>Shoutrrr</0> za integracijo s priljubljenimi storitvami obveščanja."
#: src/components/add-system.tsx:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binarno"
@@ -159,7 +161,7 @@ msgstr "Binarno"
msgid "Cache / Buffers"
msgstr "Predpomnilnik / medpomnilniki"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Prekliči"
@@ -183,11 +185,11 @@ msgstr "Preverite {email} za povezavo za ponastavitev."
msgid "Check logs for more details."
msgstr "Za več podrobnosti preverite dnevnike."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Preverite storitev obveščanja"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klikni za kopiranje"
@@ -196,32 +198,33 @@ msgstr "Klikni za kopiranje"
msgid "Command line instructions"
msgstr "Navodila za ukazno vrstico"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Nastavi način prejemanja opozorilnih obvestil."
#: src/components/login/auth-form.tsx:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Potrdite geslo"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Nadaljuj"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Kopirano v odložišče"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiraj"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiraj gostitelja"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiraj Linux ukaz"
@@ -229,17 +232,17 @@ msgstr "Kopiraj Linux ukaz"
msgid "Copy text"
msgstr "Kopiraj besedilo"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "CPU poraba"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Ustvari račun"
@@ -248,8 +251,8 @@ msgstr "Ustvari račun"
msgid "Dark"
msgstr "Temno"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Nadzorna plošča"
@@ -257,50 +260,62 @@ msgstr "Nadzorna plošča"
msgid "Default time period"
msgstr "Privzeto časovno obdobje"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Izbriši"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Poraba diska"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Poraba diska za {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU poraba"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker poraba spomina"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker I/O mreže"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentacija"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-pošta"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-poštna obvestila"
@@ -308,17 +323,20 @@ msgstr "E-poštna obvestila"
msgid "Enter email address to reset password"
msgstr "Vnesite e-poštni naslov za ponastavitev gesla"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Vnesite e-poštni naslov..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Napaka"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Preseženo {0}{1} v zadnjih {2, plural, one {# minuti} other {# minutah}}"
@@ -334,16 +352,16 @@ msgstr "Izvozi nastavitve"
msgid "Export your current systems configuration."
msgstr "Izvozi trenutne nastavitve sistema."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Preverjanje pristnosti ni uspelo"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Shranjevanje nastavitev ni uspelo"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Pošiljanje testnega obvestila ni uspelo"
@@ -351,34 +369,34 @@ msgstr "Pošiljanje testnega obvestila ni uspelo"
msgid "Failed to update alert"
msgstr "Opozorila ni bilo mogoče posodobiti"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filter..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Za <0>{min}</0> {min, plural, one {minuto} other {minut}}"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Pozabljeno geslo?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Splošno"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU poraba moči"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Mreža"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Gostitelj / IP"
@@ -386,12 +404,12 @@ msgstr "Gostitelj / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Če ste izgubili geslo za svoj skrbniški račun, ga lahko ponastavite z naslednjim ukazom."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Napačen e-poštni naslov."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Jedro"
@@ -399,7 +417,7 @@ msgstr "Jedro"
msgid "Language"
msgstr "Jezik"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Postavitev"
@@ -408,7 +426,7 @@ msgstr "Postavitev"
msgid "Light"
msgstr "Svetlo"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Odjava"
@@ -416,17 +434,17 @@ msgstr "Odjava"
msgid "Login"
msgstr "Prijava"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Poskus prijave ni uspel"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Dnevniki"
#: 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 "Namesto tega iščete, kje ustvariti opozorila? Kliknite ikone zvonca <0/> v sistemski tabeli."
@@ -434,56 +452,60 @@ msgstr "Namesto tega iščete, kje ustvariti opozorila? Kliknite ikone zvonca <0
msgid "Manage display and notification preferences."
msgstr "Upravljajte nastavitve prikaza in obvestil."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "Največ 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Pomnilnik"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Poraba pomnilnika"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Poraba pomnilnika docker kontejnerjev"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Naziv"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mreža"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Omrežni promet docker kontejnerjev"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Omrežni promet javnih vmesnikov"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Ni rezultatov."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Ne najdem sistema."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Obvestila"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Podpora za OAuth 2 / OIDC"
@@ -491,11 +513,11 @@ msgstr "Podpora za OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ob vsakem ponovnem zagonu bodo sistemi v zbirki podatkov posodobljeni, da se bodo ujemali s sistemi, definiranimi v datoteki."
#: src/components/systems-table/systems-table.tsx:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Odpri menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Ali nadaljuj z"
@@ -503,32 +525,40 @@ msgstr "Ali nadaljuj z"
msgid "Overwrite existing alerts"
msgstr "Prepiši obstoječe alarme"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Stran"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Strani / Nastavitve"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Geslo"
#: src/components/login/auth-form.tsx:17
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Geslo mora imeti vsaj 8 znakov."
#: 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 "Prejeta zahteva za ponastavitev gesla"
#: src/components/systems-table/systems-table.tsx:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Premor"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "<0>Nastavite strežnik SMTP</0>, da zagotovite dostavo opozoril."
@@ -536,8 +566,8 @@ msgstr "<0>Nastavite strežnik SMTP</0>, da zagotovite dostavo opozoril."
msgid "Please check logs for more details."
msgstr "Za več podrobnosti preverite dnevnike."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Preverite svoje poverilnice in poskusite znova"
@@ -545,15 +575,15 @@ msgstr "Preverite svoje poverilnice in poskusite znova"
msgid "Please create an admin account"
msgstr "Ustvarite skrbniški račun"
#: src/components/login/auth-form.tsx:233
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Omogočite pojavna okna za to spletno mesto"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Prosimo, prijavite se znova"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Za navodila glejte <0>dokumentacijo</0>."
@@ -561,12 +591,12 @@ msgstr "Za navodila glejte <0>dokumentacijo</0>."
msgid "Please sign in to your account"
msgstr "Prijavite se v svoj račun"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Vrata"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Natančna poraba v zabeleženem času"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Prednostni jezik"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Javni ključ"
@@ -594,24 +624,28 @@ msgstr "Prejeto"
msgid "Reset Password"
msgstr "Ponastavi geslo"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Nadaljuj"
#: 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 "Shranite naslov s tipko enter ali vejico. Pustite prazno, da onemogočite e-poštna obvestila."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Shrani nastavitve"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Iskanje"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Iskanje sistemov ali nastavitev..."
@@ -628,9 +662,9 @@ msgstr "Poslano"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Nastavi privzeti časovni obseg za grafikone, ko si ogledujete sistem."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Nastavitve"
msgid "Settings saved"
msgstr "Nastavitve so shranjene"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Prijavite se"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP nastavitve"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Razvrsti po"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap prostor, ki ga uporablja sistem"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap uporaba"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistemsko"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Sistemi"
@@ -681,32 +716,37 @@ msgstr "Sistemi"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sisteme lahko upravljate v datoteki <0>config.yml</0> v vašem podatkovnem imeniku."
#: src/components/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabela"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatura"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperature sistemskih senzorjev"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Preveri <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testno obvestilo je poslano"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Za vzpostavitev povezave mora biti agent zagnan v sistemu. Kopirajte spodnji namestitveni ukaz za agenta."
#: src/components/add-system.tsx:99
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Za vzpostavitev povezave mora biti agent zagnan v sistemu. Kopirajte <0>docker-compose.yml</0> za spodnjega agenta."
@@ -714,24 +754,24 @@ msgstr "Za vzpostavitev povezave mora biti agent zagnan v sistemu. Kopirajte <0>
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Nato se prijavite v zaledni sistem in ponastavite geslo svojega uporabniškega računa v tabeli uporabnikov."
#: src/components/systems-table/systems-table.tsx:573
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tega dejanja ni mogoče razveljaviti. To bo trajno izbrisalo vse trenutne zapise za {name} iz zbirke podatkov."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Prepustnost {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Prepustnost korenskega datotečnega sistema"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-pošta za"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Preklopi način mreže"
@@ -739,68 +779,74 @@ msgstr "Preklopi način mreže"
msgid "Toggle theme"
msgstr "Obrni temo"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Sproži se, ko kateri koli senzor preseže prag"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Sproži, ko kombinacija gor/dol preseže prag"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Sproži se, ko poraba procesorja preseže prag"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Sproži se, ko uporaba pomnilnika preseže prag"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Sproži se, ko se stanje preklaplja med gor in dol"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Sproži se, ko uporaba katerega koli diska preseže prag"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Posodobljeno v realnem času. Za ogled informacij kliknite na sistem."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Čas delovanja"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Uporaba"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Uporaba korenske particije"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Uporabljeno"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Uporabniki"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Pogled"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Vidna polja"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Čakam na dovolj zapisov za prikaz"
@@ -808,7 +854,7 @@ msgstr "Čakam na dovolj zapisov za prikaz"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Ali nam želite pomagati, da bomo naše prevode še izboljšali? Za več podrobnosti si oglejte <0>Crowdin</0>."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / potisna obvestila"
@@ -829,3 +875,4 @@ msgstr "YAML nastavitev"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Vaše uporabniške nastavitve so posodobljene."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: sv\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-20 18:13\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Swedish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# dag} other {# dagar}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# timme} other {# timmar}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 timme"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 vecka"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 timmar"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 timmar"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 dagar"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Åtgärder"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktiva larm"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Lägg till <0>System</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Lägg till nytt system"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Lägg till system"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Lägg till URL"
@@ -79,15 +79,15 @@ msgstr "Lägg till URL"
msgid "Adjust display options for charts."
msgstr "Justera visningsalternativ för diagram."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Agent"
@@ -96,12 +96,12 @@ msgstr "Agent"
msgid "Alerts"
msgstr "Larm"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Alla system"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Är du säker på att du vill ta bort {name}?"
@@ -109,49 +109,51 @@ msgstr "Är du säker på att du vill ta bort {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Automatisk kopiering kräver en säker kontext."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Genomsnitt"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Genomsnittlig CPU-användning för containrar"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Genomsnittet överskrider <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "Genomsnittlig strömförbrukning för GPU:er"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Genomsnittlig systemomfattande CPU-användning"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "Genomsnittlig användning av {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Säkerhetskopior"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bandbredd"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel stöder OpenID Connect och många OAuth2-autentiseringsleverantörer."
#: 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 använder <0>Shoutrrr</0> för att integrera med populära aviseringstjänster."
#: src/components/add-system.tsx:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Binär"
@@ -159,7 +161,7 @@ msgstr "Binär"
msgid "Cache / Buffers"
msgstr "Cache / Buffertar"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Avbryt"
@@ -183,11 +185,11 @@ msgstr "Kontrollera {email} för en återställningslänk."
msgid "Check logs for more details."
msgstr "Kontrollera loggarna för mer information."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Kontrollera din aviseringstjänst"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Klicka för att kopiera"
@@ -196,32 +198,33 @@ msgstr "Klicka för att kopiera"
msgid "Command line instructions"
msgstr "Instruktioner för kommandoraden"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Konfigurera hur du tar emot larmaviseringar."
#: src/components/login/auth-form.tsx:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Bekräfta lösenord"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Fortsätt"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Kopierat till urklipp"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopiera"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Kopiera värd"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Kopiera Linux-kommando"
@@ -229,17 +232,17 @@ msgstr "Kopiera Linux-kommando"
msgid "Copy text"
msgstr "Kopiera text"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "CPU-användning"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Skapa konto"
@@ -248,8 +251,8 @@ msgstr "Skapa konto"
msgid "Dark"
msgstr "Mörkt"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Dashboard"
@@ -257,50 +260,62 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardtidsperiod"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Ta bort"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Diskanvändning"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Diskanvändning av {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU-användning"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Minnesanvändning"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Nätverks-I/O"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokumentation"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-post"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-postaviseringar"
@@ -308,17 +323,20 @@ msgstr "E-postaviseringar"
msgid "Enter email address to reset password"
msgstr "Ange e-postadress för att återställa lösenord"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Ange e-postadress..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Fel"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Överskrider {0}{1} under de senaste {2, plural, one {# minuten} other {# minuterna}}"
@@ -334,16 +352,16 @@ msgstr "Exportera konfiguration"
msgid "Export your current systems configuration."
msgstr "Exportera din nuvarande systemkonfiguration."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Autentisering misslyckades"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Kunde inte spara inställningar"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Kunde inte skicka testavisering"
@@ -351,34 +369,34 @@ msgstr "Kunde inte skicka testavisering"
msgid "Failed to update alert"
msgstr "Kunde inte uppdatera larm"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrera..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Under <0>{min}</0> {min, plural, one {minut} other {minuter}}"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Glömt lösenordet?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Allmänt"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU-strömförbrukning"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Rutnät"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Värd / IP"
@@ -386,12 +404,12 @@ msgstr "Värd / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Om du har glömt lösenordet till ditt administratörskonto kan du återställa det med följande kommando."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Ogiltig e-postadress."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kärna"
@@ -399,7 +417,7 @@ msgstr "Kärna"
msgid "Language"
msgstr "Språk"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Layout"
@@ -408,7 +426,7 @@ msgstr "Layout"
msgid "Light"
msgstr "Ljust"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Logga ut"
@@ -416,17 +434,17 @@ msgstr "Logga ut"
msgid "Login"
msgstr "Logga in"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Inloggningsförsök misslyckades"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Loggar"
#: 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 "Letar du istället efter var du skapar larm? Klicka på klockikonerna <0/> i systemtabellen."
@@ -434,56 +452,60 @@ msgstr "Letar du istället efter var du skapar larm? Klicka på klockikonerna <0
msgid "Manage display and notification preferences."
msgstr "Hantera visnings- och aviseringsinställningar."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Minne"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Minnesanvändning"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Minnesanvändning för dockercontainrar"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Namn"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Nät"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Nätverkstrafik för dockercontainrar"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Nätverkstrafik för publika gränssnitt"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Inga resultat hittades."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Inga system hittades."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Aviseringar"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Stöd för OAuth 2 / OIDC"
@@ -491,11 +513,11 @@ msgstr "Stöd för OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Vid varje omstart kommer systemen i databasen att uppdateras för att matcha systemen som definieras i filen."
#: src/components/systems-table/systems-table.tsx:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Öppna menyn"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Eller fortsätt med"
@@ -503,32 +525,40 @@ msgstr "Eller fortsätt med"
msgid "Overwrite existing alerts"
msgstr "Skriv över befintliga larm"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Sida"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Sidor / Inställningar"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Lösenord"
#: src/components/login/auth-form.tsx:17
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Lösenordet måste vara minst 8 tecken."
#: 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 "Begäran om återställning av lösenord mottagen"
#: src/components/systems-table/systems-table.tsx:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Paus"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Vänligen <0>konfigurera en SMTP-server</0> för att säkerställa att larm levereras."
@@ -536,8 +566,8 @@ msgstr "Vänligen <0>konfigurera en SMTP-server</0> för att säkerställa att l
msgid "Please check logs for more details."
msgstr "Vänligen kontrollera loggarna för mer information."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Vänligen kontrollera dina inloggningsuppgifter och försök igen"
@@ -545,15 +575,15 @@ msgstr "Vänligen kontrollera dina inloggningsuppgifter och försök igen"
msgid "Please create an admin account"
msgstr "Vänligen skapa ett administratörskonto"
#: src/components/login/auth-form.tsx:233
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Vänligen aktivera popup-fönster för den här webbplatsen"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Vänligen logga in igen"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vänligen se <0>dokumentationen</0> för instruktioner."
@@ -561,12 +591,12 @@ msgstr "Vänligen se <0>dokumentationen</0> för instruktioner."
msgid "Please sign in to your account"
msgstr "Vänligen logga in på ditt konto"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Exakt användning vid den registrerade tidpunkten"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Föredraget språk"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Offentlig nyckel"
@@ -594,24 +624,28 @@ msgstr "Mottaget"
msgid "Reset Password"
msgstr "Återställ lösenord"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Återuppta"
#: 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 "Spara adressen med Enter-tangenten eller komma. Lämna tomt för att inaktivera e-postaviseringar."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Spara inställningar"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Sök"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Sök efter system eller inställningar..."
@@ -628,9 +662,9 @@ msgstr "Skickat"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Anger standardtidsintervallet för diagram när ett system visas."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Inställningar"
msgid "Settings saved"
msgstr "Inställningar sparade"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Logga in"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP-inställningar"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sortera efter"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Status"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Swap-utrymme som används av systemet"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Swap-användning"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "System"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "System"
@@ -681,32 +716,37 @@ msgstr "System"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "System kan hanteras i en <0>config.yml</0>-fil i din datakatalog."
#: src/components/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tabell"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Temperatur"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Temperaturer för systemsensorer"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Testa <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Testavisering skickad"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Agenten måste köras på systemet för att ansluta. Kopiera installationskommandot för agenten nedan."
#: src/components/add-system.tsx:99
#: src/components/add-system.tsx:137
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åste köras på systemet för att ansluta. Kopiera <0>docker-compose.yml</0> för agenten nedan."
@@ -714,24 +754,24 @@ msgstr "Agenten måste köras på systemet för att ansluta. Kopiera <0>docker-c
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Logga sedan in på backend och återställ ditt användarkontos lösenord i användartabellen."
#: src/components/systems-table/systems-table.tsx:573
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Den här åtgärden kan inte ångras. Detta kommer permanent att ta bort alla aktuella poster för {name} från databasen."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Genomströmning av {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Genomströmning av rotfilsystemet"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Till e-postadress(er)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Växla rutnät"
@@ -739,68 +779,74 @@ msgstr "Växla rutnät"
msgid "Toggle theme"
msgstr "Växla tema"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Utlöses när någon sensor överskrider ett tröskelvärde"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Utlöses när kombinerad upp/ner överskrider ett tröskelvärde"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Utlöses när CPU-användningen överskrider ett tröskelvärde"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Utlöses när minnesanvändningen överskrider ett tröskelvärde"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Utlöses när status växlar mellan upp och ner"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Utlöses när användningen av någon disk överskrider ett tröskelvärde"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Uppdateras i realtid. Klicka på ett system för att visa information."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Drifttid"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Användning"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Användning av rotpartitionen"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Använt"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Användare"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Visa"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Synliga fält"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Väntar på tillräckligt med poster att visa"
@@ -808,7 +854,7 @@ msgstr "Väntar på tillräckligt med poster att visa"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Vill du hjälpa oss att göra våra översättningar ännu bättre? Kolla in <0>Crowdin</0> för mer information."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-aviseringar"
@@ -829,3 +875,4 @@ msgstr "YAML-konfiguration"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Dina användarinställningar har uppdaterats."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: tr\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Turkish\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# gün} other {# gün}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# saat} other {# saat}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 saat"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 hafta"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 saat"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 saat"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 gün"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Eylemler"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Aktif Uyarılar"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "<0>Sistem</0> Ekle"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Yeni Sistem Ekle"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Sistem ekle"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "URL Ekle"
@@ -79,15 +79,15 @@ msgstr "URL Ekle"
msgid "Adjust display options for charts."
msgstr "Grafikler için görüntüleme seçeneklerini ayarlayın."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Yönetici"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Aracı"
@@ -96,12 +96,12 @@ msgstr "Aracı"
msgid "Alerts"
msgstr "Uyarılar"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Tüm Sistemler"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "{name} silmek istediğinizden emin misiniz?"
@@ -109,49 +109,51 @@ msgstr "{name} silmek istediğinizden emin misiniz?"
msgid "Automatic copy requires a secure context."
msgstr "Otomatik kopyalama güvenli bir bağlam gerektirir."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Ortalama"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Konteynerlerin ortalama CPU kullanımı"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Ortalama <0>{value}{0}</0> aşıyor"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU ların ortalama güç tüketimi"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Sistem genelinde ortalama CPU kullanımı"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} ortalama kullanımı"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Yedekler"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Bant Genişliği"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel, OpenID Connect ve birçok OAuth2 kimlik doğrulama sağlayıcısını destekler."
#: 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, popüler bildirim hizmetleriyle entegre olmak için <0>Shoutrrr</0> kullanır."
#: src/components/add-system.tsx:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "İkili"
@@ -159,7 +161,7 @@ msgstr "İkili"
msgid "Cache / Buffers"
msgstr "Önbellek / Tamponlar"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "İptal"
@@ -183,11 +185,11 @@ msgstr "Sıfırlama bağlantısı için {email} kontrol edin."
msgid "Check logs for more details."
msgstr "Daha fazla ayrıntı için günlükleri kontrol edin."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Bildirim hizmetinizi kontrol edin"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Kopyalamak için tıklayın"
@@ -196,32 +198,33 @@ msgstr "Kopyalamak için tıklayın"
msgid "Command line instructions"
msgstr "Komut satırı talimatları"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Uyarı bildirimlerini nasıl alacağınızı yapılandırın."
#: src/components/login/auth-form.tsx:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Şifreyi onayla"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Devam et"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Panoya kopyalandı"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Kopyala"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Ana bilgisayarı kopyala"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Linux komutunu kopyala"
@@ -229,17 +232,17 @@ msgstr "Linux komutunu kopyala"
msgid "Copy text"
msgstr "Metni kopyala"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "CPU Kullanımı"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Hesap oluştur"
@@ -248,8 +251,8 @@ msgstr "Hesap oluştur"
msgid "Dark"
msgstr "Koyu"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Gösterge Paneli"
@@ -257,50 +260,62 @@ msgstr "Gösterge Paneli"
msgid "Default time period"
msgstr "Varsayılan zaman dilimi"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Sil"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Disk"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Disk G/Ç"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Disk Kullanımı"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName} disk kullanımı"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU Kullanımı"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker Bellek Kullanımı"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker Ağ G/Ç"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Dokümantasyon"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "E-posta"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "E-posta bildirimleri"
@@ -308,17 +323,20 @@ msgstr "E-posta bildirimleri"
msgid "Enter email address to reset password"
msgstr "Şifreyi sıfırlamak için e-posta adresini girin"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "E-posta adresini girin..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Hata"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Son {2, plural, one {# dakika} other {# dakika}} içinde {0}{1} aşıyor"
@@ -334,16 +352,16 @@ msgstr "Yapılandırmayı dışa aktar"
msgid "Export your current systems configuration."
msgstr "Mevcut sistem yapılandırmanızı dışa aktarın."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Kimlik doğrulama başarısız"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Ayarlar kaydedilemedi"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Test bildirimi gönderilemedi"
@@ -351,34 +369,34 @@ msgstr "Test bildirimi gönderilemedi"
msgid "Failed to update alert"
msgstr "Uyarı güncellenemedi"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Filtrele..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "<0>{min}</0> {min, plural, one {dakika} other {dakika}} için"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Şifrenizi mi unuttunuz?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Genel"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU Güç Çekimi"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Izgara"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Host / IP"
@@ -386,12 +404,12 @@ msgstr "Host / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Yönetici hesabınızın şifresini kaybettiyseniz, aşağıdaki komutu kullanarak sıfırlayabilirsiniz."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Geçersiz e-posta adresi."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Çekirdek"
@@ -399,7 +417,7 @@ msgstr "Çekirdek"
msgid "Language"
msgstr "Dil"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Düzen"
@@ -408,7 +426,7 @@ msgstr "Düzen"
msgid "Light"
msgstr "Açık"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Çıkış Yap"
@@ -416,17 +434,17 @@ msgstr "Çıkış Yap"
msgid "Login"
msgstr "Giriş Yap"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Giriş denemesi başarısız"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Günlükler"
#: 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 "Uyarı oluşturma yerini mi arıyorsunuz? Sistemler tablosundaki zil <0/> simgelerine tıklayın."
@@ -434,56 +452,60 @@ msgstr "Uyarı oluşturma yerini mi arıyorsunuz? Sistemler tablosundaki zil <0/
msgid "Manage display and notification preferences."
msgstr "Görüntüleme ve bildirim tercihlerini yönetin."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "Maks 1 dk"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Bellek"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Bellek Kullanımı"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker konteynerlerinin bellek kullanımı"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ad"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Ağ"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker konteynerlerinin ağ trafiği"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Genel arayüzlerin ağ trafiği"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Sonuç bulunamadı."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Sistem bulunamadı."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Bildirimler"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "OAuth 2 / OIDC desteği"
@@ -491,11 +513,11 @@ msgstr "OAuth 2 / OIDC desteği"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Her yeniden başlatmada, veritabanındaki sistemler dosyada tanımlanan sistemlerle eşleşecek şekilde güncellenecektir."
#: src/components/systems-table/systems-table.tsx:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Menüyü aç"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Veya devam et"
@@ -503,32 +525,40 @@ msgstr "Veya devam et"
msgid "Overwrite existing alerts"
msgstr "Mevcut uyarıların üzerine yaz"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Sayfa"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Sayfalar / Ayarlar"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Şifre"
#: src/components/login/auth-form.tsx:17
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Şifre en az 8 karakter olmalıdır."
#: 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 "Şifre sıfırlama isteği alındı"
#: src/components/systems-table/systems-table.tsx:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Duraklat"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Uyarıların teslim edilmesini sağlamak için lütfen bir SMTP sunucusu <0>yapılandırın</0>."
@@ -536,8 +566,8 @@ msgstr "Uyarıların teslim edilmesini sağlamak için lütfen bir SMTP sunucusu
msgid "Please check logs for more details."
msgstr "Daha fazla ayrıntı için lütfen günlükleri kontrol edin."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin"
@@ -545,15 +575,15 @@ msgstr "Lütfen kimlik bilgilerinizi kontrol edin ve tekrar deneyin"
msgid "Please create an admin account"
msgstr "Lütfen bir yönetici hesabı oluşturun"
#: src/components/login/auth-form.tsx:233
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Lütfen bu site için açılır pencereleri etkinleştirin"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Lütfen tekrar giriş yapın"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Talimatlar için lütfen <0>dokümantasyonu</0> inceleyin."
@@ -561,12 +591,12 @@ msgstr "Talimatlar için lütfen <0>dokümantasyonu</0> inceleyin."
msgid "Please sign in to your account"
msgstr "Lütfen hesabınıza giriş yapın"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Kayıtlı zamanda kesin kullanım"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Tercih Edilen Dil"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Genel Anahtar"
@@ -594,24 +624,28 @@ msgstr "Alındı"
msgid "Reset Password"
msgstr "Şifreyi Sıfırla"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Devam et"
#: 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 "Adresleri enter tuşu veya virgül ile kaydedin. E-posta bildirimlerini devre dışı bırakmak için boş bırakın."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Ayarları Kaydet"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Ara"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Sistemler veya ayarlar için ara..."
@@ -628,9 +662,9 @@ msgstr "Gönderildi"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Bir sistem görüntülendiğinde grafikler için varsayılan zaman aralığını ayarlar."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Ayarlar"
msgid "Settings saved"
msgstr "Ayarlar kaydedildi"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Giriş yap"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP ayarları"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sıralama Ölçütü"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Durum"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Sistem tarafından kullanılan takas alanı"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Takas Kullanımı"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Sistem"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Sistemler"
@@ -681,32 +716,37 @@ msgstr "Sistemler"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Sistemler, veri dizininizdeki bir <0>config.yml</0> dosyasında yönetilebilir."
#: src/components/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Tablo"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Sıcaklık"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Sistem sensörlerinin sıcaklıkları"
#: 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 bildirimi gönderildi"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Bağlanmak için aracının sistemde çalışıyor olması gerekir. Aşağıdaki aracı kurulum komutunu kopyalayın."
#: src/components/add-system.tsx:99
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Bağlanmak için aracının sistemde çalışıyor olması gerekir. Aşağıdaki <0>docker-compose.yml</0> dosyasını kopyalayın."
@@ -714,24 +754,24 @@ msgstr "Bağlanmak için aracının sistemde çalışıyor olması gerekir. Aşa
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Ardından arka uca giriş yapın ve kullanıcılar tablosunda kullanıcı hesabı şifrenizi sıfırlayın."
#: src/components/systems-table/systems-table.tsx:573
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Bu işlem geri alınamaz. Bu, veritabanından {name} için tüm mevcut kayıtları kalıcı olarak silecektir."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName} verimliliği"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Kök dosya sisteminin verimliliği"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "E-posta(lar)a"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Izgarayı değiştir"
@@ -739,68 +779,74 @@ msgstr "Izgarayı değiştir"
msgid "Toggle theme"
msgstr "Temayı değiştir"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Herhangi bir sensör bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Birleştirilmiş yukarı/aşağı bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "CPU kullanımı bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Bellek kullanımı bir eşiği aştığında tetiklenir"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Durum yukarı ve aşağı arasında değiştiğinde tetiklenir"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Herhangi bir diskin kullanımı bir eşiği aştığında tetiklenir"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Gerçek zamanlı olarak güncellenir. Bilgileri görüntülemek için bir sisteme tıklayın."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Çalışma Süresi"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Kullanım"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Kök bölümün kullanımı"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Kullanıldı"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Kullanıcılar"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Görüntüle"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Görünür Alanlar"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Görüntülemek için yeterli kayıt bekleniyor"
@@ -808,7 +854,7 @@ msgstr "Görüntülemek için yeterli kayıt bekleniyor"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Çevirilerimizi daha iyi hale getirmemize yardımcı olmak ister misiniz? Daha fazla bilgi için <0>Crowdin</0> inceleyin."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Webhook / Anlık bildirimler"
@@ -829,3 +875,4 @@ msgstr "YAML Yapılandırması"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Kullanıcı ayarlarınız güncellendi."

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: uk\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-20 18:13\n"
"PO-Revision-Date: 2025-03-15 04:14\n"
"Last-Translator: \n"
"Language-Team: Ukrainian\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,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:258
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# день} few {# дні} many {# днів} other {# дня}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:256
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# година} few {# години} many {# годин} other {# години}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 година"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 тиждень"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 годин"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 години"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 днів"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Дії"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Активні сповіщення"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Додати <0>Систему</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Додати нову систему"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Додати систему"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Додати URL"
@@ -79,15 +79,15 @@ msgstr "Додати URL"
msgid "Adjust display options for charts."
msgstr "Налаштуйте параметри відображення для графіків."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Адміністратор"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Агент"
@@ -96,12 +96,12 @@ msgstr "Агент"
msgid "Alerts"
msgstr "Сповіщення"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Всі системи"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Ви впевнені, що хочете видалити {name}?"
@@ -109,49 +109,51 @@ msgstr "Ви впевнені, що хочете видалити {name}?"
msgid "Automatic copy requires a secure context."
msgstr "Автоматичне копіювання вимагає безпечного контексту."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:668
msgid "Average"
msgstr "Середнє"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:445
msgid "Average CPU utilization of containers"
msgstr "Середнє використання CPU контейнерами"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Середнє перевищує <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:546
msgid "Average power consumption of GPUs"
msgstr "Середнє енергоспоживання GPUs"
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:434
msgid "Average system-wide CPU utilization"
msgstr "Середнє використання CPU по всій системі"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:564
msgid "Average utilization of {0}"
msgstr "Середнє використання {0}"
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Резервні копії"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:490
msgid "Bandwidth"
msgstr "Пропускна здатність"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
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:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Двійковий"
@@ -159,7 +161,7 @@ msgstr "Двійковий"
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Скасувати"
@@ -183,11 +185,11 @@ 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:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Натисніть, щоб скопіювати"
@@ -196,32 +198,33 @@ msgstr "Натисніть, щоб скопіювати"
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:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Підтвердьте пароль"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Продовжити"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Скопійовано в буфер обміну"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Копіювати"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Копіювати хост"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Копіювати команду Linux"
@@ -229,17 +232,17 @@ msgstr "Копіювати команду Linux"
msgid "Copy text"
msgstr "Копіювати текст"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "ЦП"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:433
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Використання ЦП"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Створити обліковий запис"
@@ -248,8 +251,8 @@ msgstr "Створити обліковий запис"
msgid "Dark"
msgstr "Темний"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Панель управління"
@@ -257,50 +260,62 @@ msgstr "Панель управління"
msgid "Default time period"
msgstr "Стандартний період часу"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Видалити"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Диск"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:480
msgid "Disk I/O"
msgstr "Дисковий ввід/вивід"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:473
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Використання диска"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:601
msgid "Disk usage of {extraFsName}"
msgstr "Використання диска {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:444
msgid "Docker CPU Usage"
msgstr "Використання ЦП Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:465
msgid "Docker Memory Usage"
msgstr "Використання пам'яті Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:506
msgid "Docker Network I/O"
msgstr "Мережевий ввід/вивід Docker"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Документація"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:344
msgid "Down"
msgstr "Не працює"
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "Редагувати"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Електронна пошта"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Сповіщення електронною поштою"
@@ -308,17 +323,20 @@ 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:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Помилка"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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 {останніх # хвилин}}"
@@ -334,16 +352,16 @@ msgstr "Експорт конфігурації"
msgid "Export your current systems configuration."
msgstr "Експортуйте поточну конфігурацію систем."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Не вдалося автентифікувати"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
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 "Не вдалося надіслати тестове сповіщення"
@@ -351,34 +369,34 @@ msgstr "Не вдалося надіслати тестове сповіщенн
msgid "Failed to update alert"
msgstr "Не вдалося оновити сповіщення"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:641
msgid "Filter..."
msgstr "Фільтр..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
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:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Забули пароль?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Загальні"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:545
msgid "GPU Power Draw"
msgstr "Енергоспоживання GPU"
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Сітка"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Хост / IP"
@@ -386,12 +404,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:270
msgid "Kernel"
msgstr "Ядро"
@@ -399,7 +417,7 @@ msgstr "Ядро"
msgid "Language"
msgstr "Мова"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Макет"
@@ -408,7 +426,7 @@ msgstr "Макет"
msgid "Light"
msgstr "Світлий"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Вийти"
@@ -416,17 +434,17 @@ msgstr "Вийти"
msgid "Login"
msgstr "Увійти"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Спроба входу не вдалася"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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/> в таблиці систем."
@@ -434,56 +452,60 @@ msgstr "Шукаєте, де створити сповіщення? Натисн
msgid "Manage display and notification preferences."
msgstr "Керуйте параметрами відображення та сповіщень."
#: src/components/add-system.tsx:226
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:671
msgid "Max 1 min"
msgstr "Макс 1 хв"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Пам'ять"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:455
msgid "Memory Usage"
msgstr "Використання пам'яті"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:466
msgid "Memory usage of docker containers"
msgstr "Використання пам'яті контейнерами Docker"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Ім'я"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Мережа"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:507
msgid "Network traffic of docker containers"
msgstr "Мережевий трафік контейнерів Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:492
msgid "Network traffic of public interfaces"
msgstr "Мережевий трафік публічних інтерфейсів"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Результатів не знайдено."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Систем не знайдено."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Сповіщення"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Підтримка OAuth 2 / OIDC"
@@ -491,11 +513,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:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Відкрити меню"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Або продовжити з"
@@ -503,32 +525,40 @@ msgstr "Або продовжити з"
msgid "Overwrite existing alerts"
msgstr "Перезаписати існуючі сповіщення"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Сторінка"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Сторінки / Налаштування"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Пароль"
#: src/components/login/auth-form.tsx:17
#: 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:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Пауза"
msgstr "Призупинити"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
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>, щоб забезпечити доставку сповіщень."
@@ -536,8 +566,8 @@ msgstr "Будь ласка, <0>налаштуйте SMTP сервер</0>, що
msgid "Please check logs for more details."
msgstr "Будь ласка, перевірте журнали для отримання додаткової інформації."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Будь ласка, перевірте свої облікові дані та спробуйте ще раз"
@@ -545,15 +575,15 @@ msgstr "Будь ласка, перевірте свої облікові дан
msgid "Please create an admin account"
msgstr "Будь ласка, створіть адміністративний обліковий запис"
#: src/components/login/auth-form.tsx:233
#: 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:49
msgid "Please log in again"
msgstr "Будь ласка, увійдіть знову"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Будь ласка, перегляньте <0>документацію</0> для отримання інструкцій."
@@ -561,12 +591,12 @@ msgstr "Будь ласка, перегляньте <0>документацію<
msgid "Please sign in to your account"
msgstr "Будь ласка, увійдіть у свій обліковий запис"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Порт"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:456
#: src/components/routes/system.tsx:572
msgid "Precise utilization at the recorded time"
msgstr "Точне використання в записаний час"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Бажана мова"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Ключ"
@@ -594,24 +624,28 @@ msgstr "Отримано"
msgid "Reset Password"
msgstr "Скинути пароль"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Продовжити"
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Зберегти налаштування"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "Зберегти систему"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Пошук"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Шукати системи або налаштування..."
@@ -628,9 +662,9 @@ msgstr "Відправлено"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Встановлює стандартний діапазон часу для графіків при перегляді системи."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Налаштування"
msgid "Settings saved"
msgstr "Налаштування збережено"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Увійти"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Налаштування SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Сортувати за"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Статус"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:522
msgid "Swap space used by the system"
msgstr "Область підкачки, використана системою"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:521
msgid "Swap Usage"
msgstr "Використання підкачки"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Система"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Системи"
@@ -681,32 +716,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/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Таблиця"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "Температура"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:533
msgid "Temperature"
msgstr "Температура"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:534
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:108
#: src/components/add-system.tsx:146
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:99
#: src/components/add-system.tsx:137
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> для агента нижче."
@@ -714,24 +754,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:573
#: src/components/systems-table/systems-table.tsx:660
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:613
msgid "Throughput of {extraFsName}"
msgstr "Пропускна здатність {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:481
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:408
#: src/components/routes/system.tsx:421
msgid "Toggle grid"
msgstr "Перемкнути сітку"
@@ -739,68 +779,74 @@ msgstr "Перемкнути сітку"
msgid "Toggle theme"
msgstr "Перемкнути тему"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Спрацьовує, коли будь-який датчик перевищує поріг"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Спрацьовує, коли комбіноване підняття/падіння перевищує поріг"
msgstr "Спрацьовує, коли відправлення/отримання сумарно перевищує поріг"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Спрацьовує, коли використання ЦП перевищує поріг"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Спрацьовує, коли використання пам'яті перевищує поріг"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Спрацьовує, коли статус перемикається між підняттям і падінням"
msgstr "Спрацьовує, коли статус перемикається між «працює» та «не працює»"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Спрацьовує, коли використання будь-якого диска перевищує поріг"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:342
msgid "Up"
msgstr "Працює"
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Оновлюється в реальному часі. Натисніть на систему, щоб переглянути інформацію."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:269
msgid "Uptime"
msgstr "Час роботи"
#: src/components/routes/system.tsx:563
#: src/components/routes/system.tsx:600
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Використання"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:473
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
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Використано"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Користувачі"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Вигляд"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Видимі стовпці"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:705
msgid "Waiting for enough records to display"
msgstr "Очікування достатньої кількості записів для відображення"
@@ -808,7 +854,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 сповіщення"
@@ -829,3 +875,4 @@ 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: vi\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-17 21:36\n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Vietnamese\n"
"Plural-Forms: nplurals=1; plural=0;\n"
@@ -18,60 +18,60 @@ 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
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# ngày} other {# ngày}}"
#: src/components/routes/system.tsx:248
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# giờ} other {# giờ}}"
#: src/lib/utils.ts:139
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1 giờ"
#: src/lib/utils.ts:162
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1 tuần"
#: src/lib/utils.ts:147
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12 giờ"
#: src/lib/utils.ts:155
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24 giờ"
#: src/lib/utils.ts:170
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30 ngày"
#. Table column
#: src/components/systems-table/systems-table.tsx:227
#: src/components/systems-table/systems-table.tsx:313
#: src/components/systems-table/systems-table.tsx:455
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
msgid "Actions"
msgstr "Hành động"
#: src/components/routes/home.tsx:61
#: src/components/routes/home.tsx:62
msgid "Active Alerts"
msgstr "Cảnh báo hoạt động"
#: src/components/add-system.tsx:78
#: src/components/add-system.tsx:42
msgid "Add <0>System</0>"
msgstr "Thêm <0>Hệ thống</0>"
#: src/components/add-system.tsx:87
#: src/components/add-system.tsx:125
msgid "Add New System"
msgstr "Thêm Hệ thống Mới"
#: src/components/add-system.tsx:165
#: src/components/add-system.tsx:176
#: src/components/add-system.tsx:231
msgid "Add system"
msgstr "Thêm hệ thống"
#: src/components/routes/settings/notifications.tsx:156
#: src/components/routes/settings/notifications.tsx:157
msgid "Add URL"
msgstr "Thêm URL"
@@ -79,15 +79,15 @@ msgstr "Thêm URL"
msgid "Adjust display options for charts."
msgstr "Điều chỉnh tùy chọn hiển thị cho biểu đồ."
#: src/components/command-palette.tsx:132
#: src/components/command-palette.tsx:145
#: src/components/command-palette.tsx:159
#: src/components/command-palette.tsx:173
#: src/components/command-palette.tsx:188
#: src/components/command-palette.tsx:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "Quản trị viên"
#: src/components/systems-table/systems-table.tsx:201
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "Tác nhân"
@@ -96,12 +96,12 @@ msgstr "Tác nhân"
msgid "Alerts"
msgstr "Cảnh báo"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
#: src/components/systems-table/systems-table.tsx:266
msgid "All Systems"
msgstr "Tất cả Hệ thống"
#: src/components/systems-table/systems-table.tsx:570
#: src/components/systems-table/systems-table.tsx:657
msgid "Are you sure you want to delete {name}?"
msgstr "Bạn có chắc chắn muốn xóa {name} không?"
@@ -109,49 +109,51 @@ msgstr "Bạn có chắc chắn muốn xóa {name} không?"
msgid "Automatic copy requires a secure context."
msgstr "Sao chép tự động yêu cầu một ngữ cảnh an toàn."
#: src/components/routes/system.tsx:625
#: src/components/routes/system.tsx:660
msgid "Average"
msgstr "Trung bình"
#: src/components/routes/system.tsx:396
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "Sử dụng CPU trung bình của các container"
#: src/components/alerts/alerts-system.tsx:206
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "Trung bình vượt quá <0>{value}{0}</0>"
#: src/components/routes/system.tsx:497
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr ""
#: src/components/routes/system.tsx:385
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "Sử dụng CPU trung bình toàn hệ thống"
#: src/components/routes/system.tsx:515
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr ""
#: src/components/command-palette.tsx:170
#: src/components/navbar.tsx:93
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "Sao lưu"
#: src/components/routes/system.tsx:441
#: src/lib/utils.ts:307
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "Băng thông"
#: src/components/login/auth-form.tsx:289
#: src/components/login/auth-form.tsx:306
msgid "Beszel supports OpenID Connect and many OAuth2 authentication providers."
msgstr "Beszel hỗ trợ OpenID Connect và nhiều nhà cung cấp xác thực 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 sử dụng <0>Shoutrrr</0> để tích hợp với các dịch vụ thông báo phổ biến."
#: src/components/add-system.tsx:92
#: src/components/add-system.tsx:130
msgid "Binary"
msgstr "Nhị phân"
@@ -159,7 +161,7 @@ msgstr "Nhị phân"
msgid "Cache / Buffers"
msgstr "Bộ nhớ đệm / Bộ đệm"
#: src/components/systems-table/systems-table.tsx:581
#: src/components/systems-table/systems-table.tsx:668
msgid "Cancel"
msgstr "Hủy bỏ"
@@ -183,11 +185,11 @@ msgstr "Kiểm tra {email} để lấy liên kết đặt lại."
msgid "Check logs for more details."
msgstr "Kiểm tra nhật ký để biết thêm chi tiết."
#: src/components/routes/settings/notifications.tsx:183
#: src/components/routes/settings/notifications.tsx:184
msgid "Check your notification service"
msgstr "Kiểm tra dịch vụ thông báo của bạn"
#: src/components/add-system.tsx:151
#: src/components/add-system.tsx:204
msgid "Click to copy"
msgstr "Nhấp để sao chép"
@@ -196,32 +198,33 @@ msgstr "Nhấp để sao chép"
msgid "Command line instructions"
msgstr "Hướng dẫn dòng lệnh"
#: src/components/routes/settings/notifications.tsx:77
#: src/components/routes/settings/notifications.tsx:78
msgid "Configure how you receive alert notifications."
msgstr "Cấu hình cách bạn nhận thông báo cảnh báo."
#: src/components/login/auth-form.tsx:165
#: src/components/login/auth-form.tsx:170
#: src/components/login/auth-form.tsx:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "Xác nhận mật khẩu"
#: src/components/systems-table/systems-table.tsx:587
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "Tiếp tục"
#: src/lib/utils.ts:25
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "Đã sao chép vào clipboard"
#: src/components/add-system.tsx:162
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "Sao chép"
#: src/components/systems-table/systems-table.tsx:556
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "Sao chép máy chủ"
#: src/components/add-system.tsx:173
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "Sao chép lệnh Linux"
@@ -229,17 +232,17 @@ msgstr "Sao chép lệnh Linux"
msgid "Copy text"
msgstr "Sao chép văn bản"
#: src/components/systems-table/systems-table.tsx:157
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
#: src/components/routes/system.tsx:384
#: src/lib/utils.ts:289
msgid "CPU Usage"
msgstr "Sử dụng CPU"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "Tạo tài khoản"
@@ -248,8 +251,8 @@ msgstr "Tạo tài khoản"
msgid "Dark"
msgstr "Tối"
#: src/components/command-palette.tsx:81
#: src/components/routes/home.tsx:34
#: src/components/command-palette.tsx:80
#: src/components/routes/home.tsx:35
msgid "Dashboard"
msgstr "Bảng điều khiển"
@@ -257,50 +260,62 @@ msgstr "Bảng điều khiển"
msgid "Default time period"
msgstr "Thời gian mặc định"
#: src/components/systems-table/systems-table.tsx:562
#: src/components/systems-table/systems-table.tsx:644
msgid "Delete"
msgstr "Xóa"
#: src/components/systems-table/systems-table.tsx:173
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "Đĩa"
#: src/components/routes/system.tsx:431
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "Đĩa I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
#: src/components/routes/system.tsx:424
#: src/lib/utils.ts:301
msgid "Disk Usage"
msgstr "Sử dụng Đĩa"
#: src/components/routes/system.tsx:552
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "Sử dụng đĩa của {extraFsName}"
#: src/components/routes/system.tsx:395
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Sử dụng CPU Docker"
#: src/components/routes/system.tsx:416
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Sử dụng Bộ nhớ Docker"
#: src/components/routes/system.tsx:457
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Mạng I/O Docker"
#: src/components/command-palette.tsx:124
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "Tài liệu"
#: src/components/login/auth-form.tsx:128
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr ""
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
msgid "Email"
msgstr "Email"
#: src/components/routes/settings/notifications.tsx:91
#: src/components/routes/settings/notifications.tsx:92
msgid "Email notifications"
msgstr "Thông báo email"
@@ -308,17 +323,20 @@ msgstr "Thông báo email"
msgid "Enter email address to reset password"
msgstr "Nhập địa chỉ email để đặt lại mật khẩu"
#: src/components/routes/settings/notifications.tsx:111
#: src/components/routes/settings/notifications.tsx:112
msgid "Enter email address..."
msgstr "Nhập địa chỉ email..."
#: src/components/login/auth-form.tsx:232
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/routes/settings/notifications.tsx:187
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "Lỗi"
#: src/components/routes/home.tsx:80
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: src/components/routes/home.tsx:81
msgid "Exceeds {0}{1} in last {2, plural, one {# minute} other {# minutes}}"
msgstr "Vượt quá {0}{1} trong {2, plural, one {# phút} other {# phút}} qua"
@@ -334,16 +352,16 @@ msgstr "Xuất cấu hình"
msgid "Export your current systems configuration."
msgstr "Xuất cấu hình hệ thống hiện tại của bạn."
#: src/lib/utils.ts:38
#: src/lib/utils.ts:48
msgid "Failed to authenticate"
msgstr "Xác thực thất bại"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
#: src/components/routes/settings/notifications.tsx:62
msgid "Failed to save settings"
msgstr "Lưu cài đặt thất bại"
#: src/components/routes/settings/notifications.tsx:188
#: src/components/routes/settings/notifications.tsx:189
msgid "Failed to send test notification"
msgstr "Gửi thông báo thử nghiệm thất bại"
@@ -351,34 +369,34 @@ msgstr "Gửi thông báo thử nghiệm thất bại"
msgid "Failed to update alert"
msgstr "Cập nhật cảnh báo thất bại"
#: src/components/routes/system.tsx:596
#: src/components/systems-table/systems-table.tsx:273
#: src/components/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "Lọc..."
#: src/components/alerts/alerts-system.tsx:227
#: src/components/alerts/alerts-system.tsx:230
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
msgstr "Trong <0>{min}</0> {min, plural, one {phút} other {phút}}"
#: src/components/login/auth-form.tsx:313
#: src/components/login/auth-form.tsx:330
msgid "Forgot password?"
msgstr "Quên mật khẩu?"
#. Context: General settings
#: src/components/routes/settings/general.tsx:33
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "Chung"
#: src/components/routes/system.tsx:496
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr ""
#: src/components/systems-table/systems-table.tsx:300
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "Lưới"
#: src/components/add-system.tsx:120
#: src/components/add-system.tsx:158
msgid "Host / IP"
msgstr "Máy chủ / IP"
@@ -386,12 +404,12 @@ msgstr "Máy chủ / IP"
msgid "If you've lost the password to your admin account, you may reset it using the following command."
msgstr "Nếu bạn đã mất mật khẩu cho tài khoản quản trị viên của mình, bạn có thể đặt lại bằng cách sử dụng lệnh sau."
#: src/components/login/auth-form.tsx:16
#: src/components/login/auth-form.tsx:17
msgid "Invalid email address."
msgstr "Địa chỉ email không hợp lệ."
#. Linux kernel
#: src/components/routes/system.tsx:262
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Nhân"
@@ -399,7 +417,7 @@ msgstr "Nhân"
msgid "Language"
msgstr "Ngôn ngữ"
#: src/components/systems-table/systems-table.tsx:286
#: src/components/systems-table/systems-table.tsx:354
msgid "Layout"
msgstr "Bố cục"
@@ -408,7 +426,7 @@ msgstr "Bố cục"
msgid "Light"
msgstr "Sáng"
#: src/components/navbar.tsx:104
#: src/components/navbar.tsx:105
msgid "Log Out"
msgstr "Đăng xuất"
@@ -416,17 +434,17 @@ msgstr "Đăng xuất"
msgid "Login"
msgstr "Đăng nhập"
#: src/components/login/auth-form.tsx:34
#: src/components/login/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "Nỗ lực đăng nhập thất bại"
#: src/components/command-palette.tsx:156
#: src/components/navbar.tsx:85
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
msgid "Logs"
msgstr "Nhật ký"
#: 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 "Thay vào đó, bạn đang tìm nơi để tạo cảnh báo? Nhấp vào biểu tượng chuông <0/> trong bảng hệ thống."
@@ -434,56 +452,60 @@ msgstr "Thay vào đó, bạn đang tìm nơi để tạo cảnh báo? Nhấp v
msgid "Manage display and notification preferences."
msgstr "Quản lý tùy chọn hiển thị và thông báo."
#: src/components/add-system.tsx:226
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:663
msgid "Max 1 min"
msgstr "Tối đa 1 phút"
#: src/components/systems-table/systems-table.tsx:165
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "Bộ nhớ"
#: src/components/routes/system.tsx:406
#: src/lib/utils.ts:295
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "Sử dụng Bộ nhớ"
#: src/components/routes/system.tsx:417
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Sử dụng bộ nhớ của các container Docker"
#: src/components/add-system.tsx:116
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "Tên"
#: src/components/systems-table/systems-table.tsx:181
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "Mạng"
#: src/components/routes/system.tsx:458
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Lưu lượng mạng của các container Docker"
#: src/components/routes/system.tsx:443
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "Lưu lượng mạng của các giao diện công cộng"
#: src/components/command-palette.tsx:49
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "Không tìm thấy kết quả."
#: src/components/systems-table/systems-table.tsx:421
#: src/components/systems-table/systems-table.tsx:494
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "Không tìm thấy hệ thống."
#: src/components/command-palette.tsx:110
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
#: src/components/routes/settings/notifications.tsx:74
msgid "Notifications"
msgstr "Thông báo"
#: src/components/login/auth-form.tsx:284
#: src/components/login/auth-form.tsx:301
msgid "OAuth 2 / OIDC support"
msgstr "Hỗ trợ OAuth 2 / OIDC"
@@ -491,11 +513,11 @@ msgstr "Hỗ trợ OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Mỗi khi khởi động lại, các hệ thống trong cơ sở dữ liệu sẽ được cập nhật để khớp với các hệ thống được định nghĩa trong tệp."
#: src/components/systems-table/systems-table.tsx:528
#: src/components/systems-table/systems-table.tsx:600
msgid "Open menu"
msgstr "Mở menu"
#: src/components/login/auth-form.tsx:203
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "Hoặc tiếp tục với"
@@ -503,32 +525,40 @@ msgstr "Hoặc tiếp tục với"
msgid "Overwrite existing alerts"
msgstr "Ghi đè các cảnh báo hiện có"
#: src/components/command-palette.tsx:84
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "Trang"
#: src/components/command-palette.tsx:71
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "Trang / Cài đặt"
#: src/components/login/auth-form.tsx:147
#: src/components/login/auth-form.tsx:152
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
msgid "Password"
msgstr "Mật khẩu"
#: src/components/login/auth-form.tsx:17
#: src/components/login/auth-form.tsx:20
msgid "Password must be at least 8 characters."
msgstr "Mật khẩu phải có ít nhất 8 ký tự."
#: 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 "Yêu cầu đặt lại mật khẩu đã được nhận"
#: src/components/systems-table/systems-table.tsx:550
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "Tạm dừng"
#: src/components/routes/settings/notifications.tsx:95
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
msgstr ""
#: src/components/routes/settings/notifications.tsx:96
msgid "Please <0>configure an SMTP server</0> to ensure alerts are delivered."
msgstr "Vui lòng <0>cấu hình máy chủ SMTP</0> để đảm bảo cảnh báo được gửi đi."
@@ -536,8 +566,8 @@ msgstr "Vui lòng <0>cấu hình máy chủ SMTP</0> để đảm bảo cảnh b
msgid "Please check logs for more details."
msgstr "Vui lòng kiểm tra nhật ký để biết thêm chi tiết."
#: src/components/login/auth-form.tsx:35
#: src/components/login/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
msgid "Please check your credentials and try again"
msgstr "Vui lòng kiểm tra thông tin đăng nhập của bạn và thử lại"
@@ -545,15 +575,15 @@ msgstr "Vui lòng kiểm tra thông tin đăng nhập của bạn và thử lạ
msgid "Please create an admin account"
msgstr "Vui lòng tạo một tài khoản quản trị viên"
#: src/components/login/auth-form.tsx:233
#: src/components/login/auth-form.tsx:137
msgid "Please enable pop-ups for this site"
msgstr "Vui lòng bật cửa sổ bật lên cho trang web này"
#: src/lib/utils.ts:39
#: src/lib/utils.ts:49
msgid "Please log in again"
msgstr "Vui lòng đăng nhập lại"
#: src/components/login/auth-form.tsx:292
#: src/components/login/auth-form.tsx:309
msgid "Please see <0>the documentation</0> for instructions."
msgstr "Vui lòng xem <0>tài liệu</0> để biết hướng dẫn."
@@ -561,12 +591,12 @@ msgstr "Vui lòng xem <0>tài liệu</0> để biết hướng dẫn."
msgid "Please sign in to your account"
msgstr "Vui lòng đăng nhập vào tài khoản của bạn"
#: src/components/add-system.tsx:124
#: src/components/add-system.tsx:170
msgid "Port"
msgstr "Cổng"
#: src/components/routes/system.tsx:407
#: src/components/routes/system.tsx:523
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
msgid "Precise utilization at the recorded time"
msgstr "Sử dụng chính xác tại thời điểm ghi nhận"
@@ -575,7 +605,7 @@ msgid "Preferred Language"
msgstr "Ngôn ngữ Ưa thích"
#. Use 'Key' if your language requires many more characters
#: src/components/add-system.tsx:128
#: src/components/add-system.tsx:181
msgid "Public Key"
msgstr "Khóa"
@@ -594,24 +624,28 @@ msgstr "Đã nhận"
msgid "Reset Password"
msgstr "Đặt lại Mật khẩu"
#: src/components/systems-table/systems-table.tsx:545
#: src/components/systems-table/systems-table.tsx:628
msgid "Resume"
msgstr "Tiếp tục"
#: 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 "Lưu địa chỉ bằng cách sử dụng phím enter hoặc dấu phẩy. Để trống để vô hiệu hóa thông báo email."
#: src/components/routes/settings/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
#: src/components/routes/settings/notifications.tsx:167
msgid "Save Settings"
msgstr "Lưu Cài đặt"
#: src/components/navbar.tsx:133
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr ""
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "Tìm kiếm"
#: src/components/command-palette.tsx:46
#: src/components/command-palette.tsx:45
msgid "Search for systems or settings..."
msgstr "Tìm kiếm hệ thống hoặc cài đặt..."
@@ -628,9 +662,9 @@ msgstr "Đã gửi"
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Đặt phạm vi thời gian mặc định cho biểu đồ khi một hệ thống được xem."
#: src/components/command-palette.tsx:95
#: src/components/command-palette.tsx:98
#: src/components/command-palette.tsx:113
#: src/components/command-palette.tsx:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: src/components/routes/settings/layout.tsx:71
#: src/components/routes/settings/layout.tsx:82
msgid "Settings"
@@ -640,40 +674,41 @@ msgstr "Cài đặt"
msgid "Settings saved"
msgstr "Cài đặt đã được lưu"
#: src/components/login/auth-form.tsx:191
#: src/components/login/auth-form.tsx:238
msgid "Sign in"
msgstr "Đăng nhập"
#: src/components/command-palette.tsx:185
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "Cài đặt SMTP"
#: src/components/systems-table/systems-table.tsx:308
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "Sắp xếp theo"
#: src/lib/utils.ts:282
#: src/lib/utils.ts:311
msgid "Status"
msgstr "Trạng thái"
#: src/components/routes/system.tsx:473
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "Không gian hoán đổi được sử dụng bởi hệ thống"
#: src/components/routes/system.tsx:472
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "Sử dụng Hoán đổi"
#. System theme
#: src/lib/utils.ts:316
#: src/components/mode-toggle.tsx:26
#: src/components/systems-table/systems-table.tsx:117
#: src/components/systems-table/systems-table.tsx:125
#: src/components/systems-table/systems-table.tsx:136
#: src/components/systems-table/systems-table.tsx:465
#: src/components/systems-table/systems-table.tsx:133
#: src/components/systems-table/systems-table.tsx:150
#: src/components/systems-table/systems-table.tsx:533
msgid "System"
msgstr "Hệ thống"
#: src/components/navbar.tsx:77
#: src/components/navbar.tsx:78
msgid "Systems"
msgstr "Các hệ thống"
@@ -681,32 +716,37 @@ msgstr "Các hệ thống"
msgid "Systems may be managed in a <0>config.yml</0> file inside your data directory."
msgstr "Các hệ thống có thể được quản lý trong tệp <0>config.yml</0> bên trong thư mục dữ liệu của bạn."
#: src/components/systems-table/systems-table.tsx:296
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "Bảng"
#: src/components/routes/system.tsx:484
#: src/lib/utils.ts:314
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr ""
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "Nhiệt độ"
#: src/components/routes/system.tsx:485
#: src/components/routes/system.tsx:526
msgid "Temperatures of system sensors"
msgstr "Nhiệt độ của các cảm biến hệ thống"
#: src/components/routes/settings/notifications.tsx:211
#: src/components/routes/settings/notifications.tsx:212
msgid "Test <0>URL</0>"
msgstr "Kiểm tra <0>URL</0>"
#: src/components/routes/settings/notifications.tsx:182
#: src/components/routes/settings/notifications.tsx:183
msgid "Test notification sent"
msgstr "Thông báo thử nghiệm đã được gửi"
#: src/components/add-system.tsx:108
#: src/components/add-system.tsx:146
msgid "The agent must be running on the system to connect. Copy the installation command for the agent below."
msgstr "Tác nhân phải đang chạy trên hệ thống để kết nối. Sao chép lệnh cài đặt cho tác nhân bên dưới."
#: src/components/add-system.tsx:99
#: src/components/add-system.tsx:137
msgid "The agent must be running on the system to connect. Copy the<0>docker-compose.yml</0> for the agent below."
msgstr "Tác nhân phải đang chạy trên hệ thống để kết nối. Sao chép <0>docker-compose.yml</0> cho tác nhân bên dưới."
@@ -714,24 +754,24 @@ msgstr "Tác nhân phải đang chạy trên hệ thống để kết nối. Sao
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Sau đó đăng nhập vào backend và đặt lại mật khẩu tài khoản người dùng của bạn trong bảng người dùng."
#: src/components/systems-table/systems-table.tsx:573
#: src/components/systems-table/systems-table.tsx:660
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Hành động này không thể hoàn tác. Điều này sẽ xóa vĩnh viễn tất cả các bản ghi hiện tại cho {name} khỏi cơ sở dữ liệu."
#: src/components/routes/system.tsx:564
#: src/components/routes/system.tsx:605
msgid "Throughput of {extraFsName}"
msgstr "Thông lượng của {extraFsName}"
#: src/components/routes/system.tsx:432
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Thông lượng của hệ thống tệp gốc"
#: src/components/routes/settings/notifications.tsx:106
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "Đến email(s)"
#: src/components/routes/system.tsx:359
#: src/components/routes/system.tsx:372
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "Chuyển đổi lưới"
@@ -739,68 +779,74 @@ msgstr "Chuyển đổi lưới"
msgid "Toggle theme"
msgstr "Chuyển đổi chủ đề"
#: src/lib/utils.ts:317
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "Kích hoạt khi bất kỳ cảm biến nào vượt quá ngưỡng"
#: src/lib/utils.ts:310
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "Kích hoạt khi kết hợp lên/xuống vượt quá ngưỡng"
#: src/lib/utils.ts:292
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "Kích hoạt khi sử dụng CPU vượt quá ngưỡng"
#: src/lib/utils.ts:298
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "Kích hoạt khi sử dụng bộ nhớ vượt quá ngưỡng"
#: src/lib/utils.ts:285
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "Kích hoạt khi trạng thái chuyển đổi giữa lên và xuống"
#: src/lib/utils.ts:304
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "Kích hoạt khi sử dụng bất kỳ đĩa nào vượt quá ngưỡng"
#: src/components/systems-table/systems-table.tsx:269
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "Cập nhật theo thời gian thực. Nhấp vào một hệ thống để xem thông tin."
#: src/components/routes/system.tsx:261
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "Thời gian hoạt động"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
#: src/components/routes/system.tsx:514
#: src/components/routes/system.tsx:551
msgid "Usage"
msgstr "Sử dụng"
#: src/components/routes/system.tsx:424
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Sử dụng phân vùng gốc"
#: src/components/charts/area-chart.tsx:73
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "Đã sử dụng"
#: src/components/command-palette.tsx:142
#: src/components/navbar.tsx:69
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "Người dùng"
#: src/components/systems-table/systems-table.tsx:278
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "Xem"
#: src/components/systems-table/systems-table.tsx:342
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "Các cột hiển thị"
#: src/components/routes/system.tsx:662
#: src/components/routes/system.tsx:697
msgid "Waiting for enough records to display"
msgstr "Đang chờ đủ bản ghi để hiển thị"
@@ -808,7 +854,7 @@ msgstr "Đang chờ đủ bản ghi để hiển thị"
msgid "Want to help us make our translations even better? Check out <0>Crowdin</0> for more details."
msgstr "Muốn giúp chúng tôi cải thiện bản dịch của mình? Xem <0>Crowdin</0> để biết thêm chi tiết."
#: src/components/routes/settings/notifications.tsx:124
#: src/components/routes/settings/notifications.tsx:125
msgid "Webhook / Push notifications"
msgstr "Thông báo Webhook / Push"
@@ -829,3 +875,4 @@ msgstr "Cấu hình YAML"
#: src/components/routes/settings/layout.tsx:34
msgid "Your user settings have been updated."
msgstr "Cài đặt người dùng của bạn đã được cập nhật."

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,878 @@
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: zh\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-03-06 07:27\n"
"Last-Translator: \n"
"Language-Team: Chinese Traditional\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Crowdin-Project: beszel\n"
"X-Crowdin-Project-ID: 733311\n"
"X-Crowdin-Language: zh-TW\n"
"X-Crowdin-File: /main/beszel/site/src/locales/en/en.po\n"
"X-Crowdin-File-ID: 16\n"
#. placeholder {0}: Math.trunc(system.info?.u / 86400)
#: src/components/routes/system.tsx:255
msgid "{0, plural, one {# day} other {# days}}"
msgstr "{0, plural, one {# 天} other {# 天}}"
#: src/components/routes/system.tsx:253
msgid "{hours, plural, one {# hour} other {# hours}}"
msgstr "{hours, plural, one {# 小時} other {# 小時}}"
#: src/lib/utils.ts:168
msgid "1 hour"
msgstr "1小時"
#: src/lib/utils.ts:191
msgid "1 week"
msgstr "1週"
#: src/lib/utils.ts:176
msgid "12 hours"
msgstr "12小時"
#: src/lib/utils.ts:184
msgid "24 hours"
msgstr "24小時"
#: src/lib/utils.ts:199
msgid "30 days"
msgstr "30天"
#. Table column
#: src/components/systems-table/systems-table.tsx:293
#: src/components/systems-table/systems-table.tsx:381
#: src/components/systems-table/systems-table.tsx:523
#: src/components/systems-table/systems-table.tsx:533
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:125
msgid "Add New System"
msgstr "新增新系統"
#: src/components/add-system.tsx:231
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:131
#: src/components/command-palette.tsx:144
#: src/components/command-palette.tsx:158
#: src/components/command-palette.tsx:172
#: src/components/command-palette.tsx:187
msgid "Admin"
msgstr "管理員"
#: src/components/systems-table/systems-table.tsx:261
msgid "Agent"
msgstr "代理"
#: src/components/alerts/alert-button.tsx:32
#: src/components/alerts/alert-button.tsx:68
msgid "Alerts"
msgstr "警報"
#: src/components/systems-table/systems-table.tsx:334
#: src/components/alerts/alert-button.tsx:88
msgid "All Systems"
msgstr "所有系統"
#: src/components/systems-table/systems-table.tsx:657
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:660
msgid "Average"
msgstr "平均"
#: src/components/routes/system.tsx:437
msgid "Average CPU utilization of containers"
msgstr "容器的平均 CPU 使用率"
#. placeholder {0}: data.alert.unit
#: src/components/alerts/alerts-system.tsx:205
msgid "Average exceeds <0>{value}{0}</0>"
msgstr "平均值超過<0>{value}{0}</0>"
#: src/components/routes/system.tsx:538
msgid "Average power consumption of GPUs"
msgstr "GPU 的平均功耗"
#: src/components/routes/system.tsx:426
msgid "Average system-wide CPU utilization"
msgstr "系統的平均 CPU 使用率"
#. placeholder {0}: gpu.n
#: src/components/routes/system.tsx:556
msgid "Average utilization of {0}"
msgstr "{0} 的平均使用率"
#: src/components/navbar.tsx:94
#: src/components/command-palette.tsx:169
msgid "Backups"
msgstr "備份"
#: src/lib/utils.ts:337
#: src/components/routes/system.tsx:482
msgid "Bandwidth"
msgstr "網路流量"
#: src/components/login/auth-form.tsx:306
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:130
msgid "Binary"
msgstr "執行檔"
#: src/components/charts/mem-chart.tsx:89
msgid "Cache / Buffers"
msgstr "快取/緩衝"
#: src/components/systems-table/systems-table.tsx:668
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:204
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:212
#: src/components/login/auth-form.tsx:217
msgid "Confirm password"
msgstr "確認密碼"
#: src/components/systems-table/systems-table.tsx:674
msgid "Continue"
msgstr "繼續"
#: src/lib/utils.ts:35
msgid "Copied to clipboard"
msgstr "已複製到剪貼簿"
#: src/components/add-system.tsx:215
#: src/components/add-system.tsx:217
msgid "Copy"
msgstr "複製"
#: src/components/systems-table/systems-table.tsx:639
msgid "Copy host"
msgstr "複製主機"
#: src/components/add-system.tsx:224
msgid "Copy Linux command"
msgstr "複製 Linux 指令"
#: src/components/copy-to-clipboard.tsx:13
msgid "Copy text"
msgstr "複製文字"
#: src/components/systems-table/systems-table.tsx:180
msgid "CPU"
msgstr "CPU"
#: src/lib/utils.ts:319
#: src/components/routes/system.tsx:425
#: src/components/charts/area-chart.tsx:56
msgid "CPU Usage"
msgstr "CPU 使用率"
#: src/components/login/auth-form.tsx:238
msgid "Create account"
msgstr "建立帳號"
#. Dark theme
#: src/components/mode-toggle.tsx:21
msgid "Dark"
msgstr "深色"
#: src/components/command-palette.tsx:80
#: 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:644
msgid "Delete"
msgstr "刪除"
#: src/components/systems-table/systems-table.tsx:196
msgid "Disk"
msgstr "磁碟"
#: src/components/routes/system.tsx:472
msgid "Disk I/O"
msgstr "磁碟 I/O"
#: src/lib/utils.ts:331
#: src/components/routes/system.tsx:465
#: src/components/charts/disk-chart.tsx:79
msgid "Disk Usage"
msgstr "磁碟使用量"
#: src/components/routes/system.tsx:593
msgid "Disk usage of {extraFsName}"
msgstr "{extraFsName}的磁碟使用量"
#: src/components/routes/system.tsx:436
msgid "Docker CPU Usage"
msgstr "Docker CPU 使用率"
#: src/components/routes/system.tsx:457
msgid "Docker Memory Usage"
msgstr "Docker 記憶體使用率"
#: src/components/routes/system.tsx:498
msgid "Docker Network I/O"
msgstr "Docker 網路 I/O"
#: src/components/command-palette.tsx:123
msgid "Documentation"
msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts:316
#: src/components/systems-table/systems-table.tsx:141
#: src/components/routes/system.tsx:336
msgid "Down"
msgstr ""
#: src/components/add-system.tsx:125
#: src/components/systems-table/systems-table.tsx:614
msgid "Edit"
msgstr "編輯"
#: src/components/login/forgot-pass-form.tsx:53
#: src/components/login/auth-form.tsx:175
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/routes/settings/notifications.tsx:188
#: src/components/routes/settings/config-yaml.tsx:28
#: src/components/login/auth-form.tsx:136
msgid "Error"
msgstr "錯誤"
#. placeholder {0}: alert.value
#. placeholder {1}: info.unit
#. placeholder {2}: alert.min
#: 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:48
msgid "Failed to authenticate"
msgstr "認證失敗"
#: src/components/routes/settings/notifications.tsx:63
#: src/components/routes/settings/layout.tsx:39
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/systems-table/systems-table.tsx:341
#: src/components/routes/system.tsx:633
msgid "Filter..."
msgstr "篩選..."
#: src/components/alerts/alerts-system.tsx:230
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:330
msgid "Forgot password?"
msgstr "忘記密碼?"
#. Context: General settings
#: src/components/routes/settings/layout.tsx:51
#: src/components/routes/settings/general.tsx:33
msgid "General"
msgstr "一般"
#: src/components/routes/system.tsx:537
msgid "GPU Power Draw"
msgstr "GPU 功耗"
#: src/components/systems-table/systems-table.tsx:368
msgid "Grid"
msgstr "網格"
#: src/components/add-system.tsx:158
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 "無效的電子郵件地址。"
#. Linux kernel
#: src/components/routes/system.tsx:267
msgid "Kernel"
msgstr "Kernel"
#: src/components/routes/settings/general.tsx:45
msgid "Language"
msgstr "語言"
#: src/components/systems-table/systems-table.tsx:354
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/forgot-pass-form.tsx:15
#: src/components/login/auth-form.tsx:39
msgid "Login attempt failed"
msgstr "登入失敗"
#: src/components/navbar.tsx:86
#: src/components/command-palette.tsx:155
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:226
msgid "Manual setup instructions"
msgstr "手動設定說明"
#. Chart select field. Please try to keep this short.
#: src/components/routes/system.tsx:663
msgid "Max 1 min"
msgstr "最多1分鐘"
#: src/components/systems-table/systems-table.tsx:188
msgid "Memory"
msgstr "記憶體"
#: src/lib/utils.ts:325
#: src/components/routes/system.tsx:447
msgid "Memory Usage"
msgstr "記憶體使用量"
#: src/components/routes/system.tsx:458
msgid "Memory usage of docker containers"
msgstr "Docker 容器的記憶體使用量"
#: src/components/add-system.tsx:154
msgid "Name"
msgstr "名稱"
#: src/components/systems-table/systems-table.tsx:213
msgid "Net"
msgstr "網路"
#: src/components/routes/system.tsx:499
msgid "Network traffic of docker containers"
msgstr "Docker 容器的網路流量"
#: src/components/routes/system.tsx:484
msgid "Network traffic of public interfaces"
msgstr "公開介面的網路流量"
#: src/components/command-palette.tsx:48
msgid "No results found."
msgstr "找不到結果。"
#: src/components/systems-table/systems-table.tsx:489
#: src/components/systems-table/systems-table.tsx:562
msgid "No systems found."
msgstr "找不到任何系統。"
#: src/components/command-palette.tsx:109
#: src/components/routes/settings/notifications.tsx:75
#: src/components/routes/settings/layout.tsx:56
msgid "Notifications"
msgstr "通知"
#: src/components/login/auth-form.tsx:301
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:600
msgid "Open menu"
msgstr "開啟選單"
#: src/components/login/auth-form.tsx:250
msgid "Or continue with"
msgstr "或繼續使用"
#: src/components/alerts/alert-button.tsx:109
msgid "Overwrite existing alerts"
msgstr "覆蓋現有警報"
#: src/components/command-palette.tsx:83
msgid "Page"
msgstr "頁面"
#: src/components/command-palette.tsx:70
msgid "Pages / Settings"
msgstr "頁面 / 設定"
#: src/components/login/auth-form.tsx:194
#: src/components/login/auth-form.tsx:199
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 "密碼必須少於 72 個位元組。"
#: src/components/login/forgot-pass-form.tsx:33
msgid "Password reset request received"
msgstr "已收到密碼重設請求"
#: src/components/systems-table/systems-table.tsx:633
msgid "Pause"
msgstr "暫停"
#: src/components/systems-table/systems-table.tsx:142
msgid "Paused"
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/forgot-pass-form.tsx:16
#: src/components/login/auth-form.tsx:40
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:49
msgid "Please log in again"
msgstr "請重新登入"
#: src/components/login/auth-form.tsx:309
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:170
msgid "Port"
msgstr "Port"
#: src/components/routes/system.tsx:448
#: src/components/routes/system.tsx:564
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:181
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:628
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/notifications.tsx:168
#: src/components/routes/settings/general.tsx:106
msgid "Save Settings"
msgstr "儲存設定"
#: src/components/add-system.tsx:231
msgid "Save system"
msgstr "儲存系統"
#: src/components/navbar.tsx:134
msgid "Search"
msgstr "搜尋"
#: src/components/command-palette.tsx:45
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:94
#: src/components/command-palette.tsx:97
#: src/components/command-palette.tsx:112
#: 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:238
msgid "Sign in"
msgstr "登入"
#: src/components/command-palette.tsx:184
msgid "SMTP settings"
msgstr "SMTP 設定"
#: src/components/systems-table/systems-table.tsx:376
msgid "Sort By"
msgstr "排序"
#: src/lib/utils.ts:311
msgid "Status"
msgstr "狀態"
#: src/components/routes/system.tsx:514
msgid "Swap space used by the system"
msgstr "系統的虛擬記憶體使用量"
#: src/components/routes/system.tsx:513
msgid "Swap Usage"
msgstr "虛擬記憶體使用量"
#. System theme
#: src/lib/utils.ts:316
#: 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:150
#: src/components/systems-table/systems-table.tsx:533
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 "可以用您Data資料夾中的<0>config.yml</0>來管理系統。"
#: src/components/systems-table/systems-table.tsx:364
msgid "Table"
msgstr "列表"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx:233
msgid "Temp"
msgstr "溫度"
#: src/lib/utils.ts:344
#: src/components/routes/system.tsx:525
msgid "Temperature"
msgstr "溫度"
#: src/components/routes/system.tsx:526
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:146
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:137
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:660
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:605
msgid "Throughput of {extraFsName}"
msgstr "{extraFsName}的傳輸速率"
#: src/components/routes/system.tsx:473
msgid "Throughput of root filesystem"
msgstr "Root文件系統的傳輸速率"
#: src/components/routes/settings/notifications.tsx:107
msgid "To email(s)"
msgstr "發送到電子郵件"
#: src/components/routes/system.tsx:400
#: src/components/routes/system.tsx:413
msgid "Toggle grid"
msgstr "切換網格"
#: src/components/mode-toggle.tsx:33
msgid "Toggle theme"
msgstr "切換主題"
#: src/lib/utils.ts:347
msgid "Triggers when any sensor exceeds a threshold"
msgstr "當任何感應器超過閾值時觸發"
#: src/lib/utils.ts:340
msgid "Triggers when combined up/down exceeds a threshold"
msgstr "當總流量超過閾值時觸發"
#: src/lib/utils.ts:322
msgid "Triggers when CPU usage exceeds a threshold"
msgstr "當CPU使用率超過閾值時觸發"
#: src/lib/utils.ts:328
msgid "Triggers when memory usage exceeds a threshold"
msgstr "當記憶體使用率超過閾值時觸發"
#: src/lib/utils.ts:314
msgid "Triggers when status switches between up and down"
msgstr "當連線和離線時觸發"
#: src/lib/utils.ts:334
msgid "Triggers when usage of any disk exceeds a threshold"
msgstr "當任何磁碟使用率超過閾值時觸發"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx:140
#: src/components/routes/system.tsx:334
msgid "Up"
msgstr ""
#: src/components/systems-table/systems-table.tsx:337
msgid "Updated in real time. Click on a system to view information."
msgstr "實時更新。點擊系統顯示資訊。"
#: src/components/routes/system.tsx:266
msgid "Uptime"
msgstr "運行時間"
#: src/components/routes/system.tsx:555
#: src/components/routes/system.tsx:592
#: src/components/charts/area-chart.tsx:73
msgid "Usage"
msgstr "使用量"
#: src/components/routes/system.tsx:465
msgid "Usage of root partition"
msgstr "Root 分區的使用量"
#: src/components/charts/swap-chart.tsx:56
#: src/components/charts/mem-chart.tsx:65
#: src/components/charts/area-chart.tsx:73
msgid "Used"
msgstr "已使用"
#: src/components/navbar.tsx:70
#: src/components/command-palette.tsx:141
msgid "Users"
msgstr "使用者"
#: src/components/systems-table/systems-table.tsx:346
msgid "View"
msgstr "檢視"
#: src/components/systems-table/systems-table.tsx:410
msgid "Visible Fields"
msgstr "顯示欄位"
#: src/components/routes/system.tsx:697
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

@@ -63,9 +63,9 @@ const App = () => {
if (!page) {
return <h1 className="text-3xl text-center my-14">404</h1>
} else if (page.path === "/") {
} else if (page.route === "home") {
return <Home />
} else if (page.route === "server") {
} else if (page.route === "system") {
return <SystemDetail name={page.params.name} />
} else if (page.route === "settings") {
return (

View File

@@ -1,5 +1,12 @@
import { RecordModel } from "pocketbase"
// global window properties
declare global {
interface Window {
BASE_PATH: string
}
}
export interface SystemRecord extends RecordModel {
name: string
host: string
@@ -36,6 +43,10 @@ export interface SystemInfo {
v: string
/** system is using podman */
p?: boolean
/** highest gpu utilization */
g?: number
/** dashboard display temperature */
dt?: number
}
export interface SystemStats {
@@ -189,6 +200,7 @@ interface AlertInfo {
unit: string
icon: any
desc: () => string
single?: boolean
max?: number
/** Single value description (when there's only one value, like status) */
singleDesc?: () => string
}

View File

@@ -4,6 +4,7 @@ import react from "@vitejs/plugin-react-swc"
import { lingui } from "@lingui/vite-plugin"
export default defineConfig({
base: "./",
plugins: [
react({
plugins: [["@lingui/swc-plugin", {}]],

View File

@@ -0,0 +1,31 @@
[Unit]
Description=Beszel Agent Service
Wants=network-online.target
After=network-online.target
[Service]
Environment="PORT=45876"
# Port number can be overridden in beszel-agent.conf if needed
EnvironmentFile=/etc/beszel-agent.conf
ExecStart=/usr/bin/beszel-agent
User=beszel
Restart=on-failure
StateDirectory=beszel-agent
# Security/sandboxing settings
KeyringMode=private
LockPersonality=yes
NoNewPrivileges=yes
PrivateTmp=yes
ProtectClock=yes
ProtectHome=read-only
ProtectHostname=yes
ProtectKernelLogs=yes
ProtectKernelTunables=yes
ProtectSystem=strict
RemoveIPC=yes
RestrictSUIDSGID=true
SystemCallArchitectures=native
[Install]
WantedBy=multi-user.target

View File

@@ -0,0 +1,8 @@
#!/bin/sh
set -e
. /usr/share/debconf/confmodule
db_version 2.0
db_input high beszel-agent/key || true
db_go

View File

@@ -0,0 +1,8 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: Beszel
Upstream-Contact: henrygd <hank@henrygd.me>
Source: https://beszel.dev/
Files: *
Copyright: 2024 henrygd
License: MIT

View File

@@ -0,0 +1,11 @@
# No changelog in the repo at the moment. This would be good to fix
beszel-agent: no-changelog
# Current unable to fix these due to Goreleaser bug
# https://github.com/goreleaser/goreleaser/issues/5487
beszel-agent: no-debconf-config
beszel-agent: postinst-uses-db-input
# Needs to be fixed in Beszel build
beszel-agent: hardening-no-pie
beszel-agent: hardening-no-relro
# Maybe one day
beszel-agent: no-manual-page

View File

@@ -0,0 +1,49 @@
#!/bin/sh
set -e
[ "$1" = "configure" ] || exit 0
CONFIG_FILE=/etc/beszel-agent.conf
SERVICE=beszel-agent
SERVICE_USER=beszel
. /usr/share/debconf/confmodule
# This would normally be in the config control file, however this is currently
# broken in goreleaser. Temporarily do it here.
# https://github.com/goreleaser/goreleaser/issues/5487
db_version 2.0
db_input high beszel-agent/key || true
db_go
# Create group and user
if ! getent group "$SERVICE_USER" >/dev/null; then
echo "Creating $SERVICE_USER group"
addgroup --quiet --system "$SERVICE_USER"
fi
if ! getent passwd "$SERVICE_USER" >/dev/null; then
echo "Creating $SERVICE_USER user"
adduser --quiet --system "$SERVICE_USER" \
--ingroup "$SERVICE_USER" \
--no-create-home \
--home /nonexistent \
--gecos "System user for $SERVICE"
fi
# Create config file if it doesn't already exist
if [ ! -f "$CONFIG_FILE" ]; then
touch "$CONFIG_FILE"
chmod 0600 "$CONFIG_FILE"
chown "$SERVICE_USER":"$SERVICE_USER" "$CONFIG_FILE"
fi;
# Only add key to config if it's not already present
if ! grep -q "^KEY=" "$CONFIG_FILE"; then
db_get beszel-agent/key
echo "KEY=$RET" > "$CONFIG_FILE"
fi;
deb-systemd-helper enable "$SERVICE".service
systemctl daemon-reload
deb-systemd-invoke start "$SERVICE".service || echo "could not start $SERVICE.service!"

View File

@@ -0,0 +1,8 @@
#!/bin/sh
set -e
if [ "$1" = "purge" ]; then
. /usr/share/debconf/confmodule
db_purge
rm /etc/beszel-agent.conf
fi

View File

@@ -0,0 +1,9 @@
#!/bin/sh
set -e
SERVICE=beszel-agent
deb-systemd-invoke stop "$SERVICE".service
if [ "$1" = "remove" ]; then
deb-systemd-helper purge "$SERVICE".service
fi

View File

@@ -0,0 +1,5 @@
Template: beszel-agent/key
Type: string
Description: SSH public key provided by beszel hub:
If you leave this blank, you will need to configure it in
/etc/beszel-agent.conf before starting Beszel.

View File

@@ -0,0 +1,23 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

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