Compare commits

...

18 Commits

Author SHA1 Message Date
henrygd
47360c5bf1 update to json/v2 - pocketbase collection errors :( 2025-08-20 20:13:01 -04:00
henrygd
7ba1f366ba remove batch api in favor of custom endpoint for alerts management (#1039, #1023) 2025-08-19 20:56:12 -04:00
henrygd
37c6b920f9 refactor: move useStore above possible return nulls 2025-08-19 20:20:47 -04:00
henrygd
49db81dac8 refactor: api router groups and auth handling
- require auth for `/api/beszel/getkey`
- Change `GET /api/beszel/send-test-notification` endpoint to `POST /api/beszel/test-notification`.
- add tests for API endpoints
2025-08-19 20:14:01 -04:00
henrygd
a9e90ec19c update resolveAlertHistoryRecord params to use alert ID directly 2025-08-19 19:56:51 -04:00
henrygd
2ad60507b7 small style updates 2025-08-19 19:48:25 -04:00
henrygd
12059ee3db refactor: js performance improvements 2025-08-06 22:21:48 -04:00
henrygd
de56544ca3 0.12.3 release :) 2025-08-03 22:10:51 -04:00
henrygd
065c7facb6 update language files 2025-08-03 22:10:25 -04:00
NickAss512
630c92c139 New Czech translations 2025-08-03 21:53:51 -04:00
henrygd
e11d452d91 separate agent dockerfiles 2025-08-03 21:14:43 -04:00
dalton-baker
99c7f7bd8a Add GPU-enabled build target in dockerfile_Agent (nvidia-smi support) (#898) 2025-08-03 13:31:26 -04:00
henrygd
8af3a0eb5b refactor: add getMeterState function 2025-08-02 23:44:07 -04:00
henrygd
5f7950b474 tweaks to custom meter percentages 2025-08-02 20:53:49 -04:00
Sven van Ginkel
df9e2dec28 [Feature] Add custom meter percentages (#942) 2025-08-02 17:58:52 -04:00
henrygd
a0f271545a refactoring (no functionality changes) 2025-08-02 17:04:38 -04:00
Bradley Varol
aa2bc9f118 fix systems table names wrapping (#1027) 2025-08-02 12:28:49 -04:00
henrygd
b22ae87022 disable winget auto pr and reactivate docker workflow 2025-08-01 21:15:37 -04:00
86 changed files with 3615 additions and 1893 deletions

View File

@@ -3,7 +3,7 @@ name: Make docker images
on:
push:
tags:
- "xv*"
- "v*"
jobs:
build:
@@ -14,28 +14,48 @@ jobs:
include:
- image: henrygd/beszel
context: ./beszel
dockerfile: ./beszel/dockerfile_Hub
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
dockerfile: ./beszel/dockerfile_agent
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
- image: henrygd/beszel-agent-nvidia
context: ./beszel
dockerfile: ./beszel/dockerfile_agent_nvidia
platforms: linux/amd64
registry: docker.io
username_secret: DOCKERHUB_USERNAME
password_secret: DOCKERHUB_TOKEN
- image: ghcr.io/${{ github.repository }}/beszel
context: ./beszel
dockerfile: ./beszel/dockerfile_Hub
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
dockerfile: ./beszel/dockerfile_agent
registry: ghcr.io
username: ${{ github.actor }}
password_secret: GITHUB_TOKEN
- image: ghcr.io/${{ github.repository }}/beszel-agent-nvidia
context: ./beszel
dockerfile: ./beszel/dockerfile_agent_nvidia
platforms: linux/amd64
registry: ghcr.io
username: ${{ github.actor }}
password_secret: GITHUB_TOKEN
permissions:
contents: read
packages: write
@@ -87,7 +107,7 @@ jobs:
with:
context: "${{ matrix.context }}"
file: ${{ matrix.dockerfile }}
platforms: linux/amd64,linux/arm64,linux/arm/v7
platforms: ${{ matrix.platforms || 'linux/amd64,linux/arm64,linux/arm/v7' }}
push: ${{ github.ref_type == 'tag' }}
tags: ${{ steps.metadata.outputs.tags }}
labels: ${{ steps.metadata.outputs.labels }}

1
.gitignore vendored
View File

@@ -19,3 +19,4 @@ beszel/site/src/locales/**/*.ts
__debug_*
beszel/internal/agent/lhm/obj
beszel/internal/agent/lhm/bin
dockerfile_agent_dev

View File

@@ -203,13 +203,13 @@ winget:
name: beszel-winget
branch: henrygd.beszel-agent-{{ .Version }}
token: "{{ .Env.WINGET_TOKEN }}"
pull_request:
enabled: true
draft: false
base:
owner: microsoft
name: winget-pkgs
branch: master
# pull_request:
# enabled: true
# draft: false
# base:
# owner: microsoft
# name: winget-pkgs
# branch: master
release:
draft: true

View File

@@ -17,7 +17,7 @@ clean:
lint:
golangci-lint run
test: export GOEXPERIMENT=synctest
test: export GOEXPERIMENT=synctest,jsonv2
test:
go test -tags=testing ./...
@@ -70,6 +70,7 @@ dev-server: generate-locales
fi
dev-hub: export ENV=dev
dev-hub: export GOEXPERIMENT=jsonv2
dev-hub:
mkdir -p ./site/dist && touch ./site/dist/index.html
@if command -v entr >/dev/null 2>&1; then \
@@ -78,6 +79,7 @@ dev-hub:
cd ./cmd/hub && go run . serve --http 0.0.0.0:8090; \
fi
dev-agent: export GOEXPERIMENT=jsonv2
dev-agent:
@if command -v entr >/dev/null 2>&1; then \
find ./cmd/agent/*.go ./internal/agent/*.go | entr -r go run beszel/cmd/agent; \

View File

@@ -8,6 +8,7 @@ import (
"fmt"
"log"
"os"
"strings"
"golang.org/x/crypto/ssh"
)
@@ -25,13 +26,16 @@ func (opts *cmdOptions) parse() bool {
flag.StringVar(&opts.listen, "listen", "", "Address or port to listen on")
flag.Usage = func() {
fmt.Printf("Usage: %s [command] [flags]\n", os.Args[0])
fmt.Println("\nCommands:")
fmt.Println(" health Check if the agent is running")
fmt.Println(" help Display this help message")
fmt.Println(" update Update to the latest version")
fmt.Println(" version Display the version")
fmt.Println("\nFlags:")
builder := strings.Builder{}
builder.WriteString("Usage: ")
builder.WriteString(os.Args[0])
builder.WriteString(" [command] [flags]\n")
builder.WriteString("\nCommands:\n")
builder.WriteString(" health Check if the agent is running\n")
builder.WriteString(" help Display this help message\n")
builder.WriteString(" update Update to the latest version\n")
builder.WriteString("\nFlags:\n")
fmt.Print(builder.String())
flag.PrintDefaults()
}
@@ -111,12 +115,12 @@ func main() {
serverConfig.Addr = addr
serverConfig.Network = agent.GetNetwork(addr)
agent, err := agent.NewAgent()
a, err := agent.NewAgent()
if err != nil {
log.Fatal("Failed to create agent: ", err)
}
if err := agent.Start(serverConfig); err != nil {
if err := a.Start(serverConfig); err != nil {
log.Fatal("Failed to start server: ", err)
}
}

View File

@@ -1,26 +0,0 @@
FROM --platform=$BUILDPLATFORM golang:alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
# RUN go mod download
COPY *.go ./
COPY cmd ./cmd
COPY internal ./internal
# Build
ARG TARGETOS TARGETARCH
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./cmd/agent
RUN rm -rf /tmp/*
# ? -------------------------
FROM scratch
COPY --from=builder /agent /agent
# this is so we don't need to create the
# /tmp directory in the scratch container
COPY --from=builder /tmp /tmp
ENTRYPOINT ["/agent"]

26
beszel/dockerfile_agent Normal file
View File

@@ -0,0 +1,26 @@
FROM --platform=$BUILDPLATFORM golang:alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
# RUN go mod download
COPY *.go ./
COPY cmd ./cmd
COPY internal ./internal
# Build
ARG TARGETOS TARGETARCH
RUN CGO_ENABLED=0 GOGC=75 GOEXPERIMENT=jsonv2 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./cmd/agent
RUN rm -rf /tmp/*
# --------------------------
# Final image: default scratch-based agent
# --------------------------
FROM scratch
COPY --from=builder /agent /agent
# this is so we don't need to create the /tmp directory in the scratch container
COPY --from=builder /tmp /tmp
ENTRYPOINT ["/agent"]

View File

@@ -0,0 +1,21 @@
FROM --platform=$BUILDPLATFORM golang:alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
# RUN go mod download
COPY *.go ./
COPY cmd ./cmd
COPY internal ./internal
# Build
ARG TARGETOS TARGETARCH
RUN CGO_ENABLED=0 GOGC=75 GOEXPERIMENT=jsonv2 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /agent ./cmd/agent
# --------------------------
# Final image: GPU-enabled agent with nvidia-smi
# --------------------------
FROM nvidia/cuda:12.9.1-base-ubuntu22.04
COPY --from=builder /agent /agent
ENTRYPOINT ["/agent"]

View File

@@ -22,7 +22,7 @@ RUN update-ca-certificates
# Build
ARG TARGETOS TARGETARCH
RUN CGO_ENABLED=0 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /beszel ./cmd/hub
RUN CGO_ENABLED=0 GOEXPERIMENT=jsonv2 GOGC=75 GOOS=$TARGETOS GOARCH=$TARGETARCH go build -ldflags "-w -s" -o /beszel ./cmd/hub
# ? -------------------------
FROM scratch

View File

@@ -11,16 +11,16 @@ require (
github.com/gliderlabs/ssh v0.3.8
github.com/google/uuid v1.6.0
github.com/lxzan/gws v1.8.9
github.com/nicholas-fedor/shoutrrr v0.8.15
github.com/nicholas-fedor/shoutrrr v0.8.17
github.com/pocketbase/dbx v1.11.0
github.com/pocketbase/pocketbase v0.29.0
github.com/pocketbase/pocketbase v0.29.2
github.com/rhysd/go-github-selfupdate v1.2.3
github.com/shirou/gopsutil/v4 v4.25.6
github.com/shirou/gopsutil/v4 v4.25.7
github.com/spf13/cast v1.9.2
github.com/spf13/cobra v1.9.1
github.com/stretchr/testify v1.10.0
golang.org/x/crypto v0.40.0
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792
golang.org/x/crypto v0.41.0
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b
gopkg.in/yaml.v3 v3.0.1
)
@@ -39,7 +39,7 @@ require (
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-ozzo/ozzo-validation/v4 v4.3.0 // indirect
github.com/go-sql-driver/mysql v1.9.1 // indirect
github.com/golang-jwt/jwt/v5 v5.2.3 // indirect
github.com/golang-jwt/jwt/v5 v5.3.0 // indirect
github.com/google/go-github/v30 v30.1.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/inconshreveable/go-update v0.0.0-20160112193335-8152e7eb6ccf // indirect
@@ -56,17 +56,17 @@ require (
github.com/tcnksm/go-gitconfig v0.1.2 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/ulikunitz/xz v0.5.12 // indirect
github.com/ulikunitz/xz v0.5.13 // indirect
github.com/x448/float16 v0.8.4 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/image v0.29.0 // indirect
golang.org/x/net v0.42.0 // indirect
golang.org/x/image v0.30.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.34.0 // indirect
golang.org/x/text v0.27.0 // indirect
modernc.org/libc v1.65.10 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
modernc.org/libc v1.66.3 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
modernc.org/sqlite v1.38.0 // indirect
modernc.org/sqlite v1.38.2 // indirect
)

View File

@@ -46,8 +46,8 @@ github.com/go-sql-driver/mysql v1.9.1 h1:FrjNGn/BsJQjVRuSa8CBrM5BWA9BWoXXat3KrtS
github.com/go-sql-driver/mysql v1.9.1/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -103,8 +103,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU=
github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs=
github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIaf1R8KUs=
github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU=
github.com/pocketbase/pocketbase v0.29.2 h1:MghVgLYy/xh9lBwHtteNSYjYOvHKYD+dS9pzUzOP79Q=
github.com/pocketbase/pocketbase v0.29.2/go.mod h1:QZPKtMCWfiDJb0aLhwgj7ZOr6O8tusbui2EhTFAHThU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
@@ -114,8 +114,8 @@ 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.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs=
github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c=
github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM=
github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U=
github.com/spf13/cast v1.9.2 h1:SsGfm7M8QOFtEzumm7UZrZdLLquNdzFYfIbEXntcFbE=
github.com/spf13/cast v1.9.2/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
@@ -134,8 +134,8 @@ github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nE
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
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/ulikunitz/xz v0.5.13 h1:ar98gWrjf4H1ev05fYP/o29PDZw9DrI3niHtnEqyuXA=
github.com/ulikunitz/xz v0.5.13/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
@@ -144,22 +144,22 @@ go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4=
golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0=
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
golang.org/x/image v0.0.0-20191009234506-e7c1f5e7dbb8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.29.0 h1:HcdsyR4Gsuys/Axh0rDEmlBmB68rW1U9BUdB3UVHsas=
golang.org/x/image v0.29.0/go.mod h1:RVJROnf3SLK8d26OW91j4FrIHGbsJ8QnbEocVTOWQDA=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/image v0.30.0 h1:jD5RhkmVAnjqaCUXfbGBrn3lpxbknfN9w2UhHHU+5B4=
golang.org/x/image v0.30.0/go.mod h1:SAEUTxCCMWSrJcCy/4HwavEsfZZJlYxeHLc6tTiAe/c=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
@@ -174,19 +174,19 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg=
golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0=
golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4=
golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
@@ -203,19 +203,21 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM=
modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/cc/v4 v4.26.3 h1:yEN8dzrkRFnn4PUUKXLYIqVf2PJYAEjMTFjO3BDGc3I=
modernc.org/cc/v4 v4.26.3/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM=
modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/fileutil v1.3.15 h1:rJAXTP6ilMW/1+kzDiqmBlHLWszheUFXIyGQIAvjJpY=
modernc.org/fileutil v1.3.15/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc=
modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/libc v1.66.7 h1:rjhZ8OSCybKWxS1CJr0hikpEi6Vg+944Ouyrd+bQsoY=
modernc.org/libc v1.66.7/go.mod h1:ln6tbWX0NH+mzApEoDRvilBvAWFt1HX7AUA4VDdVDPM=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -224,8 +226,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI=
modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE=
modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek=
modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=

View File

@@ -113,37 +113,37 @@ func (a *Agent) gatherStats(sessionID string) *system.CombinedData {
a.Lock()
defer a.Unlock()
cachedData, ok := a.cache.Get(sessionID)
if ok {
slog.Debug("Cached stats", "session", sessionID)
return cachedData
data, isCached := a.cache.Get(sessionID)
if isCached {
slog.Debug("Cached data", "session", sessionID)
return data
}
*cachedData = system.CombinedData{
*data = system.CombinedData{
Stats: a.getSystemStats(),
Info: a.systemInfo,
}
slog.Debug("System stats", "data", cachedData)
slog.Debug("System data", "data", data)
if a.dockerManager != nil {
if containerStats, err := a.dockerManager.getDockerStats(); err == nil {
cachedData.Containers = containerStats
slog.Debug("Docker stats", "data", cachedData.Containers)
data.Containers = containerStats
slog.Debug("Containers", "data", data.Containers)
} else {
slog.Debug("Docker stats", "err", err)
slog.Debug("Containers", "err", err)
}
}
cachedData.Stats.ExtraFs = make(map[string]*system.FsStats)
data.Stats.ExtraFs = make(map[string]*system.FsStats)
for name, stats := range a.fsStats {
if !stats.Root && stats.DiskTotal > 0 {
cachedData.Stats.ExtraFs[name] = stats
data.Stats.ExtraFs[name] = stats
}
}
slog.Debug("Extra filesystems", "data", cachedData.Stats.ExtraFs)
slog.Debug("Extra FS", "data", data.Stats.ExtraFs)
a.cache.Set(sessionID, cachedData)
return cachedData
a.cache.Set(sessionID, data)
return data
}
// StartAgent initializes and starts the agent with optional WebSocket connection

View File

@@ -4,7 +4,7 @@ import (
"beszel/internal/entities/container"
"bytes"
"context"
"encoding/json"
"encoding/json/v2"
"fmt"
"log/slog"
"net"
@@ -29,7 +29,6 @@ type dockerManager struct {
goodDockerVersion bool // Whether docker version is at least 25.0.0 (one-shot works correctly)
isWindows bool // Whether the Docker Engine API is running on Windows
buf *bytes.Buffer // Buffer to store and read response bodies
decoder *json.Decoder // Reusable JSON decoder that reads from buf
apiStats *container.ApiStats // Reusable API stats object
}
@@ -343,17 +342,16 @@ func newDockerManager(a *Agent) *dockerManager {
// Decodes Docker API JSON response using a reusable buffer and decoder. Not thread safe.
func (dm *dockerManager) decode(resp *http.Response, d any) error {
if dm.buf == nil {
// initialize buffer with 256kb starting size
dm.buf = bytes.NewBuffer(make([]byte, 0, 1024*256))
dm.decoder = json.NewDecoder(dm.buf)
// initialize buffer with 128kb starting size
dm.buf = bytes.NewBuffer(make([]byte, 0, 1024*128))
}
defer resp.Body.Close()
defer dm.buf.Reset()
dm.buf.Reset()
_, err := dm.buf.ReadFrom(resp.Body)
if err != nil {
return err
}
return dm.decoder.Decode(d)
return json.Unmarshal(dm.buf.Bytes(), d)
}
// Test docker / podman sockets and return if one exists

View File

@@ -4,7 +4,7 @@ import (
"beszel/internal/entities/system"
"bufio"
"bytes"
"encoding/json"
"encoding/json/v2"
"fmt"
"os/exec"
"regexp"
@@ -50,7 +50,7 @@ type GPUManager struct {
// RocmSmiJson represents the JSON structure of rocm-smi output
type RocmSmiJson struct {
ID string `json:"GUID"`
Name string `json:"Card series"`
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)"`

View File

@@ -4,7 +4,8 @@ import (
"beszel"
"beszel/internal/common"
"beszel/internal/entities/system"
"encoding/json"
"encoding/json/jsontext"
"encoding/json/v2"
"errors"
"fmt"
"io"
@@ -144,7 +145,7 @@ func (a *Agent) writeToSession(w io.Writer, stats *system.CombinedData, hubVersi
if hubVersion.GTE(beszel.MinVersionCbor) {
return cbor.NewEncoder(w).Encode(stats)
}
return json.NewEncoder(w).Encode(stats)
return json.MarshalEncode(jsontext.NewEncoder(w), stats)
}
// extractHubVersion extracts the beszel version from SSH client version string.

View File

@@ -5,7 +5,7 @@ import (
"beszel/internal/entities/system"
"context"
"crypto/ed25519"
"encoding/json"
"encoding/json/v2"
"fmt"
"net"
"os"

View File

@@ -10,7 +10,6 @@ import (
"github.com/nicholas-fedor/shoutrrr"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tools/mailer"
)
@@ -206,16 +205,14 @@ func (am *AlertManager) SendShoutrrrAlert(notificationUrl, title, message, link,
}
func (am *AlertManager) SendTestNotification(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
var data struct {
URL string `json:"url"`
}
url := e.Request.URL.Query().Get("url")
// log.Println("url", url)
if url == "" {
return e.JSON(200, map[string]string{"err": "URL is required"})
err := e.BindBody(&data)
if err != nil || data.URL == "" {
return e.BadRequestError("URL is required", err)
}
err := am.SendShoutrrrAlert(url, "Test Alert", "This is a notification from Beszel.", am.hub.Settings().Meta.AppURL, "View Beszel")
err = am.SendShoutrrrAlert(data.URL, "Test Alert", "This is a notification from Beszel.", am.hub.Settings().Meta.AppURL, "View Beszel")
if err != nil {
return e.JSON(200, map[string]string{"err": err.Error()})
}

View File

@@ -0,0 +1,119 @@
package alerts
import (
"database/sql"
"errors"
"net/http"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
)
// UpsertUserAlerts handles API request to create or update alerts for a user
// across multiple systems (POST /api/beszel/user-alerts)
func UpsertUserAlerts(e *core.RequestEvent) error {
userID := e.Auth.Id
reqData := struct {
Min uint8 `json:"min"`
Value float64 `json:"value"`
Name string `json:"name"`
Systems []string `json:"systems"`
Overwrite bool `json:"overwrite"`
}{}
err := e.BindBody(&reqData)
if err != nil || userID == "" || reqData.Name == "" || len(reqData.Systems) == 0 {
return e.BadRequestError("Bad data", err)
}
alertsCollection, err := e.App.FindCachedCollectionByNameOrId("alerts")
if err != nil {
return err
}
err = e.App.RunInTransaction(func(txApp core.App) error {
for _, systemId := range reqData.Systems {
// find existing matching alert
alertRecord, err := txApp.FindFirstRecordByFilter(alertsCollection,
"system={:system} && name={:name} && user={:user}",
dbx.Params{"system": systemId, "name": reqData.Name, "user": userID})
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return err
}
// skip if alert already exists and overwrite is not set
if !reqData.Overwrite && alertRecord != nil {
continue
}
// create new alert if it doesn't exist
if alertRecord == nil {
alertRecord = core.NewRecord(alertsCollection)
alertRecord.Set("user", userID)
alertRecord.Set("system", systemId)
alertRecord.Set("name", reqData.Name)
}
alertRecord.Set("value", reqData.Value)
alertRecord.Set("min", reqData.Min)
if err := txApp.SaveNoValidate(alertRecord); err != nil {
return err
}
}
return nil
})
if err != nil {
return err
}
return e.JSON(http.StatusOK, map[string]any{"success": true})
}
// DeleteUserAlerts handles API request to delete alerts for a user across multiple systems
// (DELETE /api/beszel/user-alerts)
func DeleteUserAlerts(e *core.RequestEvent) error {
userID := e.Auth.Id
reqData := struct {
AlertName string `json:"name"`
Systems []string `json:"systems"`
}{}
err := e.BindBody(&reqData)
if err != nil || userID == "" || reqData.AlertName == "" || len(reqData.Systems) == 0 {
return e.BadRequestError("Bad data", err)
}
var numDeleted uint16
err = e.App.RunInTransaction(func(txApp core.App) error {
for _, systemId := range reqData.Systems {
// Find existing alert to delete
alertRecord, err := txApp.FindFirstRecordByFilter("alerts",
"system={:system} && name={:name} && user={:user}",
dbx.Params{"system": systemId, "name": reqData.AlertName, "user": userID})
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
// alert doesn't exist, continue to next system
continue
}
return err
}
if err := txApp.Delete(alertRecord); err != nil {
return err
}
numDeleted++
}
return nil
})
if err != nil {
return err
}
return e.JSON(http.StatusOK, map[string]any{"success": true, "count": numDeleted})
}

View File

@@ -12,7 +12,7 @@ func resolveHistoryOnAlertDelete(e *core.RecordEvent) error {
if !e.Record.GetBool("triggered") {
return e.Next()
}
_ = resolveAlertHistoryRecord(e.App, e.Record)
_ = resolveAlertHistoryRecord(e.App, e.Record.Id)
return e.Next()
}
@@ -36,19 +36,19 @@ func updateHistoryOnAlertUpdate(e *core.RecordEvent) error {
}
// if new state is not triggered, check for matching alert history record and set it to resolved
_ = resolveAlertHistoryRecord(e.App, new)
_ = resolveAlertHistoryRecord(e.App, new.Id)
return e.Next()
}
// resolveAlertHistoryRecord sets the resolved field to the current time
func resolveAlertHistoryRecord(app core.App, alertRecord *core.Record) error {
func resolveAlertHistoryRecord(app core.App, alertRecordID string) error {
alertHistoryRecords, err := app.FindRecordsByFilter(
"alerts_history",
"alert_id={:alert_id} && resolved=null",
"-created",
1,
0,
dbx.Params{"alert_id": alertRecord.Id},
dbx.Params{"alert_id": alertRecordID},
)
if err != nil {
return err

View File

@@ -2,7 +2,7 @@ package alerts
import (
"beszel/internal/entities/system"
"encoding/json"
"encoding/json/v2"
"fmt"
"strings"
"time"
@@ -293,18 +293,11 @@ func (am *AlertManager) sendSystemAlert(alert SystemAlertData) {
// app.Logger().Error("failed to save alert record", "err", err)
return
}
// expand the user relation and send the alert
if errs := am.hub.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.hub.MakeLink("system", systemName),
LinkText: "View " + systemName,
})
}
am.SendAlert(AlertMessageData{
UserID: alert.alertRecord.GetString("user"),
Title: subject,
Message: body,
Link: am.hub.MakeLink("system", systemName),
LinkText: "View " + systemName,
})
}

View File

@@ -0,0 +1,368 @@
//go:build testing
// +build testing
package alerts_test
import (
"bytes"
"encoding/json"
"io"
"net/http"
"strings"
"testing"
beszelTests "beszel/internal/tests"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
pbTests "github.com/pocketbase/pocketbase/tests"
"github.com/stretchr/testify/assert"
)
// marshal to json and return an io.Reader (for use in ApiScenario.Body)
func jsonReader(v any) io.Reader {
data, err := json.Marshal(v)
if err != nil {
panic(err)
}
return bytes.NewReader(data)
}
func TestUserAlertsApi(t *testing.T) {
hub, _ := beszelTests.NewTestHub(t.TempDir())
defer hub.Cleanup()
hub.StartHub()
user1, _ := beszelTests.CreateUser(hub, "alertstest@example.com", "password")
user1Token, _ := user1.NewAuthToken()
user2, _ := beszelTests.CreateUser(hub, "alertstest2@example.com", "password")
user2Token, _ := user2.NewAuthToken()
system1, _ := beszelTests.CreateRecord(hub, "systems", map[string]any{
"name": "system1",
"users": []string{user1.Id},
"host": "127.0.0.1",
})
system2, _ := beszelTests.CreateRecord(hub, "systems", map[string]any{
"name": "system2",
"users": []string{user1.Id, user2.Id},
"host": "127.0.0.2",
})
userRecords, _ := hub.CountRecords("users")
assert.EqualValues(t, 2, userRecords, "all users should be created")
systemRecords, _ := hub.CountRecords("systems")
assert.EqualValues(t, 2, systemRecords, "all systems should be created")
testAppFactory := func(t testing.TB) *pbTests.TestApp {
return hub.TestApp
}
scenarios := []beszelTests.ApiScenario{
{
Name: "GET not implemented - returns index",
Method: http.MethodGet,
URL: "/api/beszel/user-alerts",
ExpectedStatus: 200,
ExpectedContent: []string{"<html ", "globalThis.BESZEL"},
TestAppFactory: testAppFactory,
},
{
Name: "POST no auth",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
},
{
Name: "POST no body",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 400,
ExpectedContent: []string{"Bad data"},
TestAppFactory: testAppFactory,
},
{
Name: "POST bad data",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 400,
ExpectedContent: []string{"Bad data"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"invalidField": "this should cause validation error",
"threshold": "not a number",
}),
},
{
Name: "POST malformed JSON",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 400,
ExpectedContent: []string{"Bad data"},
TestAppFactory: testAppFactory,
Body: strings.NewReader(`{"alertType": "cpu", "threshold": 80, "enabled": true,}`),
},
{
Name: "POST valid alert data multiple systems",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 69,
"min": 9,
"systems": []string{system1.Id, system2.Id},
"overwrite": false,
}),
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
// check total alerts
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 2, alerts, "should have 2 alerts")
// check alert has correct values
matchingAlerts, _ := app.CountRecords("alerts", dbx.HashExp{"name": "CPU", "user": user1.Id, "system": system1.Id, "value": 69, "min": 9})
assert.EqualValues(t, 1, matchingAlerts, "should have 1 alert")
},
},
{
Name: "POST valid alert data single system",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "Memory",
"systems": []string{system1.Id},
"value": 90,
"min": 10,
}),
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
user1Alerts, _ := app.CountRecords("alerts", dbx.HashExp{"user": user1.Id})
assert.EqualValues(t, 3, user1Alerts, "should have 3 alerts")
},
},
{
Name: "Overwrite: false, should not overwrite existing alert",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 45,
"min": 5,
"systems": []string{system1.Id},
"overwrite": false,
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system1.Id,
"user": user1.Id,
"value": 80,
"min": 10,
})
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 1, alerts, "should have 1 alert")
alert, _ := app.FindFirstRecordByFilter("alerts", "name = 'CPU' && user = {:user}", dbx.Params{"user": user1.Id})
assert.EqualValues(t, 80, alert.Get("value"), "should have 80 as value")
},
},
{
Name: "Overwrite: true, should overwrite existing alert",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user2Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 45,
"min": 5,
"systems": []string{system2.Id},
"overwrite": true,
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system2.Id,
"user": user2.Id,
"value": 80,
"min": 10,
})
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 1, alerts, "should have 1 alert")
alert, _ := app.FindFirstRecordByFilter("alerts", "name = 'CPU' && user = {:user}", dbx.Params{"user": user2.Id})
assert.EqualValues(t, 45, alert.Get("value"), "should have 45 as value")
},
},
{
Name: "DELETE no auth",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"systems": []string{system1.Id},
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system1.Id,
"user": user1.Id,
"value": 80,
"min": 10,
})
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 1, alerts, "should have 1 alert")
},
},
{
Name: "DELETE alert",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"count\":1", "\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"systems": []string{system1.Id},
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system1.Id,
"user": user1.Id,
"value": 80,
"min": 10,
})
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
alerts, _ := app.CountRecords("alerts")
assert.Zero(t, alerts, "should have 0 alerts")
},
},
{
Name: "DELETE alert multiple systems",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user1Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"count\":2", "\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "Memory",
"systems": []string{system1.Id, system2.Id},
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
for _, systemId := range []string{system1.Id, system2.Id} {
_, err := beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "Memory",
"system": systemId,
"user": user1.Id,
"value": 90,
"min": 10,
})
assert.NoError(t, err, "should create alert")
}
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 2, alerts, "should have 2 alerts")
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
alerts, _ := app.CountRecords("alerts")
assert.Zero(t, alerts, "should have 0 alerts")
},
},
{
Name: "User 2 should not be able to delete alert of user 1",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": user2Token,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"count\":1", "\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"systems": []string{system2.Id},
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
beszelTests.ClearCollection(t, app, "alerts")
for _, user := range []string{user1.Id, user2.Id} {
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system2.Id,
"user": user,
"value": 80,
"min": 10,
})
}
alerts, _ := app.CountRecords("alerts")
assert.EqualValues(t, 2, alerts, "should have 2 alerts")
user1AlertCount, _ := app.CountRecords("alerts", dbx.HashExp{"user": user1.Id})
assert.EqualValues(t, 1, user1AlertCount, "should have 1 alert")
user2AlertCount, _ := app.CountRecords("alerts", dbx.HashExp{"user": user2.Id})
assert.EqualValues(t, 1, user2AlertCount, "should have 1 alert")
},
AfterTestFunc: func(t testing.TB, app *pbTests.TestApp, res *http.Response) {
user1AlertCount, _ := app.CountRecords("alerts", dbx.HashExp{"user": user1.Id})
assert.EqualValues(t, 1, user1AlertCount, "should have 1 alert")
user2AlertCount, _ := app.CountRecords("alerts", dbx.HashExp{"user": user2.Id})
assert.Zero(t, user2AlertCount, "should have 0 alerts")
},
},
}
for _, scenario := range scenarios {
scenario.Test(t)
}
}

View File

@@ -10,7 +10,6 @@ import (
"github.com/google/uuid"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/spf13/cast"
"gopkg.in/yaml.v3"
@@ -279,9 +278,8 @@ func createFingerprintRecord(app core.App, systemID, token string) error {
// Returns the current config.yml file as a JSON object
func GetYamlConfig(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil || info.Auth.GetString("role") != "admin" {
return apis.NewForbiddenError("Forbidden", nil)
if e.Auth.GetString("role") != "admin" {
return e.ForbiddenError("Requires admin role", nil)
}
configContent, err := generateYAML(e.App)
if err != nil {

View File

@@ -224,48 +224,48 @@ func (h *Hub) registerCronJobs(_ *core.ServeEvent) error {
// custom api routes
func (h *Hub) registerApiRoutes(se *core.ServeEvent) error {
// returns public key and version
se.Router.GET("/api/beszel/getkey", func(e *core.RequestEvent) error {
info, _ := e.RequestInfo()
if info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
return e.JSON(http.StatusOK, map[string]string{"key": h.pubKey, "v": beszel.Version})
})
// auth protected routes
apiAuth := se.Router.Group("/api/beszel")
apiAuth.Bind(apis.RequireAuth())
// auth optional routes
apiNoAuth := se.Router.Group("/api/beszel")
// create first user endpoint only needed if no users exist
if totalUsers, _ := se.App.CountRecords("users"); totalUsers == 0 {
apiNoAuth.POST("/create-user", h.um.CreateFirstUser)
}
// check if first time setup on login page
se.Router.GET("/api/beszel/first-run", func(e *core.RequestEvent) error {
total, err := h.CountRecords("users")
apiNoAuth.GET("/first-run", func(e *core.RequestEvent) error {
total, err := e.App.CountRecords("users")
return e.JSON(http.StatusOK, map[string]bool{"firstRun": err == nil && total == 0})
})
// get public key and version
apiAuth.GET("/getkey", func(e *core.RequestEvent) error {
return e.JSON(http.StatusOK, map[string]string{"key": h.pubKey, "v": beszel.Version})
})
// send test notification
se.Router.GET("/api/beszel/send-test-notification", h.SendTestNotification)
// API endpoint to get config.yml content
se.Router.GET("/api/beszel/config-yaml", config.GetYamlConfig)
apiAuth.POST("/test-notification", h.SendTestNotification)
// get config.yml content
apiAuth.GET("/config-yaml", config.GetYamlConfig)
// handle agent websocket connection
se.Router.GET("/api/beszel/agent-connect", h.handleAgentConnect)
apiNoAuth.GET("/agent-connect", h.handleAgentConnect)
// get or create universal tokens
se.Router.GET("/api/beszel/universal-token", h.getUniversalToken)
// create first user endpoint only needed if no users exist
if totalUsers, _ := h.CountRecords("users"); totalUsers == 0 {
se.Router.POST("/api/beszel/create-user", h.um.CreateFirstUser)
}
apiAuth.GET("/universal-token", h.getUniversalToken)
// update / delete user alerts
apiAuth.POST("/user-alerts", alerts.UpsertUserAlerts)
apiAuth.DELETE("/user-alerts", alerts.DeleteUserAlerts)
return nil
}
// Handler for universal token API endpoint (create, read, delete)
func (h *Hub) getUniversalToken(e *core.RequestEvent) error {
info, err := e.RequestInfo()
if err != nil || info.Auth == nil {
return apis.NewForbiddenError("Forbidden", nil)
}
tokenMap := universalTokenMap.GetMap()
userID := info.Auth.Id
userID := e.Auth.Id
query := e.Request.URL.Query()
token := query.Get("token")
tokenSet := token != ""
if !tokenSet {
if token == "" {
// return existing token if it exists
if token, _, ok := tokenMap.GetByValue(userID); ok {
return e.JSON(http.StatusOK, map[string]any{"token": token, "active": true})

View File

@@ -4,27 +4,37 @@
package hub_test
import (
"beszel/internal/tests"
beszelTests "beszel/internal/tests"
"testing"
"bytes"
"crypto/ed25519"
"encoding/json/v2"
"encoding/pem"
"io"
"net/http"
"os"
"path/filepath"
"strings"
"github.com/pocketbase/pocketbase/core"
pbTests "github.com/pocketbase/pocketbase/tests"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/ssh"
)
func getTestHub(t testing.TB) *tests.TestHub {
hub, _ := tests.NewTestHub(t.TempDir())
return hub
// marshal to json and return an io.Reader (for use in ApiScenario.Body)
func jsonReader(v any) io.Reader {
data, err := json.Marshal(v)
if err != nil {
panic(err)
}
return bytes.NewReader(data)
}
func TestMakeLink(t *testing.T) {
hub := getTestHub(t)
hub, _ := beszelTests.NewTestHub(t.TempDir())
tests := []struct {
name string
@@ -114,7 +124,7 @@ func TestMakeLink(t *testing.T) {
}
func TestGetSSHKey(t *testing.T) {
hub := getTestHub(t)
hub, _ := beszelTests.NewTestHub(t.TempDir())
// Test Case 1: Key generation (no existing key)
t.Run("KeyGeneration", func(t *testing.T) {
@@ -254,3 +264,340 @@ func TestGetSSHKey(t *testing.T) {
}
})
}
func TestApiRoutesAuthentication(t *testing.T) {
hub, _ := beszelTests.NewTestHub(t.TempDir())
defer hub.Cleanup()
hub.StartHub()
// Create test user and get auth token
user, err := beszelTests.CreateUser(hub, "testuser@example.com", "password123")
require.NoError(t, err, "Failed to create test user")
adminUser, err := beszelTests.CreateRecord(hub, "users", map[string]any{
"email": "admin@example.com",
"password": "password123",
"role": "admin",
})
require.NoError(t, err, "Failed to create admin user")
adminUserToken, err := adminUser.NewAuthToken()
// superUser, err := beszelTests.CreateRecord(hub, core.CollectionNameSuperusers, map[string]any{
// "email": "superuser@example.com",
// "password": "password123",
// })
// require.NoError(t, err, "Failed to create superuser")
userToken, err := user.NewAuthToken()
require.NoError(t, err, "Failed to create auth token")
// Create test system for user-alerts endpoints
system, err := beszelTests.CreateRecord(hub, "systems", map[string]any{
"name": "test-system",
"users": []string{user.Id},
"host": "127.0.0.1",
})
require.NoError(t, err, "Failed to create test system")
testAppFactory := func(t testing.TB) *pbTests.TestApp {
return hub.TestApp
}
scenarios := []beszelTests.ApiScenario{
// Auth Protected Routes - Should require authentication
{
Name: "POST /test-notification - no auth should fail",
Method: http.MethodPost,
URL: "/api/beszel/test-notification",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"url": "generic://127.0.0.1",
}),
},
{
Name: "POST /test-notification - with auth should succeed",
Method: http.MethodPost,
URL: "/api/beszel/test-notification",
TestAppFactory: testAppFactory,
Headers: map[string]string{
"Authorization": userToken,
},
Body: jsonReader(map[string]any{
"url": "generic://127.0.0.1",
}),
ExpectedStatus: 200,
ExpectedContent: []string{"sending message"},
},
{
Name: "GET /config-yaml - no auth should fail",
Method: http.MethodGet,
URL: "/api/beszel/config-yaml",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /config-yaml - with user auth should fail",
Method: http.MethodGet,
URL: "/api/beszel/config-yaml",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 403,
ExpectedContent: []string{"Requires admin"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /config-yaml - with admin auth should succeed",
Method: http.MethodGet,
URL: "/api/beszel/config-yaml",
Headers: map[string]string{
"Authorization": adminUserToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"test-system"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /universal-token - no auth should fail",
Method: http.MethodGet,
URL: "/api/beszel/universal-token",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /universal-token - with auth should succeed",
Method: http.MethodGet,
URL: "/api/beszel/universal-token",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"active", "token"},
TestAppFactory: testAppFactory,
},
{
Name: "POST /user-alerts - no auth should fail",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 80,
"min": 10,
"systems": []string{system.Id},
}),
},
{
Name: "POST /user-alerts - with auth should succeed",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 80,
"min": 10,
"systems": []string{system.Id},
}),
},
{
Name: "DELETE /user-alerts - no auth should fail",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"systems": []string{system.Id},
}),
},
{
Name: "DELETE /user-alerts - with auth should succeed",
Method: http.MethodDelete,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"success\":true"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"systems": []string{system.Id},
}),
BeforeTestFunc: func(t testing.TB, app *pbTests.TestApp, e *core.ServeEvent) {
// Create an alert to delete
beszelTests.CreateRecord(app, "alerts", map[string]any{
"name": "CPU",
"system": system.Id,
"user": user.Id,
"value": 80,
"min": 10,
})
},
},
// Auth Optional Routes - Should work without authentication
{
Name: "GET /getkey - no auth should fail",
Method: http.MethodGet,
URL: "/api/beszel/getkey",
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /getkey - with auth should also succeed",
Method: http.MethodGet,
URL: "/api/beszel/getkey",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"key\":", "\"v\":"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /first-run - no auth should succeed",
Method: http.MethodGet,
URL: "/api/beszel/first-run",
ExpectedStatus: 200,
ExpectedContent: []string{"\"firstRun\":false"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /first-run - with auth should also succeed",
Method: http.MethodGet,
URL: "/api/beszel/first-run",
Headers: map[string]string{
"Authorization": userToken,
},
ExpectedStatus: 200,
ExpectedContent: []string{"\"firstRun\":false"},
TestAppFactory: testAppFactory,
},
{
Name: "GET /agent-connect - no auth should succeed (websocket upgrade fails but route is accessible)",
Method: http.MethodGet,
URL: "/api/beszel/agent-connect",
ExpectedStatus: 400,
ExpectedContent: []string{},
TestAppFactory: testAppFactory,
},
{
Name: "POST /test-notification - invalid auth token should fail",
Method: http.MethodPost,
URL: "/api/beszel/test-notification",
Body: jsonReader(map[string]any{
"url": "generic://127.0.0.1",
}),
Headers: map[string]string{
"Authorization": "invalid-token",
},
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
},
{
Name: "POST /user-alerts - invalid auth token should fail",
Method: http.MethodPost,
URL: "/api/beszel/user-alerts",
Headers: map[string]string{
"Authorization": "invalid-token",
},
ExpectedStatus: 401,
ExpectedContent: []string{"requires valid"},
TestAppFactory: testAppFactory,
Body: jsonReader(map[string]any{
"name": "CPU",
"value": 80,
"min": 10,
"systems": []string{system.Id},
}),
},
}
for _, scenario := range scenarios {
scenario.Test(t)
}
}
func TestCreateUserEndpointAvailability(t *testing.T) {
t.Run("CreateUserEndpoint available when no users exist", func(t *testing.T) {
hub, _ := beszelTests.NewTestHub(t.TempDir())
defer hub.Cleanup()
// Ensure no users exist
userCount, err := hub.CountRecords("users")
require.NoError(t, err)
require.Zero(t, userCount, "Should start with no users")
hub.StartHub()
testAppFactory := func(t testing.TB) *pbTests.TestApp {
return hub.TestApp
}
scenario := beszelTests.ApiScenario{
Name: "POST /create-user - should be available when no users exist",
Method: http.MethodPost,
URL: "/api/beszel/create-user",
Body: jsonReader(map[string]any{
"email": "firstuser@example.com",
"password": "password123",
}),
ExpectedStatus: 200,
ExpectedContent: []string{"User created"},
TestAppFactory: testAppFactory,
}
scenario.Test(t)
// Verify user was created
userCount, err = hub.CountRecords("users")
require.NoError(t, err)
require.EqualValues(t, 1, userCount, "Should have created one user")
})
t.Run("CreateUserEndpoint not available when users exist", func(t *testing.T) {
hub, _ := beszelTests.NewTestHub(t.TempDir())
defer hub.Cleanup()
// Create a user first
_, err := beszelTests.CreateUser(hub, "existing@example.com", "password")
require.NoError(t, err)
hub.StartHub()
testAppFactory := func(t testing.TB) *pbTests.TestApp {
return hub.TestApp
}
scenario := beszelTests.ApiScenario{
Name: "POST /create-user - should not be available when users exist",
Method: http.MethodPost,
URL: "/api/beszel/create-user",
Body: jsonReader(map[string]any{
"email": "another@example.com",
"password": "password123",
}),
ExpectedStatus: 404,
ExpectedContent: []string{"wasn't found"},
TestAppFactory: testAppFactory,
}
scenario.Test(t)
})
}

View File

@@ -5,7 +5,8 @@ import (
"beszel/internal/entities/system"
"beszel/internal/hub/ws"
"context"
"encoding/json"
"encoding/json/jsontext"
"encoding/json/v2"
"errors"
"fmt"
"math/rand"
@@ -275,7 +276,7 @@ func (sys *System) fetchDataViaSSH() (*system.CombinedData, error) {
if sys.agentVersion.GTE(beszel.MinVersionCbor) {
err = cbor.NewDecoder(stdout).Decode(sys.data)
} else {
err = json.NewDecoder(stdout).Decode(sys.data)
err = json.UnmarshalDecode(jsontext.NewDecoder(stdout), sys.data)
}
if err != nil {

View File

@@ -4,7 +4,7 @@ package records
import (
"beszel/internal/entities/container"
"beszel/internal/entities/system"
"encoding/json"
"encoding/json/v2"
"fmt"
"log"
"math"

View File

@@ -0,0 +1,307 @@
package tests
import (
"context"
"fmt"
"io"
"maps"
"net/http"
"net/http/httptest"
"testing"
"time"
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
pbtests "github.com/pocketbase/pocketbase/tests"
"github.com/pocketbase/pocketbase/tools/hook"
)
// NOTE: This is a copy of https://github.com/pocketbase/pocketbase/blob/master/tests/api.go
// with the following changes:
// - Removed automatic cleanup of the test app in ApiScenario.Test (Aug 17 2025)
// ApiScenario defines a single api request test case/scenario.
type ApiScenario struct {
// Name is the test name.
Name string
// Method is the HTTP method of the test request to use.
Method string
// URL is the url/path of the endpoint you want to test.
URL string
// Body specifies the body to send with the request.
//
// For example:
//
// strings.NewReader(`{"title":"abc"}`)
Body io.Reader
// Headers specifies the headers to send with the request (e.g. "Authorization": "abc")
Headers map[string]string
// Delay adds a delay before checking the expectations usually
// to ensure that all fired non-awaited go routines have finished
Delay time.Duration
// Timeout specifies how long to wait before cancelling the request context.
//
// A zero or negative value means that there will be no timeout.
Timeout time.Duration
// expectations
// ---------------------------------------------------------------
// ExpectedStatus specifies the expected response HTTP status code.
ExpectedStatus int
// List of keywords that MUST exist in the response body.
//
// Either ExpectedContent or NotExpectedContent must be set if the response body is non-empty.
// Leave both fields empty if you want to ensure that the response didn't have any body (e.g. 204).
ExpectedContent []string
// List of keywords that MUST NOT exist in the response body.
//
// Either ExpectedContent or NotExpectedContent must be set if the response body is non-empty.
// Leave both fields empty if you want to ensure that the response didn't have any body (e.g. 204).
NotExpectedContent []string
// List of hook events to check whether they were fired or not.
//
// You can use the wildcard "*" event key if you want to ensure
// that no other hook events except those listed have been fired.
//
// For example:
//
// map[string]int{ "*": 0 } // no hook events were fired
// map[string]int{ "*": 0, "EventA": 2 } // no hook events, except EventA were fired
// map[string]int{ "EventA": 2, "EventB": 0 } // ensures that EventA was fired exactly 2 times and EventB exactly 0 times.
ExpectedEvents map[string]int
// test hooks
// ---------------------------------------------------------------
TestAppFactory func(t testing.TB) *pbtests.TestApp
BeforeTestFunc func(t testing.TB, app *pbtests.TestApp, e *core.ServeEvent)
AfterTestFunc func(t testing.TB, app *pbtests.TestApp, res *http.Response)
}
// Test executes the test scenario.
//
// Example:
//
// func TestListExample(t *testing.T) {
// scenario := tests.ApiScenario{
// Name: "list example collection",
// Method: http.MethodGet,
// URL: "/api/collections/example/records",
// ExpectedStatus: 200,
// ExpectedContent: []string{
// `"totalItems":3`,
// `"id":"0yxhwia2amd8gec"`,
// `"id":"achvryl401bhse3"`,
// `"id":"llvuca81nly1qls"`,
// },
// ExpectedEvents: map[string]int{
// "OnRecordsListRequest": 1,
// "OnRecordEnrich": 3,
// },
// }
//
// scenario.Test(t)
// }
func (scenario *ApiScenario) Test(t *testing.T) {
t.Run(scenario.normalizedName(), func(t *testing.T) {
scenario.test(t)
})
}
// Benchmark benchmarks the test scenario.
//
// Example:
//
// func BenchmarkListExample(b *testing.B) {
// scenario := tests.ApiScenario{
// Name: "list example collection",
// Method: http.MethodGet,
// URL: "/api/collections/example/records",
// ExpectedStatus: 200,
// ExpectedContent: []string{
// `"totalItems":3`,
// `"id":"0yxhwia2amd8gec"`,
// `"id":"achvryl401bhse3"`,
// `"id":"llvuca81nly1qls"`,
// },
// ExpectedEvents: map[string]int{
// "OnRecordsListRequest": 1,
// "OnRecordEnrich": 3,
// },
// }
//
// scenario.Benchmark(b)
// }
func (scenario *ApiScenario) Benchmark(b *testing.B) {
b.Run(scenario.normalizedName(), func(b *testing.B) {
for i := 0; i < b.N; i++ {
scenario.test(b)
}
})
}
func (scenario *ApiScenario) normalizedName() string {
var name = scenario.Name
if name == "" {
name = fmt.Sprintf("%s:%s", scenario.Method, scenario.URL)
}
return name
}
func (scenario *ApiScenario) test(t testing.TB) {
var testApp *pbtests.TestApp
if scenario.TestAppFactory != nil {
testApp = scenario.TestAppFactory(t)
if testApp == nil {
t.Fatal("TestAppFactory must return a non-nill app instance")
}
} else {
var testAppErr error
testApp, testAppErr = pbtests.NewTestApp()
if testAppErr != nil {
t.Fatalf("Failed to initialize the test app instance: %v", testAppErr)
}
}
// defer testApp.Cleanup()
baseRouter, err := apis.NewRouter(testApp)
if err != nil {
t.Fatal(err)
}
// manually trigger the serve event to ensure that custom app routes and middlewares are registered
serveEvent := new(core.ServeEvent)
serveEvent.App = testApp
serveEvent.Router = baseRouter
serveErr := testApp.OnServe().Trigger(serveEvent, func(e *core.ServeEvent) error {
if scenario.BeforeTestFunc != nil {
scenario.BeforeTestFunc(t, testApp, e)
}
// reset the event counters in case a hook was triggered from a before func (eg. db save)
testApp.ResetEventCalls()
// add middleware to timeout long-running requests (eg. keep-alive routes)
e.Router.Bind(&hook.Handler[*core.RequestEvent]{
Func: func(re *core.RequestEvent) error {
slowTimer := time.AfterFunc(3*time.Second, func() {
t.Logf("[WARN] Long running test %q", scenario.Name)
})
defer slowTimer.Stop()
if scenario.Timeout > 0 {
ctx, cancelFunc := context.WithTimeout(re.Request.Context(), scenario.Timeout)
defer cancelFunc()
re.Request = re.Request.Clone(ctx)
}
return re.Next()
},
Priority: -9999,
})
recorder := httptest.NewRecorder()
req := httptest.NewRequest(scenario.Method, scenario.URL, scenario.Body)
// set default header
req.Header.Set("content-type", "application/json")
// set scenario headers
for k, v := range scenario.Headers {
req.Header.Set(k, v)
}
// execute request
mux, err := e.Router.BuildMux()
if err != nil {
t.Fatalf("Failed to build router mux: %v", err)
}
mux.ServeHTTP(recorder, req)
res := recorder.Result()
if res.StatusCode != scenario.ExpectedStatus {
t.Errorf("Expected status code %d, got %d", scenario.ExpectedStatus, res.StatusCode)
}
if scenario.Delay > 0 {
time.Sleep(scenario.Delay)
}
if len(scenario.ExpectedContent) == 0 && len(scenario.NotExpectedContent) == 0 {
if len(recorder.Body.Bytes()) != 0 {
t.Errorf("Expected empty body, got \n%v", recorder.Body.String())
}
} else {
// normalize json response format
/* buffer := new(bytes.Buffer)
err := json.Compact(buffer, recorder.Body.Bytes())
var normalizedBody string
if err != nil {
// not a json...
normalizedBody = recorder.Body.String()
} else {
normalizedBody = buffer.String()
}
for _, item := range scenario.ExpectedContent {
if !strings.Contains(normalizedBody, item) {
t.Errorf("Cannot find %v in response body \n%v", item, normalizedBody)
break
}
}
for _, item := range scenario.NotExpectedContent {
if strings.Contains(normalizedBody, item) {
t.Errorf("Didn't expect %v in response body \n%v", item, normalizedBody)
break
}
}
*/
}
remainingEvents := maps.Clone(testApp.EventCalls)
var noOtherEventsShouldRemain bool
for event, expectedNum := range scenario.ExpectedEvents {
if event == "*" && expectedNum <= 0 {
noOtherEventsShouldRemain = true
continue
}
actualNum := remainingEvents[event]
if actualNum != expectedNum {
t.Errorf("Expected event %s to be called %d, got %d", event, expectedNum, actualNum)
}
delete(remainingEvents, event)
}
if noOtherEventsShouldRemain && len(remainingEvents) > 0 {
t.Errorf("Missing expected remaining events:\n%#v\nAll triggered app events are:\n%#v", remainingEvents, testApp.EventCalls)
}
if scenario.AfterTestFunc != nil {
scenario.AfterTestFunc(t, testApp, res)
}
return nil
})
if serveErr != nil {
t.Fatalf("Failed to trigger app serve hook: %v", serveErr)
}
}

View File

@@ -6,9 +6,12 @@ package tests
import (
"beszel/internal/hub"
"fmt"
"testing"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/tests"
"github.com/stretchr/testify/assert"
_ "github.com/pocketbase/pocketbase/migrations"
)
@@ -86,3 +89,10 @@ func CreateRecord(app core.App, collectionName string, fields map[string]any) (*
return record, app.Save(record)
}
func ClearCollection(t testing.TB, app core.App, collectionName string) error {
_, err := app.DB().NewQuery(fmt.Sprintf("DELETE from %s", collectionName)).Execute()
recordCount, err := app.CountRecords(collectionName)
assert.EqualValues(t, recordCount, 0, "should have 0 records after clearing")
return err
}

View File

@@ -6,6 +6,7 @@ import (
"log"
"net/http"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
)
@@ -13,18 +14,6 @@ type UserManager struct {
app core.App
}
type UserSettings struct {
ChartTime string `json:"chartTime"`
NotificationEmails []string `json:"emails"`
NotificationWebhooks []string `json:"webhooks"`
// UnitTemp uint8 `json:"unitTemp"` // 0 for Celsius, 1 for Fahrenheit
// UnitNet uint8 `json:"unitNet"` // 0 for bytes, 1 for bits
// UnitDisk uint8 `json:"unitDisk"` // 0 for bytes, 1 for bits
// New field for alert history retention (e.g., "1m", "3m", "6m", "1y")
AlertHistoryRetention string `json:"alertHistoryRetention,omitempty"`
}
func NewUserManager(app core.App) *UserManager {
return &UserManager{
app: app,
@@ -42,29 +31,26 @@ func (um *UserManager) InitializeUserRole(e *core.RecordEvent) error {
// Initialize user settings with defaults if not set
func (um *UserManager) InitializeUserSettings(e *core.RecordEvent) error {
record := e.Record
// intialize settings with defaults
settings := UserSettings{
ChartTime: "1h",
NotificationEmails: []string{},
NotificationWebhooks: []string{},
// intialize settings with defaults (zero values can be ignored)
settings := struct {
ChartTime string `json:"chartTime"`
Emails []string `json:"emails"`
}{
ChartTime: "1h",
}
record.UnmarshalJSONField("settings", &settings)
if len(settings.NotificationEmails) == 0 {
// get user email from auth record
if errs := um.app.ExpandRecord(record, []string{"user"}, nil); len(errs) == 0 {
// app.Logger().Error("failed to expand user relation", "errs", errs)
if user := record.ExpandedOne("user"); user != nil {
settings.NotificationEmails = []string{user.GetString("email")}
} else {
log.Println("Failed to get user email from auth record")
}
} else {
log.Println("failed to expand user relation", "errs", errs)
}
// get user email from auth record
var user struct {
Email string `db:"email"`
}
// if len(settings.NotificationWebhooks) == 0 {
// settings.NotificationWebhooks = []string{""}
// }
err := e.App.DB().NewQuery("SELECT email FROM users WHERE id = {:id}").Bind(dbx.Params{
"id": record.GetString("user"),
}).One(&user)
if err != nil {
log.Println("failed to get user email", "err", err)
return err
}
settings.Emails = []string{user.Email}
record.Set("settings", settings)
return e.Next()
}

View File

@@ -1,12 +1,12 @@
{
"name": "beszel",
"version": "0.12.2",
"version": "0.12.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "beszel",
"version": "0.12.2",
"version": "0.12.3",
"dependencies": {
"@henrygd/queue": "^1.0.7",
"@henrygd/semaphore": "^0.0.2",
@@ -6185,4 +6185,4 @@
}
}
}
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "beszel",
"private": true,
"version": "0.12.2",
"version": "0.12.3",
"type": "module",
"scripts": {
"dev": "vite",

View File

@@ -1,31 +1,19 @@
import { t } from "@lingui/core/macro"
import { Trans } from "@lingui/react/macro"
import { memo, useMemo, useState } from "react"
import { useStore } from "@nanostores/react"
import { $alerts } from "@/lib/stores"
import {
Dialog,
DialogTrigger,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog"
import { BellIcon, GlobeIcon, ServerIcon } from "lucide-react"
import { alertInfo, cn } from "@/lib/utils"
import { Dialog, DialogTrigger, DialogContent } from "@/components/ui/dialog"
import { BellIcon } from "lucide-react"
import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"
import { AlertRecord, SystemRecord } from "@/types"
import { $router, Link } from "../router"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Checkbox } from "../ui/checkbox"
import { SystemAlert, SystemAlertGlobal } from "./alerts-system"
import { getPagePath } from "@nanostores/router"
import { SystemRecord } from "@/types"
import { AlertDialogContent } from "./alerts-dialog"
export default memo(function AlertsButton({ system }: { system: SystemRecord }) {
const alerts = useStore($alerts)
const [opened, setOpened] = useState(false)
const alerts = useStore($alerts)
const hasAlert = alerts.some((alert) => alert.system === system.id)
const hasSystemAlert = alerts[system.id]?.size > 0
return useMemo(
() => (
@@ -34,7 +22,7 @@ export default memo(function AlertsButton({ system }: { system: SystemRecord })
<Button variant="ghost" size="icon" aria-label={t`Alerts`} data-nolink onClick={() => setOpened(true)}>
<BellIcon
className={cn("h-[1.2em] w-[1.2em] pointer-events-none", {
"fill-primary": hasAlert,
"fill-primary": hasSystemAlert,
})}
/>
</Button>
@@ -44,7 +32,7 @@ export default memo(function AlertsButton({ system }: { system: SystemRecord })
</DialogContent>
</Dialog>
),
[opened, hasAlert]
[opened, hasSystemAlert]
)
// return useMemo(
@@ -67,87 +55,3 @@ export default memo(function AlertsButton({ system }: { system: SystemRecord })
// [opened, hasAlert]
// )
})
function AlertDialogContent({ system }: { system: SystemRecord }) {
const alerts = useStore($alerts)
const [overwriteExisting, setOverwriteExisting] = useState<boolean | "indeterminate">(false)
// alertsSignature changes only when alerts for this system change
let alertsSignature = ""
const systemAlerts = alerts.filter((alert) => {
if (alert.system === system.id) {
alertsSignature += alert.name + alert.min + alert.value
return true
}
return false
}) as AlertRecord[]
return useMemo(() => {
// console.log("render modal", system.name, alertsSignature)
const data = Object.keys(alertInfo).map((name) => {
const alert = alertInfo[name as keyof typeof alertInfo]
return {
name: name as keyof typeof alertInfo,
alert,
system,
}
})
return (
<>
<DialogHeader>
<DialogTitle className="text-xl">
<Trans>Alerts</Trans>
</DialogTitle>
<DialogDescription>
<Trans>
See{" "}
<Link href={getPagePath($router, "settings", { name: "notifications" })} className="link">
notification settings
</Link>{" "}
to configure how you receive alerts.
</Trans>
</DialogDescription>
</DialogHeader>
<Tabs defaultValue="system">
<TabsList className="mb-1 -mt-0.5">
<TabsTrigger value="system">
<ServerIcon className="me-2 h-3.5 w-3.5" />
{system.name}
</TabsTrigger>
<TabsTrigger value="global">
<GlobeIcon className="me-1.5 h-3.5 w-3.5" />
<Trans>All Systems</Trans>
</TabsTrigger>
</TabsList>
<TabsContent value="system">
<div className="grid gap-3">
{data.map((d) => (
<SystemAlert key={d.name} system={system} data={d} systemAlerts={systemAlerts} />
))}
</div>
</TabsContent>
<TabsContent value="global">
<label
htmlFor="ovw"
className="mb-3 flex gap-2 items-center justify-center cursor-pointer border rounded-sm py-3 px-4 border-destructive text-destructive font-semibold text-sm"
>
<Checkbox
id="ovw"
className="text-destructive border-destructive data-[state=checked]:bg-destructive"
checked={overwriteExisting}
onCheckedChange={setOverwriteExisting}
/>
<Trans>Overwrite existing alerts</Trans>
</label>
<div className="grid gap-3">
{data.map((d) => (
<SystemAlertGlobal key={d.name} data={d} overwrite={overwriteExisting} />
))}
</div>
</TabsContent>
</Tabs>
</>
)
}, [alertsSignature, overwriteExisting])
}

View File

@@ -0,0 +1,297 @@
import { t } from "@lingui/core/macro"
import { Trans, Plural } from "@lingui/react/macro"
import { $alerts, $systems, pb } from "@/lib/stores"
import { alertInfo, cn, debounce } from "@/lib/utils"
import { Switch } from "@/components/ui/switch"
import { AlertInfo, AlertRecord, SystemRecord } from "@/types"
import { lazy, memo, Suspense, useMemo, useState } from "react"
import { toast } from "@/components/ui/use-toast"
import { useStore } from "@nanostores/react"
import { getPagePath } from "@nanostores/router"
import { Checkbox } from "@/components/ui/checkbox"
import { DialogTitle, DialogDescription } from "@/components/ui/dialog"
import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"
import { ServerIcon, GlobeIcon } from "lucide-react"
import { $router, Link } from "@/components/router"
import { DialogHeader } from "@/components/ui/dialog"
const Slider = lazy(() => import("@/components/ui/slider"))
const endpoint = "/api/beszel/user-alerts"
const alertDebounce = 100
const alertKeys = Object.keys(alertInfo) as (keyof typeof alertInfo)[]
const failedUpdateToast = (error: unknown) => {
console.error(error)
toast({
title: t`Failed to update alert`,
description: t`Please check logs for more details.`,
variant: "destructive",
})
}
/** Create or update alerts for a given name and systems */
const upsertAlerts = debounce(
async ({ name, value, min, systems }: { name: string; value: number; min: number; systems: string[] }) => {
try {
await pb.send<{ success: boolean }>(endpoint, {
method: "POST",
// overwrite is always true because we've done filtering client side
body: { name, value, min, systems, overwrite: true },
})
} catch (error) {
failedUpdateToast(error)
}
},
alertDebounce
)
/** Delete alerts for a given name and systems */
const deleteAlerts = debounce(async ({ name, systems }: { name: string; systems: string[] }) => {
try {
await pb.send<{ success: boolean }>(endpoint, {
method: "DELETE",
body: { name, systems },
})
} catch (error) {
failedUpdateToast(error)
}
}, alertDebounce)
export const AlertDialogContent = memo(function AlertDialogContent({ system }: { system: SystemRecord }) {
const alerts = useStore($alerts)
const [overwriteExisting, setOverwriteExisting] = useState<boolean | "indeterminate">(false)
const [currentTab, setCurrentTab] = useState("system")
const systemAlerts = alerts[system.id] ?? new Map()
// We need to keep a copy of alerts when we switch to global tab. If we always compare to
// current alerts, it will only be updated when first checked, then won't be updated because
// after that it exists.
const alertsWhenGlobalSelected = useMemo(() => {
return currentTab === "global" ? structuredClone(alerts) : alerts
}, [currentTab])
return (
<>
<DialogHeader>
<DialogTitle className="text-xl">
<Trans>Alerts</Trans>
</DialogTitle>
<DialogDescription>
<Trans>
See{" "}
<Link href={getPagePath($router, "settings", { name: "notifications" })} className="link">
notification settings
</Link>{" "}
to configure how you receive alerts.
</Trans>
</DialogDescription>
</DialogHeader>
<Tabs defaultValue="system" onValueChange={setCurrentTab}>
<TabsList className="mb-1 -mt-0.5">
<TabsTrigger value="system">
<ServerIcon className="me-2 h-3.5 w-3.5" />
{system.name}
</TabsTrigger>
<TabsTrigger value="global">
<GlobeIcon className="me-1.5 h-3.5 w-3.5" />
<Trans>All Systems</Trans>
</TabsTrigger>
</TabsList>
<TabsContent value="system">
<div className="grid gap-3">
{alertKeys.map((name) => (
<AlertContent
key={name}
alertKey={name}
data={alertInfo[name as keyof typeof alertInfo]}
alert={systemAlerts.get(name)}
system={system}
/>
))}
</div>
</TabsContent>
<TabsContent value="global">
<label
htmlFor="ovw"
className="mb-3 flex gap-2 items-center justify-center cursor-pointer border rounded-sm py-3 px-4 border-destructive text-destructive font-semibold text-sm"
>
<Checkbox
id="ovw"
className="text-destructive border-destructive data-[state=checked]:bg-destructive"
checked={overwriteExisting}
onCheckedChange={setOverwriteExisting}
/>
<Trans>Overwrite existing alerts</Trans>
</label>
<div className="grid gap-3">
{alertKeys.map((name) => (
<AlertContent
key={name}
alertKey={name}
system={system}
alert={systemAlerts.get(name)}
data={alertInfo[name as keyof typeof alertInfo]}
global={true}
overwriteExisting={!!overwriteExisting}
initialAlertsState={alertsWhenGlobalSelected}
/>
))}
</div>
</TabsContent>
</Tabs>
</>
)
})
export function AlertContent({
alertKey,
data: alertData,
system,
alert,
global = false,
overwriteExisting = false,
initialAlertsState = {},
}: {
alertKey: string
data: AlertInfo
system: SystemRecord
alert?: AlertRecord
global?: boolean
overwriteExisting?: boolean
initialAlertsState?: Record<string, Map<string, AlertRecord>>
}) {
const { name } = alertData
const singleDescription = alertData.singleDesc?.()
const [checked, setChecked] = useState(global ? false : !!alert)
const [min, setMin] = useState(alert?.min || 10)
const [value, setValue] = useState(alert?.value || (singleDescription ? 0 : alertData.start ?? 80))
const Icon = alertData.icon
/** Get system ids to update */
function getSystemIds(): string[] {
// if not global, update only the current system
if (!global) {
return [system.id]
}
// if global, update all systems when overwriteExisting is true
// update only systems without an existing alert when overwriteExisting is false
const allSystems = $systems.get()
const systemIds: string[] = []
for (const system of allSystems) {
if (overwriteExisting || !initialAlertsState[system.id]?.has(alertKey)) {
systemIds.push(system.id)
}
}
return systemIds
}
function sendUpsert(min: number, value: number) {
const systems = getSystemIds()
systems.length &&
upsertAlerts({
name: alertKey,
value,
min,
systems,
})
}
return (
<div className="rounded-lg border border-muted-foreground/15 hover:border-muted-foreground/20 transition-colors duration-100 group">
<label
htmlFor={`s${name}`}
className={cn("flex flex-row items-center justify-between gap-4 cursor-pointer p-4", {
"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" /> {alertData.name()}
</p>
{!checked && <span className="block text-sm text-muted-foreground">{alertData.desc()}</span>}
</div>
<Switch
id={`s${name}`}
checked={checked}
onCheckedChange={(newChecked) => {
setChecked(newChecked)
if (newChecked) {
// if alert checked, create or update alert
sendUpsert(min, value)
} else {
// if unchecked, delete alert (unless global and overwriteExisting is false)
deleteAlerts({ name: alertKey, systems: getSystemIds() })
// when force deleting all alerts of a type, also remove them from initialAlertsState
if (overwriteExisting) {
for (const curAlerts of Object.values(initialAlertsState)) {
curAlerts.delete(alertKey)
}
}
}
}}
/>
</label>
{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${name}`} className="text-sm block h-8">
<Trans>
Average exceeds{" "}
<strong className="text-foreground">
{value}
{alertData.unit}
</strong>
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${name}`}
defaultValue={[value]}
onValueCommit={(val) => sendUpsert(min, val[0])}
onValueChange={(val) => setValue(val[0])}
step={alertData.step ?? 1}
min={alertData.min ?? 1}
max={alertData.max ?? 99}
/>
</div>
</div>
)}
<div className={cn(singleDescription && "col-span-full lowercase")}>
<p id={`t${name}`} 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" />
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${name}`}
defaultValue={[min]}
onValueCommit={(minVal) => sendUpsert(minVal[0], value)}
onValueChange={(val) => setMin(val[0])}
min={1}
max={60}
/>
</div>
</div>
</Suspense>
</div>
)}
</div>
)
}

View File

@@ -1,311 +0,0 @@
import { t } from "@lingui/core/macro"
import { Trans, Plural } from "@lingui/react/macro"
import { $alerts, $systems, pb } from "@/lib/stores"
import { alertInfo, cn } from "@/lib/utils"
import { Switch } from "@/components/ui/switch"
import { AlertInfo, AlertRecord, SystemRecord } from "@/types"
import { lazy, Suspense, useMemo, useState } from "react"
import { toast } from "../ui/use-toast"
import { BatchService } from "pocketbase"
import { getSemaphore } from "@henrygd/semaphore"
interface AlertData {
checked?: boolean
val?: number
min?: number
updateAlert?: (checked: boolean, value: number, min: number) => void
name: keyof typeof alertInfo
alert: AlertInfo
system: SystemRecord
}
const Slider = lazy(() => import("@/components/ui/slider"))
const failedUpdateToast = () =>
toast({
title: t`Failed to update alert`,
description: t`Please check logs for more details.`,
variant: "destructive",
})
export function SystemAlert({
system,
systemAlerts,
data,
}: {
system: SystemRecord
systemAlerts: AlertRecord[]
data: AlertData
}) {
const alert = systemAlerts.find((alert) => alert.name === data.name)
data.updateAlert = async (checked: boolean, value: number, min: number) => {
try {
if (alert && !checked) {
await pb.collection("alerts").delete(alert.id)
} else if (alert && checked) {
await pb.collection("alerts").update(alert.id, { value, min, triggered: false })
} else if (checked) {
pb.collection("alerts").create({
system: system.id,
user: pb.authStore.record!.id,
name: data.name,
value: value,
min: min,
})
}
} catch (e) {
failedUpdateToast()
}
}
if (alert) {
data.checked = true
data.val = alert.value
data.min = alert.min || 1
}
return <AlertContent data={data} />
}
export const SystemAlertGlobal = ({ data, overwrite }: { data: AlertData; overwrite: boolean | "indeterminate" }) => {
data.checked = false
data.val = data.min = 0
// set of system ids that have an alert for this name when the component is mounted
const existingAlertsSystems = useMemo(() => {
const map = new Set<string>()
const alerts = $alerts.get()
for (const alert of alerts) {
if (alert.name === data.name) {
map.add(alert.system)
}
}
return map
}, [])
data.updateAlert = async (checked: boolean, value: number, min: number) => {
const sem = getSemaphore("alerts")
await sem.acquire()
try {
// if another update is waiting behind, don't start this one
if (sem.size() > 1) {
return
}
const recordData: Partial<AlertRecord> = {
value,
min,
triggered: false,
}
const batch = batchWrapper("alerts", 25)
const systems = $systems.get()
const currentAlerts = $alerts.get()
// map of current alerts with this name right now by system id
const currentAlertsSystems = new Map<string, AlertRecord>()
for (const alert of currentAlerts) {
if (alert.name === data.name) {
currentAlertsSystems.set(alert.system, alert)
}
}
if (overwrite) {
existingAlertsSystems.clear()
}
const processSystem = async (system: SystemRecord): Promise<void> => {
const existingAlert = existingAlertsSystems.has(system.id)
if (!overwrite && existingAlert) {
return
}
const currentAlert = currentAlertsSystems.get(system.id)
// delete existing alert if unchecked
if (!checked && currentAlert) {
return batch.remove(currentAlert.id)
}
if (checked && currentAlert) {
// update existing alert if checked
return batch.update(currentAlert.id, recordData)
}
if (checked) {
// create new alert if checked and not existing
return batch.create({
system: system.id,
user: pb.authStore.record!.id,
name: data.name,
...recordData,
})
}
}
// make sure current system is updated in the first batch
await processSystem(data.system)
for (const system of systems) {
if (system.id === data.system.id) {
continue
}
if (sem.size() > 1) {
return
}
await processSystem(system)
}
await batch.send()
} finally {
sem.release()
}
}
return <AlertContent data={data} />
}
/**
* Creates a wrapper for performing batch operations on a specified collection.
*/
function batchWrapper(collection: string, batchSize: number) {
let batch: BatchService | undefined
let count = 0
const create = async <T extends Record<string, any>>(options: T) => {
batch ||= pb.createBatch()
batch.collection(collection).create(options)
if (++count >= batchSize) {
await send()
}
}
const update = async <T extends Record<string, any>>(id: string, data: T) => {
batch ||= pb.createBatch()
batch.collection(collection).update(id, data)
if (++count >= batchSize) {
await send()
}
}
const remove = async (id: string) => {
batch ||= pb.createBatch()
batch.collection(collection).delete(id)
if (++count >= batchSize) {
await send()
}
}
const send = async () => {
if (count) {
await batch?.send({ requestKey: null })
batch = undefined
count = 0
}
}
return {
update,
remove,
send,
create,
}
}
function AlertContent({ data }: { data: AlertData }) {
const { name } = data
const singleDescription = data.alert.singleDesc?.()
const [checked, setChecked] = useState(data.checked || false)
const [min, setMin] = useState(data.min || 10)
const [value, setValue] = useState(data.val || (singleDescription ? 0 : data.alert.start ?? 80))
const Icon = alertInfo[name].icon
return (
<div className="rounded-lg border border-muted-foreground/15 hover:border-muted-foreground/20 transition-colors duration-100 group">
<label
htmlFor={`s${name}`}
className={cn("flex flex-row items-center justify-between gap-4 cursor-pointer p-4", {
"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>
{!checked && <span className="block text-sm text-muted-foreground">{data.alert.desc()}</span>}
</div>
<Switch
id={`s${name}`}
checked={checked}
onCheckedChange={(newChecked) => {
setChecked(newChecked)
data.updateAlert?.(newChecked, value, min)
}}
/>
</label>
{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${name}`} className="text-sm block h-8">
<Trans>
Average exceeds{" "}
<strong className="text-foreground">
{value}
{data.alert.unit}
</strong>
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${name}`}
defaultValue={[value]}
onValueCommit={(val) => {
data.updateAlert?.(true, val[0], min)
}}
onValueChange={(val) => {
setValue(val[0])
}}
step={data.alert.step ?? 1}
min={data.alert.min ?? 1}
max={alertInfo[name].max ?? 99}
/>
</div>
</div>
)}
<div className={cn(singleDescription && "col-span-full lowercase")}>
<p id={`t${name}`} 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" />
</Trans>
</p>
<div className="flex gap-3">
<Slider
aria-labelledby={`v${name}`}
defaultValue={[min]}
onValueCommit={(min) => {
data.updateAlert?.(true, value, min[0])
}}
onValueChange={(val) => {
setMin(val[0])
}}
min={1}
max={60}
/>
</div>
</div>
</Suspense>
</div>
)}
</div>
)
}

View File

@@ -29,41 +29,36 @@ export default memo(function ContainerChart({
const isNetChart = chartType === ChartType.Network
const chartConfig = useMemo(() => {
let config = {} as Record<
string,
{
label: string
color: string
}
>
const totalUsage = {} as Record<string, number>
for (let stats of containerData) {
for (let key in stats) {
if (!key || key === "created") {
continue
}
if (!(key in totalUsage)) {
totalUsage[key] = 0
}
if (isNetChart) {
totalUsage[key] += (stats[key]?.nr ?? 0) + (stats[key]?.ns ?? 0)
} else {
// @ts-ignore
totalUsage[key] += stats[key]?.[dataKey] ?? 0
}
const config = {} as Record<string, { label: string; color: string }>
const totalUsage = new Map<string, number>()
// calculate total usage of each container
for (const stats of containerData) {
for (const key in stats) {
if (!key || key === "created") continue
const currentTotal = totalUsage.get(key) ?? 0
const increment = isNetChart
? (stats[key]?.nr ?? 0) + (stats[key]?.ns ?? 0)
: // @ts-ignore
stats[key]?.[dataKey] ?? 0
totalUsage.set(key, currentTotal + increment)
}
}
let keys = Object.keys(totalUsage)
keys.sort((a, b) => (totalUsage[a] > totalUsage[b] ? -1 : 1))
const length = keys.length
for (let i = 0; i < length; i++) {
const key = keys[i]
// Sort keys and generate colors based on usage
const sortedEntries = Array.from(totalUsage.entries()).sort(([, a], [, b]) => b - a)
const length = sortedEntries.length
sortedEntries.forEach(([key], i) => {
const hue = ((i * 360) / length) % 360
config[key] = {
label: key,
color: `hsl(${hue}, 60%, 55%)`,
}
}
})
return config satisfies ChartConfig
}, [chartData])
@@ -124,6 +119,8 @@ export default memo(function ContainerChart({
return obj
}, [])
const filterLower = filter?.toLowerCase()
// console.log('rendered at', new Date())
if (containerData.length === 0) {
@@ -165,7 +162,7 @@ export default memo(function ContainerChart({
content={<ChartTooltipContent filter={filter} contentFormatter={toolTipFormatter} />}
/>
{Object.keys(chartConfig).map((key) => {
const filtered = filter && !key.toLowerCase().includes(filter.toLowerCase())
const filtered = filterLower && !key.toLowerCase().includes(filterLower)
let fillOpacity = filtered ? 0.05 : 0.4
let strokeOpacity = filtered ? 0.1 : 1
return (

View File

@@ -4,7 +4,7 @@ import { $alerts, $systems, pb } from "@/lib/stores"
import { useStore } from "@nanostores/react"
import { GithubIcon } from "lucide-react"
import { Separator } from "../ui/separator"
import { alertInfo, updateRecordList, updateSystemList } from "@/lib/utils"
import { alertInfo, getSystemNameFromId, updateRecordList, updateSystemList } from "@/lib/utils"
import { AlertRecord, SystemRecord } from "@/types"
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"
import { $router, Link } from "../router"
@@ -14,24 +14,8 @@ import { getPagePath } from "@nanostores/router"
const SystemsTable = lazy(() => import("../systems-table/systems-table"))
export const Home = memo(() => {
const alerts = useStore($alerts)
const systems = useStore($systems)
const { t } = useLingui()
let alertsKey = ""
const activeAlerts = useMemo(() => {
const activeAlerts = alerts.filter((alert) => {
const active = alert.triggered && alert.name in alertInfo
if (!active) {
return false
}
alert.sysname = systems.find((system) => system.id === alert.system)?.name
alertsKey += alert.id
return true
})
return activeAlerts
}, [systems, alerts])
useEffect(() => {
document.title = t`Dashboard` + " / Beszel"
}, [t])
@@ -44,20 +28,15 @@ export const Home = memo(() => {
pb.collection<SystemRecord>("systems").subscribe("*", (e) => {
updateRecordList(e, $systems)
})
pb.collection<AlertRecord>("alerts").subscribe("*", (e) => {
updateRecordList(e, $alerts)
})
return () => {
pb.collection("systems").unsubscribe("*")
// pb.collection('alerts').unsubscribe('*')
}
}, [])
return useMemo(
() => (
<>
{/* show active alerts */}
{activeAlerts.length > 0 && <ActiveAlerts key={activeAlerts.length} activeAlerts={activeAlerts} />}
<ActiveAlerts />
<Suspense>
<SystemsTable />
</Suspense>
@@ -81,55 +60,79 @@ export const Home = memo(() => {
</div>
</>
),
[alertsKey]
[]
)
})
const ActiveAlerts = memo(({ activeAlerts }: { activeAlerts: AlertRecord[] }) => {
return (
<Card className="mb-4">
<CardHeader className="pb-4 px-2 sm:px-6 max-sm:pt-5 max-sm:pb-1">
<div className="px-2 sm:px-1">
<CardTitle>
<Trans>Active Alerts</Trans>
</CardTitle>
</div>
</CardHeader>
<CardContent className="max-sm:p-2">
{activeAlerts.length > 0 && (
<div className="grid sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-3">
{activeAlerts.map((alert) => {
const info = alertInfo[alert.name as keyof typeof alertInfo]
return (
<Alert
key={alert.id}
className="hover:-translate-y-[1px] duration-200 bg-transparent border-foreground/10 hover:shadow-md shadow-black"
>
<info.icon className="h-4 w-4" />
<AlertTitle>
{alert.sysname} {info.name().toLowerCase().replace("cpu", "CPU")}
</AlertTitle>
<AlertDescription>
{alert.name === "Status" ? (
<Trans>Connection is down</Trans>
) : (
<Trans>
Exceeds {alert.value}
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
</Trans>
)}
</AlertDescription>
<Link
href={getPagePath($router, "system", { name: alert.sysname! })}
className="absolute inset-0 w-full h-full"
aria-label="View system"
></Link>
</Alert>
)
})}
const ActiveAlerts = () => {
const alerts = useStore($alerts)
const { activeAlerts, alertsKey } = useMemo(() => {
const activeAlerts: AlertRecord[] = []
// key to prevent re-rendering if alerts change but active alerts didn't
const alertsKey: string[] = []
for (const systemId of Object.keys(alerts)) {
for (const alert of alerts[systemId].values()) {
if (alert.triggered && alert.name in alertInfo) {
activeAlerts.push(alert)
alertsKey.push(`${alert.system}${alert.value}${alert.min}`)
}
}
}
return { activeAlerts, alertsKey }
}, [alerts])
return useMemo(() => {
if (activeAlerts.length === 0) {
return null
}
return (
<Card className="mb-4">
<CardHeader className="pb-4 px-2 sm:px-6 max-sm:pt-5 max-sm:pb-1">
<div className="px-2 sm:px-1">
<CardTitle>
<Trans>Active Alerts</Trans>
</CardTitle>
</div>
)}
</CardContent>
</Card>
)
})
</CardHeader>
<CardContent className="max-sm:p-2">
{activeAlerts.length > 0 && (
<div className="grid sm:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-3">
{activeAlerts.map((alert) => {
const info = alertInfo[alert.name as keyof typeof alertInfo]
return (
<Alert
key={alert.id}
className="hover:-translate-y-[1px] duration-200 bg-transparent border-foreground/10 hover:shadow-md shadow-black"
>
<info.icon className="h-4 w-4" />
<AlertTitle>
{getSystemNameFromId(alert.system)} {info.name().toLowerCase().replace("cpu", "CPU")}
</AlertTitle>
<AlertDescription>
{alert.name === "Status" ? (
<Trans>Connection is down</Trans>
) : (
<Trans>
Exceeds {alert.value}
{info.unit} in last <Plural value={alert.min} one="# minute" other="# minutes" />
</Trans>
)}
</AlertDescription>
<Link
href={getPagePath($router, "system", { name: getSystemNameFromId(alert.system) })}
className="absolute inset-0 w-full h-full"
aria-label="View system"
></Link>
</Alert>
)
})}
</div>
)}
</CardContent>
</Card>
)
}, [alertsKey.join("")])
}

View File

@@ -11,6 +11,7 @@ import { useState } from "react"
import languages from "@/lib/languages"
import { dynamicActivate } from "@/lib/i18n"
import { useLingui } from "@lingui/react/macro"
import { Input } from "@/components/ui/input"
import { Unit } from "@/lib/enums"
export default function SettingsProfilePage({ userSettings }: { userSettings: UserSettings }) {
@@ -133,7 +134,6 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label className="block" htmlFor="unitNet">
<Trans comment="Context: Bytes or bits">Network unit</Trans>
@@ -156,7 +156,6 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label className="block" htmlFor="unitDisk">
<Trans>Disk unit</Trans>
@@ -182,6 +181,47 @@ export default function SettingsProfilePage({ userSettings }: { userSettings: Us
</div>
</div>
<Separator />
<div className="space-y-2">
<div className="mb-4">
<h3 className="mb-1 text-lg font-medium">
<Trans>Warning thresholds</Trans>
</h3>
<p className="text-sm text-muted-foreground leading-relaxed">
<Trans>Set percentage thresholds for meter colors.</Trans>
</p>
</div>
<div className="grid grid-cols-2 lg:grid-cols-3 gap-4 items-end">
<div className="space-y-1">
<Label htmlFor="colorWarn">
<Trans>Warning (%)</Trans>
</Label>
<Input
id="colorWarn"
name="colorWarn"
type="number"
min={1}
max={100}
className="min-w-24"
defaultValue={userSettings.colorWarn ?? 65}
/>
</div>
<div className="space-y-1">
<Label htmlFor="colorCrit">
<Trans>Critical (%)</Trans>
</Label>
<Input
id="colorCrit"
name="colorCrit"
type="number"
min={1}
max={100}
className="min-w-24"
defaultValue={userSettings.colorCrit ?? 90}
/>
</div>
</div>
</div>
<Separator />
<Button type="submit" className="flex items-center gap-1.5 disabled:opacity-100" disabled={isLoading}>
{isLoading ? <LoaderCircleIcon className="h-4 w-4 animate-spin" /> : <SaveIcon className="h-4 w-4" />}
<Trans>Save Settings</Trans>

View File

@@ -10,7 +10,7 @@ import { getPagePath, redirectPage } from "@nanostores/router"
import { BellIcon, FileSlidersIcon, FingerprintIcon, SettingsIcon, AlertOctagonIcon } from "lucide-react"
import { $userSettings, pb } from "@/lib/stores.ts"
import { toast } from "@/components/ui/use-toast.ts"
import { UserSettings } from "@/types.js"
import { UserSettings } from "@/types"
import General from "./general.tsx"
import Notifications from "./notifications.tsx"
import ConfigYaml from "./config-yaml.tsx"

View File

@@ -178,7 +178,7 @@ const ShoutrrrUrlCard = ({ url, onUrlChange, onRemove }: ShoutrrrUrlCardProps) =
const sendTestNotification = async () => {
setIsLoading(true)
const res = await pb.send("/api/beszel/send-test-notification", { url })
const res = await pb.send("/api/beszel/test-notification", { method: "POST", body: { url } })
if ("err" in res && !res.err) {
toast({
title: t`Test notification sent`,

View File

@@ -56,8 +56,8 @@ export function SidebarNav({ className, items, ...props }: SidebarNavProps) {
href={item.href}
className={cn(
buttonVariants({ variant: "ghost" }),
"flex items-center gap-3 justify-start truncate",
page?.path === item.href ? "bg-muted hover:bg-muted" : "hover:bg-muted/50"
"flex items-center gap-3 justify-start truncate duration-50",
page?.path === item.href ? "bg-muted hover:bg-accent/70" : "hover:bg-accent/50"
)}
>
{item.icon && <item.icon className="size-4 shrink-0" />}

View File

@@ -456,9 +456,9 @@ export default function SystemDetail({ name }: { name: string }) {
onClick={() => setGrid(!grid)}
>
{grid ? (
<LayoutGridIcon className="h-[1.2rem] w-[1.2rem] opacity-85" />
<LayoutGridIcon className="h-[1.2rem] w-[1.2rem] opacity-75" />
) : (
<Rows className="h-[1.3rem] w-[1.3rem] opacity-85" />
<Rows className="h-[1.3rem] w-[1.3rem] opacity-75" />
)}
</Button>
</TooltipTrigger>

View File

@@ -0,0 +1,440 @@
import { SystemRecord } from "@/types"
import { CellContext, ColumnDef, HeaderContext } from "@tanstack/react-table"
import { ClassValue } from "clsx"
import {
ArrowUpDownIcon,
CopyIcon,
CpuIcon,
HardDriveIcon,
MemoryStickIcon,
MoreHorizontalIcon,
PauseCircleIcon,
PenBoxIcon,
PlayCircleIcon,
ServerIcon,
Trash2Icon,
WifiIcon,
} from "lucide-react"
import { Button } from "../ui/button"
import {
cn,
copyToClipboard,
decimalString,
formatBytes,
formatTemperature,
getMeterState,
isReadOnlyUser,
parseSemVer,
} from "@/lib/utils"
import { EthernetIcon, GpuIcon, HourglassIcon, ThermometerIcon } from "../ui/icons"
import { useStore } from "@nanostores/react"
import { $userSettings, pb } from "@/lib/stores"
import { Trans, useLingui } from "@lingui/react/macro"
import { useMemo, useRef, useState } from "react"
import { memo } from "react"
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "../ui/dropdown-menu"
import AlertButton from "../alerts/alert-button"
import { Dialog } from "../ui/dialog"
import { SystemDialog } from "../add-system"
import { AlertDialog } from "../ui/alert-dialog"
import {
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from "../ui/alert-dialog"
import { buttonVariants } from "../ui/button"
import { t } from "@lingui/core/macro"
import { MeterState } from "@/lib/enums"
const STATUS_COLORS = {
up: "bg-green-500",
down: "bg-red-500",
paused: "bg-primary/40",
pending: "bg-yellow-500",
} as const
/**
* @param viewMode - "table" or "grid"
* @returns - Column definitions for the systems table
*/
export default function SystemsTableColumns(viewMode: "table" | "grid"): ColumnDef<SystemRecord>[] {
return [
{
size: 200,
minSize: 0,
accessorKey: "name",
id: "system",
name: () => t`System`,
filterFn: (() => {
let filterInput = ""
let filterInputLower = ""
const nameCache = new Map<string, string>()
const statusTranslations = {
up: t`Up`.toLowerCase(),
down: t`Down`.toLowerCase(),
paused: t`Paused`.toLowerCase(),
} as const
// match filter value against name or translated status
return (row, _, newFilterInput) => {
const { name, status } = row.original
if (newFilterInput !== filterInput) {
filterInput = newFilterInput
filterInputLower = newFilterInput.toLowerCase()
}
let nameLower = nameCache.get(name)
if (nameLower === undefined) {
nameLower = name.toLowerCase()
nameCache.set(name, nameLower)
}
if (nameLower.includes(filterInputLower)) {
return true
}
const statusLower = statusTranslations[status as keyof typeof statusTranslations]
return statusLower?.includes(filterInputLower) || false
}
})(),
enableHiding: false,
invertSorting: false,
Icon: ServerIcon,
cell: (info) => (
<span className="flex gap-2 items-center font-medium text-sm text-nowrap md:ps-1 md:pe-5">
<IndicatorDot system={info.row.original} />
{info.getValue() as string}
</span>
),
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.cpu,
id: "cpu",
name: () => t`CPU`,
cell: TableCellWithMeter,
Icon: CpuIcon,
header: sortableHeader,
},
{
// accessorKey: "info.mp",
accessorFn: ({ info }) => info.mp,
id: "memory",
name: () => t`Memory`,
cell: TableCellWithMeter,
Icon: MemoryStickIcon,
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.dp,
id: "disk",
name: () => t`Disk`,
cell: TableCellWithMeter,
Icon: HardDriveIcon,
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.g,
id: "gpu",
name: () => "GPU",
cell: TableCellWithMeter,
Icon: GpuIcon,
header: sortableHeader,
},
{
id: "loadAverage",
accessorFn: ({ info }) => {
const sum = info.la?.reduce((acc, curr) => acc + curr, 0)
// TODO: remove this in future release in favor of la array
if (!sum) {
return (info.l1 ?? 0) + (info.l5 ?? 0) + (info.l15 ?? 0)
}
return sum
},
name: () => t({ message: "Load Avg", comment: "Short label for load average" }),
size: 0,
Icon: HourglassIcon,
header: sortableHeader,
cell(info: CellContext<SystemRecord, unknown>) {
const { info: sysInfo, status } = info.row.original
// agent version
const { minor, patch } = parseSemVer(sysInfo.v)
let loadAverages = sysInfo.la
// use legacy load averages if agent version is less than 12.1.0
if (!loadAverages || (minor === 12 && patch < 1)) {
loadAverages = [sysInfo.l1 ?? 0, sysInfo.l5 ?? 0, sysInfo.l15 ?? 0]
}
const max = Math.max(...loadAverages)
if (max === 0 && (status === "paused" || minor < 12)) {
return null
}
const normalizedLoad = max / (sysInfo.t ?? 1)
const threshold = getMeterState(normalizedLoad * 100)
return (
<div className="flex items-center gap-[.35em] w-full tabular-nums tracking-tight">
<span
className={cn("inline-block size-2 rounded-full me-0.5", {
[STATUS_COLORS.up]: threshold === MeterState.Good,
[STATUS_COLORS.pending]: threshold === MeterState.Warn,
[STATUS_COLORS.down]: threshold === MeterState.Crit,
[STATUS_COLORS.paused]: status !== "up",
})}
/>
{loadAverages?.map((la, i) => (
<span key={i}>{decimalString(la, la >= 10 ? 1 : 2)}</span>
))}
</div>
)
},
},
{
accessorFn: ({ info }) => info.bb || (info.b || 0) * 1024 * 1024,
id: "net",
name: () => t`Net`,
size: 0,
Icon: EthernetIcon,
header: sortableHeader,
cell(info) {
const sys = info.row.original
const userSettings = useStore($userSettings, { keys: ["unitNet"] })
if (sys.status === "paused") {
return null
}
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, false)
return (
<span className="tabular-nums whitespace-nowrap">
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
</span>
)
},
},
{
accessorFn: ({ info }) => info.dt,
id: "temp",
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
size: 50,
hideSort: true,
Icon: ThermometerIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
const userSettings = useStore($userSettings, { keys: ["unitTemp"] })
if (!val) {
return null
}
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
return (
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-0.5")}>
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
</span>
)
},
},
{
accessorFn: ({ info }) => info.v,
id: "agent",
name: () => t`Agent`,
// invertSorting: true,
size: 50,
Icon: WifiIcon,
hideSort: true,
header: sortableHeader,
cell(info) {
const version = info.getValue() as string
if (!version) {
return null
}
const system = info.row.original
return (
<span className={cn("flex gap-2 items-center md:pe-5 tabular-nums", viewMode === "table" && "ps-0.5")}>
<IndicatorDot
system={system}
className={
(system.status !== "up" && STATUS_COLORS.paused) ||
(version === globalThis.BESZEL.HUB_VERSION && STATUS_COLORS.up) ||
STATUS_COLORS.pending
}
/>
<span className="truncate max-w-14">{info.getValue() as string}</span>
</span>
)
},
},
{
id: "actions",
// @ts-ignore
name: () => t({ message: "Actions", comment: "Table column" }),
size: 50,
cell: ({ row }) => (
<div className="flex justify-end items-center gap-1 -ms-3">
<AlertButton system={row.original} />
<ActionsButton system={row.original} />
</div>
),
},
] as ColumnDef<SystemRecord>[]
}
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
const { column } = context
// @ts-ignore
const { Icon, hideSort, name }: { Icon: React.ElementType; name: () => string; hideSort: boolean } = column.columnDef
return (
<Button
variant="ghost"
className="h-9 px-3 flex"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
{Icon && <Icon className="me-2 size-4" />}
{name()}
{hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
</Button>
)
}
function TableCellWithMeter(info: CellContext<SystemRecord, unknown>) {
const val = Number(info.getValue()) || 0
const threshold = getMeterState(val)
return (
<div className="flex gap-2 items-center tabular-nums tracking-tight">
<span className="min-w-8">{decimalString(val, val >= 10 ? 1 : 2)}%</span>
<span className="grow min-w-8 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
<span
className={cn(
"absolute inset-0 w-full h-full origin-left",
(info.row.original.status !== "up" && STATUS_COLORS.paused) ||
(threshold === MeterState.Good && STATUS_COLORS.up) ||
(threshold === MeterState.Warn && STATUS_COLORS.pending) ||
STATUS_COLORS.down
)}
style={{
transform: `scalex(${val / 100})`,
}}
></span>
</span>
</div>
)
}
export function IndicatorDot({ system, className }: { system: SystemRecord; className?: ClassValue }) {
className ||= STATUS_COLORS[system.status as keyof typeof STATUS_COLORS] || ""
return (
<span
className={cn("flex-shrink-0 size-2 rounded-full", className)}
// style={{ marginBottom: "-1px" }}
/>
)
}
export const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
const [deleteOpen, setDeleteOpen] = useState(false)
const [editOpen, setEditOpen] = useState(false)
let editOpened = useRef(false)
const { t } = useLingui()
const { id, status, host, name } = system
return useMemo(() => {
return (
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
<span className="sr-only">
<Trans>Open menu</Trans>
</span>
<MoreHorizontalIcon className="w-5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{!isReadOnlyUser() && (
<DropdownMenuItem
onSelect={() => {
editOpened.current = true
setEditOpen(true)
}}
>
<PenBoxIcon className="me-2.5 size-4" />
<Trans>Edit</Trans>
</DropdownMenuItem>
)}
<DropdownMenuItem
className={cn(isReadOnlyUser() && "hidden")}
onClick={() => {
pb.collection("systems").update(id, {
status: status === "paused" ? "pending" : "paused",
})
}}
>
{status === "paused" ? (
<>
<PlayCircleIcon className="me-2.5 size-4" />
<Trans>Resume</Trans>
</>
) : (
<>
<PauseCircleIcon className="me-2.5 size-4" />
<Trans>Pause</Trans>
</>
)}
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(name)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy name</Trans>
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
{/* edit dialog */}
<Dialog open={editOpen} onOpenChange={setEditOpen}>
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
</Dialog>
{/* deletion dialog */}
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure you want to delete {name}?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>
This action cannot be undone. This will permanently delete all current records for {name} from the
database.
</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={() => pb.collection("systems").delete(id)}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</>
)
}, [id, status, host, name, t, deleteOpen, editOpen])
})

View File

@@ -1,5 +1,4 @@
import {
CellContext,
ColumnDef,
ColumnFiltersState,
getFilteredRowModel,
@@ -9,14 +8,13 @@ import {
VisibilityState,
getCoreRowModel,
useReactTable,
HeaderContext,
Row,
Table as TableType,
} from "@tanstack/react-table"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Button, buttonVariants } from "@/components/ui/button"
import { Button } from "@/components/ui/button"
import {
DropdownMenu,
@@ -29,105 +27,30 @@ import {
DropdownMenuSeparator,
DropdownMenuTrigger,
} from "@/components/ui/dropdown-menu"
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from "@/components/ui/alert-dialog"
import { SystemRecord } from "@/types"
import {
MoreHorizontalIcon,
ArrowUpDownIcon,
MemoryStickIcon,
CopyIcon,
PauseCircleIcon,
PlayCircleIcon,
Trash2Icon,
WifiIcon,
HardDriveIcon,
ServerIcon,
CpuIcon,
LayoutGridIcon,
LayoutListIcon,
ArrowDownIcon,
ArrowUpIcon,
Settings2Icon,
EyeIcon,
PenBoxIcon,
} from "lucide-react"
import { memo, useEffect, useMemo, useRef, useState } from "react"
import { $systems, $userSettings, pb } from "@/lib/stores"
import { memo, useEffect, useMemo, useState } from "react"
import { $systems } from "@/lib/stores"
import { useStore } from "@nanostores/react"
import {
cn,
copyToClipboard,
isReadOnlyUser,
useLocalStorage,
formatTemperature,
decimalString,
formatBytes,
parseSemVer,
} from "@/lib/utils"
import AlertsButton from "../alerts/alert-button"
import { cn, useLocalStorage } from "@/lib/utils"
import { $router, Link, navigate } from "../router"
import { EthernetIcon, GpuIcon, HourglassIcon, ThermometerIcon } from "../ui/icons"
import { useLingui, Trans } from "@lingui/react/macro"
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"
import SystemsTableColumns, { ActionsButton, IndicatorDot } from "./systems-table-columns"
import AlertButton from "../alerts/alert-button"
type ViewMode = "table" | "grid"
function CellFormatter(info: CellContext<SystemRecord, unknown>) {
const val = Number(info.getValue()) || 0
return (
<div className="flex gap-2 items-center tabular-nums tracking-tight">
<span className="min-w-8">{decimalString(val, val >= 10 ? 1 : 2)}%</span>
<span className="grow min-w-8 block bg-muted h-[1em] relative rounded-sm overflow-hidden">
<span
className={cn(
"absolute inset-0 w-full h-full origin-left",
(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})`,
}}
></span>
</span>
</div>
)
}
function sortableHeader(context: HeaderContext<SystemRecord, unknown>) {
const { column } = context
// @ts-ignore
const { Icon, hideSort, name }: { Icon: React.ElementType; name: () => string; hideSort: boolean } = column.columnDef
return (
<Button
variant="ghost"
className="h-9 px-3 flex"
onClick={() => column.toggleSorting(column.getIsSorted() === "asc")}
>
{Icon && <Icon className="me-2 size-4" />}
{name()}
{hideSort || <ArrowUpDownIcon className="ms-2 size-4" />}
</Button>
)
}
export default function SystemsTable() {
const data = useStore($systems)
const { i18n, t } = useLingui()
@@ -145,212 +68,7 @@ export default function SystemsTable() {
}
}, [filter])
const columnDefs = useMemo(() => {
const statusTranslations = {
up: () => t`Up`.toLowerCase(),
down: () => t`Down`.toLowerCase(),
paused: () => t`Paused`.toLowerCase(),
}
return [
{
size: 200,
minSize: 0,
accessorKey: "name",
id: "system",
name: () => t`System`,
filterFn: (row, _, filterVal) => {
const filterLower = filterVal.toLowerCase()
const { name, status } = row.original
// Check if the filter matches the name or status for this row
if (
name.toLowerCase().includes(filterLower) ||
statusTranslations[status as keyof typeof statusTranslations]?.().includes(filterLower)
) {
return true
}
return false
},
enableHiding: false,
invertSorting: false,
Icon: ServerIcon,
cell: (info) => (
<span className="flex gap-2 items-center md:ps-1 md:pe-5">
<IndicatorDot system={info.row.original} />
<span className="font-medium text-sm">
{info.getValue() as string}
</span>
</span>
),
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.cpu,
id: "cpu",
name: () => t`CPU`,
cell: CellFormatter,
Icon: CpuIcon,
header: sortableHeader,
},
{
// accessorKey: "info.mp",
accessorFn: ({ info }) => info.mp,
id: "memory",
name: () => t`Memory`,
cell: CellFormatter,
Icon: MemoryStickIcon,
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.dp,
id: "disk",
name: () => t`Disk`,
cell: CellFormatter,
Icon: HardDriveIcon,
header: sortableHeader,
},
{
accessorFn: ({ info }) => info.g,
id: "gpu",
name: () => "GPU",
cell: CellFormatter,
Icon: GpuIcon,
header: sortableHeader,
},
{
id: "loadAverage",
accessorFn: ({ info }) => {
const sum = info.la?.reduce((acc, curr) => acc + curr, 0)
// TODO: remove this in future release in favor of la array
if (!sum) {
return (info.l1 ?? 0) + (info.l5 ?? 0) + (info.l15 ?? 0)
}
return sum
},
name: () => t({ message: "Load Avg", comment: "Short label for load average" }),
size: 0,
Icon: HourglassIcon,
header: sortableHeader,
cell(info: CellContext<SystemRecord, unknown>) {
const { info: sysInfo, status } = info.row.original
// agent version
const { minor, patch } = parseSemVer(sysInfo.v)
let loadAverages = sysInfo.la
// use legacy load averages if agent version is less than 12.1.0
if (!loadAverages || (minor === 12 && patch < 1)) {
loadAverages = [sysInfo.l1 ?? 0, sysInfo.l5 ?? 0, sysInfo.l15 ?? 0]
}
const max = Math.max(...loadAverages)
if (max === 0 && (status === "paused" || minor < 12)) {
return null
}
function getDotColor() {
const normalized = max / (sysInfo.t ?? 1)
if (status !== "up") return "bg-primary/30"
if (normalized < 0.7) return "bg-green-500"
if (normalized < 1) return "bg-yellow-500"
return "bg-red-600"
}
return (
<div className="flex items-center gap-[.35em] w-full tabular-nums tracking-tight">
<span className={cn("inline-block size-2 rounded-full me-0.5", getDotColor())} />
{loadAverages?.map((la, i) => (
<span key={i}>{decimalString(la, la >= 10 ? 1 : 2)}</span>
))}
</div>
)
},
},
{
accessorFn: ({ info }) => info.bb || (info.b || 0) * 1024 * 1024,
id: "net",
name: () => t`Net`,
size: 0,
Icon: EthernetIcon,
header: sortableHeader,
cell(info) {
const sys = info.row.original
if (sys.status === "paused") {
return null
}
const userSettings = useStore($userSettings)
const { value, unit } = formatBytes(info.getValue() as number, true, userSettings.unitNet, false)
return (
<span className="tabular-nums whitespace-nowrap">
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
</span>
)
},
},
{
accessorFn: ({ info }) => info.dt,
id: "temp",
name: () => t({ message: "Temp", comment: "Temperature label in systems table" }),
size: 50,
hideSort: true,
Icon: ThermometerIcon,
header: sortableHeader,
cell(info) {
const val = info.getValue() as number
if (!val) {
return null
}
const userSettings = useStore($userSettings)
const { value, unit } = formatTemperature(val, userSettings.unitTemp)
return (
<span className={cn("tabular-nums whitespace-nowrap", viewMode === "table" && "ps-0.5")}>
{decimalString(value, value >= 100 ? 1 : 2)} {unit}
</span>
)
},
},
{
accessorFn: ({ info }) => info.v,
id: "agent",
name: () => t`Agent`,
// invertSorting: true,
size: 50,
Icon: WifiIcon,
hideSort: true,
header: sortableHeader,
cell(info) {
const version = info.getValue() as string
if (!version) {
return null
}
const system = info.row.original
return (
<span className={cn("flex gap-2 items-center md:pe-5 tabular-nums", viewMode === "table" && "ps-0.5")}>
<IndicatorDot
system={system}
className={
(system.status !== "up" && "bg-primary/30") ||
(version === globalThis.BESZEL.HUB_VERSION && "bg-green-500") ||
"bg-yellow-500"
}
/>
<span className="truncate max-w-14">{info.getValue() as string}</span>
</span>
)
},
},
{
id: "actions",
// @ts-ignore
name: () => t({ message: "Actions", comment: "Table column" }),
size: 50,
cell: ({ row }) => (
<div className="flex justify-end items-center gap-1 -ms-3">
<AlertsButton system={row.original} />
<ActionsButton system={row.original} />
</div>
),
},
] as ColumnDef<SystemRecord>[]
}, [])
const columnDefs = useMemo(() => SystemsTableColumns(viewMode), [viewMode])
const table = useReactTable({
data,
@@ -628,7 +346,7 @@ const SystemCard = memo(
</CardTitle>
{table.getColumn("actions")?.getIsVisible() && (
<div className="flex gap-1 flex-shrink-0 relative z-10">
<AlertsButton system={system} />
<AlertButton system={system} />
<ActionsButton system={system} />
</div>
)}
@@ -663,120 +381,3 @@ const SystemCard = memo(
}, [system, colLength, t])
}
)
const ActionsButton = memo(({ system }: { system: SystemRecord }) => {
const [deleteOpen, setDeleteOpen] = useState(false)
const [editOpen, setEditOpen] = useState(false)
let editOpened = useRef(false)
const { t } = useLingui()
const { id, status, host, name } = system
return useMemo(() => {
return (
<>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="ghost" size={"icon"} data-nolink>
<span className="sr-only">
<Trans>Open menu</Trans>
</span>
<MoreHorizontalIcon className="w-5" />
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
{!isReadOnlyUser() && (
<DropdownMenuItem
onSelect={() => {
editOpened.current = true
setEditOpen(true)
}}
>
<PenBoxIcon className="me-2.5 size-4" />
<Trans>Edit</Trans>
</DropdownMenuItem>
)}
<DropdownMenuItem
className={cn(isReadOnlyUser() && "hidden")}
onClick={() => {
pb.collection("systems").update(id, {
status: status === "paused" ? "pending" : "paused",
})
}}
>
{status === "paused" ? (
<>
<PlayCircleIcon className="me-2.5 size-4" />
<Trans>Resume</Trans>
</>
) : (
<>
<PauseCircleIcon className="me-2.5 size-4" />
<Trans>Pause</Trans>
</>
)}
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(name)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy name</Trans>
</DropdownMenuItem>
<DropdownMenuItem onClick={() => copyToClipboard(host)}>
<CopyIcon className="me-2.5 size-4" />
<Trans>Copy host</Trans>
</DropdownMenuItem>
<DropdownMenuSeparator className={cn(isReadOnlyUser() && "hidden")} />
<DropdownMenuItem className={cn(isReadOnlyUser() && "hidden")} onSelect={() => setDeleteOpen(true)}>
<Trash2Icon className="me-2.5 size-4" />
<Trans>Delete</Trans>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
{/* edit dialog */}
<Dialog open={editOpen} onOpenChange={setEditOpen}>
{editOpened.current && <SystemDialog system={system} setOpen={setEditOpen} />}
</Dialog>
{/* deletion dialog */}
<AlertDialog open={deleteOpen} onOpenChange={(open) => setDeleteOpen(open)}>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>
<Trans>Are you sure you want to delete {name}?</Trans>
</AlertDialogTitle>
<AlertDialogDescription>
<Trans>
This action cannot be undone. This will permanently delete all current records for {name} from the
database.
</Trans>
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>
<Trans>Cancel</Trans>
</AlertDialogCancel>
<AlertDialogAction
className={cn(buttonVariants({ variant: "destructive" }))}
onClick={() => pb.collection("systems").delete(id)}
>
<Trans>Continue</Trans>
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</>
)
}, [id, status, host, name, t, deleteOpen, editOpen])
})
function IndicatorDot({ system, className }: { system: SystemRecord; className?: ClassValue }) {
className ||= {
"bg-green-500": system.status === "up",
"bg-red-500": system.status === "down",
"bg-primary/40": system.status === "paused",
"bg-yellow-500": system.status === "pending",
}
return (
<span
className={cn("flex-shrink-0 size-2 rounded-full", className)}
// style={{ marginBottom: "-1px" }}
/>
)
}

View File

@@ -13,7 +13,7 @@ const buttonVariants = cva(
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border bg-background hover:bg-accent/70 dark:hover:bg-accent/50 hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
ghost: "hover:bg-accent/70 hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {

View File

@@ -13,7 +13,7 @@ const Checkbox = React.forwardRef<
<CheckboxPrimitive.Root
ref={ref}
className={cn(
"peer size-4 flex items-center justify-center shrink-0 rounded-[.3em] border border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-primary data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
"peer size-4 flex items-center justify-center shrink-0 rounded-[.3em] border border-input ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground",
className
)}

View File

@@ -105,7 +105,7 @@ const CommandItem = React.forwardRef<
<CommandPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default opacity-70 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent aria-selected:opacity-90 data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50",
"relative flex cursor-default opacity-70 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none aria-selected:bg-accent/70 aria-selected:opacity-90 data-[disabled='true']:pointer-events-none data-[disabled='true']:opacity-50",
className
)}
{...props}

View File

@@ -25,7 +25,7 @@ const DropdownMenuSubTrigger = React.forwardRef<
<DropdownMenuPrimitive.SubTrigger
ref={ref}
className={cn(
"flex cursor-default select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent",
"flex cursor-default select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-none focus:bg-accent/70 data-[state=open]:bg-accent/70",
inset && "ps-8",
className
)}
@@ -79,7 +79,7 @@ const DropdownMenuItem = React.forwardRef<
<DropdownMenuPrimitive.Item
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm px-2.5 py-1.5 text-sm outline-none focus:bg-accent/70 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
inset && "ps-8",
className
)}
@@ -95,7 +95,7 @@ const DropdownMenuCheckboxItem = React.forwardRef<
<DropdownMenuPrimitive.CheckboxItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none focus:bg-accent/70 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className
)}
checked={checked}
@@ -118,7 +118,7 @@ const DropdownMenuRadioItem = React.forwardRef<
<DropdownMenuPrimitive.RadioItem
ref={ref}
className={cn(
"relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none focus:bg-accent/70 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className
)}
{...props}

View File

@@ -105,7 +105,7 @@ const SelectItem = React.forwardRef<
<SelectPrimitive.Item
ref={ref}
className={cn(
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 ps-8 pe-2 text-sm outline-none focus:bg-accent/70 focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
className
)}
{...props}

View File

@@ -4,7 +4,7 @@
@layer base {
:root {
--background: 30 8% 98.5%;
--background: 30 8% 98%;
--foreground: 30 0% 0%;
--card: 30 0% 100%;
--card-foreground: 240 6.67% 2.94%;

View File

@@ -21,3 +21,10 @@ export enum Unit {
Celsius,
Fahrenheit,
}
/** Meter state for color */
export enum MeterState {
Good,
Warn,
Crit,
}

View File

@@ -1,7 +1,8 @@
import PocketBase from "pocketbase"
import { atom, map, PreinitializedWritableAtom } from "nanostores"
import { AlertRecord, ChartTimes, SystemRecord, UserSettings } from "@/types"
import { atom, map } from "nanostores"
import { AlertMap, ChartTimes, SystemRecord, UserSettings } from "@/types"
import { basePath } from "@/components/router"
import { Unit } from "./enums"
/** PocketBase JS Client */
export const pb = new PocketBase(basePath)
@@ -10,33 +11,40 @@ export const pb = new PocketBase(basePath)
export const $authenticated = atom(pb.authStore.isValid)
/** List of system records */
export const $systems = atom([] as SystemRecord[])
export const $systems = atom<SystemRecord[]>([])
/** List of alert records */
export const $alerts = atom([] as AlertRecord[])
/** Map of alert records by system id and alert name */
export const $alerts = map<AlertMap>({})
/** SSH public key */
export const $publicKey = atom("")
/** Chart time period */
export const $chartTime = atom("1h") as PreinitializedWritableAtom<ChartTimes>
export const $chartTime = atom<ChartTimes>("1h")
/** Whether to display average or max chart values */
export const $maxValues = atom(false)
// export const UserSettingsSchema = v.object({
// chartTime: v.picklist(["1h", "12h", "24h", "1w", "30d"]),
// emails: v.optional(v.array(v.pipe(v.string(), v.email())), [pb?.authStore?.record?.email ?? ""]),
// webhooks: v.optional(v.array(v.string())),
// colorWarn: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))),
// colorDanger: v.optional(v.pipe(v.number(), v.minValue(1), v.maxValue(100))),
// unitTemp: v.optional(v.enum(Unit)),
// unitNet: v.optional(v.enum(Unit)),
// unitDisk: v.optional(v.enum(Unit)),
// })
/** User settings */
export const $userSettings = map<UserSettings>({
chartTime: "1h",
emails: [pb.authStore.record?.email || ""],
// unitTemp: "celsius",
// unitNet: "mbps",
// unitDisk: "mbps",
})
// update local storage on change
$userSettings.subscribe((value) => {
// console.log('user settings changed', value)
$chartTime.set(value.chartTime)
unitNet: Unit.Bytes,
unitTemp: Unit.Celsius,
})
// update chart time on change
$userSettings.subscribe((value) => $chartTime.set(value.chartTime))
/** Container chart filter */
export const $containerFilter = atom("")

View File

@@ -20,7 +20,7 @@ import { useEffect, useState } from "react"
import { CpuIcon, HardDriveIcon, MemoryStickIcon, ServerIcon } from "lucide-react"
import { EthernetIcon, HourglassIcon, ThermometerIcon } from "@/components/ui/icons"
import { prependBasePath } from "@/components/router"
import { Unit } from "./enums"
import { MeterState, Unit } from "./enums"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
@@ -84,21 +84,13 @@ export const updateSystemList = (() => {
/** Logs the user out by clearing the auth store and unsubscribing from realtime updates. */
export async function logOut() {
$systems.set([])
$alerts.set([])
$alerts.set({})
$userSettings.set({} as UserSettings)
sessionStorage.setItem("lo", "t") // prevent auto login on logout
pb.authStore.clear()
pb.realtime.unsubscribe()
}
export const updateAlerts = () => {
pb.collection("alerts")
.getFullList<AlertRecord>({ fields: "id,name,system,value,min,triggered", sort: "updated" })
.then((records) => {
$alerts.set(records)
})
}
const hourWithMinutesFormatter = new Intl.DateTimeFormat(undefined, {
hour: "numeric",
minute: "numeric",
@@ -439,7 +431,7 @@ export const alertInfo: Record<string, AlertInfo> = {
step: 0.1,
desc: () => t`Triggers when 15 minute load average exceeds a threshold`,
},
}
} as const
/**
* Retuns value of system host, truncating full path if socket.
@@ -507,3 +499,109 @@ export const parseSemVer = (semVer = ""): SemVer => {
const parts = semVer.split(".").map(Number)
return { major: parts?.[0] ?? 0, minor: parts?.[1] ?? 0, patch: parts?.[2] ?? 0 }
}
/** Get meter state from 0-100 value. Used for color coding meters. */
export function getMeterState(value: number): MeterState {
const { colorWarn = 65, colorCrit = 90 } = $userSettings.get()
return value >= colorCrit ? MeterState.Crit : value >= colorWarn ? MeterState.Warn : MeterState.Good
}
export function debounce<T extends (...args: any[]) => any>(func: T, wait: number): (...args: Parameters<T>) => void {
let timeout: ReturnType<typeof setTimeout>
return (...args: Parameters<T>) => {
clearTimeout(timeout)
timeout = setTimeout(() => func(...args), wait)
}
}
/* returns the name of a system from its id */
export const getSystemNameFromId = (() => {
const cache = new Map<string, string>()
return (systemId: string): string => {
if (cache.has(systemId)) {
return cache.get(systemId)!
}
const sysName = $systems.get().find((s) => s.id === systemId)?.name ?? ""
cache.set(systemId, sysName)
return sysName
}
})()
// TODO: reorganize this utils file into more specific files
/** Helper to manage user alerts */
export const alertManager = (() => {
const collection = pb.collection<AlertRecord>("alerts")
/** Fields to fetch from alerts collection */
const fields = "id,name,system,value,min,triggered"
/** Fetch alerts from collection */
async function fetchAlerts(): Promise<AlertRecord[]> {
return await collection.getFullList<AlertRecord>({ fields, sort: "updated" })
}
/** Format alerts into a map of system id to alert name to alert record */
function add(alerts: AlertRecord[]) {
for (const alert of alerts) {
const systemId = alert.system
const systemAlerts = $alerts.get()[systemId] ?? new Map()
const newAlerts = new Map(systemAlerts)
newAlerts.set(alert.name, alert)
$alerts.setKey(systemId, newAlerts)
}
}
function remove(alerts: Pick<AlertRecord, "name" | "system">[]) {
for (const alert of alerts) {
const systemId = alert.system
const systemAlerts = $alerts.get()[systemId]
const newAlerts = new Map(systemAlerts)
newAlerts.delete(alert.name)
$alerts.setKey(systemId, newAlerts)
}
}
const actionFns = {
create: add,
update: add,
delete: remove,
}
// batch alert updates to prevent unnecessary re-renders when adding many alerts at once
const batchUpdate = (() => {
const batch = new Map<string, RecordSubscription<AlertRecord>>()
let timeout: ReturnType<typeof setTimeout>
return (data: RecordSubscription<AlertRecord>) => {
const { record } = data
batch.set(`${record.system}${record.name}`, data)
clearTimeout(timeout!)
timeout = setTimeout(() => {
const groups = { create: [], update: [], delete: [] } as Record<string, AlertRecord[]>
for (const { action, record } of batch.values()) {
groups[action]?.push(record)
}
for (const key in groups) {
if (groups[key].length) {
actionFns[key as keyof typeof actionFns]?.(groups[key])
}
}
batch.clear()
}, 50)
}
})()
collection.subscribe("*", batchUpdate, { fields })
return {
/** Add alerts to store */
add,
/** Remove alerts from store */
remove,
/** Refresh alerts with latest data from hub */
async refresh() {
const records = await fetchAlerts()
add(records)
},
}
})()

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 دقائق"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "إجراءات"
@@ -108,7 +108,7 @@ msgstr "تعديل خيارات العرض للرسوم البيانية."
msgid "Admin"
msgstr "مسؤول"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "وكيل"
@@ -128,7 +128,7 @@ msgstr "التنبيهات"
msgid "All Systems"
msgstr "جميع الأنظمة"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "هل أنت متأكد أنك تريد حذف {name}؟"
@@ -202,7 +202,7 @@ msgstr "بايت (كيلوبايت/ثانية، ميجابايت/ثانية، ج
msgid "Cache / Buffers"
msgstr "ذاكرة التخزين المؤقت / المخازن المؤقتة"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "إلغاء"
@@ -261,7 +261,7 @@ msgstr "تأكيد كلمة المرور"
msgid "Connection is down"
msgstr "الاتصال مقطوع"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "متابعة"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "نسخ متغيرات البيئة"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "نسخ المضيف"
@@ -296,7 +296,7 @@ msgstr "نسخ المضيف"
msgid "Copy Linux command"
msgstr "نسخ أمر لينكس"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "نسخ الاسم"
@@ -316,7 +316,7 @@ msgstr "انسخ محتوى <0>docker-compose.yml</0> للوكيل أدناه،
msgid "Copy YAML"
msgstr "نسخ YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "المعالج"
@@ -335,6 +335,10 @@ msgstr "إنشاء حساب"
msgid "Created"
msgstr "أنشئت"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "حرج (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "لوحة التحكم"
msgid "Default time period"
msgstr "الفترة الزمنية الافتراضية"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "حذف"
@@ -358,7 +362,7 @@ msgstr "حذف"
msgid "Delete fingerprint"
msgstr "حذف البصمة"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "القرص"
@@ -399,7 +403,7 @@ msgstr "التوثيق"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "معطل"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "المدة"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "تعديل"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "متوسط التحميل 5 دقائق"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "متوسط التحميل"
@@ -606,7 +610,7 @@ msgstr "تعليمات الإعداد اليدوي"
msgid "Max 1 min"
msgstr "الحد الأقصى دقيقة"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "الذاكرة"
@@ -624,7 +628,7 @@ msgstr "استخدام الذاكرة لحاويات دوكر"
msgid "Name"
msgstr "الاسم"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "الشبكة"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "يجب أن تكون كلمة المرور أقل من 72 بايت."
msgid "Password reset request received"
msgstr "تم استلام طلب إعادة تعيين كلمة المرور"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "إيقاف مؤقت"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "متوقف مؤقتا"
@@ -792,7 +796,7 @@ msgstr "إعادة تعيين كلمة المرور"
msgid "Resolved"
msgstr "تم حلها"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "استئناف"
@@ -833,6 +837,10 @@ msgstr "راجع <0>إعدادات الإشعارات</0> لتكوين كيفي
msgid "Sent"
msgstr "تم الإرسال"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "تعيين عتبات النسبة المئوية لألوان العداد."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "يحدد النطاق الزمني الافتراضي للرسوم البيانية عند عرض النظام."
@@ -881,7 +889,7 @@ msgstr "استخدام التبديل"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "النظام"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "درجة الحرارة"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "لا يمكن التراجع عن هذا الإجراء. سيؤدي ذلك إلى حذف جميع السجلات الحالية لـ {name} من قاعدة البيانات بشكل دائم."
@@ -994,7 +1002,7 @@ msgstr "يتم التفعيل عندما يتجاوز متوسط التحميل
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
msgstr "يتم التفعيل عندما <EFBFBD><EFBFBD>تجاوز أي مستشعر عتبة معينة"
msgstr "يتم التفعيل عندما يتجاوز أي مستشعر عتبة معينة"
#: src/lib/utils.ts
msgid "Triggers when combined up/down exceeds a threshold"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "رمز مميز عالمي"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "قيد التشغيل"
@@ -1084,6 +1092,14 @@ msgstr "في انتظار وجود سجلات كافية للعرض"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "هل تريد مساعدتنا في تحسين ترجماتنا؟ تحقق من <0>Crowdin</0> لمزيد من التفاصيل."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "تحذير (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "عتبات التحذير"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "إشعارات Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Действия"
@@ -108,7 +108,7 @@ msgstr "Настрой опциите за показване на диагра
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Агент"
@@ -128,7 +128,7 @@ msgstr "Тревоги"
msgid "All Systems"
msgstr "Всички системи"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Сигурен ли си, че искаш да изтриеш {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Откажи"
@@ -261,7 +261,7 @@ msgstr "Потвърди парола"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продължи"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Копирай хоста"
@@ -296,7 +296,7 @@ msgstr "Копирай хоста"
msgid "Copy Linux command"
msgstr "Копирай linux командата"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Копирай име"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "Процесор"
@@ -335,6 +335,10 @@ msgstr "Създай акаунт"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Критично (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Табло"
msgid "Default time period"
msgstr "Времеви диапазон по подразбиране"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Изтрий"
@@ -358,7 +362,7 @@ msgstr "Изтрий"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Диск"
@@ -399,7 +403,7 @@ msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Максимум 1 минута"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Памет"
@@ -624,7 +628,7 @@ msgstr "Използването на памет от docker контейнер
msgid "Name"
msgstr "Име"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Мрежа"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Получено е искането за нулиране на паролата"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Пауза"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "На пауза"
@@ -792,7 +796,7 @@ msgstr "Нулиране на парола"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Възобнови"
@@ -833,6 +837,10 @@ msgstr "Виж <0>настройките за нотификациите</0> з
msgid "Sent"
msgstr "Изпратени"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Задайте процентни прагове за цветовете на измервателните уреди."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Задава диапазона за време за диаграмите, когато се разглежда система."
@@ -881,7 +889,7 @@ msgstr "Използване на swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Тестова нотификация изпратена"
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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Това действие не може да бъде отменено. Това ще изтрие всички записи за {name} от датабазата."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Изчаква се за достатъчно записи за пока
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Искаш да помогнеш да направиш преводите още по-добри? Провери нашия <0>Crowdin</0> за повече детайли."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Предупреждение (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Прагове за предупреждение"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Пуш нотификации"

View File

@@ -8,7 +8,7 @@ msgstr ""
"Language: cs\n"
"Project-Id-Version: beszel\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-07-25 22:44\n"
"PO-Revision-Date: 2025-08-04 01:51\n"
"Last-Translator: \n"
"Language-Team: Czech\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
@@ -27,7 +27,7 @@ msgstr "{0, plural, one {# den} few {# dny} other {# dní}}"
#. placeholder {1}: table.getFilteredRowModel().rows.length
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "{0} of {1} row(s) selected."
msgstr ""
msgstr "{0} z {1} vybraných řádků."
#: src/components/routes/system.tsx
msgid "{hours, plural, one {# hour} other {# hours}}"
@@ -40,7 +40,7 @@ msgstr "1 hodina"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "1 min"
msgstr ""
msgstr "1 min"
#: src/lib/utils.ts
msgid "1 week"
@@ -53,7 +53,7 @@ msgstr "12 hodin"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "15 min"
msgstr ""
msgstr "15 min"
#: src/lib/utils.ts
msgid "24 hours"
@@ -66,10 +66,10 @@ msgstr "30 dní"
#. Load average
#: src/components/charts/load-average-chart.tsx
msgid "5 min"
msgstr ""
msgstr "5 min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akce"
@@ -77,7 +77,7 @@ msgstr "Akce"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Active"
msgstr ""
msgstr "Aktivní"
#: src/components/routes/home.tsx
msgid "Active Alerts"
@@ -108,7 +108,7 @@ msgstr "Upravit možnosti zobrazení pro grafy."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -116,7 +116,7 @@ msgstr "Agent"
#: src/components/routes/settings/layout.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Alert History"
msgstr ""
msgstr "Historie upozornění"
#: src/components/alerts/alert-button.tsx
#: src/components/alerts/alert-button.tsx
@@ -128,13 +128,13 @@ msgstr "Výstrahy"
msgid "All Systems"
msgstr "Všechny systémy"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Opravdu chcete odstranit {name}?"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Are you sure?"
msgstr ""
msgstr "Jste si jistý?"
#: src/components/copy-to-clipboard.tsx
msgid "Automatic copy requires a secure context."
@@ -191,18 +191,18 @@ msgstr "Binary"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bits (Kbps, Mbps, Gbps)"
msgstr ""
msgstr "Bits (Kbps, Mbps, Gbps)"
#: src/components/routes/settings/general.tsx
#: src/components/routes/settings/general.tsx
msgid "Bytes (KB/s, MB/s, GB/s)"
msgstr ""
msgstr "Bytes (KB/s, MB/s, GB/s)"
#: src/components/charts/mem-chart.tsx
msgid "Cache / Buffers"
msgstr "Cache / vyrovnávací paměť"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Zrušit"
@@ -213,11 +213,11 @@ msgstr "Upozornění - možná ztráta dat"
#: src/components/routes/settings/general.tsx
msgid "Celsius (°C)"
msgstr ""
msgstr "Celsia (°C)"
#: src/components/routes/settings/general.tsx
msgid "Change display units for metrics."
msgstr ""
msgstr "Změnit jednotky zobrazení metrik."
#: src/components/routes/settings/general.tsx
msgid "Change general application options."
@@ -259,9 +259,9 @@ msgstr "Potvrdit heslo"
#: src/components/routes/home.tsx
msgid "Connection is down"
msgstr ""
msgstr "Připojení je nedostupné"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Pokračovat"
@@ -285,9 +285,9 @@ msgstr "Zkopírovat příkaz na spuštění dockeru"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
msgstr "Kopírovat env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopírovat hostitele"
@@ -296,7 +296,7 @@ msgstr "Kopírovat hostitele"
msgid "Copy Linux command"
msgstr "Kopírovat příkaz Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopírovat název"
@@ -306,17 +306,17 @@ msgstr "Kopírovat text"
#: src/components/add-system.tsx
msgid "Copy the installation command for the agent below, or register agents automatically with a <0>universal token</0>."
msgstr ""
msgstr "Zkopírujte instalační příkaz pro agenta níže nebo automaticky registrujte agenty s <0>univerzálním token</0>."
#: src/components/add-system.tsx
msgid "Copy the<0>docker-compose.yml</0> content for the agent below, or register agents automatically with a <1>universal token</1>."
msgstr ""
msgstr "Zkopírujte obsah <0>docker-compose.yml</0> pro agenta níže nebo automaticky registrujte agenty s <1>univerzálním token</1>."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Copy YAML"
msgstr ""
msgstr "Kopírovat YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "Procesor"
@@ -333,7 +333,11 @@ msgstr "Vytvořit účet"
#. Context: date created
#: src/components/alerts-history-columns.tsx
msgid "Created"
msgstr ""
msgstr "Vytvořeno"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritické (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
@@ -349,16 +353,16 @@ msgstr "Přehled"
msgid "Default time period"
msgstr "Výchozí doba"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Odstranit"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Delete fingerprint"
msgstr ""
msgstr "Smazat identifikátor"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -368,7 +372,7 @@ msgstr "Disk I/O"
#: src/components/routes/settings/general.tsx
msgid "Disk unit"
msgstr ""
msgstr "Disková jednotka"
#: src/lib/utils.ts
#: src/components/routes/system.tsx
@@ -399,17 +403,17 @@ msgstr "Dokumentace"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nefunkční"
#: src/components/alerts-history-columns.tsx
msgid "Duration"
msgstr ""
msgstr "Doba trvání"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Upravit"
@@ -451,7 +455,7 @@ msgstr "Stávající systémy, které nejsou definovány v <0>config.yml</0>, bu
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Export"
msgstr ""
msgstr "Export"
#: src/components/routes/settings/config-yaml.tsx
msgid "Export configuration"
@@ -463,7 +467,7 @@ msgstr "Exportovat aktuální konfiguraci systémů."
#: src/components/routes/settings/general.tsx
msgid "Fahrenheit (°F)"
msgstr ""
msgstr "Fahrenheita (°F)"
#: src/lib/utils.ts
msgid "Failed to authenticate"
@@ -490,7 +494,7 @@ msgstr "Filtr..."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Fingerprint"
msgstr ""
msgstr "Otisk"
#: src/components/alerts/alerts-system.tsx
msgid "For <0>{min}</0> {min, plural, one {minute} other {minutes}}"
@@ -552,24 +556,24 @@ msgstr "Světlý"
#: src/components/routes/system.tsx
msgid "Load Average"
msgstr ""
msgstr "Průměrné vytížení"
#: src/lib/utils.ts
msgid "Load Average 15m"
msgstr ""
msgstr "Průměrná zátěž 15m"
#: src/lib/utils.ts
msgid "Load Average 1m"
msgstr ""
msgstr "Průměrná zátěž 1m"
#: src/lib/utils.ts
msgid "Load Average 5m"
msgstr ""
msgstr "Průměrná zátěž 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
msgstr "Prům. zatížení"
#: src/components/navbar.tsx
msgid "Log Out"
@@ -606,7 +610,7 @@ msgstr "Pokyny k manuálnímu nastavení"
msgid "Max 1 min"
msgstr "Max. 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Paměť"
@@ -624,7 +628,7 @@ msgstr "Využití paměti docker kontejnerů"
msgid "Name"
msgstr "Název"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Síť"
@@ -639,7 +643,7 @@ msgstr "Síťový provoz veřejných rozhraní"
#. Context: Bytes or bits
#: src/components/routes/settings/general.tsx
msgid "Network unit"
msgstr ""
msgstr "Síťová jednotka"
#: src/components/command-palette.tsx
msgid "No results found."
@@ -647,7 +651,7 @@ msgstr "Nenalezeny žádné výskyty."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "No results."
msgstr ""
msgstr "Žádné výsledky."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table.tsx
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -690,7 +694,7 @@ msgstr "Stránka"
#. placeholder {1}: table.getPageCount()
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Page {0} of {1}"
msgstr ""
msgstr "Stránka {0} z {1}"
#: src/components/command-palette.tsx
msgid "Pages / Settings"
@@ -713,11 +717,11 @@ msgstr "Heslo musí být menší než 72 bytů."
msgid "Password reset request received"
msgstr "Žádost o obnovu hesla byla přijata"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pozastavit"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pozastaveno"
@@ -790,19 +794,19 @@ msgstr "Obnovit heslo"
#: src/components/alerts-history-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Resolved"
msgstr ""
msgstr "Vyřešeno"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Pokračovat"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Rotate token"
msgstr ""
msgstr "Změnit token"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Rows per page"
msgstr ""
msgstr "Řádků na stránku"
#: src/components/routes/settings/notifications.tsx
msgid "Save address using enter key or comma. Leave blank to disable email notifications."
@@ -833,6 +837,10 @@ msgstr "Podívejte se na <0>nastavení upozornění</0> pro nastavení toho, jak
msgid "Sent"
msgstr "Odeslat"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Nastavte procentuální prahové hodnoty pro barvy měřičů."
#: src/components/routes/settings/general.tsx
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."
@@ -863,7 +871,7 @@ msgstr "Seřadit podle"
#. Context: alert state (active or resolved)
#: src/components/alerts-history-columns.tsx
msgid "State"
msgstr ""
msgstr "Stav"
#: src/lib/utils.ts
msgid "Status"
@@ -881,14 +889,14 @@ msgstr "Swap využití"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Systém"
#: src/components/routes/system.tsx
msgid "System load averages over time"
msgstr ""
msgstr "Průměry zatížení systému v průběhu času"
#: src/components/navbar.tsx
msgid "Systems"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabulka"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Teplota"
@@ -914,7 +922,7 @@ msgstr "Teplota"
#: src/components/routes/settings/general.tsx
msgid "Temperature unit"
msgstr ""
msgstr "Jednotky teploty"
#: src/components/routes/system.tsx
msgid "Temperatures of system sensors"
@@ -932,13 +940,13 @@ msgstr "Testovací oznámení odesláno"
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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Tuto akci nelze vzít zpět. Tím se z databáze trvale odstraní všechny aktuální záznamy pro {name}."
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "This will permanently delete all selected records from the database."
msgstr ""
msgstr "Tímto trvale odstraníte všechny vybrané záznamy z databáze."
#: src/components/routes/system.tsx
msgid "Throughput of {extraFsName}"
@@ -964,33 +972,33 @@ msgstr "Přepnout motiv"
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Token"
msgstr ""
msgstr "Token"
#: src/components/command-palette.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/layout.tsx
msgid "Tokens & Fingerprints"
msgstr ""
msgstr "Tokeny & Otisky"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens allow agents to connect and register. Fingerprints are stable identifiers unique to each system, set on first connection."
msgstr ""
msgstr "Tokeny umožňují agentům připojení a registraci. Otisky jsou stabilní identifikátory jedinečné pro každý systém, nastavené na první připojení."
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Tokens and fingerprints are used to authenticate WebSocket connections to the hub."
msgstr ""
msgstr "Tokeny a otisky slouží k ověření připojení WebSocket k uzlu."
#: src/lib/utils.ts
msgid "Triggers when 1 minute load average exceeds a threshold"
msgstr ""
msgstr "Spustí se, když využití paměti během 1 minuty překročí prahovou hodnotu"
#: src/lib/utils.ts
msgid "Triggers when 15 minute load average exceeds a threshold"
msgstr ""
msgstr "Spustí se, když využití paměti během 15 minut překročí prahovou hodnotu"
#: src/lib/utils.ts
msgid "Triggers when 5 minute load average exceeds a threshold"
msgstr ""
msgstr "Spustí se, když využití paměti během 5 minut překročí prahovou hodnotu"
#: src/lib/utils.ts
msgid "Triggers when any sensor exceeds a threshold"
@@ -1019,14 +1027,14 @@ msgstr "Spustí se, když využití disku překročí prahovou hodnotu"
#. Temperature / network units
#: src/components/routes/settings/general.tsx
msgid "Unit preferences"
msgstr ""
msgstr "Předvolby jednotek"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Universal token"
msgstr ""
msgstr "Univerzální token"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Funkční"
@@ -1062,7 +1070,7 @@ msgstr "Uživatelé"
#: src/components/alerts-history-columns.tsx
msgid "Value"
msgstr ""
msgstr "Hodnota"
#: src/components/systems-table/systems-table.tsx
msgid "View"
@@ -1070,7 +1078,7 @@ msgstr "Zobrazení"
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "View your 200 most recent alerts."
msgstr ""
msgstr "Zobrazit vašich 200 nejnovějších upozornění."
#: src/components/systems-table/systems-table.tsx
msgid "Visible Fields"
@@ -1084,13 +1092,21 @@ msgstr "Čeká se na dostatek záznamů k zobrazení"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Varování (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Prahové hodnoty pro varování"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push oznámení"
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "When enabled, this token allows agents to self-register without prior system creation. Expires after one hour or on hub restart."
msgstr ""
msgstr "Pokud je povoleno, tento token umožňuje agentům, aby se sami zaregistrovali bez předchozího vytvoření systému. Vyprší po jedné hodině nebo po restartu uzlu."
#: src/components/add-system.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Handlinger"
@@ -108,7 +108,7 @@ msgstr "Juster visningsindstillinger for diagrammer."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Alarmer"
msgid "All Systems"
msgstr "Alle systemer"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på, at du vil slette {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Fortryd"
@@ -261,7 +261,7 @@ msgstr "Bekræft adgangskode"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Forsæt"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopier host"
@@ -296,7 +296,7 @@ msgstr "Kopier host"
msgid "Copy Linux command"
msgstr "Kopier Linux kommando"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopier navn"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Opret konto"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritisk (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Oversigtspanel"
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Slet"
@@ -358,7 +362,7 @@ msgstr "Slet"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nede"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Rediger"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Manuel opsætningsvejledning"
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Hukommelse"
@@ -624,7 +628,7 @@ msgstr "Hukommelsesforbrug af dockercontainere"
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Net"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Adgangskoden skal være mindre end 72 bytes."
msgid "Password reset request received"
msgstr "Anmodning om nulstilling af adgangskode modtaget"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Sat på pause"
@@ -792,7 +796,7 @@ msgstr "Nulstil adgangskode"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Genoptag"
@@ -833,6 +837,10 @@ msgstr "Se <0>meddelelsesindstillinger</0> for at konfigurere, hvordan du modtag
msgid "Sent"
msgstr "Sendt"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Indstil procentvise tærskler for målerfarver."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Sætter standardtidsintervallet for diagrammer når et system vises."
@@ -881,7 +889,7 @@ msgstr "Swap forbrug"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatur"
@@ -932,7 +940,7 @@ msgstr "Test notifikation sendt"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Oppe"
@@ -1084,6 +1092,14 @@ msgstr "Venter på nok posteringer til at vise"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Advarsel (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Advarselstærskler"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifikationer"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 Min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Aktionen"
@@ -108,7 +108,7 @@ msgstr "Anzeigeoptionen für Diagramme anpassen."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Warnungen"
msgid "All Systems"
msgstr "Alle Systeme"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Möchtest du {name} wirklich löschen?"
@@ -202,7 +202,7 @@ msgstr "Bytes (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "Cache / Puffer"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Abbrechen"
@@ -261,7 +261,7 @@ msgstr "Passwort bestätigen"
msgid "Connection is down"
msgstr "Verbindung unterbrochen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortfahren"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Umgebungsvariablen kopieren"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Host kopieren"
@@ -296,7 +296,7 @@ msgstr "Host kopieren"
msgid "Copy Linux command"
msgstr "Linux-Befehl kopieren"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Name kopieren"
@@ -316,7 +316,7 @@ msgstr "Kopieren Sie den<0>docker-compose.yml</0> Inhalt für den Agent unten od
msgid "Copy YAML"
msgstr "YAML kopieren"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Konto erstellen"
msgid "Created"
msgstr "Erstellt"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritisch (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardzeitraum"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Löschen"
@@ -358,7 +362,7 @@ msgstr "Löschen"
msgid "Delete fingerprint"
msgstr "Fingerabdruck löschen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Festplatte"
@@ -399,7 +403,7 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Dauer"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Bearbeiten"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Durchschnittliche Systemlast 5 Min"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Durchschnittliche Last"
@@ -606,7 +610,7 @@ msgstr "Anleitung zur manuellen Einrichtung"
msgid "Max 1 min"
msgstr "Max 1 Min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Arbeitsspeicher"
@@ -624,7 +628,7 @@ msgstr "Arbeitsspeichernutzung der Docker-Container"
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Netz"
@@ -668,7 +672,7 @@ msgstr "OAuth 2 / OIDC-Unterstützung"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Bei jedem Neustart werden die Systeme in der Datenbank aktualisiert, um den in der Datei definierten Systemen zu entsprechen."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Das Passwort muss weniger als 72 Bytes lang sein."
msgid "Password reset request received"
msgstr "Anfrage zum Zurücksetzen des Passworts erhalten"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pausiert"
@@ -792,7 +796,7 @@ msgstr "Passwort zurücksetzen"
msgid "Resolved"
msgstr "Gelöst"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Fortsetzen"
@@ -833,6 +837,10 @@ msgstr "Siehe <0>Benachrichtigungseinstellungen</0>, um zu konfigurieren, wie du
msgid "Sent"
msgstr "Gesendet"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Prozentuale Schwellenwerte für Zählerfarben festlegen."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Legt den Standardzeitraum für Diagramme fest, wenn ein System angezeigt wird."
@@ -881,7 +889,7 @@ msgstr "Swap-Nutzung"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabelle"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatur"
@@ -932,7 +940,7 @@ msgstr "Testbenachrichtigung gesendet"
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Melde dich dann im Backend an und setze dein Benutzerkontopasswort in der Benutzertabelle zurück."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch werden alle aktuellen Datensätze für {name} dauerhaft aus der Datenbank gelöscht."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Universeller Token"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "aktiv"
@@ -1084,6 +1092,14 @@ msgstr "Warten auf genügend Datensätze zur Anzeige"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Möchtest du uns helfen, unsere Übersetzungen noch besser zu machen? Schau dir <0>Crowdin</0> für weitere Details an."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Warnung (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Warnschwellen"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-Benachrichtigungen"

View File

@@ -64,7 +64,7 @@ msgid "5 min"
msgstr "5 min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Actions"
@@ -103,7 +103,7 @@ msgstr "Adjust display options for charts."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -123,7 +123,7 @@ msgstr "Alerts"
msgid "All Systems"
msgstr "All Systems"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Are you sure you want to delete {name}?"
@@ -197,7 +197,7 @@ msgstr "Bytes (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancel"
@@ -256,7 +256,7 @@ msgstr "Confirm password"
msgid "Connection is down"
msgstr "Connection is down"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continue"
@@ -282,7 +282,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Copy env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Copy host"
@@ -291,7 +291,7 @@ msgstr "Copy host"
msgid "Copy Linux command"
msgstr "Copy Linux command"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Copy name"
@@ -311,7 +311,7 @@ msgstr "Copy the<0>docker-compose.yml</0> content for the agent below, or regist
msgid "Copy YAML"
msgstr "Copy YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -330,6 +330,10 @@ msgstr "Create account"
msgid "Created"
msgstr "Created"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Critical (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -344,7 +348,7 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Default time period"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Delete"
@@ -353,7 +357,7 @@ msgstr "Delete"
msgid "Delete fingerprint"
msgstr "Delete fingerprint"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -394,7 +398,7 @@ msgstr "Documentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Down"
@@ -404,7 +408,7 @@ msgid "Duration"
msgstr "Duration"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Edit"
@@ -562,7 +566,7 @@ msgid "Load Average 5m"
msgstr "Load Average 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Load Avg"
@@ -601,7 +605,7 @@ msgstr "Manual setup instructions"
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Memory"
@@ -619,7 +623,7 @@ msgstr "Memory usage of docker containers"
msgid "Name"
msgstr "Name"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Net"
@@ -663,7 +667,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -708,11 +712,11 @@ msgstr "Password must be less than 72 bytes."
msgid "Password reset request received"
msgstr "Password reset request received"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Paused"
@@ -787,7 +791,7 @@ msgstr "Reset Password"
msgid "Resolved"
msgstr "Resolved"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Resume"
@@ -828,6 +832,10 @@ msgstr "See <0>notification settings</0> to configure how you receive alerts."
msgid "Sent"
msgstr "Sent"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Set percentage thresholds for meter colors."
#: src/components/routes/settings/general.tsx
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."
@@ -876,7 +884,7 @@ msgstr "Swap Usage"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -898,7 +906,7 @@ msgid "Table"
msgstr "Table"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temp"
@@ -927,7 +935,7 @@ msgstr "Test notification sent"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1021,7 +1029,7 @@ msgid "Universal token"
msgstr "Universal token"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Up"
@@ -1079,6 +1087,14 @@ msgstr "Waiting for enough records to display"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Want to help improve our translations? Check <0>Crowdin</0> for details."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Warning (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Warning thresholds"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push notifications"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Acciones"
@@ -108,7 +108,7 @@ msgstr "Ajustar las opciones de visualización para los gráficos."
msgid "Admin"
msgstr "Administrador"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agente"
@@ -128,7 +128,7 @@ msgstr "Alertas"
msgid "All Systems"
msgstr "Todos los Sistemas"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "¿Está seguro de que desea eliminar {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Caché / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancelar"
@@ -261,7 +261,7 @@ msgstr "Confirmar contraseña"
msgid "Connection is down"
msgstr "La conexión está caída"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuar"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Copiar env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Copiar host"
@@ -296,7 +296,7 @@ msgstr "Copiar host"
msgid "Copy Linux command"
msgstr "Copiar comando de Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Copiar nombre"
@@ -316,7 +316,7 @@ msgstr "Copia el contenido del<0>docker-compose.yml</0> para el agente a continu
msgid "Copy YAML"
msgstr "Copiar YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Crear cuenta"
msgid "Created"
msgstr "Creado"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Crítico (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Tablero"
msgid "Default time period"
msgstr "Período de tiempo predeterminado"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Eliminar"
@@ -358,7 +362,7 @@ msgstr "Eliminar"
msgid "Delete fingerprint"
msgstr "Eliminar huella digital"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disco"
@@ -399,7 +403,7 @@ msgstr "Documentación"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Abajo"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Duración"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Editar"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Carga media 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Carga media"
@@ -606,7 +610,7 @@ msgstr "Instrucciones manuales de configuración"
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Memoria"
@@ -624,7 +628,7 @@ msgstr "Uso de memoria de los contenedores de Docker"
msgid "Name"
msgstr "Nombre"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Red"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "La contraseña debe ser menor de 72 bytes."
msgid "Password reset request received"
msgstr "Solicitud de restablecimiento de contraseña recibida"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pausar"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pausado"
@@ -792,7 +796,7 @@ msgstr "Restablecer Contraseña"
msgid "Resolved"
msgstr "Resuelto"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Reanudar"
@@ -833,6 +837,10 @@ msgstr "Consulte <0>configuración de notificaciones</0> para configurar cómo r
msgid "Sent"
msgstr "Enviado"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Establecer umbrales de porcentaje para los colores de los medidores."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Uso de Swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatura"
@@ -932,7 +940,7 @@ msgstr "Notificación de prueba enviada"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Token universal"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Activo"
@@ -1084,6 +1092,14 @@ msgstr "Esperando suficientes registros para mostrar"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "¿Quieres ayudarnos a mejorar nuestras traducciones? Consulta <0>Crowdin</0> para más detalles."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Advertencia (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Umbrales de advertencia"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Notificaciones Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "۵ دقیقه"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "عملیات"
@@ -108,7 +108,7 @@ msgstr "تنظیم گزینه‌های نمایش برای نمودارها."
msgid "Admin"
msgstr "مدیر"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "عامل"
@@ -128,7 +128,7 @@ msgstr "هشدارها"
msgid "All Systems"
msgstr "همه سیستم‌ها"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "آیا مطمئن هستید که می‌خواهید {name} را حذف کنید؟"
@@ -202,7 +202,7 @@ msgstr "بایت (کیلوبایت بر ثانیه، مگابایت بر ثان
msgid "Cache / Buffers"
msgstr "حافظه پنهان / بافرها"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "لغو"
@@ -261,7 +261,7 @@ msgstr "تأیید رمز عبور"
msgid "Connection is down"
msgstr "اتصال قطع است"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "ادامه"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "کپی متغیرهای محیط"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "کپی میزبان"
@@ -296,7 +296,7 @@ msgstr "کپی میزبان"
msgid "Copy Linux command"
msgstr "کپی دستور لینوکس"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "کپی نام"
@@ -316,7 +316,7 @@ msgstr "محتوای <0>docker-compose.yml</0> عامل زیر را کپی کن
msgid "Copy YAML"
msgstr "کپی YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "پردازنده"
@@ -335,6 +335,10 @@ msgstr "ایجاد حساب کاربری"
msgid "Created"
msgstr "ایجاد شده"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "بحرانی (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "داشبورد"
msgid "Default time period"
msgstr "بازه زمانی پیش‌فرض"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "حذف"
@@ -358,7 +362,7 @@ msgstr "حذف"
msgid "Delete fingerprint"
msgstr "حذف اثر انگشت"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "دیسک"
@@ -399,7 +403,7 @@ msgstr "مستندات"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "قطع"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "مدت زمان"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "ویرایش"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "میانگین بار ۵ دقیقه"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "میانگین بار"
@@ -606,7 +610,7 @@ msgstr "دستورالعمل‌های راه‌اندازی دستی"
msgid "Max 1 min"
msgstr "حداکثر ۱ دقیقه"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "حافظه"
@@ -624,7 +628,7 @@ msgstr "میزان استفاده از حافظه کانتینرهای داکر"
msgid "Name"
msgstr "نام"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "شبکه"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "رمز عبور باید کمتر از ۷۲ بایت باشد."
msgid "Password reset request received"
msgstr "درخواست بازنشانی رمز عبور دریافت شد"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "توقف"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "مکث شده"
@@ -792,7 +796,7 @@ msgstr "بازنشانی رمز عبور"
msgid "Resolved"
msgstr "حل شده"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "ادامه"
@@ -833,6 +837,10 @@ msgstr "برای پیکربندی نحوه دریافت هشدارها، به <0
msgid "Sent"
msgstr "ارسال شد"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "آستانه های درصدی را برای رنگ های متر تنظیم کنید."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "بازه زمانی پیش‌فرض برای نمودارها هنگام مشاهده یک سیستم را تعیین می‌کند."
@@ -881,7 +889,7 @@ msgstr "میزان استفاده از Swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "سیستم"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "جدول"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "دما"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "این عمل قابل برگشت نیست. این کار تمام رکوردهای فعلی {name} را برای همیشه از پایگاه داده حذف خواهد کرد."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "توکن جهانی"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "فعال"
@@ -1084,6 +1092,14 @@ msgstr "در انتظار رکوردهای کافی برای نمایش"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "می‌خواهید به ما کمک کنید تا ترجمه‌های خود را بهتر کنیم؟ برای جزئیات بیشتر به <0>Crowdin</0> مراجعه کنید."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "هشدار (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "آستانه های هشدار"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "اعلان‌های Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Actions"
@@ -108,7 +108,7 @@ msgstr "Ajuster les options d'affichage pour les graphiques."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Alertes"
msgid "All Systems"
msgstr "Tous les systèmes"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Êtes-vous sûr de vouloir supprimer {name} ?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Tampons"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annuler"
@@ -261,7 +261,7 @@ msgstr "Confirmer le mot de passe"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuer"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Copier env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Copier l'hôte"
@@ -296,7 +296,7 @@ msgstr "Copier l'hôte"
msgid "Copy Linux command"
msgstr "Copier la commande Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Copier le nom"
@@ -316,7 +316,7 @@ msgstr "Copiez le contenu du<0>docker-compose.yml</0> pour l'agent ci-dessous, o
msgid "Copy YAML"
msgstr "Copier YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Créer un compte"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Critique (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Tableau de bord"
msgid "Default time period"
msgstr "Période par défaut"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Supprimer"
@@ -358,7 +362,7 @@ msgstr "Supprimer"
msgid "Delete fingerprint"
msgstr "Supprimer l'empreinte"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disque"
@@ -399,7 +403,7 @@ msgstr "Documentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Injoignable"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Éditer"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Guide pour une installation manuelle"
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Mémoire"
@@ -624,7 +628,7 @@ msgstr "Utilisation de la mémoire des conteneurs Docker"
msgid "Name"
msgstr "Nom"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Net"
@@ -668,7 +672,7 @@ msgstr "Support OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "À chaque redémarrage, les systèmes dans la base de données seront mis à jour pour correspondre aux systèmes définis dans le fichier."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Le mot de passe doit être inférieur à 72 Octets."
msgid "Password reset request received"
msgstr "Demande de réinitialisation du mot de passe reçue"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "En pause"
@@ -792,7 +796,7 @@ msgstr "Réinitialiser le mot de passe"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Reprendre"
@@ -833,6 +837,10 @@ msgstr "Voir les <0>paramètres de notification</0> pour configurer comment vous
msgid "Sent"
msgstr "Envoyé"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Définir des seuils de pourcentage pour les couleurs des compteurs."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Définit la plage de temps par défaut pour les graphiques lorsqu'un système est consulté."
@@ -881,7 +889,7 @@ msgstr "Utilisation du swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Système"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tableau"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temp."
@@ -932,7 +940,7 @@ msgstr "Notification de test envoyée"
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Ensuite, connectez-vous au backend et réinitialisez le mot de passe de votre compte utilisateur dans la table des utilisateurs."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Cette action ne peut pas être annulée. Cela supprimera définitivement tous les enregistrements actuels pour {name} de la base de données."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Token universel"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Joignable"
@@ -1084,6 +1092,14 @@ msgstr "En attente de suffisamment d'enregistrements à afficher"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Vous voulez nous aider à améliorer nos traductions ? Consultez <0>Crowdin</0> pour plus de détails."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Avertissement (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Seuils d'avertissement"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Notifications Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akcije"
@@ -108,7 +108,7 @@ msgstr "Podesite opcije prikaza za grafikone."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Upozorenja"
msgid "All Systems"
msgstr "Svi Sistemi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Jeste li sigurni da želite izbrisati {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Predmemorija / Međuspremnici"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Otkaži"
@@ -261,7 +261,7 @@ msgstr "Potvrdite lozinku"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Nastavite"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopiraj hosta"
@@ -296,7 +296,7 @@ msgstr "Kopiraj hosta"
msgid "Copy Linux command"
msgstr "Kopiraj Linux komandu"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopiraj naziv"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "Procesor"
@@ -335,6 +335,10 @@ msgstr "Napravite račun"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritično (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Nadzorna ploča"
msgid "Default time period"
msgstr "Zadano vremensko razdoblje"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Izbriši"
@@ -358,7 +362,7 @@ msgstr "Izbriši"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Maksimalno 1 minuta"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Memorija"
@@ -624,7 +628,7 @@ msgstr "Upotreba memorije Docker spremnika"
msgid "Name"
msgstr "Ime"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Mreža"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Zahtjev za ponovno postavljanje lozinke primljen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pauza"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pauzirano"
@@ -792,7 +796,7 @@ msgstr "Resetiraj Lozinku"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Nastavi"
@@ -833,6 +837,10 @@ msgstr "Pogledajte <0>postavke obavijesti</0> da biste konfigurirali način prim
msgid "Sent"
msgstr "Poslano"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Postavite pragove postotka za boje mjerača."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Postavlja zadani vremenski raspon za grafikone kada se sustav gleda."
@@ -881,7 +889,7 @@ msgstr "Swap Iskorištenost"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistem"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tablica"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Testna obavijest poslana"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Čeka se na više podataka prije prikaza"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Upozorenje (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Pragovi upozorenja"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push obavijest"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Műveletek"
@@ -108,7 +108,7 @@ msgstr "Állítsa be a diagram megjelenítését."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Ügynök"
@@ -128,7 +128,7 @@ msgstr "Riasztások"
msgid "All Systems"
msgstr "Minden rendszer"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Biztosan törölni szeretnéd {name}-t?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Gyorsítótár / Pufferelések"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Mégsem"
@@ -261,7 +261,7 @@ msgstr "Jelszó megerősítése"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Tovább"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Hoszt másolása"
@@ -296,7 +296,7 @@ msgstr "Hoszt másolása"
msgid "Copy Linux command"
msgstr "Linux parancs másolása"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Név másolása"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Fiók létrehozása"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritikus (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Áttekintés"
msgid "Default time period"
msgstr "Alapértelmezett időszak"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Törlés"
@@ -358,7 +362,7 @@ msgstr "Törlés"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Lemez"
@@ -399,7 +403,7 @@ msgstr "Dokumentáció"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Maximum 1 perc"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "RAM"
@@ -624,7 +628,7 @@ msgstr "Docker konténerek memória használata"
msgid "Name"
msgstr "Név"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Hálózat"
@@ -668,7 +672,7 @@ msgstr "OAuth 2 / OIDC támogatás"
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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Jelszó-visszaállítási kérelmet kaptunk"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Szüneteltetés"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Szüneteltetve"
@@ -792,7 +796,7 @@ msgstr "Jelszó visszaállítása"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Folytatás"
@@ -833,6 +837,10 @@ msgstr "Lásd <0>az értesítési beállításokat</0>, hogy konfigurálja, hogy
msgid "Sent"
msgstr "Elküldve"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Százalékos küszöbértékek beállítása a mérőszínekhez."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Swap használat"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Rendszer"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tábla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Teszt értesítés elküldve"
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
#: src/components/systems-table/systems-table-columns.tsx
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!"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Elegendő rekordra várva a megjelenítéshez"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Figyelmeztetés (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Figyelmeztetési küszöbértékek"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push értesítések"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Aðgerðir"
@@ -108,7 +108,7 @@ msgstr ""
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr ""
@@ -128,7 +128,7 @@ msgstr "Tilkynningar"
msgid "All Systems"
msgstr "Öll kerfi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Ertu viss um að þú viljir eyða {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Skyndiminni / Biðminni"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Hætta við"
@@ -261,7 +261,7 @@ msgstr "Staðfestu lykilorð"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Halda áfram"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Afrita host"
@@ -296,7 +296,7 @@ msgstr "Afrita host"
msgid "Copy Linux command"
msgstr "Afrita Linux aðgerð"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Afrita nafn"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "Örgjörvi"
@@ -335,6 +335,10 @@ msgstr "Búa til aðgang"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritískt (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Yfirlitssíða"
msgid "Default time period"
msgstr "Sjálfgefið tímabil"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Eyða"
@@ -358,7 +362,7 @@ msgstr "Eyða"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Diskur"
@@ -399,7 +403,7 @@ msgstr "Skjal"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Mest 1 mínúta"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Minni"
@@ -624,7 +628,7 @@ msgstr "Minnisnotkun docker kerfa"
msgid "Name"
msgstr "Nafn"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Net"
@@ -668,7 +672,7 @@ msgstr "OAuth 2 / OIDC stuðningur"
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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Beiðni um að endurstilla lykilorð móttekin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pása"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Í bið"
@@ -792,7 +796,7 @@ msgstr "Endurstilla lykilorð"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Halda áfram"
@@ -833,6 +837,10 @@ msgstr ""
msgid "Sent"
msgstr "Sent"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Stilltu prósentuþröskuld fyrir mælaliti."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr ""
@@ -881,7 +889,7 @@ msgstr "Skipti minni"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Kerfi"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tafla"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Prufu tilkynning send"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Bíður eftir nægum upplýsingum til að sýna"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Viðvörun (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Viðvörunarþröskuldur"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Tilkynningar"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Azioni"
@@ -108,7 +108,7 @@ msgstr "Regola le opzioni di visualizzazione per i grafici."
msgid "Admin"
msgstr "Amministratore"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agente"
@@ -128,7 +128,7 @@ msgstr "Avvisi"
msgid "All Systems"
msgstr "Tutti i Sistemi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Sei sicuro di voler eliminare {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Buffer"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annulla"
@@ -261,7 +261,7 @@ msgstr "Conferma password"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continua"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Copia env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Copia host"
@@ -296,7 +296,7 @@ msgstr "Copia host"
msgid "Copy Linux command"
msgstr "Copia comando Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Copia nome"
@@ -316,7 +316,7 @@ msgstr "Copia il contenuto<0>docker-compose.yml</0> per l'agente qui sotto, o re
msgid "Copy YAML"
msgstr "Copia YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Crea account"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Critico (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Cruscotto"
msgid "Default time period"
msgstr "Periodo di tempo predefinito"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Elimina"
@@ -358,7 +362,7 @@ msgstr "Elimina"
msgid "Delete fingerprint"
msgstr "Elimina impronta digitale"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disco"
@@ -399,7 +403,7 @@ msgstr "Documentazione"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Modifica"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Caricamento medio 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Istruzioni di configurazione manuale"
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Memoria"
@@ -624,7 +628,7 @@ msgstr "Utilizzo della memoria dei container Docker"
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Rete"
@@ -668,7 +672,7 @@ msgstr "Supporto OAuth 2 / OIDC"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Ad ogni riavvio, i sistemi nel database verranno aggiornati per corrispondere ai sistemi definiti nel file."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "La password deve essere inferiore a 72 byte."
msgid "Password reset request received"
msgstr "Richiesta di reimpostazione password ricevuta"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pausa"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "In pausa"
@@ -792,7 +796,7 @@ msgstr "Reimposta Password"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Riprendi"
@@ -833,6 +837,10 @@ msgstr "Vedi <0>impostazioni di notifica</0> per configurare come ricevere gli a
msgid "Sent"
msgstr "Inviato"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Imposta le soglie percentuali per i colori dei contatori."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Imposta l'intervallo di tempo predefinito per i grafici quando viene visualizzato un sistema."
@@ -881,7 +889,7 @@ msgstr "Utilizzo Swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabella"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatura"
@@ -932,7 +940,7 @@ msgstr "Notifica di test inviata"
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Quindi accedi al backend e reimposta la password del tuo account utente nella tabella degli utenti."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Questa azione non può essere annullata. Questo eliminerà permanentemente tutti i record attuali per {name} dal database."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Token universale"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Attivo"
@@ -1084,6 +1092,14 @@ msgstr "In attesa di abbastanza record da visualizzare"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Vuoi aiutarci a migliorare ulteriormente le nostre traduzioni? Dai un'occhiata a <0>Crowdin</0> per maggiori dettagli."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Avviso (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Soglie di avviso"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Notifiche Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5分"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "アクション"
@@ -108,7 +108,7 @@ msgstr "チャートの表示オプションを調整します。"
msgid "Admin"
msgstr "管理者"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "エージェント"
@@ -128,7 +128,7 @@ msgstr "アラート"
msgid "All Systems"
msgstr "すべてのシステム"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "{name}を削除してもよろしいですか?"
@@ -202,7 +202,7 @@ msgstr "バイト (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "キャッシュ / バッファ"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "キャンセル"
@@ -261,7 +261,7 @@ msgstr "パスワードを確認"
msgid "Connection is down"
msgstr "接続が切断されました"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "続行"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "環境変数をコピー"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "ホストをコピー"
@@ -296,7 +296,7 @@ msgstr "ホストをコピー"
msgid "Copy Linux command"
msgstr "Linuxコマンドをコピー"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "名前をコピー"
@@ -316,7 +316,7 @@ msgstr "下記のエージェントの<0>docker-compose.yml</0>内容をコピ
msgid "Copy YAML"
msgstr "YAMLをコピー"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "アカウントを作成"
msgid "Created"
msgstr "作成日"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "クリティカル (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "ダッシュボード"
msgid "Default time period"
msgstr "デフォルトの期間"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "削除"
@@ -358,7 +362,7 @@ msgstr "削除"
msgid "Delete fingerprint"
msgstr "フィンガープリントを削除"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "ディスク"
@@ -399,7 +403,7 @@ msgstr "ドキュメント"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "停止"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "期間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "編集"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "ロードアベレージ (5分)"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "ロードアベレージ"
@@ -606,7 +610,7 @@ msgstr "手動セットアップの手順"
msgid "Max 1 min"
msgstr "最大1分"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "メモリ"
@@ -624,7 +628,7 @@ msgstr "Dockerコンテナのメモリ使用率"
msgid "Name"
msgstr "名前"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "帯域"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "パスワードは72バイト未満でなければなりません。"
msgid "Password reset request received"
msgstr "パスワードリセットのリクエストを受け取りました"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "一時停止"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "一時停止中"
@@ -792,7 +796,7 @@ msgstr "パスワードをリセット"
msgid "Resolved"
msgstr "解決済み"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "再開"
@@ -833,6 +837,10 @@ msgstr "アラートの受信方法を設定するには<0>通知設定</0>を
msgid "Sent"
msgstr "送信"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "メーターの色にパーセンテージのしきい値を設定します。"
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "システムを表示する際のチャートのデフォルトの時間範囲を設定します。"
@@ -881,7 +889,7 @@ msgstr "スワップ使用量"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "システム"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "テーブル"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "温度"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "この操作は元に戻せません。これにより、データベースから{name}のすべての現在のレコードが永久に削除されます。"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "ユニバーサルトークン"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "正常"
@@ -1084,6 +1092,14 @@ msgstr "表示するのに十分なレコードを待っています"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "翻訳をさらに良くするためにご協力をお願いします。詳細については<0>Crowdin</0>をご覧ください。"
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "警告 (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "警告のしきい値"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / プッシュ通知"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5분"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "작업"
@@ -108,7 +108,7 @@ msgstr "차트 표시 옵션 변경."
msgid "Admin"
msgstr "관리자"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "에이전트"
@@ -128,7 +128,7 @@ msgstr "알림"
msgid "All Systems"
msgstr "모든 시스템"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "{name}을(를) 삭제하시겠습니까?"
@@ -202,7 +202,7 @@ msgstr "바이트 (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "캐시 / 버퍼"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "취소"
@@ -261,7 +261,7 @@ msgstr "비밀번호 확인"
msgid "Connection is down"
msgstr "연결이 끊겼습니다"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "계속"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "환경 복사"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "호스트 복사"
@@ -296,7 +296,7 @@ msgstr "호스트 복사"
msgid "Copy Linux command"
msgstr "리눅스 명령어 복사"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "이름 복사"
@@ -316,7 +316,7 @@ msgstr "아래 에이전트의 <0>docker-compose.yml</0> 내용을 복사하거
msgid "Copy YAML"
msgstr "YAML 복사"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "계정 생성"
msgid "Created"
msgstr "생성됨"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "치명적 (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "대시보드"
msgid "Default time period"
msgstr "기본 기간"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "삭제"
@@ -358,7 +362,7 @@ msgstr "삭제"
msgid "Delete fingerprint"
msgstr "지문 삭제"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "디스크"
@@ -399,7 +403,7 @@ msgstr "문서"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "오프라인"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "기간"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "수정"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "부하 평균 5분"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "부하 평균"
@@ -606,7 +610,7 @@ msgstr "수동 설정 방법"
msgid "Max 1 min"
msgstr "1분간 최댓값"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "메모리"
@@ -624,7 +628,7 @@ msgstr "Docker 컨테이너의 메모리 사용량"
msgid "Name"
msgstr "이름"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "네트워크"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "비밀번호는 72 바이트 이하여야 합니다."
msgid "Password reset request received"
msgstr "비밀번호 재설정 요청이 접수되었습니다"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "일시 중지"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "일시 정지됨"
@@ -792,7 +796,7 @@ msgstr "비밀번호 재설정"
msgid "Resolved"
msgstr "해결됨"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "재개"
@@ -833,6 +837,10 @@ msgstr "알림을 받는 방법을 구성하려면 <0>알림 설정</0>을 참
msgid "Sent"
msgstr "보냄"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "미터 색상에 대한 백분율 임계값을 설정합니다."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "시스템을 볼 때 차트의 기본 시간 범위를 설정합니다."
@@ -881,7 +889,7 @@ msgstr "스왑 사용량"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "시스템"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "표"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "온도"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "이 작업은 되돌릴 수 없습니다. 데이터베이스에서 {name}에 대한 모든 현재 기록이 영구적으로 삭제됩니다."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "범용 토큰"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "온라인"
@@ -1084,6 +1092,14 @@ msgstr "표시할 충분한 기록을 기다리는 중"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "번역을 개선하는데 도움을 주시겠습니까? 자세한 내용은 <0>Crowdin</0>을 확인해 주세요."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "경고 (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "경고 임계값"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / 푸시 알림"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Acties"
@@ -108,7 +108,7 @@ msgstr "Weergaveopties voor grafieken aanpassen."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Waarschuwingen"
msgid "All Systems"
msgstr "Alle systemen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Weet je zeker dat je {name} wilt verwijderen?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Annuleren"
@@ -261,7 +261,7 @@ msgstr "Bevestig wachtwoord"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Volgende"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Env kopiëren"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopieer host"
@@ -296,7 +296,7 @@ msgstr "Kopieer host"
msgid "Copy Linux command"
msgstr "Kopieer Linux-opdracht"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopieer naam"
@@ -316,7 +316,7 @@ msgstr "Kopieer de<0>docker-compose.yml</0> inhoud voor de agent hieronder, of r
msgid "Copy YAML"
msgstr "YAML kopiëren"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Account aanmaken"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritiek (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standaard tijdsduur"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Verwijderen"
@@ -358,7 +362,7 @@ msgstr "Verwijderen"
msgid "Delete fingerprint"
msgstr "Vingerafdruk verwijderen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Schijf"
@@ -399,7 +403,7 @@ msgstr "Documentatie"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Offline"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Bewerken"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Gemiddelde Belasting 5m"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Handmatige installatie-instructies"
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Geheugen"
@@ -624,7 +628,7 @@ msgstr "Geheugengebruik van docker containers"
msgid "Name"
msgstr "Naam"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Net"
@@ -668,7 +672,7 @@ msgstr "OAuth 2 / OIDC ondersteuning"
msgid "On each restart, systems in the database will be updated to match the systems defined in the file."
msgstr "Bij elke herstart zullen systemen in de database worden bijgewerkt om overeen te komen met de systemen die in het bestand zijn gedefinieerd."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Het wachtwoord moet minder zijn dat 72 bytes."
msgid "Password reset request received"
msgstr "Wachtwoord reset aanvraag ontvangen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pauze"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Gepauzeerd"
@@ -792,7 +796,7 @@ msgstr "Wachtwoord resetten"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Hervatten"
@@ -833,6 +837,10 @@ msgstr "Zie <0>notificatie-instellingen</0> om te configureren hoe je meldingen
msgid "Sent"
msgstr "Verzonden"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Stel percentagedrempels in voor meterkleuren."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Stelt het standaard tijdsbereik voor grafieken in wanneer een systeem wordt bekeken."
@@ -881,7 +889,7 @@ msgstr "Swap gebruik"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Systeem"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabel"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatuur"
@@ -932,7 +940,7 @@ msgstr "Testmelding verzonden"
msgid "Then log into the backend and reset your user account password in the users table."
msgstr "Log vervolgens in op de backend en reset het wachtwoord van je gebruikersaccount in het gebruikersoverzicht."
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Deze actie kan niet ongedaan worden gemaakt. Dit zal alle huidige records voor {name} permanent verwijderen uit de database."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Universele token"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Online"
@@ -1084,6 +1092,14 @@ msgstr "Wachtend op genoeg records om weer te geven"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Wil je ons helpen onze vertalingen nog beter te maken? Bekijk <0>Crowdin</0> voor meer informatie."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Waarschuwing (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Waarschuwingsdrempels"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Pushmeldingen"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Handlinger"
@@ -108,7 +108,7 @@ msgstr "Juster visningsalternativer for diagrammer."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Alarmer"
msgid "All Systems"
msgstr "Alle Systemer"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Er du sikker på at du vil slette {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Buffere"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Avbryt"
@@ -261,7 +261,7 @@ msgstr "Bekreft passord"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortsett"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopier vert"
@@ -296,7 +296,7 @@ msgstr "Kopier vert"
msgid "Copy Linux command"
msgstr "Kopier Linux-kommando"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopier navn"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Opprett konto"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritisk (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Dashbord"
msgid "Default time period"
msgstr "Standard tidsperiode"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Slett"
@@ -358,7 +362,7 @@ msgstr "Slett"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokumentasjon"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nede"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Rediger"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Instruks for Manuell Installasjon"
msgid "Max 1 min"
msgstr "Maks 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Minne"
@@ -624,7 +628,7 @@ msgstr "Minnebruk av docker-konteinere"
msgid "Name"
msgstr "Navn"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Nett"
@@ -668,7 +672,7 @@ msgstr "OAuth 2 / OIDC-støtte"
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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Passord må være mindre enn 72 byte."
msgid "Password reset request received"
msgstr "Mottatt forespørsel om å nullstille passord"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pause"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Satt på Pause"
@@ -792,7 +796,7 @@ msgstr "Nullstill Passord"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Gjenoppta"
@@ -833,6 +837,10 @@ msgstr "Se <0>varslingsinnstillingene</0> for å konfigurere hvordan du vil mott
msgid "Sent"
msgstr "Sendt"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Angi prosentvise terskler for målerfarger."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Angir standard tidsperiode for diagrammer når et system vises."
@@ -881,7 +889,7 @@ msgstr "Swap-bruk"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabell"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temp"
@@ -932,7 +940,7 @@ msgstr "Test-varsling sendt"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Oppe"
@@ -1084,6 +1092,14 @@ msgstr "Venter på nok registreringer til å vise"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Advarsel (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Advarselsterskler"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-varslinger"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Akcje"
@@ -108,7 +108,7 @@ msgstr "Dostosuj opcje wyświetlania wykresów."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Alerty"
msgid "All Systems"
msgstr "Wszystkie systemy"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Czy na pewno chcesz usunąć {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Pamięć podręczna / Bufory"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Anuluj"
@@ -261,7 +261,7 @@ msgstr "Potwierdź hasło"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Kontynuuj"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopiuj host"
@@ -296,7 +296,7 @@ msgstr "Kopiuj host"
msgid "Copy Linux command"
msgstr "Kopiuj polecenie Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopiuj nazwę"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "Procesor"
@@ -335,6 +335,10 @@ msgstr "Utwórz konto"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Krytyczny (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Panel kontrolny"
msgid "Default time period"
msgstr "Domyślny przedział czasu"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Usuń"
@@ -358,7 +362,7 @@ msgstr "Usuń"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Dysk"
@@ -399,7 +403,7 @@ msgstr "Dokumentacja"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Nie działa"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Edytuj"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Instrukcja ręcznej konfiguracji"
msgid "Max 1 min"
msgstr "Maks. 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Pamięć"
@@ -624,7 +628,7 @@ msgstr "Użycie pamięci przez kontenery Docker."
msgid "Name"
msgstr "Nazwa"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Sieć"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Hasło musi być mniejsze niż 72 bajty."
msgid "Password reset request received"
msgstr "Otrzymane żądanie resetowania hasła"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pauza"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Wstrzymane"
@@ -792,7 +796,7 @@ msgstr "Resetuj hasło"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Wznów"
@@ -833,6 +837,10 @@ msgstr "Zobacz <0>ustawienia powiadomień</0>, aby skonfigurować sposób, w jak
msgid "Sent"
msgstr "Wysłane"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Ustaw progi procentowe dla kolorów mierników."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Użycie pamięci wymiany"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temperatura"
@@ -932,7 +940,7 @@ msgstr "Testowe powiadomienie wysłane."
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Działa"
@@ -1084,6 +1092,14 @@ msgstr "Oczekiwanie na wystarczającą liczbę rekordów do wyświetlenia"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Ostrzeżenie (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Progi ostrzegawcze"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Powiadomienia push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Ações"
@@ -108,7 +108,7 @@ msgstr "Ajustar opções de exibição para gráficos."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agente"
@@ -128,7 +128,7 @@ msgstr "Alertas"
msgid "All Systems"
msgstr "Todos os Sistemas"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Tem certeza de que deseja excluir {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Cache / Buffers"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Cancelar"
@@ -261,7 +261,7 @@ msgstr "Confirmar senha"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Continuar"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Copiar variáveis de ambiente"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Copiar host"
@@ -296,7 +296,7 @@ msgstr "Copiar host"
msgid "Copy Linux command"
msgstr "Copiar comando Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Copiar nome"
@@ -316,7 +316,7 @@ msgstr "Copie o conteúdo do <0>docker-compose.yml</0> do agente abaixo, ou regi
msgid "Copy YAML"
msgstr "Copiar YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Criar conta"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Crítico (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Painel"
msgid "Default time period"
msgstr "Período de tempo padrão"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Excluir"
@@ -358,7 +362,7 @@ msgstr "Excluir"
msgid "Delete fingerprint"
msgstr "Excluir impressão digital"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disco"
@@ -399,7 +403,7 @@ msgstr "Documentação"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "“Desligado”"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Editar"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr "Instruções de configuração manual"
msgid "Max 1 min"
msgstr "Máx 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Memória"
@@ -624,7 +628,7 @@ msgstr "Uso de memória dos contêineres Docker"
msgid "Name"
msgstr "Nome"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Rede"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "A password tem que ter menos de 72 bytes."
msgid "Password reset request received"
msgstr "Solicitação de redefinição de senha recebida"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Pausar"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pausado"
@@ -792,7 +796,7 @@ msgstr "Redefinir Senha"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Retomar"
@@ -833,6 +837,10 @@ msgstr "Veja <0>configurações de notificação</0> para configurar como você
msgid "Sent"
msgstr "Enviado"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Defina os limiares de porcentagem para as cores do medidor."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Uso de Swap"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistema"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Temp"
@@ -932,7 +940,7 @@ msgstr "Notificação de teste enviada"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Token universal"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "“Ligado”"
@@ -1084,6 +1092,14 @@ msgstr "Aguardando registros suficientes para exibir"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Quer nos ajudar a melhorar ainda mais nossas traduções? Confira <0>Crowdin</0> para mais detalhes."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Aviso (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Limites de aviso"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Notificações Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 мин"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Действия"
@@ -108,7 +108,7 @@ msgstr "Настроить параметры отображения для гр
msgid "Admin"
msgstr "Администратор"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Агент"
@@ -128,7 +128,7 @@ msgstr "Оповещения"
msgid "All Systems"
msgstr "Все системы"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Вы уверены, что хотите удалить {name}?"
@@ -202,7 +202,7 @@ msgstr "Байты (Кбайт/с, Мбайт/с, Гбайт/с)"
msgid "Cache / Buffers"
msgstr "Кэш / Буферы"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Отмена"
@@ -261,7 +261,7 @@ msgstr "Подтвердите пароль"
msgid "Connection is down"
msgstr "Нет соединения"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продолжить"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Скопировать env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Копировать хост"
@@ -296,7 +296,7 @@ msgstr "Копировать хост"
msgid "Copy Linux command"
msgstr "Копировать команду Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Копировать имя"
@@ -316,7 +316,7 @@ msgstr "Скопируйте содержимое <0>docker-compose.yml</0> дл
msgid "Copy YAML"
msgstr "Скопировать YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Создать аккаунт"
msgid "Created"
msgstr "Создано"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Критический (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Панель управления"
msgid "Default time period"
msgstr "Период по умолчанию"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Удалить"
@@ -358,7 +362,7 @@ msgstr "Удалить"
msgid "Delete fingerprint"
msgstr "Удалить отпечаток"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Диск"
@@ -399,7 +403,7 @@ msgstr "Документация"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Не в сети"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Длительность"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Редактировать"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Средняя загрузка за 5м"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Ср. загрузка"
@@ -606,7 +610,7 @@ msgstr "Инструкции по ручной настройке"
msgid "Max 1 min"
msgstr "Макс 1 мин"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Память"
@@ -624,7 +628,7 @@ msgstr "Использование памяти контейнерами Docker"
msgid "Name"
msgstr "Имя"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Сеть"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Пароль должен быть меньше 72 символов."
msgid "Password reset request received"
msgstr "Запрос на сброс пароля получен"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Пауза"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Пауза"
@@ -792,7 +796,7 @@ msgstr "Сбросить пароль"
msgid "Resolved"
msgstr "Завершено"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Возобновить"
@@ -833,6 +837,10 @@ msgstr "Смотрите <0>настройки уведомлений</0>, чт
msgid "Sent"
msgstr "Отправлено"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Установите процентные пороги для цветов счетчиков."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Устанавливает диапазон времени по умолчанию для графиков при просмотре системы."
@@ -881,7 +889,7 @@ msgstr "Использование подкачки"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Таблица"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Темп"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Это действие не может быть отменено. Это навсегда удалит все текущие записи для {name} из базы данных."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Универсальный токен"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "В сети"
@@ -1084,6 +1092,14 @@ msgstr "Ожидание достаточного количества запи
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Хотите помочь нам улучшить наши переводы? Посетите <0>Crowdin</0> для получения более подробной информации."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Предупреждение (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Пороги предупреждения"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push уведомления"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr ""
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Dejanja"
@@ -108,7 +108,7 @@ msgstr "Prilagodi možnosti prikaza za grafikone."
msgid "Admin"
msgstr "Administrator"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Opozorila"
msgid "All Systems"
msgstr "Vsi sistemi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Ali ste prepričani, da želite izbrisati {name}?"
@@ -202,7 +202,7 @@ msgstr ""
msgid "Cache / Buffers"
msgstr "Predpomnilnik / medpomnilniki"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Prekliči"
@@ -261,7 +261,7 @@ msgstr "Potrdite geslo"
msgid "Connection is down"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Nadaljuj"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopiraj gostitelja"
@@ -296,7 +296,7 @@ msgstr "Kopiraj gostitelja"
msgid "Copy Linux command"
msgstr "Kopiraj Linux ukaz"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopiraj ime"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Ustvari račun"
msgid "Created"
msgstr ""
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritično (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Nadzorna plošča"
msgid "Default time period"
msgstr "Privzeto časovno obdobje"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Izbriši"
@@ -358,7 +362,7 @@ msgstr "Izbriši"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokumentacija"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Največ 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Pomnilnik"
@@ -624,7 +628,7 @@ msgstr "Poraba pomnilnika docker kontejnerjev"
msgid "Name"
msgstr "Naziv"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Mreža"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Prejeta zahteva za ponastavitev gesla"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Premor"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Zaustavljeno"
@@ -792,7 +796,7 @@ msgstr "Ponastavi geslo"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Nadaljuj"
@@ -833,6 +837,10 @@ msgstr "Glejte <0>nastavitve obvestil</0>, da nastavite način prejemanja opozor
msgid "Sent"
msgstr "Poslano"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Nastavite odstotne pragove za barve merilnikov."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Nastavi privzeti časovni obseg za grafikone, ko si ogledujete sistem."
@@ -881,7 +889,7 @@ msgstr "Swap uporaba"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistemsko"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabela"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Testno obvestilo je poslano"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Čakam na dovolj zapisov za prikaz"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Opozorilo (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Pragovi za opozorila"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / potisna obvestila"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 min"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Åtgärder"
@@ -108,7 +108,7 @@ msgstr "Justera visningsalternativ för diagram."
msgid "Admin"
msgstr "Admin"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Agent"
@@ -128,7 +128,7 @@ msgstr "Larm"
msgid "All Systems"
msgstr "Alla system"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Är du säker på att du vill ta bort {name}?"
@@ -202,7 +202,7 @@ msgstr "Bytes (KB/s, MB/s, GB/S)"
msgid "Cache / Buffers"
msgstr "Cache / Buffertar"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Avbryt"
@@ -261,7 +261,7 @@ msgstr "Bekräfta lösenord"
msgid "Connection is down"
msgstr "Ej ansluten"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Fortsätt"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Kopiera värd"
@@ -296,7 +296,7 @@ msgstr "Kopiera värd"
msgid "Copy Linux command"
msgstr "Kopiera Linux-kommando"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Kopiera namn"
@@ -316,7 +316,7 @@ msgstr ""
msgid "Copy YAML"
msgstr "Kopiera YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Skapa konto"
msgid "Created"
msgstr "Skapad"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritisk (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Dashboard"
msgid "Default time period"
msgstr "Standardtidsperiod"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Ta bort"
@@ -358,7 +362,7 @@ msgstr "Ta bort"
msgid "Delete fingerprint"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokumentation"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr ""
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr ""
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr ""
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr ""
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr ""
@@ -606,7 +610,7 @@ msgstr ""
msgid "Max 1 min"
msgstr "Max 1 min"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Minne"
@@ -624,7 +628,7 @@ msgstr "Minnesanvändning för dockercontainrar"
msgid "Name"
msgstr "Namn"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Nät"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr ""
msgid "Password reset request received"
msgstr "Begäran om återställning av lösenord mottagen"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Paus"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Pausad"
@@ -792,7 +796,7 @@ msgstr "Återställ lösenord"
msgid "Resolved"
msgstr ""
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Återuppta"
@@ -833,6 +837,10 @@ msgstr "Se <0>aviseringsinställningar</0> för att konfigurera hur du tar emot
msgid "Sent"
msgstr "Skickat"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Ställ in procentuella tröskelvärden för mätarfärger."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Anger standardtidsintervallet för diagram när ett system visas."
@@ -881,7 +889,7 @@ msgstr "Swap-användning"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "System"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tabell"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr ""
@@ -932,7 +940,7 @@ msgstr "Testavisering skickad"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr ""
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr ""
@@ -1084,6 +1092,14 @@ msgstr "Väntar på tillräckligt med poster att visa"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Varning (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Varningströsklar"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push-aviseringar"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 dk"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Eylemler"
@@ -108,7 +108,7 @@ msgstr "Grafikler için görüntüleme seçeneklerini ayarlayın."
msgid "Admin"
msgstr "Yönetici"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Aracı"
@@ -128,7 +128,7 @@ msgstr "Uyarılar"
msgid "All Systems"
msgstr "Tüm Sistemler"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "{name} silmek istediğinizden emin misiniz?"
@@ -202,7 +202,7 @@ msgstr "Bayt (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "Önbellek / Tamponlar"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "İptal"
@@ -261,7 +261,7 @@ msgstr "Şifreyi onayla"
msgid "Connection is down"
msgstr "Bağlantı kesildi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Devam et"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Ortam değişkenlerini kopyala"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Ana bilgisayarı kopyala"
@@ -296,7 +296,7 @@ msgstr "Ana bilgisayarı kopyala"
msgid "Copy Linux command"
msgstr "Linux komutunu kopyala"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Adı kopyala"
@@ -316,7 +316,7 @@ msgstr "Aşağıdaki agent için <0>docker-compose.yml</0> içeriğini kopyalay
msgid "Copy YAML"
msgstr "YAML'ı kopyala"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Hesap oluştur"
msgid "Created"
msgstr "Oluşturuldu"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Kritik (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Gösterge Paneli"
msgid "Default time period"
msgstr "Varsayılan zaman dilimi"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Sil"
@@ -358,7 +362,7 @@ msgstr "Sil"
msgid "Delete fingerprint"
msgstr "Parmak izini sil"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Disk"
@@ -399,7 +403,7 @@ msgstr "Dokümantasyon"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Kapalı"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Süre"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Düzenle"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Yük Ortalaması 5d"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Yük Ort."
@@ -606,7 +610,7 @@ msgstr "Manuel kurulum talimatları"
msgid "Max 1 min"
msgstr "Maks 1 dk"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Bellek"
@@ -624,7 +628,7 @@ msgstr "Docker konteynerlerinin bellek kullanımı"
msgid "Name"
msgstr "Ad"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Ağ"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Parola 72 bayttan küçük olmalıdır."
msgid "Password reset request received"
msgstr "Şifre sıfırlama isteği alındı"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Duraklat"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Duraklatıldı"
@@ -792,7 +796,7 @@ msgstr "Şifreyi Sıfırla"
msgid "Resolved"
msgstr "Çözüldü"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Devam et"
@@ -833,6 +837,10 @@ msgstr "Uyarıları nasıl alacağınızı yapılandırmak için <0>bildirim aya
msgid "Sent"
msgstr "Gönderildi"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Sayaç renkleri için yüzde eşiklerini ayarlayın."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Takas Kullanımı"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Sistem"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Tablo"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Sıc"
@@ -932,7 +940,7 @@ msgstr "Test bildirimi gönderildi"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Evrensel token"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Açık"
@@ -1084,6 +1092,14 @@ msgstr "Görüntülemek için yeterli kayıt bekleniyor"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Uyarı (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Uyarı eşikleri"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Anlık bildirimler"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 хв"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Дії"
@@ -108,7 +108,7 @@ msgstr "Налаштуйте параметри відображення для
msgid "Admin"
msgstr "Адміністратор"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Агент"
@@ -128,7 +128,7 @@ msgstr "Сповіщення"
msgid "All Systems"
msgstr "Всі системи"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Ви впевнені, що хочете видалити {name}?"
@@ -202,7 +202,7 @@ msgstr "Байти (КБ/с, МБ/с, ГБ/с)"
msgid "Cache / Buffers"
msgstr "Кеш / Буфери"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Скасувати"
@@ -261,7 +261,7 @@ msgstr "Підтвердьте пароль"
msgid "Connection is down"
msgstr "З'єднання розірвано"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Продовжити"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Копіювати env"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Копіювати хост"
@@ -296,7 +296,7 @@ msgstr "Копіювати хост"
msgid "Copy Linux command"
msgstr "Копіювати команду Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Копіювати імʼя"
@@ -316,7 +316,7 @@ msgstr "Скопіюйте вміст <0>docker-compose.yml</0> для аген
msgid "Copy YAML"
msgstr "Копіювати YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "ЦП"
@@ -335,6 +335,10 @@ msgstr "Створити обліковий запис"
msgid "Created"
msgstr "Створено"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Критично (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "Панель управління"
msgid "Default time period"
msgstr "Стандартний період часу"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Видалити"
@@ -358,7 +362,7 @@ msgstr "Видалити"
msgid "Delete fingerprint"
msgstr "Видалити відбиток"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Диск"
@@ -399,7 +403,7 @@ msgstr "Документація"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Не працює"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Тривалість"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Редагувати"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Середнє навантаження за 5 хв"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Сер. навантаження"
@@ -606,7 +610,7 @@ msgstr "Інструкції з ручного налаштування"
msgid "Max 1 min"
msgstr "Макс 1 хв"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Пам'ять"
@@ -624,7 +628,7 @@ msgstr "Використання пам'яті контейнерами Docker"
msgid "Name"
msgstr "Ім'я"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Мережа"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Пароль не повинен перевищувати 72 байти.
msgid "Password reset request received"
msgstr "Запит на скидання пароля отримано"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Призупинити"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Призупинено"
@@ -792,7 +796,7 @@ msgstr "Скинути пароль"
msgid "Resolved"
msgstr "Вирішено"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Відновити"
@@ -833,6 +837,10 @@ msgstr "Перегляньте <0>налаштування сповіщень</0
msgid "Sent"
msgstr "Відправлено"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Встановіть відсоткові пороги для кольорів лічильників."
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "Встановлює стандартний діапазон часу для графіків при перегляді системи."
@@ -881,7 +889,7 @@ msgstr "Використання підкачки"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Система"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Таблиця"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Температура"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "Цю дію не можна скасувати. Це назавжди видалить всі поточні записи для {name} з бази даних."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Універсальний токен"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Працює"
@@ -1084,6 +1092,14 @@ msgstr "Очікування достатньої кількості запис
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "Хочете допомогти покращити наші переклади? Подробиці на <0>Crowdin</0>."
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "Попередження (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Пороги попередження"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / Push сповіщення"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 phút"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "Hành động"
@@ -108,7 +108,7 @@ msgstr "Điều chỉnh tùy chọn hiển thị cho biểu đồ."
msgid "Admin"
msgstr "Quản trị viên"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "Tác nhân"
@@ -128,7 +128,7 @@ msgstr "Cảnh báo"
msgid "All Systems"
msgstr "Tất cả Hệ thống"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "Bạn có chắc chắn muốn xóa {name} không?"
@@ -202,7 +202,7 @@ msgstr "Byte (KB/giây, MB/giây, GB/giây)"
msgid "Cache / Buffers"
msgstr "Bộ nhớ đệm / Bộ đệm"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "Hủy bỏ"
@@ -261,7 +261,7 @@ msgstr "Xác nhận mật khẩu"
msgid "Connection is down"
msgstr "Mất kết nối"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "Tiếp tục"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "Sao chép môi trường"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "Sao chép máy chủ"
@@ -296,7 +296,7 @@ msgstr "Sao chép máy chủ"
msgid "Copy Linux command"
msgstr "Sao chép lệnh Linux"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "Sao chép tên"
@@ -316,7 +316,7 @@ msgstr "Sao chép nội dung <0>docker-compose.yml</0> cho tác nhân bên dư
msgid "Copy YAML"
msgstr "Sao chép YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "Tạo tài khoản"
msgid "Created"
msgstr "Đã tạo"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "Mức độ nghiêm trọng (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "Xóa"
@@ -358,7 +362,7 @@ msgstr "Xóa"
msgid "Delete fingerprint"
msgstr "Xóa vân tay"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "Đĩa"
@@ -399,7 +403,7 @@ msgstr "Tài liệu"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "Mất kết nối"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "Thời lượng"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "Chỉnh sửa"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "Tải trung bình 5 phút"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "Tải TB"
@@ -606,7 +610,7 @@ msgstr "Hướng dẫn cài đặt thủ công"
msgid "Max 1 min"
msgstr "Tối đa 1 phút"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "Bộ nhớ"
@@ -624,7 +628,7 @@ msgstr "Sử dụng bộ nhớ của các container Docker"
msgid "Name"
msgstr "Tên"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "Mạng"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "Mật khẩu phải nhỏ hơn 72 byte."
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
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "Tạm dừng"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "Đã tạm dừng"
@@ -792,7 +796,7 @@ msgstr "Đặt lại Mật khẩu"
msgid "Resolved"
msgstr "Đã giải quyết"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "Tiếp tục"
@@ -833,6 +837,10 @@ msgstr "Xem <0>cài đặt thông báo</0> để cấu hình cách bạn nhận
msgid "Sent"
msgstr "Đã gửi"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "Đặt ngưỡng phần trăm cho màu sắc của đồng hồ."
#: src/components/routes/settings/general.tsx
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."
@@ -881,7 +889,7 @@ msgstr "Sử dụng Hoán đổi"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "Hệ thống"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "Bảng"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "Nhiệt độ"
@@ -932,7 +940,7 @@ msgstr "Thông báo thử nghiệm đã được gửi"
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
#: src/components/systems-table/systems-table-columns.tsx
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."
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "Token chung"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "Hoạt động"
@@ -1084,6 +1092,14 @@ msgstr "Đang chờ đủ bản ghi để hiển thị"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for 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/general.tsx
msgid "Warning (%)"
msgstr "Cảnh báo (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "Ngưỡng cảnh báo"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Thông báo Webhook / Push"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5分钟"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
@@ -108,7 +108,7 @@ msgstr "调整图表的显示选项。"
msgid "Admin"
msgstr "管理员"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "客户端"
@@ -128,7 +128,7 @@ msgstr "警报"
msgid "All Systems"
msgstr "所有客户端"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "您确定要删除{name}吗?"
@@ -202,7 +202,7 @@ msgstr "字节 (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "缓存/缓冲区"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -261,7 +261,7 @@ msgstr "确认密码"
msgid "Connection is down"
msgstr "连接已断开"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "继续"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "复制环境变量"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "复制主机名"
@@ -296,7 +296,7 @@ msgstr "复制主机名"
msgid "Copy Linux command"
msgstr "复制 Linux 安装命令"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "复制名称"
@@ -316,7 +316,7 @@ msgstr "复制下面的客户端<0>docker-compose.yml</0>内容,或使用<1>
msgid "Copy YAML"
msgstr "复制YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "创建账户"
msgid "Created"
msgstr "创建时间"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "临界 (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "仪表板"
msgid "Default time period"
msgstr "默认时间段"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "删除"
@@ -358,7 +362,7 @@ msgstr "删除"
msgid "Delete fingerprint"
msgstr "删除指纹"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "磁盘"
@@ -399,7 +403,7 @@ msgstr "文档"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "离线"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "持续时间"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "编辑"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "5分钟内的平均负载"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "负载"
@@ -606,7 +610,7 @@ msgstr "手动设置说明"
msgid "Max 1 min"
msgstr "1分钟内最大值"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "内存"
@@ -624,7 +628,7 @@ msgstr "Docker 容器的内存使用"
msgid "Name"
msgstr "名称"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "网络"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "密码必须小于 72 字节。"
msgid "Password reset request received"
msgstr "已收到密码重置请求"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "暂停"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "已暂停"
@@ -792,7 +796,7 @@ msgstr "重置密码"
msgid "Resolved"
msgstr "已解决"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "恢复"
@@ -833,6 +837,10 @@ msgstr "查看<0>通知设置</0>以配置您接收警报的方式。"
msgid "Sent"
msgstr "发送"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "设置仪表颜色的百分比阈值。"
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "设置查看系统时图表的默认时间范围。"
@@ -881,7 +889,7 @@ msgstr "SWAP 使用"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系统"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "表格"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "温度"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作无法撤销。这将永久删除数据库中{name}的所有当前记录。"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "通用令牌"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "在线"
@@ -1084,6 +1092,14 @@ msgstr "正在收集足够的数据来显示"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "想帮助我们改进翻译吗?查看<0>Crowdin</0>以获取更多详细信息。"
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "警告 (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "警告阈值"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / 推送通知"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 分鐘"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
@@ -108,7 +108,7 @@ msgstr "調整圖表的顯示選項。"
msgid "Admin"
msgstr "管理員"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "客户端"
@@ -128,7 +128,7 @@ msgstr "警報"
msgid "All Systems"
msgstr "所有系統"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
@@ -202,7 +202,7 @@ msgstr "位元組 (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "快取 / 緩衝區"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -261,7 +261,7 @@ msgstr "確認密碼"
msgid "Connection is down"
msgstr "連線中斷"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "繼續"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "複製環境變數"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "複製主機"
@@ -296,7 +296,7 @@ msgstr "複製主機"
msgid "Copy Linux command"
msgstr "複製 Linux 指令"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "複製名稱"
@@ -316,7 +316,7 @@ msgstr "複製下面的代理程式<0>docker-compose.yml</0>內容,或使用<1
msgid "Copy YAML"
msgstr "複製YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "創建帳戶"
msgid "Created"
msgstr "已建立"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "嚴重 (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "控制面板"
msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "刪除"
@@ -358,7 +362,7 @@ msgstr "刪除"
msgid "Delete fingerprint"
msgstr "刪除指紋"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "磁碟"
@@ -399,7 +403,7 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "中斷"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "持續時間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "編輯"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "5分鐘平均負載"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "平均負載"
@@ -606,7 +610,7 @@ msgstr "手動設定說明"
msgid "Max 1 min"
msgstr "一分鐘內最大值"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "記憶體"
@@ -624,7 +628,7 @@ msgstr "Docker 容器的記憶體使用量"
msgid "Name"
msgstr "名稱"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "網絡"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "密碼必須少於 72 個字節。"
msgid "Password reset request received"
msgstr "已收到密碼重設請求"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "暫停"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "已暫停"
@@ -792,7 +796,7 @@ msgstr "重設密碼"
msgid "Resolved"
msgstr "已解決"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "恢復"
@@ -833,6 +837,10 @@ msgstr "查看<0>通知設置</0>以配置您接收警報的方式。"
msgid "Sent"
msgstr "發送"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "設定儀表顏色的百分比閾值。"
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "設置查看系統時圖表的默認時間範圍。"
@@ -881,7 +889,7 @@ msgstr "交換使用"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系統"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "表格"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "溫度"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法撤銷。這將永久刪除數據庫中{name}的所有當前記錄。"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "通用令牌"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "上線"
@@ -1084,6 +1092,14 @@ msgstr "等待足夠的記錄以顯示"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "想幫助我們改進翻譯嗎?查看<0>Crowdin</0>以獲取更多詳細信息。"
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "警告 (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "警告閾值"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / 推送通知"

View File

@@ -69,7 +69,7 @@ msgid "5 min"
msgstr "5 分鐘"
#. Table column
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Actions"
msgstr "操作"
@@ -108,7 +108,7 @@ msgstr "調整圖表的顯示選項。"
msgid "Admin"
msgstr "管理員"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Agent"
msgstr "代理"
@@ -128,7 +128,7 @@ msgstr "警報"
msgid "All Systems"
msgstr "所有系統"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Are you sure you want to delete {name}?"
msgstr "您確定要刪除 {name} 嗎?"
@@ -202,7 +202,7 @@ msgstr "位元組 (KB/s, MB/s, GB/s)"
msgid "Cache / Buffers"
msgstr "快取/緩衝"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Cancel"
msgstr "取消"
@@ -261,7 +261,7 @@ msgstr "確認密碼"
msgid "Connection is down"
msgstr "連線中斷"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Continue"
msgstr "繼續"
@@ -287,7 +287,7 @@ msgctxt "Environment variables"
msgid "Copy env"
msgstr "複製環境變數"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy host"
msgstr "複製主機"
@@ -296,7 +296,7 @@ msgstr "複製主機"
msgid "Copy Linux command"
msgstr "複製 Linux 指令"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Copy name"
msgstr "複製名稱"
@@ -316,7 +316,7 @@ msgstr "複製下面的代理程式<0>docker-compose.yml</0>內容,或使用<1
msgid "Copy YAML"
msgstr "複製YAML"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "CPU"
msgstr "CPU"
@@ -335,6 +335,10 @@ msgstr "建立帳號"
msgid "Created"
msgstr "已建立"
#: src/components/routes/settings/general.tsx
msgid "Critical (%)"
msgstr "临界 (%)"
#. Dark theme
#: src/components/mode-toggle.tsx
msgid "Dark"
@@ -349,7 +353,7 @@ msgstr "控制面板"
msgid "Default time period"
msgstr "預設時間段"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/alerts-history-data-table.tsx
msgid "Delete"
msgstr "刪除"
@@ -358,7 +362,7 @@ msgstr "刪除"
msgid "Delete fingerprint"
msgstr "刪除指紋"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Disk"
msgstr "磁碟"
@@ -399,7 +403,7 @@ msgstr "文件"
#. Context: System is down
#: src/lib/utils.ts
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Down"
msgstr "離線"
@@ -409,7 +413,7 @@ msgid "Duration"
msgstr "持續時間"
#: src/components/add-system.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Edit"
msgstr "編輯"
@@ -567,7 +571,7 @@ msgid "Load Average 5m"
msgstr "5分鐘平均負載"
#. Short label for load average
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Load Avg"
msgstr "平均負載"
@@ -606,7 +610,7 @@ msgstr "手動設定說明"
msgid "Max 1 min"
msgstr "最多1分鐘"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Memory"
msgstr "記憶體"
@@ -624,7 +628,7 @@ msgstr "Docker 容器的記憶體使用量"
msgid "Name"
msgstr "名稱"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Net"
msgstr "網路"
@@ -668,7 +672,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "Open menu"
@@ -713,11 +717,11 @@ msgstr "密碼必須少於 72 個位元組。"
msgid "Password reset request received"
msgstr "已收到密碼重設請求"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Pause"
msgstr "暫停"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Paused"
msgstr "已暫停"
@@ -792,7 +796,7 @@ msgstr "重設密碼"
msgid "Resolved"
msgstr "已解決"
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Resume"
msgstr "繼續"
@@ -833,6 +837,10 @@ msgstr "查看<0>通知設定</0>以設定您如何接收警報。"
msgid "Sent"
msgstr "傳送"
#: src/components/routes/settings/general.tsx
msgid "Set percentage thresholds for meter colors."
msgstr "设置仪表颜色的百分比阈值。"
#: src/components/routes/settings/general.tsx
msgid "Sets the default time range for charts when a system is viewed."
msgstr "設定顯示系統圖表的預設時間範圍。"
@@ -881,7 +889,7 @@ msgstr "虛擬記憶體使用量"
#: src/lib/utils.ts
#: src/components/mode-toggle.tsx
#: src/components/alerts-history-columns.tsx
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/settings/tokens-fingerprints.tsx
msgid "System"
msgstr "系統"
@@ -903,7 +911,7 @@ msgid "Table"
msgstr "列表"
#. Temperature label in systems table
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
msgid "Temp"
msgstr "溫度"
@@ -932,7 +940,7 @@ 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
#: src/components/systems-table/systems-table-columns.tsx
msgid "This action cannot be undone. This will permanently delete all current records for {name} from the database."
msgstr "此操作無法復原。這將永久刪除資料庫中{name}的所有當前記錄。"
@@ -1026,7 +1034,7 @@ msgid "Universal token"
msgstr "通用令牌"
#. Context: System is up
#: src/components/systems-table/systems-table.tsx
#: src/components/systems-table/systems-table-columns.tsx
#: src/components/routes/system.tsx
msgid "Up"
msgstr "上線"
@@ -1084,6 +1092,14 @@ msgstr "等待足夠的記錄以顯示"
msgid "Want to help improve our translations? Check <0>Crowdin</0> for details."
msgstr "想幫助我們改善翻譯嗎?查看<0>Crowdin</0>以取得更多詳細資訊。"
#: src/components/routes/settings/general.tsx
msgid "Warning (%)"
msgstr "警告 (%)"
#: src/components/routes/settings/general.tsx
msgid "Warning thresholds"
msgstr "警告阈值"
#: src/components/routes/settings/notifications.tsx
msgid "Webhook / Push notifications"
msgstr "Webhook / 推送通知"

View File

@@ -6,7 +6,7 @@ import { Home } from "./components/routes/home.tsx"
import { ThemeProvider } from "./components/theme-provider.tsx"
import { DirectionProvider } from "@radix-ui/react-direction"
import { $authenticated, $systems, pb, $publicKey, $copyContent, $direction } from "./lib/stores.ts"
import { updateUserSettings, updateAlerts, updateFavicon, updateSystemList } from "./lib/utils.ts"
import { updateUserSettings, updateFavicon, updateSystemList, alertManager } from "./lib/utils.ts"
import { useStore } from "@nanostores/react"
import { Toaster } from "./components/ui/toaster.tsx"
import { $router } from "./components/router.tsx"
@@ -38,7 +38,7 @@ const App = memo(() => {
// get servers / alerts / settings
updateUserSettings()
// get alerts after system list is loaded
updateSystemList().then(updateAlerts)
updateSystemList().then(alertManager.refresh)
return () => updateFavicon("favicon.svg")
}, [])

View File

@@ -196,7 +196,8 @@ export interface AlertRecord extends RecordModel {
system: string
name: string
triggered: boolean
sysname?: string
value: number
min: number
// user: string
}
@@ -224,13 +225,14 @@ export interface ChartTimeData {
}
export interface UserSettings {
// lang?: string
chartTime: ChartTimes
emails?: string[]
webhooks?: string[]
unitTemp?: Unit
unitNet?: Unit
unitDisk?: Unit
colorWarn?: number
colorCrit?: number
}
type ChartDataContainer = {
@@ -267,3 +269,5 @@ interface AlertInfo {
/** Single value description (when there's only one value, like status) */
singleDesc?: () => string
}
export type AlertMap = Record<string, Map<string, AlertRecord>>

View File

@@ -69,6 +69,9 @@ module.exports = {
foreground: "hsl(var(--card-foreground))",
},
},
transitionDuration: {
50: "50ms",
},
borderRadius: {
lg: "var(--radius)",
md: "calc(var(--radius) - 2px)",

View File

@@ -3,7 +3,7 @@ package beszel
import "github.com/blang/semver"
const (
Version = "0.12.2"
Version = "0.12.3"
AppName = "beszel"
)

View File

@@ -1,9 +1,11 @@
services:
beszel-agent:
image: 'henrygd/beszel-agent'
image: 'henrygd/beszel-agent' #Or henrygd/beszel-agent-nvidia
container_name: 'beszel-agent'
restart: unless-stopped
network_mode: host
# Only when using henrygd/beszel-agent-nvidia
# runtime: nvidia
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
# monitor other disks / partitions by mounting a folder in /extra-filesystems
@@ -11,3 +13,6 @@ services:
environment:
PORT: 45876
KEY: 'ssh-ed25519 YOUR_PUBLIC_KEY'
# Only when using henrygd/beszel-agent-nvidia
# NVIDIA_VISIBLE_DEVICES: all
# NVIDIA_DRIVER_CAPABILITIES: compute,video,utility

View File

@@ -11,13 +11,16 @@ services:
- 'host.docker.internal:host-gateway'
beszel-agent:
image: 'henrygd/beszel-agent'
image: 'henrygd/beszel-agent' #Add -nvidia for nvidia gpus
container_name: 'beszel-agent'
restart: unless-stopped
network_mode: host
# runtime: nvidia # when using beszel-agent-nvidia
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
PORT: 45876
KEY: '...'
# FILESYSTEM: /dev/sda1 # set to the correct filesystem for disk I/O stats
# NVIDIA_VISIBLE_DEVICES: all # when using beszel-agent-nvidia
# NVIDIA_DRIVER_CAPABILITIES: utility # when using beszel-agent-nvidia